HiFive Unmatched 是一款基于 RISC-V 处理器的 PC 形态开发板,此开发板开创了 RISC-V Linux 开发的新时代。它拥有一个名为 SiFive FU740 SoC 的 SiFive 处理器,一个 5 核处理器,由四个 SiFive U74 核和一个 SiFive S7 核构成,具有足够的性能来支撑图形桌面的运行。
2021 年 12 月 29 日,在优麒麟社区和海河实验室研发团队的共同努力下,发布了优麒麟社区首个支持 RISC-V 架构的 20.04 Pro 版本操作系统,此版本系统针对 HiFive Unmatched 进行了深度适配,其中系统无法关机的问题,在研发团队的努力下取得了突破,实现了通过系统关机断电的功能。
1、Hifive Unmatched 开发板硬件支持
PMIC 是 power management IC 的缩写,中文是电源管理集成电路,主要特点是高集成度,将传统的多路输出电源封装在一颗芯片内,使得多电源应用场景效率更高,体积更小。此开发板使用 DA9063 芯片作为其 PMIC ,实现电源管理模块。
Hifive Unmatched 开发板硬件关机共支持两种方式,一种是由 CPU 相关功能引脚直接外接开/关机按键,通过按键使对应引脚产生高低电平变化实现关机,用户可以通过按键操作直接关机。另一种是通过开发板硬件电源管理模块(即上述 DA9063 )外接开/关机按键实现开/关机功能。
2、优麒麟系统关机流程软件实现
在 Linux Kernel 中,主流的 shutdown 和 restart 都是通过“reboot”系统调用(具体可参考 kernel/sys.c )来实现的,关机也是一种特殊的 restart 过程,所以,内核根据不同的表现方式,将 reboot 分为如下的几种方式:
本篇文章主要讲解关机流程,即其中的 POWER_OFF ,执行该动作后,系统会停止操作系统,并去除所有供电。在优麒麟中可以通过 poweroff 命令,发起如下流程:
用户空间程序通过 reboot 系统调用,进入内核空间。具体实现是在内核目录的 kernel/reboot.c 中的下图函数中:
其中针对 cmd 有多个 case,poweroff 等关机命令实际调用的是:
内核空间提供了 kernel_restart 处理函数,响应用户空间的 reboot 请求。其处理流程主要包括:
-
向关心 reboot 过程的进程发送 Notify 事件; -
调用 drivers 核心模块提供的接口,关闭所有的外部设备; -
调用 drivers syscore 模块提供的接口,关闭 system core; -
调用 Architecture 相关的处理函数,进行后续的处理; -
紧接着执行了 machine_power_off 函数。
我们在 machine_power_off 函数中可以看到,如果 pm_power_off 这个函数指针不为空,那么系统就会通过调用这个函数进行关机。
实际上 pm_power_off 函数指向了 gpio-poweroff.c 中的 gpio_poweroff_do_poweroff 函数,在此函数中去实际操作 GPIO 。
整个关机流程会依次进行如下调用:
-->kernel_power_off()
-->kernel_shutdown_prepare
-->migrate_to_reboot_cpu
-->syscore_shutdown
-->machine_power_off // 该函数根据具体平台而定,riscv 平台在 arch/riscv/kernel/reset.c 文件中
Hifive Unmatched 开发板中的 SiFive FU740 芯片将 GPIO2 口用作关机使用,我们只需要给 GPIO2 发送低电平脉冲即可实现关机,具体流程如下:
首先要更改内核源码中对应开发板的设备树文件,在内核源码中的 /arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dts 文件,向其中增加关机设备节点:
gpio-poweroff {
compatible = "gpio-poweroff";
gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
}
其次,需要在内核中相应的驱动代码中将设备树节点与驱动匹配。
将设备节点与驱动相匹配后,当用户发起关机请求,经过上述关机流程,最后控制硬件完成关机断电的操作。
以上即为 Hifive Unmatched 开发板的整体关机流程,感兴趣的小伙伴,赶紧到优麒麟官网下载体验吧。
|