4.7.5. 设计说明¶
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原因,梳理分类如下:
 
图 4.19 各种情况的Reboot reason梳理¶
小技巧
其中“外部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类型的启动原因 | 
| 返回值 | 无 | 
| 注意事项 |