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 // 超时喂狗,系统复位,则表明看门狗正常

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值