Android深度探索——第八章读书笔记及心得
蜂鸣器驱动
——第8章读书笔记及心得
通过本章的学习,学会了pwm的驱动实验,知道了蜂鸣器实现的原理。蜂鸣器是开发板上的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声。本实验将linux驱动区分成了多个实现文件。学会了编写Makefile文件。知道了linux驱动模块的依赖。通过实验学会了linux驱动常用的代码重用方式及强行卸载linux驱动的方法。
在C语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中的函数,extern的作用就是告诉编译器该函数的函数名、参数个数、参数类型和返回值类型。这些信息用以将a.c编译成a.o。将a.o和b.o连接成可执行文件或程序库时,编译器再到b.o中寻找函数的具体实现。所以extern只在编译阶段起作用。
在编译时,最关键的一步是编写Makefile文件。该文件的代码如下:
Obj-m := multi_file_driver.o
Multi_file_driver-objs :=main.o fun.o product.
其中在multi_file_driver目录中有一个build.sh的脚本文件,用于编译和测试示例。命令为:#sh build.sh。执行成功后可以使用demesg查看命令日志信息。
代码重用分为静态和动态两种。静态重用是代码级的重用,需要将重用的代码和使用者放在一起进行编译。最后生成可执行的文件或程序库。模块依赖(到处符号)是另一种代码共享。在linux驱动中可以实现宏导出的函数有两个为EXPORT_SYMBOL和EXPORT_SYMOL_GPL(该函数仅用于GPL协议的linux驱动模块中)。
当linux驱动模块没有被正常引用导致的linux驱动无法正常卸载,无法使用rmmod。卸载失败可能的两种原因:1、初始化函数崩溃,2、卸载函数被阻塞。当初始化函数崩溃时,需要将linux驱动模块的引用函数清零。可利用的函数“static inline try_module_get(struct module *module)”和“extern void module_put(struct module *module)”。当卸载函数被阻塞时,需要将原来的卸载函数替换成一个空的卸载函数即可。
蜂鸣器(脉冲宽度调制),基本原理是通过脉冲来控制蜂鸣器的打开和停止。