原因是因为 watchdog 生效的时候,产生的 reset 信号,只有 2.5us 左右,太短了,导致 LAN8710a 未完全重启
在 kernel watchdog 里面增加下面的代码即可
86 static void omap_wdt_enable(struct omap_wdt_dev *wdev)
87 {
88 void __iomem *base = wdev->base;
89 static void *prm_reg_mem;
90
// 增加下面控制寄存器的代码,意思就是将 reset 下拉时间延长
91 #define PRM_REG_MEM 0x44E00F00
92
93 if (!request_mem_region(PRM_REG_MEM, 8, "prm_reg_mem")){
94 printk("request mem error\n");
95 goto JUMP;
96 }
97 prm_reg_mem = ioremap(PRM_REG_MEM, 8);
98
99 __raw_writel(0xff, prm_reg_mem + 4);
100 /* __raw_writel(0x1, prm_reg_mem); */
101 /* reset code */
102
103 iounmap(prm_reg_mem);
104 release_mem_region(PRM_REG_MEM, 8);
105
106 JUMP:
107 /* Sequence to enable the watchdog */
108 __raw_writel(0xBBBB, base + OMAP_WATCHDOG_SPR);
109 while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10)
// ...
参考335x datasheet 里面的如下
![991711-20180620181828810-1611977650.png](https://i-blog.csdnimg.cn/blog_migrate/31d74beffe0b67e63323645d9f2edfe9.png)
寄存器地址如下
![991711-20180620181906560-734864994.png](https://i-blog.csdnimg.cn/blog_migrate/a2e3aa8d33eb695204ee1ef34d2269f4.png)
kernel 内怎么直接操作请参考上面的代码
第一步, 申请: request_mem_region
第二步: 映射 : ioremap
后面就是写,解除映射,释放申请