RK平台外接LPC804硬件看门狗适配全解析|内核驱动+Android守护进程完整方案

烽融爱财 阅读:14482 2026-10-13

工业设备无人值守场景,单纯 SoC 内部看门狗存在短板:当 RK 主控内核彻底死机、总线挂死时,内部 WDT 可能失效。采用独立 MCU 做外部硬件看门狗,是高可靠产品的经典设计。

本文基于 NXP LPC804 Cortex-M0+ MCU,详解在 RK3568 Android 15 平台上的完整适配流程,包含硬件原理、设备树、内核驱动、Android 用户态守护进程、SELinux 权限、流程图与调试踩坑总结。


一、方案背景:为什么选 LPC804 做外部硬件看门狗

RK 系列 SoC 自带片内看门狗,但片内 WDT 依赖内核正常运行。如果 AHB 总线、内核彻底锁死,内部看门狗模块有可能停止工作,无法完成复位动作。

LPC804 是 NXP 低成本 Cortex-M0+ MCU(32KB Flash / 4KB SRAM),支持 I2C 通信,可独立运行看门狗逻辑,完全脱离 RK 主控运行:即便 RK 主控完全死机、I2C 总线卡死,只要 LPC804 供电正常,超时后就输出复位信号复位 RK 主控,实现真正硬件级故障保护。

LPC804 看门狗逻辑分为两个工作模式:

Boot 模式(启动模式):设备上电后默认处于 Boot 模式,运行启动定时器(boot_timer),给 RK 平台留出完整开机时间,避免开机过程误复位。

Oper 模式(工作模式):RK 系统完全启动完成,发送 boot_finish 命令切换到此模式,开始运行业务定时器(oper_timer),RK 平台需要定时喂狗;超过设定时间没有喂狗,LPC804 输出复位信号复位 RK 主控。

硬件连接要点:

  • LPC804 I2C 引脚接到 RK 的 I2C3 总线,I2C 从设备地址0x48
  • LPC804 复位输出引脚接到 RK 主控的系统复位脚
  • LPC804 独立供电,保证 RK 主控死机不掉电

二、整体软件架构

整套适配分为三层:

① 内核驱动层lpc804_wdt.c

I2C 设备驱动,封装寄存器读写,通过 sysfs 节点向用户空间暴露 status、control、feed_watchdog、oper_timer 等接口,同时注册 misc 字符设备与 reboot notifier。

② Android 用户态守护脚本hw_wdt_guard.sh

开机完成后启动,完成芯片就绪检测、使能看门狗、配置业务超时时间、切换 Oper 模式,之后循环定时喂狗,并在每次喂狗前复核运行模式。

③ Android 构建 / 权限层

rootdir.mk拷贝脚本 ·init.rk30board.rc配置服务启动时机 ·sepolicy配置脚本域与 sysfs 访问权限。

系统完整启动时序:

① 上电 —— LPC804 复位进入 Boot 模式 ,boot_timer 开始倒计时(默认给开机预留充足时间) ↓ ② BootROM → kernel 启动 → i2c3 总线枚举到 3-0048 , hwwatchdog 驱动 probe 成功,创建 sysfs 节点 ↓ ③ Android 启动 → sys.boot_completed=1 ↓ ④ init 执行 chmod 放开各 sysfs 节点权限, start hw_wdt_guard ↓ ⑤ 守护脚本:等芯片就绪 → hwd_state=1 使能 → 设置 oper_timer=300s 并使能 ↓ ⑥ 写 boot_finish=1 ,LPC804 切到 Oper 模式 (mode=1),boot_timer 交棒给 oper_timer ↓ ⑦ 进入喂狗死循环:每 180s 写一次 feed_watchdog ,超时 300s 未喂则 LPC804 复位 RK 主控

关键参数说明:

  • oper_timer :业务看门狗超时时间,本案例设置 300s(5 分钟)
  • FEED_INTERVAL :喂狗间隔 180s(3 分钟),必须小于超时时间,预留容错窗口

三、内核部分适配(RK 6.1 内核)

3.1 修改 DTS 设备树配置

在kernel-6.1/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi的&i2c3节点下挂载 hwwatchdog 设备,I2C 地址 0x48:

