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.

请教DM8168的看门狗驱动omap_wdt.c问题



请问DM8168的看门狗驱动omap_wdt.c中ioctl函数中的参数都表示什么意思,其中switch(cmd)中,各个case值是怎么取的,我看了下头文件它们是宏定义,但是在应用函数中怎么把参数传进来呢?

  • 你可以参考:\linux_lsp\example\watchdog\saWatchdog.c文件以及http://processors.wiki.ti.com/index.php/TI81XX_PSP_WDT_Driver_User_Guide

    下面是一个例子:

     int fd;

    void catch_int(int signum)
    {
     signal(SIGINT, catch_int);

     printf("In signal handler\n");
     if(0 != close(fd))
      printf("Close failed in signal handler\n");
     else
      printf("Close succeeded in signal handler\n");
    }

    int main(int argc, const char *argv[]) {
           
     int sleep_time = atoi(argv[1]); 

     int data = 0;
            int ret_val;

     signal(SIGINT, catch_int);

            fd=open("/dev/watchdog",O_WRONLY);
            if (fd==-1) {
                    perror("watchdog");
                    return 1;
            }

            ret_val = ioctl (fd, WDIOC_GETTIMEOUT, &data);
            if (ret_val) {
             printf ("\nWatchdog Timer : WDIOC_GETTIMEOUT failed");
            }
            else {
             printf ("\nCurrent timeout value is : %d seconds\n", data);
            }

     data = 10;

            ret_val = ioctl (fd, WDIOC_SETTIMEOUT, &data);
            if (ret_val) {
             printf ("\nWatchdog Timer : WDIOC_SETTIMEOUT failed");
            }
            else {
             printf ("\nNew timeout value is : %d seconds", data);
            }

            ret_val = ioctl (fd, WDIOC_GETTIMEOUT, &data);
            if (ret_val) {
             printf ("\nWatchdog Timer : WDIOC_GETTIMEOUT failed");
            }
            else {
             printf ("\nCurrent timeout value is : %d seconds\n", data);
            }

            while(1)
            {
                    if (1 != write(fd, "\0", 1))
      {
       printf("Write failed\n");
       break;
      }
      else
       printf("Write succeeded\n");

                    sleep(sleep_time);
            }

            if (0 != close (fd))
      printf("Close failed\n");
     else
      printf("Close succeeded\n");
     
     return 0;
    }

     

  • 非常感谢回复我的帖子,我还有个问题就是看门狗超时复位后在WD_OUT管脚是否会输出电平,复位是内部复位还是管脚驱动reset复位呢?我在WD_OUT管脚接了个下拉电阻,在系统复位时用示波器没有看见有电平输出,重新启动系统不正常,如果是输出电平方式复位,那么电平持续时间是多少呢?

  •    关于WDT复位,你可以参考Datasheet(http://www.ti.com/lit/gpn/tms320dm8168) 和TRM(http://www.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=sprugx8b)手册相关章节。另外需要关注以下 WDT相关的 silicon errata(http://www.ti.com/litv/pdf/sprz329d):

    Advisory 1.1.37 —Watchdog Timer (WDT): Default Timeout Period of 2 ms is Too Short.

    Advisory 2.1.65 —Watchdog Timer (WDT): Watchdog Timer Generates Reset When Enabled For First Time After
    Power-On Reset.

  • 非常感谢你的回复。我还想问一下有没有I2C的应用例程,应用函数怎样得到ACK的呢?

  • I2C驱动已经差不多了,不用麻烦了。我还想问一下SATA接口的Led驱动在Linux内核是默认支持的么,我在测试的时候发现SATA可以正常读写但是LED不亮,如果是默认支持的,在那个驱动中有体现呢?

  • 不是很确定SATA的驱动是否支持LED的驱动,但是在芯片的silicon errata看到了下面的描述:

  • 感谢回复,我想问下网口芯片采用RTL8211DG,现在有个情况就是不能和电脑直连,和交换机连接可以正常工作,直连电脑就是断线状态,我想知道这个问题有可能出在哪?附件是网口电路原理图,后缀是.SchDoc,请把改一下就可以看了

    P2_PHY.Doc
  • 网口问题可能是我电脑网卡驱动有问题,这个问题先放一边。我想问一下GPIO的边沿检测寄存器需设置的是那些比如:GPIO_IRQENABLE_CLR_1寄存器用于使能中断,但是我不太明白GPIO1_LEVELDETECT0寄存器和GPIO1_FALLINGDETECT寄存器有什么区别,FALLINGDETECT寄存器检测下降沿,那么GPIO1_LEVELDETECT0是检测是么的呢,检测低电平么,还是什么,有GPIO边沿检测程序的例子么,我还想知道进入中断函数怎么写,谢谢!!

    根据http://processors.wiki.ti.com/index.php/TI81XX_PSP_GPIO_Driver_User_Guide,GPIO是否是按顺序排列的,比如GP0[1]~GP0[31]那么GP1的32个管脚是否在函数中的值是从32到63?