​想了解更多内容,请访问:​

​51CTO和华为官方战略合作共建的鸿蒙技术社区​

​https://harmonyos.51cto.com/#bkwz​


在鸿蒙内核的调试过程经常需要重启设备烧固件。

由于设备没有reset物理按键,需要经常长按POWER键进行强制关机,调试起来比较麻烦。

于是在shell中添加reboot命令实现类似Android设备的重启命令。

 

查找芯片手册,找到实现软件重启需要用到的寄存器

鸿蒙内核liteos_a添加reboot命令实现设备重启_鸿蒙内核

 


从Address Mapping章节找到CRU的基址:0x200000000

鸿蒙内核liteos_a添加reboot命令实现设备重启_命令行 reboot_02

寄存器CRU_GLB_SRST_FST_VALUE所在偏移量 0x0100

鸿蒙内核liteos_a添加reboot命令实现设备重启_鸿蒙内核_03

根据手册得到CRU基址+CRU_GLB_SRST_FST_VALUE寄存器 = 0x20000000 + 0x0100 = 0x20000100

0x20000100写入0xfdb9即可

转换成代码:

hmos/vendor/rockchip/rk3126c/board/include/asm/platform.h 添加寄存器宏定义

#define CRU_REG_ADDR              0x20000000

#define CRU_REG_BASE              IO_DEVICE_ADDR(CRU_REG_ADDR)

#define CRU_GLB_SRST_FST_REG_BASE IO_DEVICE_ADDR(CRU_REG_ADDR + 0x0100)

#define CRU_GLB_SRST_FST_VALUE    0xfdb9

hmos/vendor/rockchip/rk3126c/board/board.c 添加reset方法实现,写0xfdb9到reset寄存器

void reset(void){

    (*(volatile unsigned int *)(CRU_GLB_SRST_FST_REG_BASE) = (CRU_GLB_SRST_FST_VALUE));

}

hmos/kernel/liteos_a/fs/vfs/vfs_cmd/vfs_shellcmd.c 尾部添加reboot shell 命令以及对应入口函数osShellCmdReset

int osShellCmdReset(int argc, const char **argv)

{  

#if (defined(LOSCFG_PLATFORM_RK3126C))

  extern void reset(void);

  reset();

#endif  

  return 0;

}


SHELLCMD_ENTRY(reset_shellcmd, CMD_TYPE_EX, "reset", XARGS, (CmdCallBackFunc)osShellCmdReset);

SHELLCMD_ENTRY(reboot_shellcmd, CMD_TYPE_EX, "reboot", XARGS, (CmdCallBackFunc)osShellCmdReset);

编译liteos.bin并烧写,进入命令行 敲help 显示刚刚添加的两个命令reboot和reset

鸿蒙内核liteos_a添加reboot命令实现设备重启_命令行 reboot_04

输入reboot命令验证重启功能正常

鸿蒙内核liteos_a添加reboot命令实现设备重启_命令行 reboot_05

不同芯片可根据芯片手册找到对应的reset寄存器实现重启。



​想了解更多内容,请访问:​

​51CTO和华为官方战略合作共建的鸿蒙技术社区​

​https://harmonyos.51cto.com/#bkwz​


作者: tobeqj


鸿蒙内核liteos_a添加reboot命令实现设备重启_liteos_06