IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> AM335X外部看门狗及LINUX系统驱动移植(二) -> 正文阅读

[嵌入式]AM335X外部看门狗及LINUX系统驱动移植(二)

看门狗定时器(WDT,Watch Dog Timer)是嵌入式系统的的一个组成部分,它实际上是一个计数器,一般给看门狗设置复位时间间隔,程序开始运行后看门狗开始计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗置零,重新开始计数。如果看门狗增加到设定值就认为程序没有正常工作,强制整个系统复位。

所以,当开启看门狗后,需要在看门狗超时(计数减到0)前,对其进行喂狗(复位)操作,否则看门狗会发出复位信号,当CPU接收到该信号将复位系统。

以TPL5010为例,介绍在AM335x平台上的使用,主要内容有:

1、原理简介;

2、u-boot喂狗操作;

3、linux内核驱动程序喂狗操作;

4、应用程序访问看门狗。

1.?EVB-D335 原理设计

EVB-D335的原理设计如图1-7所示,根据1.1.3节的中介绍,时间间隔(tIP)的值取决图1-5中的R129与R130的并联电阻的阻值(REXT),REXT = 11.199,查表1-3得tIP?的值为10s 。取值10s是为能保证Linux内核正常引导,当在u-boot中喂狗,距离下一次喂狗间隔时长最多不能超过20s,这个时长能正常引导Linux内核,Linux内核接管看门狗设备后在设备管理层实现“喂狗”操作,保证系统正常运行情况下复位。

另外,可以软件或硬件禁用看门狗复位信号,软硬件禁用的原理一样——使三态门处于无效状态,即EN脚置高。硬件禁用,只需接上J3跳线;软件禁用,通过操作系统内核空间或用户空间将WDG_SHDN置高,WDG_SHDN连接至GPIO3_21。

注:目前Linux内核驱动与应用程序都未使用WDG_SHDN,留待后续开发。

图1-7

2. TPL5010调试

在EVB-D335上,TPL5010复位时间间隔为10s。根据第1章的原理,若第二次TPL5010 WAKE信号的上升沿到来之前20ms,未接收到MPU发来DONE信号,系统将复位。在不同的阶段,均需要对看门的信号进行处理,其流程如图2-1所示:

图2-1

  1. u-boot中打开“CONFIG_HW_WATCHDOG”宏,使能“hw_watchdog_reset”函数在各种循环中调用喂狗。
  2. 在内核空间,使用驱动喂狗。
  3. 在user space,应用程序调用内核API操作看门狗。

3.EVB-D335简要介绍:

EVB-D335是DIM-335X/IoT-335X工控模块的评估系统,为客户提供DIM-335X/IoT-335X的原始参考设计,方便客户快速评估和应用DIM-335X/IoT-335X核心模块。

DIM-335X工控模块产品集成了?ARM Cortex-A8 1GHz(MAX) TI AM335X 处理器,该模块使用了TPS65217作为电源管理芯片,板载大容量电子盘(NAND FLASH或者EMMC),支持三种启动方式(NAND/EMMC/QSPI NOR,通过开关SW1选择),目前唯一支持GPMC总线的SODIMM模式核心板,稳定运行WindowsCE 7.0 和Linux 4.14(支持DTB)。?该核心模块使用SODIMM204接口件与工程底板相连,并带螺钉锁定,保证系统抗震性能。DIM-335X提供了3.3V I/O接口,可提供宽温的工业组件,运行于条件恶劣的工业现场!

DIM-335X核心板实物图:

EVB-D335功能图:

4. u-boot调试

据u-boot文档介绍,“CONFIG_HW_WATCHDOG”宏使能hw_watchdog_reset函数被各种循环调用,包括等待串口输入字符,板级代码中调用hw_watchdog_init函数,实现喂狗。

在EVB-D335上,函数的调用关系如图2-2:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图2-2

?代码明细如下:

① board/embfly/evb-d335/board.c?

调用板级初始化代码中,调用hw_watchdog_init函数。

② drivers/watchdog/omap_wdt.c

/* TPL5010 DONE pin , GPIO3_15 */

#define TPL5010_WATCHDOG_FEED 111

static int hw_watchdog_init_done = 0;

设置TPL5010 DONE信号的IO电平

?

设置TPL5010 DONE信号方向

代码执行流程:当定义了CONFIG_HW_WATCHDOG宏,在board.c中调用hw_watchdog_init()函数,继而调用驱动omap_wdt.c中的函数hw_watchdog_init()完成喂狗操作。

5. linux内核驱动调试

linux内核驱动由“static struct platform_driver tpl5010_wdt_driver”数据结构展开,当中probe成员最为复杂,完成了设备注册、设置、喂狗操作等。TPL5010的驱动图2-3、图2-4所示:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图2-3?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图2-4?