DTS &i2c3 {

status = "okay";

hw_wdt:hw_wdt@48 {

compatible = "hwwatchdog";

status = "okay";

reg = <0x48>;

pinctrl-names = "default";

};

};

同时新增一路 GPIO 配置,把 PC5 拉成高阻态(regulator-fixed+pcfg_pull_none),避免 RK 上电时误拉低 LPC804 的复位/使能脚:

DTS gpio0_c5_pin: gpio0-c5-pin {

compatible = "regulator-fixed";

regulator-name = "gpio0_c5_pin";

pinctrl-names = "default";

pinctrl-0 = <&gpio0_c5_hiz>;

regulator-always-on;

regulator-boot-on;

};

/* pinctrl 节点内 */

gpio0_c5_hiz: gpio0-c5-hiz {

rockchip,pins = <0 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;

};

3.2 修改 Makefile

kernel-6.1/drivers/misc/mcu/Makefile中把原来的 msp430 驱动换成 lpc804 驱动:

Makefile -obj-y += msp430_watchdog.o

+obj-y += lpc804_wdt.o

说明:本驱动是从项目原有的msp430_watchdog.c移植改名而来,所以源码里函数名、结构体名仍保留msp430_*前缀,文件头注释也还留着上一版模板的 Intel 版权信息——阅读代码时不必困惑,以实际实现为准。

3.3 驱动设计与 sysfs 节点

新增的lpc804_wdt.c基于 I2C SMBus 读写(i2c_smbus_read_word_data/write_word_data),寄存器定义在lpc804_wdt.h:

C #defineREG_STATUS 0x00 /* bit[7:0]=版本号 bit[9:8]=模式 */

#defineREG_CONTROL 0x01 /* bit0=HWD使能 bit1=boot_timer使能 bit2=oper_timer使能 */

#defineREG_BOOT_TIMER 0x02 /* boot 超时,单位 4s/字 */

#defineREG_OPER_TIMER 0x03 /* oper 超时,单位 1s */

#defineREG_COOL_TIMER 0x04 /* 冷却定时器,复位后最短静默时间 */

#defineREG_SPECIAL 0x05 /* 特殊命令字 */

/* 特殊命令 */

#defineCMD_KEEP_ALIVE 0x5555 /* 喂狗 */

#defineCMD_RESET_DEFAULT 0xAAAA /* 恢复出厂设置 */

#defineCMD_BOOT_DONE 0x8477 /* Boot -> Oper 模式切换 */

#defineCMD_SHUT_NOW 0x0322

#defineCMD_TO_BOOT_MODE 0x0333 /* 切回 Boot 模式 */

驱动创建的 sysfs 节点位于/sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/:

节点 读写 作用
status RO 芯片版本号 + 当前运行模式(Boot/Oper/Cool/Stop)
control RO 控制寄存器:HWD 使能位、boot/oper 定时器使能位
hwd_state RW 看门狗总开关,写 1 开启硬件看门狗
oper_timer RW Oper 模式超时秒数(上限 600s)
oper_timer_enable RW 业务定时器使能
boot_timer /boot_timer_enable RW 启动定时器时长与使能(上限 86400s)
cool_timer RW 复位冷却时间(下限 5s,上限 60s)
boot_finish WO 写 1,命令 LPC804 从 Boot 切到 Oper 模式
feed_watchdog WO 写 1 执行喂狗(下发 CMD_KEEP_ALIVE=0x5555)
reset_default WO 写 1 恢复 LPC804 出厂参数

注意status和control读出来是带说明文字的复合字符串,不是纯数字:

0x0303 (ver=3, mode=1)、0x0005 (hwd=1, boot_en=0, oper_en=1)。

shell 脚本里必须先抠出0x…再做进制转换,详见 4.1 与第六章踩坑。hwd_state、oper_timer等其余节点是纯数字,可以直接用。

驱动设计要点

本项目不在内核线程做自动喂狗(KEEP_ALIVE_IN_KERNEL 0),喂狗逻辑全部交给 Android 用户空间守护脚本。

优势:不仅监控内核是否存活,同时监控 Android 用户态系统是否正常。如果 Android 系统卡死、init 进程挂掉,守护脚本停止喂狗,LPC804 依然会触发复位——这是纯内核喂狗方案做不到的。

