Edit online

接口设计

15 Jul 2024
Read time: 3 minute(s)

以下接口是 Linux Watchdog 子系统需要的标准接口。

外部接口

Linux 对用户态提供了一组 Watchdog 的 ioctl 接口,用户态可以通过设备节点 /dev/watchdogX 来访问:(详见 include/upai/linux/watchdog.h
struct watchdog_info {
    __u32 options;      /* Options the card/driver supports */
    __u32 firmware_version; /* Firmware version of the card */
    __u8  identity[32]; /* Identity of the board */
};

#define WDIOC_GETSUPPORT        _IOR(WATCHDOG_IOCTL_BASE, 0, struct watchdog_info)
#define WDIOC_GETSTATUS     _IOR(WATCHDOG_IOCTL_BASE, 1, int)
#define WDIOC_GETBOOTSTATUS _IOR(WATCHDOG_IOCTL_BASE, 2, int)
#define WDIOC_GETTEMP           _IOR(WATCHDOG_IOCTL_BASE, 3, int)
#define WDIOC_SETOPTIONS        _IOR(WATCHDOG_IOCTL_BASE, 4, int)
#define WDIOC_KEEPALIVE     _IOR(WATCHDOG_IOCTL_BASE, 5, int)
#define WDIOC_SETTIMEOUT     _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define WDIOC_GETTIMEOUT     _IOR(WATCHDOG_IOCTL_BASE, 7, int)
#define WDIOC_SETPRETIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 8, int)
#define WDIOC_GETPRETIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 9, int)
#define WDIOC_GETTIMELEFT       _IOR(WATCHDOG_IOCTL_BASE, 10, int)

Demo 就是调用的这些接口 Watchdog 的访问。

内部接口

1. aic_wdt_start
函数原型 static int aic_wdt_start(struct watchdog_device *wdt_dev)
功能说明 使能一个 Watchdog 通道(device)
参数定义 wdt_dev - 指向 Watchdog 设备的指针
返回值 0,成功
注意事项 如果当前通道的 Watchdog 已经是使能状态,将执行 ping 操作(喂狗)。
2. aic_wdt_stop
函数原型 static int aic_wdt_stop(struct watchdog_device *wdt_dev)
功能说明 关闭一个 Watchdog 通道(device)
参数定义 wdt_dev - 指向 Watchdog 设备的指针
返回值 0,成功
注意事项 -
3. aic_wdt_pin
函数原型 static int aic_wdt_ping(struct watchdog_device *wdt_dev)
功能说明 清零指定的 Watchdog 通道计数器,相当于“喂狗”操作
参数定义 wdt_dev - 指向 Watchdog 设备的指针
返回值 0,成功
注意事项 需要先调用 aic_wdt_start(),再调用此接口
4. aic_wdt_set_timeout
函数原型 static int aic_wdt_set_timeout(struct watchdog_device *wdt_dev, unsigned int timeout)
功能说明 给指定的 Watchdog 设备设置一个超时
参数定义 wdt_dev - 指向 Watchdog 设备的指针 timetout - 超时的数值,单位:秒
返回值 0,成功
注意事项 1. 在 Watchdog 初始化时配置的最大、最小 timeout 参数,Watchdog Core 会去做校验,如果超出范围,将采用上一次有效的 timeout 参数值。2. clr_thd 会和 timeout 一起设置到 Watchdog 控制器。
5. aic_wdt_set_pretimeout
函数原型 static int aic_wdt_set_pretimeout(struct watchdog_device *wdt_dev,unsigned int pretimeout)
功能说明 给指定的 Watchdog 设备设置一个预超时
参数定义 wdt_dev - 指向 Watchdog 设备的指针 pretimetout - 预超时的数值,单位:秒
返回值 0,成功
注意事项 pretimeout 必须要小于该 Watchdog 通道的 timeout 参数,这个有效性检查会在 Core 中去做(所以合理的 ioctl 操作是先设置 timeout、再设置 pretimeout),如果 pretimeout 无效将返回出错。
6. aic_wdt_restart
函数原型 static int aic_wdt_restart(struct watchdog_device *wdt_dev,unsigned long action, void *data)
功能说明 用于重启整个系统(方法是设置 timeout 是 0,Watchdog 会立即触发超时重启)
参数定义
  • wdt_dev - 指向 Watchdog 设备的指针
  • action - 需要执行的操作类型(定义详见“注意事项”),目前统一按重启处理
  • data - 附加数据,暂未用到
返回值 0,成功
注意事项 -
action 的定义详见 include/linux/reboot.h
#define SYS_DOWN        0x0001  /* Notify of system down */
#define SYS_RESTART     SYS_DOWN
#define SYS_HALT            0x0002  /* Notify of system halt */
#define SYS_POWER_OFF   0x0003  /* Notify of system power off */