6.?应用程序调试

通常用户空间守护进程会通过/dev/watchdog设备通知内核空间看门狗驱动处于活跃状态,在规律的时隙中。当这些工作正常,驱动通常会告知硬件看门狗一切正常,看门将等待一段时间才复位系统。如果用户空间守护进程操作失败(RAM错误、内核bug等等),硬件看门狗将复位系统当超时发生后。

所有驱动支持基本操作,例如当打开看门狗超时不“喂狗”系统将重启。主要的API函数如下:

1、keep_alive

?这个函数简单地发送IOCTL到驱动,使得已经打开的看门狗设备不触发系统复位。

2、term

运行程序加“-d”参数禁用看门狗,或者“-e”参数使能看门狗。?

3、main

int main(int argc, char *argv[])

{

????????int flags; ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

????????unsigned int ping_rate = DEFAULT_PING_RATE; /*?#define DEFAULT_PING_RATE ??????1?, 默认ping rate为1s,若不指定“-p”参数 */

????????int ret;

????????int c;

????????int oneshot = 0;

????????setbuf(stdout, NULL);

????????fd = open("/dev/watchdog1", O_WRONLY);

????????if (fd == -1) {

????????????????printf("Watchdog device not enabled.\n");

????????????????exit(-1);

????????}

????????while ((c = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) {

????????????????switch (c) {

?case 'b':

????????????????????????flags = 0;

????????????????????????oneshot = 1;

????????????????????????ret = ioctl(fd, WDIOC_GETBOOTSTATUS, &flags); /* 获取启动状态 */

????????????????????????if (!ret)

????????????????????????????????printf("Last boot is caused by: %s.\n", (flags != 0) ?

????????????????????????????????????????"Watchdog" : "Power-On-Reset");

????????????????????????else

????????????????????????????????printf("WDIOC_GETBOOTSTATUS errno '%s'\n", strerror(errno));

????????????????????????break;

????????????????case 'd':

????????????????????????flags = WDIOS_DISABLECARD;

????????????????????????ret = ioctl(fd, WDIOC_SETOPTIONS, &flags); /* 关闭看门狗 */

????????????????????????if (!ret)

????????????????????????????????printf("Watchdog card disabled.\n");

????????????????????????else

????????????????????????????????printf("WDIOS_DISABLECARD errno '%s'\n", strerror(errno));

????????????????????????break;

????????????????case 'e':

????????????????????????flags = WDIOS_ENABLECARD;

????????????????????????ret = ioctl(fd, WDIOC_SETOPTIONS, &flags); /* 使能看门狗 */

????????????????????????if (!ret)

????????????????????????????????printf("Watchdog card enabled.\n");

????????????????????????else

????????????????????????????????printf("WDIOS_ENABLECARD errno '%s'\n", strerror(errno));

????????????????????????break;

????????????????case 'p':

????????????????????????ping_rate = strtoul(optarg, NULL, 0); /* 设置喂狗间隔 */

????????????????????????if (!ping_rate)

????????????????????????????????ping_rate = DEFAULT_PING_RATE;

????????????????????????printf("Watchdog ping rate set to %u seconds.\n", ping_rate);

????????????????????????break;

????????????????case 't':

????????????????????????flags = strtoul(optarg, NULL, 0); /* 设置超时时长 */

????????????????????????ret = ioctl(fd, WDIOC_SETTIMEOUT, &flags);

????????????????????????if (!ret)

????????????????????????????????printf("Watchdog timeout set to %u seconds.\n", flags);

????????????????????????else

????????????????????????????????printf("WDIOC_SETTIMEOUT errno '%s'\n", strerror(errno));

????????????????????????break;

????????????????default:

????????????????????????usage(argv[0]);

????????????????????????goto end;

??????????}

????????}

????????if (oneshot)

????????????????goto end;

????????printf("Watchdog Ticking Away!\n");

????????signal(SIGINT, term);

????????while (1) {

????????????????keep_alive();

????????????????sleep(ping_rate);

????????}

end:

????????ret = write(fd, &v, 1);

????????if (ret < 0)

????????????????printf("Stopping watchdog ticks failed (%d)...\n", errno);

????????close(fd);

????????return 0;

}

根据硬件设计,使能看门狗后,以10s的间隔喂狗不复位,以20s间隔喂狗复位。以此来验证看门驱动是否正常工作,在EVB-D335主板上执行:

# /embfly/watchdog.elf -e -p 10 // 系统不复位,则表明看门狗正常

# /embfly/watchdog.elf -e -p 20 // 超时喂狗,系统复位,则表明看门狗正常

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:22:07  更:2022-03-17 22:22:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:43:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码