5

RISC-V开发板关机流程浅析

 2 years ago
source link: https://www.ubuntukylin.com/news/1754-cn.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

RISC-V开发板关机流程浅析

2022-03-30 09:21:35

43

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 = ;
}

其次,需要在内核中相应的驱动代码中将设备树节点与驱动匹配。

优麒麟

将设备节点与驱动相匹配后,当用户发起关机请求,经过上述关机流程,最后控制硬件完成关机断电的操作。

以上即为 Hifive Unmatched 开发板的整体关机流程,感兴趣的小伙伴,赶紧到优麒麟官网下载体验吧。

通讯员:李剑峰

来源:终端研发

审核:优麒麟社区


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK