使用PXA3xx内部watchdog碰到的问题

[复制链接]
2535|0
 楼主| chenbo35 发表于 2008-11-18 15:55 | 显示全部楼层 |阅读模式
请教一下,我在linux下编写watchdog的驱动程序,使用linux内核中的sa1100-wdt.c做了修改,可是不管是修改<br />static&nbsp;int&nbsp;margin&nbsp;__initdata&nbsp;=&nbsp;60&nbsp;还是<br />#define&nbsp;OSCR_FREQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLOCK_TICK_RATE的值在不喂狗的情况下watchdog总是在60秒后reset&nbsp;究竟是什么原因呢?以下是我的程序:<br />#include&nbsp;&ltlinux/module.h&gt<br />#include&nbsp;&ltlinux/moduleparam.h&gt<br />#include&nbsp;&ltlinux/types.h&gt<br />#include&nbsp;&ltlinux/kernel.h&gt<br />#include&nbsp;&ltlinux/fs.h&gt<br />#include&nbsp;&ltlinux/miscdevice.h&gt<br />#include&nbsp;&ltlinux/init.h&gt<br /><br />#ifdef&nbsp;CONFIG_ARCH_PXA<br />#include&nbsp;&ltasm/arch/pxa-regs.h&gt<br />#endif<br /><br />#include&nbsp;&ltasm/hardware.h&gt<br />#include&nbsp;&ltasm/bitops.h&gt<br />#include&nbsp;&ltasm/uaccess.h&gt<br />//#include&nbsp;&ltasm/sa-1100.h&gt<br /><br />#define&nbsp;OSCR_FREQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3250000//CLOCK_TICK_RATE<br /><br />#define&nbsp;WDIOC_SETTIMEOUT&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;WDIOC_GETTIMEOUT&nbsp;&nbsp;&nbsp;2<br />#define&nbsp;WDIOC_KEEPALIVE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<br />//static&nbsp;unsigned&nbsp;long&nbsp;pxa3xxwdt_users;<br />unsigned&nbsp;long&nbsp;pre_margin;<br /><br />//static&nbsp;int&nbsp;boot_status;<br /><br />/*<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;Allow&nbsp;only&nbsp;one&nbsp;person&nbsp;to&nbsp;hold&nbsp;it&nbsp;open<br />&nbsp;*/<br />static&nbsp;int&nbsp;pxa3xx_watchdog_open(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*file)<br />{<br />//&nbsp;&nbsp;&nbsp;&nbsp;nonseekable_open(inode,&nbsp;file);<br />&nbsp;&nbsp;&nbsp;&nbsp;/*if&nbsp;(test_and_set_bit(1,&pxa3xxwdt_users))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-EBUSY;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Activate&nbsp;SA1100&nbsp;Watchdog&nbsp;timer&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;OSMR3&nbsp;=&nbsp;OSCR&nbsp;+&nbsp;pre_margin;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSSR&nbsp;=&nbsp;OSSR_M3;<br />&nbsp;&nbsp;&nbsp;&nbsp;OWER&nbsp;=&nbsp;OWER_WME;<br />&nbsp;&nbsp;&nbsp;&nbsp;OIER&nbsp;|=&nbsp;OIER_E3;<br />&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_EMERG&nbsp;&quot;device&nbsp;is&nbsp;open
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />/*<br />&nbsp;*&nbsp;The&nbsp;watchdog&nbsp;cannot&nbsp;be&nbsp;disabled.<br />&nbsp;*<br />&nbsp;*&nbsp;Previous&nbsp;comments&nbsp;suggested&nbsp;that&nbsp;turning&nbsp;off&nbsp;the&nbsp;interrupt&nbsp;by<br />&nbsp;*&nbsp;clearing&nbsp;OIER[E3]&nbsp;would&nbsp;prevent&nbsp;the&nbsp;watchdog&nbsp;timing&nbsp;out&nbsp;but&nbsp;this<br />&nbsp;*&nbsp;does&nbsp;not&nbsp;appear&nbsp;to&nbsp;be&nbsp;true&nbsp;(at&nbsp;least&nbsp;on&nbsp;the&nbsp;PXA255).<br />&nbsp;*/<br />static&nbsp;int&nbsp;pxa3xx_watchdog_release(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*file)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_CRIT&nbsp;&quot;WATCHDOG:&nbsp;Device&nbsp;closed&nbsp;-&nbsp;timer&nbsp;will&nbsp;not&nbsp;stop
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;OWER&nbsp;=&nbsp;~OWER_WME;<br />&nbsp;&nbsp;&nbsp;&nbsp;//clear_bit(1,&nbsp;&pxa3xxwdt_users);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />/*static&nbsp;struct&nbsp;watchdog_info&nbsp;ident&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;.options&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WDIOF_CARDRESET&nbsp;|&nbsp;WDIOF_SETTIMEOUT&nbsp;|&nbsp;WDIOF_KEEPALIVEPING,<br />&nbsp;&nbsp;&nbsp;&nbsp;.identity&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&quot;SA1100/PXA255&nbsp;Watchdog&quot;,<br />};<br />*/<br />static&nbsp;int&nbsp;pxa3xx_watchdog_ioctl(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*file,<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;cmd,&nbsp;unsigned&nbsp;long&nbsp;arg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret&nbsp;=&nbsp;-ENOTTY;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;time;<br />//&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;__user&nbsp;*argp&nbsp;=&nbsp;(void&nbsp;__user&nbsp;*)arg;<br />//&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;__user&nbsp;*p&nbsp;=&nbsp;argp;<br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(cmd)&nbsp;{<br />/*&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WDIOC_GETSUPPORT:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;copy_to_user(&arg,&nbsp;&ident,sizeof(ident))&nbsp;?&nbsp;-EFAULT&nbsp;:&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WDIOC_SETTIMEOUT:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;get_user(time,&nbsp;&arg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(time&nbsp;&lt=&nbsp;0&nbsp;||&nbsp;time&nbsp;&gt&nbsp;255)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;-EINVAL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre_margin&nbsp;=&nbsp;OSCR_FREQ*time;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSMR3&nbsp;=&nbsp;OSCR&nbsp;+&nbsp;pre_margin;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_EMERG&nbsp;&quot;pre_margin=%d
&quot;,pre_margin);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*fall&nbsp;through*/<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WDIOC_GETTIMEOUT:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;put_user(pre_margin&nbsp;/&nbsp;OSCR_FREQ,&nbsp;&arg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WDIOC_KEEPALIVE:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSMR3&nbsp;=&nbsp;OSCR&nbsp;+&nbsp;pre_margin;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />}<br /><br />static&nbsp;const&nbsp;struct&nbsp;file_operations&nbsp;pxa3xx_watchdog_fops&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;.owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;THIS_MODULE,<br />&nbsp;&nbsp;&nbsp;&nbsp;.llseek&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;no_llseek,<br />&nbsp;&nbsp;&nbsp;&nbsp;.ioctl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;pxa3xx_watchdog_ioctl,<br />&nbsp;&nbsp;&nbsp;&nbsp;.open&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;pxa3xx_watchdog_open,<br />&nbsp;&nbsp;&nbsp;&nbsp;.release&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;pxa3xx_watchdog_release,<br />};<br /><br />static&nbsp;struct&nbsp;miscdevice&nbsp;pxa3xx_watchdog_miscdev&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;.minor&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WATCHDOG_MINOR,<br />&nbsp;&nbsp;&nbsp;&nbsp;.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&quot;watchdog&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp;.fops&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&pxa3xx_watchdog_fops,<br />};<br /><br />int&nbsp;margin&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;10;&nbsp;//__initdata&nbsp;=&nbsp;60;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;(secs)&nbsp;Default&nbsp;is&nbsp;1&nbsp;minute&nbsp;*/<br /><br />static&nbsp;int&nbsp;__init&nbsp;pxa3xx_watchdog_init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;pre_margin=OSCR_FREQ&nbsp;*&nbsp;margin;<br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;misc_register(&pxa3xx_watchdog_miscdev);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_EMERG&nbsp;&quot;initial&nbsp;succeed!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />static&nbsp;void&nbsp;__exit&nbsp;pxa3xx_watchdog_exit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;misc_deregister(&pxa3xx_watchdog_miscdev);<br />}<br /><br />module_init(pxa3xx_watchdog_init);<br />module_exit(pxa3xx_watchdog_exit);<br /><br />觉得有点奇怪,请指教一下,谢谢<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部