| |
|
开发:
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
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例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |