接口设计
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 的访问。
内部接口
函数原型 | static int aic_wdt_start(struct watchdog_device *wdt_dev) |
---|---|
功能说明 | 使能一个 Watchdog 通道(device) |
参数定义 | wdt_dev - 指向 Watchdog 设备的指针 |
返回值 | 0,成功 |
注意事项 | 如果当前通道的 Watchdog 已经是使能状态,将执行 ping 操作(喂狗)。 |
函数原型 | static int aic_wdt_stop(struct watchdog_device *wdt_dev) |
---|---|
功能说明 | 关闭一个 Watchdog 通道(device) |
参数定义 | wdt_dev - 指向 Watchdog 设备的指针 |
返回值 | 0,成功 |
注意事项 | - |
函数原型 | static int aic_wdt_ping(struct watchdog_device *wdt_dev) |
---|---|
功能说明 | 清零指定的 Watchdog 通道计数器,相当于“喂狗”操作 |
参数定义 | wdt_dev - 指向 Watchdog 设备的指针 |
返回值 | 0,成功 |
注意事项 | 需要先调用 aic_wdt_start(),再调用此接口 |
函数原型 | 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 控制器。 |
函数原型 | 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 无效将返回出错。 |
函数原型 | static int aic_wdt_restart(struct watchdog_device *wdt_dev,unsigned long action, void *data) |
---|---|
功能说明 | 用于重启整个系统(方法是设置 timeout 是 0,Watchdog 会立即触发超时重启) |
参数定义 |
|
返回值 | 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 */