3.4 容易被忽略的两块内核机制

除了 sysfs,驱动里还实现了两个关键机制,直接决定方案的可用性:

(1)Reboot Notifier —— 正常关机不误复位

驱动注册了register_reboot_notifier(),在系统SYS_DOWN / SYS_HALT / SYS_POWER_OFF时调用setToBootMode()把 LPC804 切回 Boot 模式,并停止喂狗:

C static int msp430_watchdog_notify_sys(struct notifier_block *this,

unsigned long code, void *unused)

{

printk("Set to Bootmode when reboot code =%ld, off time: %d sn",

code, schedule_off_time);

if (code == SYS_DOWN || code == SYS_HALT || code == SYS_POWER_OFF) {

if (schedule_off_time > 0) {

/* 补偿 10s/小时的时钟漂移,另加 5s 冷却 */

int off_time = schedule_off_time + (schedule_off_time / 360) + 5;

if (off_time > 86400)

off_time = 86400;

setBootTimer(g_i2c_client, off_time);

}

setToBootMode(g_i2c_client);

}

return NOTIFY_DONE;

}

这样正常关机重启不会被看门狗当成死机而反复拉起,schedule_off_time通过 ioctlHWD_IOCTL_SET_OFF_TIMER下发,用于预计断电很久的场景。

(2)misc 字符设备与 ioctl 接口

驱动同时还注册了/dev/hwwatchdog,提供一整套 ioctl 命令,供对延迟敏感的 HAL 或原生程序使用(sysfs 每次写都要走文件系统,不如 ioctl 直接):

C / ioctl HWD_IOCTL_GET_VERSION / GET_MODE / GET_HWD_STATE / GET_TIMER_STATE

HWD_IOCTL_GET_BOOT_TIMER / GET_OPER_TIMER / GET_COOL_TIMER

HWD_IOCTL_SET_HWD_STATE / SET_TIMER_STATE / SET_BOOT_TIMER

HWD_IOCTL_SET_OPER_TIMER / SET_COOL_TIMER / SET_BOOT_FINISH

HWD_IOCTL_SET_RESET_DEFAULT / SET_KEEP_ALIVE / SET_SHUT_NOW

HWD_IOCTL_SET_TO_BOOT_MODE / SET_OFF_TIMER

本文档的守护脚本走的是 sysfs 路线(可读性、调试性更好,方便现场直接cat排查);ioctl 接口作为备选通道保留。


四、Android 用户空间适配

4.1 守护脚本 hw_wdt_guard.sh

脚本路径device/rockchip/common/rootdir/hw_wdt_guard.sh,核心逻辑:

  1. 预检查 sysfs 目录与 status 节点是否存在,不存在直接报错退出
  2. 循环读取 status 节点,等待 LPC804 芯片上电就绪
  3. 设置hwd_state=1开启硬件看门狗,回读 control bit0 确认
  4. 设置oper_timer=300并开启oper_timer_enable,回读 control bit2 确认
  5. 调用switch_to_oper_mode():写 boot_finish=1,轮询直到 mode 变为 1
  6. 进入死循环,每次喂狗前先复核 mode,mode≠1 则重新切模式;正常则每 180s 写一次 feed_watchdog
wKgZO2q8RUqAGtRYAANEhxcg4ac778.png

完整脚本:

Shell #!/system/bin/sh

#

# hw_wdt_guard.sh — LPC804 hardware watchdog daemon

#

SYSFS="/sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog"

STATUS="$SYSFS/status"

CONTROL="$SYSFS/control"

BOOT_FINISH="$SYSFS/boot_finish"

FEED="$SYSFS/feed_watchdog"

OPER_TIMER="$SYSFS/oper_timer"

OPER_TIMER_ENABLE="$SYSFS/oper_timer_enable"

HWD_STATE="$SYSFS/hwd_state"

OPER_TIMER_SEC=300 # 5 minutes

FEED_INTERVAL=180 # 3 minutes

RETRY_INTERVAL=3

log() {

echo "hw_wdt_guard: $1"

# Android系统有log工具可打开下面一行

# log -t hw_wdt_guard "$1"

}

