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的处理:

  1. WRI

    负责记录 硬件可监测 到的Reboot原因,如过温保护、看门狗复位、外部输入复位等;

  2. SYS_BAK

    负责记录 软件可监测 到的Reboot原因,如Suspend、Panic、进入烧写模式、正常重启等。

关于Reboot原因,梳理分类如下:

../../../_images/reboot_reason1.png

图 4.27 各种情况的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类型的启动原因

返回值

注意事项