4.7.5. 设计说明
4.7.5.1. 源码说明
源代码位于:
WRI V1.0: drivers/misc/zx-wri.c
4.7.5.2. 关键流程设计
4.7.5.2.1. Reboot Reason 的设计
WRI 模块需要和RTC模块的SYS_BAK 寄存器一起配合来完成Boot reason的处理:
- WRI
负责记录 硬件可监测 到的Reboot原因,如过温保护、看门狗复位、外部输入复位等;
- SYS_BAK
负责记录 软件可监测 到的Reboot原因,如Suspend、Panic、进入烧写模式、正常重启等。
关于Reboot原因,梳理分类如下:
小技巧
其中“外部IO复位”指常用的Reset按键。
所以,定义 SYS_BAK0寄存器(4~7bit) 的值如下:(详见include/linux/reboot-reason.h)
enum aic_reboot_reason {
REBOOT_REASON_COLD = 0,
REBOOT_REASON_CMD_REBOOT = 1,
REBOOT_REASON_CMD_SHUTDOWN = 2,
REBOOT_REASON_SUSPEND = 3,
REBOOT_REASON_UPGRADE = 4,
REBOOT_REASON_FASTBOOT = 5,
/* Some software exception reason */
REBOOT_REASON_SW_LOCKUP = 8,
REBOOT_REASON_HW_LOCKUP = 9,
REBOOT_REASON_PANIC = 10,
REBOOT_REASON_RAMDUMP = 11,
/* Some hardware exception reason */
REBOOT_REASON_RTC = 17,
REBOOT_REASON_EXTEND = 18,
REBOOT_REASON_DM = 19,
REBOOT_REASON_OTP = 20,
REBOOT_REASON_UNDER_VOL = 21,
};
针对不同场景,SYS_BAK0寄存器中的Reboot reason 和 WRI中的RST_FLAG值对应如下:
场景 |
触发行为 |
WRI状态 |
SYS_BAK状态值 |
---|---|---|---|
正常 重启 |
按Reset按键 |
EXT_RST |
COLD |
shell中执行reboot命令 |
WDOG_RST |
CMD_REBOOT |
|
shell执行aicupg命令进入烧写 |
WDOG_RST |
UPGRADE |
|
正常 关机 |
长按PowerOn按键 |
SYS_POR |
COLD |
shell中执行poweroff命令 |
SYS_POR |
CMD_SHUTDOWN |
|
进入深度休眠状态 |
SYS_POR |
SUSPEND |
|
异常 重启 |
过温保护 |
OTP |
COLD |
通过Jtag执行reset命令 |
DM_RST |
COLD |
|
RTC模块断电 |
RTC_POR |
COLD |
|
内核中发生SW Lock |
WDOG_RST |
SW_LOCKUP |
|
内核中发生HW Lock |
WDOG_RST |
HW_LOCKUP |
|
内核中发生Panic |
WDOG_RST |
PANIC |
|
内核中触发进入Ramdump |
WDOG_RST |
RAMDUMP |
|
电源电压不稳定 |
CMP_RST |
COLD |
备注
其中“按Reset按键”的情况,因为软件来不及设置SYS_BAK,所以是初始值0 (COLD)。
4.7.5.3. 数据结构设计
4.7.5.3.1. aic_wri_dev
记录WRI控制器的配置信息:
struct aic_wri_dev {
struct attribute_group attrs;
struct platform_device *pdev;
struct device *dev;
void __iomem *regs;
};
4.7.5.3.2. enum aic_warm_reset_type
定义WRI模块的暖复位类型
enum aic_warm_reset_type {
WRI_TYPE_POR = 0,
WRI_TYPE_RTC,
WRI_TYPE_EXT,
WRI_TYPE_DM,
WRI_TYPE_WDOG,
WRI_TYPE_OTP,
WRI_TYPE_CMP,
WRI_TYPE_MAX
};
4.7.5.4. 接口设计
4.7.5.4.1. 外部接口
4.7.5.4.2. WRI 相关的内部接口
4.7.5.4.2.1. aic_hw_type_get
函数原型 |
enum aic_warm_reset_type aic_hw_type_get(void __iomem *regs) |
---|---|
功能说明 |
读取上一次reboot硬件原因 |
参数定义 |
regs - 指向WRI寄存器的指针 |
返回值 |
暖复位原因类型 |
注意事项 |
4.7.5.4.2.2. aic_judge_reboot_reason
函数原型 |
enum aic_reboot_reason aic_judge_reboot_reason(enum aic_warm_reset_type hw, enum aic_reboot_reason sw) |
---|---|
功能说明 |
分析判断reboot原因 |
参数定义 |
hw- 硬件监测的reboot原因
sw - 软件监测的reboot原因
|
返回值 |
reboot原因类型 |
注意事项 |
判断依据是WRI模块、RTC模块SYS_BAK寄存器中的两处reboot信息 |
4.7.5.4.2.3. aic_set_reboot_reason
函数原型 |
void aic_set_reboot_reason(enum aic_reboot_reason reason) |
---|---|
功能说明 |
设置Reboot reason到RTC模块的SYS_BAK寄存器 |
参数定义 |
reason - aic_reboot_reason类型的启动原因 |
返回值 |
无 |
注意事项 |