代码矗用分为静态和动态两种。在上 节介绍的方式是代码的静态重用,这种方式是代码级的重用,也就是将需要重用的代码和使用这些代码的使用者放在 起进行编译,最终生成 个可执行文件或程序C. ko .so 等) 8-1 测试 mu ti fi iver 驱动在本节将介绍另外 种代码共享的方式:模块依赖,也称为导出符号。如果只能用一句话解释如何利用导出符号实现代码共卒,这句话就是“在 个驱动模块里使用另 个驱动模块里的被导出的符号(常章、变量、函数等〉”
由于 ymbol_ consumer 驱动使用了 symbo I_producer 驱动中导出的符号,因此,在安装
ψnbol_ consumer 之前, 需要先安装 symbol_producer ,否则会输出如 的错误信息。
insmod: eπor inserting ’symbol_consumer.ko': -1 Unknown symbol in module
depmod 令用于分析 inux 筷块之间的依赖性,这 功能在多个 Linux 模块之间拥有复杂的依赖关系方面非常有用。使用 depmod 分析 Linux模块的依赖关系 ,就可以使用modprobe 命令装载 Lin 皿模块。 mod probe 命令全根据 depmod 命令成的 Linux 模块依赖关系来装载 Linux 模块,并不需要像使用 ins mod 命令那样挨个装载 inux 模块。
如果在模拟器或开发板上采用动态装载.ko 文件的方式测试 Linux 驱动,就算无法正常卸载 Linux 驱动,只要重新启动模拟器或开发板,动态 Linux 模坏就会从 存中卸载。
情况1 初始化函数崩溃
由于 Linux 驱动模块的初始化函数(通诠module_ init 宏指定的函数〉进行了某些操作而崩溃,从而导致初始化函数无法正常返田二这种情况的表现是当前 nux 驱动模块没用被任何其他的linux 驱动模块使用,但却显示已经被引用 一了一次。
使用 rmmo d bad driver 命令细载bad drive 时会输出如下的信息,但却找不到使用 ad_ driverl 的其他linux 模块
情况 2卸载函数被阻塞
在使用 rmmod 命令卸载 Linux 驱动时,系统会调用卸载函数(跑过 modu le_ exit 宏指定的函数),只有卸载函数成功返回肘, Linux 动才会被翻载。如果卸载函数被阻塞(可能是死循环、并发等情况引起的阻塞), rmmod 命令也会被阻塞 也就是说永远不会执行到卸载 Linux 驱动模块的代码。
首先看第 种情况。这种情况的关键是引用计数器的值和引用者不 致。实际上引用者是不存在的,因此,只需要将当前的 inux 驱动模块的引用计数器清零即可。
第2种情况的问题根源就是卸载函数,因此,只要将原来的卸载函数替换成一个空的卸载函数即可。
不管是哪种情况,都需要解决 个不可回避的问题,就是要获取表示要卸载的 Linux 驱动模块modu le 结构体指针。因为 struct module 表示了 Linux 驱动的相关信息.
pwm驱动
蜂鸣器也称为 PWM (脉冲宽度调制〉,基本原理是通过脉冲来控制蜂鸣器的打开和停止。为了方便,本书将蜂吗然统称为 PWM PWM 连接到了 TOUT 1端口
PWM使用 端口 GPFCON 存器进行控制。该寄存器在 Lin 皿内核中对应的宏是S3C64XX PF CON ,该宏表示 GPFCON 寄存器寄存器的虚拟地址。 GPFCON 只用了最高两位( 3031 位〉来控制 PWM 。当最高两位为 时,打开 PWM 。为 时停止 PWM 。所以只需要通过 owrite3函数为 GPFCON 寄存器设置不同的值即可。