# Read status, return: RET_MODE RET_VER ; return 0 success

read_status() {

local val status_dec

val=$(cat "$STATUS" 2>/dev/null)

if [ -z "$val" ]; then

return 1

fi

local hex_val

hex_val=$(echo "$val" | grep -oE '0x[0-9a-fA-F]+' | head -1)

if [ -z "$hex_val" ]; then

return 1

fi

status_dec=$(printf '%d' "$hex_val" 2>/dev/null)

if [ -z "$status_dec" ] || [ "$status_dec" -eq 0 ] 2>/dev/null; then

return 1

fi

RET_MODE=$(( (status_dec >> 8) & 0x03 ))

RET_VER=$(( status_dec & 0xFF ))

return 0

}

# 【抽成公共函数】循环切换到Oper mode(mode=1),直到成功

switch_to_oper_mode() {

log "enter switch_to_oper_mode(), try enter Oper mode"

while true; do

if read_status; then

if [ "$RET_MODE" -eq 1 ]; then

log "switch_to_oper_mode: success, mode=1"

return 0

fi

fi

log "switch_to_oper_mode: current mode=$RET_MODE, send boot_finish=1"

echo 1 > "$BOOT_FINISH" 2>/dev/null

sleep 2

if read_status; then

log "switch_to_oper_mode after boot_finish: mode=$RET_MODE ver=$RET_VER"

if [ "$RET_MODE" -eq 1 ]; then

log "switch_to_oper_mode: success, mode=1"

return 0

fi

fi

log "switch_to_oper_mode failed, retry after ${RETRY_INTERVAL}s"

sleep $RETRY_INTERVAL

done

}

log "start"

# check sysfs exist

if [ ! -d "$SYSFS" ]; then

log "ERROR: sysfs directory not found: $SYSFS"

log "Please check if the I2C device is properly configured in DTS"

exit 1

fi

if [ ! -f "$STATUS" ]; then

log "ERROR: status file not found: $STATUS"

log "Please check if the hwwatchdog driver is loaded"

exit 1

fi

log "sysfs interface found: $SYSFS"

# --- Part1 Wait chip ready ---

while true; do

if read_status; then

log "chip ready: mode=$RET_MODE ver=$RET_VER"

break

fi

log "chip not ready, retry in ${RETRY_INTERVAL}s..."

sleep $RETRY_INTERVAL

done

# --- Part2 Enable hwd ---

while true; do

echo 1 > "$HWD_STATE" 2>/dev/null

sleep 1

ctrl=$(cat "$CONTROL" 2>/dev/null)

log "set hwd=1, control=$ctrl"

local hex_ctrl

hex_ctrl=$(echo "$ctrl" | grep -oE '0x[0-9a-fA-F]+' | head -1)

if [ -z "$hex_ctrl" ]; then

log "control read failed, retry in ${RETRY_INTERVAL}s..."

sleep $RETRY_INTERVAL

continue

fi

ctrl_dec=$(printf '%d' "$hex_ctrl" 2>/dev/null)

hwd=$(( ctrl_dec & 0x01 ))

if [ "$hwd" -eq 1 ]; then

log "hwd enabled OK"

break

fi

log "hwd not set, retry in ${RETRY_INTERVAL}s..."

sleep $RETRY_INTERVAL

done

# --- Part3 Enable oper timer ---

while true; do

echo "$OPER_TIMER_SEC" > "$OPER_TIMER" 2>/dev/null

echo 1 > "$OPER_TIMER_ENABLE" 2>/dev/null

sleep 1

ctrl=$(cat "$CONTROL" 2>/dev/null)

local hex_ctrl

hex_ctrl=$(echo "$ctrl" | grep -oE '0x[0-9a-fA-F]+' | head -1)

if [ -z "$hex_ctrl" ]; then

log "control read failed, retry in ${RETRY_INTERVAL}s..."

sleep $RETRY_INTERVAL

continue

fi

ctrl_dec=$(printf '%d' "$hex_ctrl" 2>/dev/null)

oper=$(( (ctrl_dec >> 2) & 0x01 ))

log "set oper_timer=$OPER_TIMER_SEC, enable=1, control=$ctrl, oper_bit=$oper"

