第八章 让开发板发出声音:蜂鸣器驱动

1)蜂鸣器是S3C6410 开发板上带的个硬件设备。可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声。PWM驱动的实现方式不同于LED驱动,PWM驱动将有多个文件组成。这也是大多数Linux驱动的标准实现方式。也就是说个复杂的驱动不太可能将所有的代码都放在个文件中。最好将关的代码放在相应文件中。在编译 Linux 驱动时将这些文件进行联合编译。这些文件中的数据结构、函数的代码也可以被多个不同的驱动使用以这也是代码重用重要方法。

2)Linux驱动的代码重用有很多种方法。可以采用标准C程序的方式。也可以使用另一种动态重用的方式。

3)编译是由多个文件组成的Linux驱动。如果Linux驱动的代码不多,将所有的代码都放到一个文件中并么有什么不妥,但对于复杂的Linux驱动,就需要使用多个源代码文件存放不同的功能代码,这样做有利于代码的分类和管理。如果Linux驱动要使用第三方的源代码,那就么就不得不编译对个源代码文件,最终生成.ko文件或编译进Linux内核。

4)C或C++语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中的函数,extern的作用就是告诉编译器该函数的函数名、参数个数、参数类型个返回值类型。

5)最关键的一步是编写Makefile文件,形式如下

Obj-m := main.o

Multi_file_driver-y := fun.o product.o

6)代码重写分为静态和动态两种。代码共享:模块依赖,也称为导出符号。在一个驱动模块里使用另一个驱动模块里的被导出的符号。

7)使用depmod命令分析Linux模块之间的依赖关系时需要指定所有相关的Linux模块文件名。

8)强行卸载Linux驱动  本方法只能卸载由于异常情况而导致的Linux驱动模块无法卸载的情况。

(1)初始化函数崩溃

(2)卸载函数被阻塞

初始化函数崩溃。这种情况的关键是引用计数器的值和引用者不一致。实际上引用者是不存在的,因此,只需要将当前的Linux驱动模块的引用计数器清零即可。修改引用计数器可以使用下面两个函数。

Static inline int try_module_get(struct module *module)

extern void module_put(struct module *module);

卸载函数被阻塞的问题根源就是卸载函数,因此只要将原来的卸载函数替换成一个空的函数即可。

两种情况都需要解决一个不可回避的问题,就是要获取表示要卸载的Linux驱动模块的module结构体指针。因为 struct module表示了Linux驱动的相关信息。

9)蜂鸣器也称为PWM,基本原理是通过脉冲来控制蜂鸣器的打开和停止。

10)编译PWM驱动的Makefile文件的内容如下

Obj-m := pwm_driver.o

Pwm_driver-objs := pwm.o pwm_fun.o

posted on 2016-07-08 09:03  WL,  阅读(229)  评论(0编辑  收藏  举报