本文假设各位看官已经了解看门狗的工作原理,而且手上有2440的datasheet,可以随时查看看门狗相关的寄存器。我在这里仅仅专注于对驱动程序的分析,望见谅~
借用网上的朋友☆&寒 烟☆的一幅描述看门狗驱动程序的结构框图,总结得还是相当到位的,这里妄自copy如下(如有冒犯原作者请立刻通知,立删并道歉),各位可以按照结构图来按图索骥,更好地掌握驱动程序里面稍稍复杂的关系。
看过结构框图,想必对程序的构成有一个大致的认识了。下面开始贴上代码并分析之
watchdog_init & watchdog_exit
上面两个函数分别是整个驱动的入口和出口,分别完成注册platform设备和注销platform设备的动作,其操作的platform设备由结构体s3c2410wdt_driver描述,代码如下
结构体s3c2410wdt_driver
对应文章一开始的框图,上述结构体绑定了5个函数和一些自身的信息。5个函数分别实现的功能如下。
s3c2410wdt_remove
s3c2410wdt_shutdown
s3c2410wdt_suspend
s3c2410wdt_resume
s3c2410wdt_probe
留意到,当注册wdt为杂项设备时,参数里的结构体s3c2410wdt_miscdev,代码如
哈哈,看到这个东东,应该很熟悉了吧,在之前的一些列驱动里都有接触过的结构体。其中我们关注.fops,它为我们提供了若干工具函数。
s3c2410wdt_open
s3c2410wdt_release
s3c2410wdt_write
s3c2410wdt_ioctl
到这里为止,看门狗驱动函数已经全部介绍完毕,可能有朋友跟我一样,一开始会迷惑,到底看门狗算是什么设备吖。它究竟是平台设备(platform)、混杂设备(misc)、还是字符设备(char)呢。这里我摘录一段网友的解释,视点比较独特,深入浅出,摘录如下:
曾看到这样一段话,说一粒花生,如果我们把它看作字符设备,当我们煮着炖着吃了,它就成了菜中的一个混杂设备,但是了它总是从挂在花生秧的根部上的一员长来了,因此它是可以作为一个花生秧苗中一个独立的设备而存在,所以就也可以定义为一个平台设备。这说明什么呢?字符设备是对其本质的描述,说明是串行,顺序访问的(而不是缓冲随机的),混杂设备是存放这个字符设备的容器,即这个设备是被丢在使用了同一设备号的混杂设备里面,平台设备则是描述了设备的一种特性或者说属性。换句话说就是这个设备属于平台的独立模块,完全是一种附加的属性。
个人水平有限,对于本文有不妥的地方敬请各位看官提出,以免误人子弟。