if [ "$oper" -eq 1 ]; then

log "oper timer enabled OK"

break

fi

log "oper timer not set, retry in ${RETRY_INTERVAL}s..."

sleep $RETRY_INTERVAL

done

# --- Part4 switch to oper mode (初始化调用公共函数) ---

switch_to_oper_mode

# --- Part5 main feed loop【增加运行时mode检测】 ---

log "init done, start feed every ${FEED_INTERVAL}s"

while true; do

# 每次喂狗前先检查mode,异常就重试切Oper模式

if read_status; then

if [ "$RET_MODE" -ne 1 ]; then

log "RUNTIME WARN: detect mode=$RET_MODE !=1, trigger re-switch oper mode"

switch_to_oper_mode

fi

else

log "RUNTIME WARN: read_status failed, i2c maybe error, wait retry"

sleep $RETRY_INTERVAL

continue

fi

# mode确认等于1之后,才执行feed喂狗

if echo 1 > "$FEED" 2>/dev/null; then

log "feed"

else

log "WARNING: feed write failed"

fi

sleep $FEED_INTERVAL

done

4.2 init.rc 配置服务启动时机

修改device/rockchip/common/rootdir/init.rk30board.rc:

init.rc # LPC804硬件看门狗守护服务

service hw_wdt_guard /vendor/bin/hw_wdt_guard.sh

class late_start

user root

group root

disabled

# 等待系统完全启动完成后启动看门狗守护

on property:sys.boot_completed=1

restorecon /vendor/bin/hw_wdt_guard.sh

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/status

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/control

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/boot_finish

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/feed_watchdog

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/hwd_state

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/boot_timer_enable

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/oper_timer_enable

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/boot_timer

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/oper_timer

chmod 0666 /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/cool_timer

start hw_wdt_guard

两个动作必须同时做:restorecon让脚本拿到正确的 SELinux 标签后再执行,chmod放开 sysfs 节点权限。少任何一个,脚本都会静默失败。

4.3 rootdir.mk 拷贝脚本到 vendor/bin

Makefile PRODUCT_COPY_FILES +=

$(ROCKCHIP_ROOT_DIR_PATH)/hw_wdt_guard.sh:$(TARGET_COPY_OUT_VENDOR)/bin/hw_wdt_guard.sh

4.4 SELinux 权限配置

①sepolicy/vendor/file_contexts标记脚本文件上下文:

file_contexts # hw watchdog guard

/vendor/bin/hw_wdt_guard.sh uhw_wdt_guard_exec:s0

②新增hw_wdt_guard.te域策略,允许脚本访问 sysfs 节点与 log 输出:

SELinux (.te) type hw_wdt_guard, domain;

type hw_wdt_guard_exec, exec_type, vendor_file_type, file_type;

init_daemon_domain(hw_wdt_guard)

# Allow reading/writing sysfs nodes for hwwatchdog

allow hw_wdt_guard sysfs:dir r_dir_perms;

allow hw_wdt_guard sysfs:file rw_file_perms;

# Allow using log command

allow hw_wdt_guard kernel:system syslog_read;

allow hw_wdt_guard kmsg_device:chr_file { open write };


五、调试与验证方法

5.1 查看守护进程运行日志

Shell # 按 tag 过滤 logcat

logcat -s hw_wdt_guard

# 或者查看内核 dmesg,确认 i2c 驱动是否 probe 成功

dmesg | grep hwwatchdog

dmesg | grep "LPC804|msp430"

5.2 手动读取 sysfs 节点确认状态

Shell cat /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/status

cat /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/control

cat /sys/devices/platform/fe5c0000.i2c/i2c-3/3-0048/hwwatchdog/oper_timer

输出示例:

输出示例 0x0303 (ver=3, mode=1) # mode=0 Boot模式, 1 Oper模式

0x0005 (hwd=1, boot_en=0, oper_en=1)

300

确认mode=1(Oper)且hwd=1、oper_en=1,说明整条链路已经生效。

5.3 故障模拟测试

Shell stop hw_wdt_guard

# 等待 oper_timer(300s) 超时,RK 主板应自动复位

