Edit online

接口设计

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 */