看已适配的设备驱动代码,我一般都是从设备注册入口开始看,之后再从对接框架所需的函数指针结构体中寻找对应的暴露给框架的实现,分析此模块也不例外。
代码分析
注册入口
static struct rt_watchdog_device ra_wdt_dev; static struct rt_watchdog_ops ops; int rt_wdt_init(void) { ops.init = &wdt_init; ops.control = &wdt_control; ra_wdt_dev.ops = &ops; /* register watchdog device */ if (rt_hw_watchdog_register(&ra_wdt_dev, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK) { LOG_E("wdt device register failed."); return -RT_ERROR; } LOG_D("wdt device register success."); return RT_EOK; } INIT_BOARD_EXPORT(rt_wdt_init);
从注册入口上看,瑞萨还是沿用了设备注册那套逻辑,唯一的区别是ops改成了初始化时动态指定了,这个地方可以稍微优化下,毕竟ops这个结构体可以变成静态全局变量,不必占用ram资源。
初始化入口
static rt_err_t wdt_init(rt_watchdog_t *wdt) { return RT_EOK; }
这入口并没有实现任何功能,也能理解,也就是说,瑞萨很可能把初始化放在控制函数中实现了。
控制入口
static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg) { rt_err_t ret = -RT_ERROR; struct st_wdt_timeout_values *wdt_value = {0}; switch (cmd) { /* feed the watchdog */ case RT_DEVICE_CTRL_WDT_KEEPALIVE: if (R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS) { LOG_E("watch dog keepalive fail."); ret = -RT_ERROR; } else { ret = RT_EOK; } break; /* set watchdog timeout */ case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: /**< set*/ LOG_W("Use the FSP tool to modify the configuration parameters!"); ret = -RT_EINVAL; break; case RT_DEVICE_CTRL_WDT_GET_TIMEOUT: wdt_value = (struct st_wdt_timeout_values *)arg; if (R_WDT_TimeoutGet(&g_wdt_ctrl, wdt_value) != FSP_SUCCESS) { LOG_E("wdt get timeout failed."); ret = -RT_ERROR; } else { ret = RT_EOK; } break; case RT_DEVICE_CTRL_WDT_START: if (R_WDT_Open(&g_wdt_ctrl, &g_wdt_cfg) == FSP_SUCCESS) { if (R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS) { LOG_E("wdt start failed."); ret = -RT_ERROR; } else { ret = RT_EOK; } } else { LOG_E("wdt start failed."); ret = -RT_ERROR; } break; default: LOG_W("This command is not supported."); ret = -RT_ERROR; } return ret; }
从控制入口来看,确实瑞萨已适配的驱动把初始化放在了此处,对应接口为RT_DEVICE_CTRL_WDT_START。另外,从函数实现上看,目前驱动并不支持动态设置看萌购超时时间的功能,仅仅支持基本的刷新看门狗和获取看门狗剩余时间的功能。有这几个接口,看门狗的基本功能是有了。
总结
从驱动实现上看,瑞萨已适配的看门狗框架代码,仅仅是到能用的程度,若正式项目需要做更加精细化的调整,则需要自行修改看门狗驱动代码了。