停止守护进程后等待 5 分钟,如果 LPC804 正常复位 RK 主控,说明整套看门狗链路工作正常。

注意:测试完记得恢复服务start hw_wdt_guard。


六、踩坑与注意事项

① sysfs 返回值是"数字+说明"的混合字符串,不能直接进制转换

这是本项目最容易踩的坑。status_show()用的是sprintf(buf, "0x%04x (ver=%d, mode=%d)n", ...),control_show()同理。如果脚本里直接printf '%d' "$val",shell 会因为非法数字返回 0 并报错,read_status永远返回失败,脚本卡死在"chip not ready"死循环里,看起来像硬件没就绪,实际是解析问题。

正确做法:先用grep -oE '0x[0-9a-fA-F]+' | head -1抠出十六进制串,再转换(见 4.1 脚本)。

② I2C 总线挂死风险

RK 主控彻底死机时 I2C 总线可能锁死,但 LPC804 本身独立运行,不需要依赖 I2C 接收喂狗指令就可以完成超时复位。守护脚本所有 sysfs 操作都加2>/dev/null屏蔽 IO 异常,避免脚本卡死。

③ Boot 模式不要提前切 Oper 模式

必须等 Androidsys.boot_completed=1系统完全启动后,再发送 boot_finish。如果内核刚启动就切 Oper 模式,开机过程(Android 首次启动可能长达数分钟)就会触发看门狗复位,形成复位循环。

④ 超时时间配置逻辑与上限

喂狗间隔必须小于 oper_timer 超时时间,预留容错窗口,防止偶尔 I2C 通信抖动错过喂狗。本案例 5 分钟超时、3 分钟喂狗。

注意驱动侧有硬上限:setOperTimer()里OPER_TIMER_MAX = 600,写超过 600 会被静默截断到 600;boot_timer 上限 86400s;cool_timer 会被夹到 [5, 60] 区间。想调更长超时只能改驱动宏。

⑤ SELinux 权限坑

Android 系统如果 sepolicy 权限缺失,脚本会被阻止读写 sysfs。典型现象是日志看不到任何输出、或卡在开头不动。优先检查dmesg | grep avc的拒绝日志,那里会直接告诉你缺哪条 allow。

⑥ 硬件层面

LPC804 必须独立供电;复位输出引脚硬件连接正确;LPC804 固件需要预先烧录看门狗业务固件。

特别说明:LPC804 片内自带 WWDT 只是芯片自身内部看门狗,本方案是让 LPC804 运行定制固件作为 RK 的外部看门狗,并不是直接使用 LPC804 内置 WWDT。

⑦ 正常关机与看门狗的配合

如果只做"喂狗"而不管关机流程,正常关机后 LPC804 仍在 Oper 模式等待喂狗,超时后会强行复位主控——表现为"关机后自己又开机了"。所以必须依赖驱动里的 reboot notifier 在关机时切回 Boot 模式(见 3.4),并在必要场景通过HWD_IOCTL_SET_OFF_TIMER下发预计关机时长。


七、总结

这套基于 LPC804 的 RK 平台外部硬件看门狗方案,实现了内核 + 用户态双层监控,不仅检测内核存活,同时监控 Android 用户空间系统是否正常运行,适合工控、无人值守设备等高可靠性产品。

整套方案关键点:

  • 独立 MCU 看门狗,脱离 RK SoC,真正硬件级故障复位
  • 区分 Boot 启动模式和 Oper 业务模式,解决开机误复位问题
  • 用户态 shell 守护进程,系统完全启动后才开启业务看门狗,且具备运行时模式自愈能力
  • sysfs 作为内核-用户态交互接口,调试直观;ioctl 作为高性能备选通道
  • reboot notifier 保证正常关机不被看门狗误拉起
  • 完整适配 Android SELinux、init rc、build 编译系统

适用平台:RK3568(本文 DTS 改动基于rk3568-evb.dtsi)。RK3566 等其他 RK 平台只需把&i2c3节点与 pinctrl 配置照搬到对应板级 dtsi 即可,驱动与 Android 侧改动完全通用。

本文 zblog模板 原创,转载保留链接!网址:https://www.wbaas.cn/fengrong/2430.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

排行榜