第八章中介绍了代码编译,编译是由多个文件组成的Linux驱动。对于复杂的Linux 驱动,就需要使用多个源代码文件存放不同的功能代码,这样有利于代码的分类和管理。
实验:将 3 个.c 文件分别编译成 3 个.0 文件,并将这3 个.0 文件链接生成.ko 文件。
1.编写main.c文件,以及fun.c、product.c和product.h文件。
2.编写makefile文件
obj-m := main.o
multi_file_driver-y := fun.o product.o
3.执行#sh build.sh
4.执行dmesg命令查看日志信息。
代码共享的方式:模块依赖,也称为导出符号。利用导出符号实现代码共享就是:在一个驱动模块里使用另一个驱动模块里的被导出的符号(常量、变量、函数等)。
卸载由于异常情况而导致的Linux驱动模块无法卸载的情况:1.初始化函数崩溃2.卸载函数被阻塞。
本章还介绍了蜂鸣器的驱动程序,蜂鸣器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声。了解了蜂鸣器的实现原理,并实现了一个完整的蜂鸣器驱动。PWM驱动的实现方式不同于LED驱动,由多个文件组成。Linux驱动的代码重用有很多方式。对于复杂的linux驱动,需要使用多个源代码文件存放不同的功能代码,有利于代码分类和管理,也需要编译多个源代码文件。代码重用分为静态和动态两种。
本节中介绍了一种代码共享的方式,模块依赖。对于一些无法正常卸载的linux驱动,比如:初始化函数崩溃,卸载函数被阻塞。这是需要获取表示要卸载的linux驱动模块的module结构体指针。接下来介绍了如何通过相应的寄存器来控制蜂鸣器的打开和关闭,并且在实现蜂鸣器驱动时,将打来和关闭蜂鸣器的函数放到了另外的C源代码文件中。