第8章:让开发板发出声音:蜂鸣器

一、Linux驱动的代码重用

Linux 驱动的代码重用有很多种方法。可以采用标准 C 程序的方式。将要重用的代码放在其他的文件(在头文件中声明)中。如果要使用某些功能, include 相应的头文件即可(这种方式称为静态重用)。也可以使用另外一种动态重用的方式,也就是一个 Linux 驱动可以使用另外一个Linux驱动中的资源(函数、变量、宏等)。本节将详细介绍这些代码重用方法。

  1. 编译是有多个文件组成的Linux驱动

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

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

代码重用分为静态和动态两种。在上一节介绍的方式是代码的静态重用,这种方式是代码级的重用,也就是将需要重用的代码和使用这些代码的使用者放在一起进行编译,最终生成一个可执行文件或程序库(.ko、.so等)。

在本节将介绍另外一种代码共享的方式:模块依赖,也称为导出符号。如果只能用一句话解释如何利用导出符号实现代码共卒,这句话就是“在一个驱动模块里使用另一个驱动模块里的被导出的符号(常章、变量、函数等)”。

二、强行卸载Linux驱动

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

情况1:初始化函数崩溃

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

情况2:卸载函数被阻塞

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

三、蜂鸣器(PWM)驱动实验

PWM驱动与LED驱动的实现流程类似,可能还要简单一些。在本章只是为了演示如何将一个 Linux驱动分成多个实现文件, 才使用了比较简单的PWM驱动。

总结:

通过本章的学习, 可以掌握Linux驱动常用的代码重用方式。除此之外,本章还介绍了一种强行卸载Linux驱动的方法。通过这种方法,就可免去不断重启机器的痛苦了。

时间: 2024-10-14 03:50:00

第8章:让开发板发出声音:蜂鸣器的相关文章

第8章 让开发板发出声音,蜂鸣器驱动 心得体会

第8章让开发板发出声音,蜂鸣器驱动 心得体会 通过学习Android深度探索(卷1)HAL与驱动开发的第8章 让开发板发出声音,蜂鸣器驱动,我加深对驱动的认识.以下主要是我对本节实验和参考在Linux驱动开发中使用PWM控制蜂鸣器中的一些见解. 先编写一个简单的蜂鸣器驱动程序,根据开发板上的硬件IO接口和Android驱动规范,在kernel中的driver目录中新建一个Buzzer文件,新建一个buzzer.c的源文 在目录下创建一个Makefile文件 先运行make clean命令清楚到编

第8章 让开发板发出声音,蜂鸣器驱动

第8章让开发板发出声音,蜂鸣器驱动 心得体会 在目录下创建一个Makefile文件 先运行make clean命令清楚到编译生成的一些工程文件,执行make命令,重新编译驱动程序.将编译生成的buzzer.ko内核镜像文件拷贝出来,adb push buzzer.ko /fpga/moudles 然后插入内核镜像文件到系统中,insmod buzzer.ko,并且装载设备驱动程序,mknod  /dev/buzzer c 248 0 现在就可以在库层直接编写C/C++文件来调用这个驱动程序,这个

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

这一章的主要内容是让开发板发出声音——蜂鸣器驱动,在Linux驱动开发中重点也学习了这一部分内容,同时最后我们小组的考核内容是通过中断控制蜂鸣器发七个音符的音. 这一部分中,要中断控制蜂鸣器,在中断和蜂鸣器代码的基础上进行增加.中断与蜂鸣器的代码不变,在中断的测试代码中,首先要定义七个音符,之后将开发板上的七个键与七个音符相连接,再将七个音符的转换与蜂鸣器相连接,来达到所需的效果. 核心代码: int main() { int fd,fd1; int div; int keyval; fd1 =

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

第八章介绍了一个个实验:蜂鸣器驱动,让开发板发出声音. 将介绍蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,通过该驱动可以控制蜂鸣器的打开与关闭. 蜂鸣器也称为PWM脉冲宽度调制,基本原理就是通过脉冲来控制蜂鸣器的打开和停止.蜂鸣器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出的声音.本节介绍了蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,可以打开和关闭.PWM驱动的实现方式不同于LED驱动,PWM驱动由多个文件组成,这也是大多数Linux驱动的标准实现方式. Linu

让开发板发出声音

第八章介绍了第二个实验:蜂鸣器驱动,使开发板发出声音将介绍蜂鸣器的实现原理,并实现一个完整的蜂呜器驱动,通过该驱动可以控制蜂鸣器的打开与关闭. 蜂鸣器也称为PWM脉冲宽度调制,基本原理就是通过脉冲来控制蜂鸣器的打开和停止.蜂鸣 器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出的声音.本节介绍了蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,可以打 开和关闭.PWM驱动的实现方式不同于LED驱动,PWM驱动由多个文件组成,这也是大多数Linux驱动的标准实现方式. Linu

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

蜂鸣器也称为PWM脉冲宽度调制,基本原理就是通过脉冲来控制蜂鸣器的打开和停止.蜂鸣器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出的声音.本节介绍了蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,可以打 开和关闭.PWM驱动的实现方式不同于LED驱动,PWM驱动由多个文件组成,这也是大多数Linux驱动的标准实现方式. Linux驱动的代码重用有很多种方法.分为静态重用和动态重用,静态重用是代码级的重用,就是将需要重用的代码和使用这些代码的文档放在一起编 译,最终生成一个

让开发板发出声音: 蜂鸣器驱动 读书笔记

蜂鸣器(buzzer)与 LED 类似,也是 S3C64l0 开发板上自带的一个简单的硬件.如果打开蜂鸣器,开发板会发出类似蜂鸣的尖叫声,关闭蜂鸣器则会停止尖叫声. 这一章将介绍如何通过相应的寄 存器来控制蜂鸣器的打开和关闭, 并且在实现蜂鸣器驱动时,将打开和关闭蜂鸣器的函数放到了另 外的 C源代码文件中. 从 Makefile 文件的内容可以看出,编译器 首先将pwm.c和 pwm_fun.c文件编译成 pw肌0 和 pwm_fun.o,然后再将这两个飞.文件链接成 pwm_命iver.o,最

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

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

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

蜂鸣器是 S3C6410 开发板上带的一个硬件设备.可以通过向寄存器写入特定的值来控制蜂鸣器 发出尖叫声. 这章将介绍蜂鸣器的实现原犁,并实现一个完整的蜂呜器驱动(可以打开和关闭蜂鸣 器). PWm时驱动的实现方式不同于 LED 驱动, PWM 驱动将由多个文件组成.这也是大多数 Linux 驱动的标准实现方式. 也就是说--个复杂的驱动不太可能将所有的代码都放在…个文件中.最好将 相关的代码放在相应的文件中.在编译 Linux 驱动时将这些文件进行联合编译.本节将介绍把 Linux 驱动分成多