标签:
蜂鸣器也称为PWM脉冲宽度调制,基本原理就是通过脉冲来控制蜂鸣器的打开和停止。蜂鸣器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出的声音。本节介绍了蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,可以打 开和关闭。PWM驱动的实现方式不同于LED驱动,PWM驱动由多个文件组成,这也是大多数Linux驱动的标准实现方式。
Linux驱动的代码重用有很多种方法。分为静态重用和动态重用,静态重用是代码级的重用,就是将需要重用的代码和使用这些代码的文档放在一起编 译,最终生成一个可执行的文件或程序库(.ko和.so等)。代码共享就是在一个驱动模块里使用另一个驱动模块里被导出的符号(常量、变量、函数等)。
强行卸载Linux驱动
情况1:初始化函数崩溃
由于Linux驱动模块的初始化函数进行了某些操作而崩溃,从而导致初始化函数无法正常返回,这种情况变现是当前Linux驱动模块没用被任何其他的Linux驱动模块使用,但却显示已经被应用了一次
这种情况关键是引用计数器的值和引用者不一致。只需要将当前的Linux驱动模块的引用计数器清零即可,修改计数器可以使用下面两个函数
//是module指向的Linux驱动模块的引用计数器加1,成功返回1,失败返回0
static inline int try_module_get(struct module *module);
//是module指向的Linux驱动模块的引用计数器减1
extern void module_put(struct module *module);
情况2:卸载函数被阻塞
在使用rmmod命令卸载Linux驱动时,系统会调用卸载函数,只有卸载函数成功返回时,Linux驱动才会被卸载,如果卸载函数被阻塞,rmmod命令也会被阻塞,也就是说永远不会执行到卸载Linux驱动模块的代码,这种情况的表现是一执行rmmod命令就会停在那不动了,永远也不会返回到系统的操作提示符
这种情况的问题根源就是卸载函数,只要将原来的卸载函数替换成一个空的卸载函数即可
总之,两者情况都要解决一个不可回避的问题,就是要获取表示要卸载的Linux驱动模块的module结构体指针。
蜂鸣器(pwm)驱动:蜂鸣器与LED一样也是开发板自带的简单的硬件,若打开蜂鸣器开发板会发出想蜂鸣一样的叫声,关闭就会停止尖叫。蜂鸣器驱动的原理:pwm基本原理通过脉冲来控制蜂鸣器的打开和关闭。
测试蜂鸣器驱动:pwm_fun.c则包含了打开和停止pwm的两个函数,从Makefile中可以看出,编译器首先将pwm.c和pwm_fun.c文件编译成pwm.o和pwm_fun.o,然后再将两个.o文件连接成pwm_driver.o,最后生成pwm_driver.ko,然后执行build.sh脚本文件,然后就编译成功了。
输入如下命令:
./ioctl /dev/pwm_dev 1 0
./ioctl /dev/pwm_dev 0 0
由于命令必须要求输入I/O命令的参数,而PWM驱动未使用I/O命令参数,所以ioctl最后一个命令行可以任意输入参数。如果最后显示如下信息并且蜂鸣器发出尖叫则说明测试成功!
标签:
原文地址:http://www.cnblogs.com/bigcrazy/p/5651618.html