第八章

蜂鸣器是S3C6410 开发板上带的一个硬件设备。可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声。4:节将介绍蜂鸣器的实现原犁,并实现一个完整的蜂呜器驱动(可以打开和关闭蜂鸣器). PW时驱动的实现方式不同于LED 驱动, PWM 驱动将由多个文件组成。这也是大多数Linux驱动的标准实现方式. 也就是说- -个复杂的驱动不太可能将所有的代码都放在一个文件中。最好将相关的代码放在相应的文件中。在编译Linux 驱动时将这些文件进行联合编译.

当开发一个Linux 驱动时, 有可能会在init、exit 等函数中发生错误,这时Linux 驱动可能会安装失败,更糟糕的是无法使用rmmod 命令正常卸载Linux 驱动,这也就会造成无法再次安装的窘境。当然,遇到这种情况,重启机器就可以解决了。但每次都要重启机器, 实在太麻烦了。在遇到无法卸载Linux 驱动时通过直接修改Linux 驱动相应的内存地址删除Linux 驱动, 避免了重启机器的麻烦。

  PWM 驱动由3 个文件组成: pwm.c, pwm_fun.h 、pwm_fun.c。其中pwm.c 是驱动主程序。pwm_fun.h 引用了相应的头文件,以及定义了一些宏。pwm_fun.c 文件则包含了打开和停止PWM的两个函数pwm start和pwm stop .

从Makefile 文件的内容可以看出,编译器首先将pwm.c 和pwm.fun.c 文件编译成pwm.o和pwm_fun.o,然后再将这两个飞。文件链接成

pwm_命iver.o,最后生成pwm_driver.ko 。

如果编写的Linux 驱动程序在逻辑上是正确的,那么可以正常装载和卸载,但在某些情况下,可能某些程序会出现异常情况。这时Linux 驱动可能会无法正常卸载。

情况1 :初始化函数崩溃

情况2: 卸载函数被阻塞

在编写程序解决这两种情况之前,需要先了解实现原理。

首先看第1 种情况。这种情况的关键是引用计数器的值和引用者不一致。实际上引用者是不存在的,因此,只需要将当前的Linux 驱动模块的引用计数器清零即可。

第2 种情况的问题根源就是卸载函数,因此,只要将原来的卸载函数替换成一个空的卸载函数即可。

 

posted on 2016-07-04 11:34  jiazemin  阅读(130)  评论(0编辑  收藏  举报

导航