1.Linux驱动的代码重用

(1)编译是由多个文件组成的 Linux 驱动

    如果 Linux 驱动的代码不多,将所有的代码都放到 个文件中并没 什么不妥,但对于复杂 Linux 动,就需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理。当然,如果 Linux 驱动要使用第 方的源代码 就不得不编译多个源代码文件,最终便成.ko 文件或编 Linux 内核(估计不会有人将第 方草原代码都复制到一个文件里再进行编译)。

(2)Linux 驱动模块的依赖(导出符号)

模块依赖,也称为导出符号。如果只能用一句话解释 如何利用导出符号实现代码共卒,这句话就是“在 个驱动模块里使用另一个驱动模块里的被导出的符号(常章、变量、函数等〉”。下面就来看一下如何在一个驱动模块中调用另一个驱动模块中被导出的函数。

2.强行卸载Linux驱动

如果编写的 Ljnux 驱动程序在逻辑上是正确的,那么可以正常装载和卸载,但在某些情况下, 能某些程序会出现异常情况。这 Linux 驱动可能会无法正常卸载。

情况1:初始化函数崩溃

由于 Linux 驱动模块的初始化函数(通诠module_init 宏指定的函数〉进行了某些操作而崩溃, 从而导致初始化函数无法正常返回。这种情况的表现是当前 linux 驱动模块没用被任何其他的linux 驱动模块使用,但却显示已经被引用了一次。

使用 rmmod bad driver 命令卸载 bad driverl 时会输出如下的信息,但却找不到使用 bad_driverl 的其他 Linux 模块。

ERROR: Module bad driverl is in use

情况2:卸载函数被阻塞

在使用 rmmod 命令卸载 Linux 驱动时,系统会调用卸载函数(跑过 modu le_exit 宏指定的函数), 只有卸载函数成功返回肘, Linux 动才会被翻载。如果卸载函数被阻塞(可能是死循环、并发等 情况引起的阻塞), rmmod 命令也会被阻塞 也就是说永远不会执行到卸载 Linux 驱动模块的代码。 这种情况的表现是 执行 rmmod 命令就会停在那不动了,永远也不会返回到系统的操作提示符。

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

3.蜂鸣器(PWM)驱动

通过相应的寄存器来控制蜂鸣器的打开和关闭, 并且在实现蜂鸣器驱动时,将打开和关闭蜂鸣器的函数放到了另外的C源代码文件中。

(1)蜂呜器驱动的原理

    蜂鸣器也称为 PWM (脉冲宽度调制〉,基本原理是通过脉冲来控制蜂鸣器的打开和停止。为了方便,本书将蜂吗然统称为 PWM PWM 连接到了 TOUT1端口。

使用 端口 GPFCON 存器进行控制。该寄存器在 Lin皿内核中对应的宏是 S3C64XX PFCON,该宏表示 GPFCON 寄存器寄存器的虚拟地址。 GPFCON 只用了最高两位(30 31 位〉来控制 PWM。当最高两位为 时,打开 PWM。为 时停止 PWM。所以只需要通过 owrite3 函数为 GPFCON 寄存器设置不同的值即可。

(2)实现蜂鸣器驱动

PWM 驱动由 个文件组成 pwm.c, pwm_fun.h ,pwm_fun.c 。其中 pwm.c 是驱动主程序。 pwm_fun.h 用了相应的头文件,以及定义了些宏。 pwm fun.c 件则包含了打 和停 PWM 的两个函数(pwm_start和pwm stop )

Makefile文件的内容可以看出,编译器首先将pwm.c和pwm_fun.c 文件编译成pwm.o和pwm_fun.o ,然后再将这两个*.o。文件链接成pwm_driver.o ,最后生成 pwm_driver.ko。

(3)测试蜂鸣器驱动

1)编译和安装 PWM 驱动

2)后进入开发板终端的 Idata/local 目录

3)# ./ioctl /dev/pwm_dev 1 0 //打开pwm

4)# ./ioccl /dev/pwm_dev O O //关闭pwm

posted on 2016-07-08 10:56  花糜海棠  阅读(180)  评论(0编辑  收藏  举报