This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于AM335x 看门狗 问题--请教TI工程师



TI 工程师 你好:

我在AM335x的板子上,omap_wdt_probe()操作执行的后期 已经omap_wdt_enable(wdev);操作,但是系统仍然不会重启,我看TRF中说是 wdt默认是

“The default state of the watchdog timer is enabled and not running”

----请问下 我如何操作才能在内核的启动初期就能让看门狗运行起来 开监控内核的是否挂死?

盼答复,谢谢!

  • hi Steven,感谢你的及时回复,不过我问的是在纯内核态下的 WDT的重启,你说是用户态代码通过IOCTL cmd来实现控制的,虽然两者本质上说操作没啥区别,但是我想做到的是在纯内核态实现WDT的溢出重启,我的操作如下(绿色字体为调整的地方),还请帮忙分析下问题出在哪边了:

    我在watchdog这个设备的 omap_wdt_probe()函数中加入如下操作来模仿用户态下的激活watchdog设备的open()动作,设置timeout时间180s,最后enable它,但是为什么180s后板子就是没有重启(你提到的文档中通过 $./saWatchdog 12 是可以的--证明硬件上市没问题的)

    static int __devinit omap_wdt_probe(struct platform_device *pdev)
    {
    struct resource *res, *mem;
    struct omap_wdt_dev *wdev;
    int ret;

    。。。。。。。

    ret = misc_register(&(wdev->omap_wdt_miscdev));
    if (ret)
    goto err_misc;

    pr_info("OMAP Watchdog Timer Rev 0x%02x: initial timeout %d sec\n",
    __raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF,
    timer_margin);



    /*Test-start*/
    //omap_wdt_enable(wdev);
    early_printk("\n---------omap_wdt_probe():start to enable config --------------\n");
    /* initialize prescaler */
    while (__raw_readl(wdev->base + OMAP_WATCHDOG_WPS) & 0x01)
    cpu_relax();

    __raw_writel((1 << 5) | (PTV << 2), wdev->base + OMAP_WATCHDOG_CNTRL);
    while (__raw_readl(wdev->base + OMAP_WATCHDOG_WPS) & 0x01)
    cpu_relax();

    //file->private_data = (void *) wdev;

    omap_wdt_set_timeout(wdev);
    omap_wdt_ping(wdev); /* trigger loading of new timeout value */
    omap_wdt_enable(wdev);
    early_printk("\n---------omap_wdt_probe():end enable config --------------\n");
    //omap_wdt_enable(wdev);

    /*Test-end*/
    pm_runtime_put_sync(wdev->dev);
    omap_wdt_dev = pdev;

    return 0;

    err_misc:
    platform_set_drvdata(pdev, NULL);
    iounmap(wdev->base);

    err_ioremap:
    wdev->base = NULL;
    kfree(wdev);

    err_kzalloc:
    release_mem_region(res->start, resource_size(res));

    err_busy:
    err_get_resource:

    return ret;
    }

  • 问题最简单的描述就是,在内核态代码中,我将WDT的timeout设置成180s,并enable了WDT,后续不再对其操作什么了,但为啥180s后 没看到重启?

  • 请问您是打算再wdt的driver里面做修改吗?也可以参考下reboot命令的实现,这个命令也是设置的wdt driver。

  • 你好,该问题解决了吗?