第八章:
1、通过蜂鸣器实现一个完整的蜂呜器驱动,可以打开和关闭蜂鸣器.。
2、PWM驱动的实现方式不同于LED驱动, PWM 驱动将由多个文件组成。
3、Linux 驱动的代码重用的方法:
1)采用标准 C程序的方式。将要重用的代码放在其他 的文件 (在头文件中声明〉中。 如果要使用某些功能, include 相应的头文件即可〈这种方式称为 静态重用〉。
2)使用另外一种动态重用的方式,也就是一个 Linux 驱动可以使用另外←个 Linux 驱动中的资源(函数、变量、宏等)。
4、强行卸载Linux驱动(只能卸载自于异常情况而导致的 Linux 驱动模块无法卸载的情况)
1)白 初始化函数崩溃
2) 卸载函数被阻塞
5、蜂鸣器驱动蜂鸣器驱动的原理蜂鸣器也称为 PWM (脉冲宽度调制〉,基本原理是通过脉冲来控制蜂鸣器的打开和停止。实现蜂鸣器驱动测试蜂鸣器驱动
6、PWM 驱动与LED驱动的原理相似
7、通过有I/O命令可以打开和停止PWM,PWM 驱动由3 个文件组成: pwm.c, pwm_fun.h 、pwm_fun.c(pwm.c 是驱动主程序;pwm_fun.h 引用了相应的头文件,以及定义了一些宏;pwm_fun.c 文件则包含了打开和停止PWM的两个函数( pwm_start 和pwm_stop ))
8、运行之后从Makefile 文件的内容可以看出,
1)首先将pwm.c 和pwm_fun.c 文件编译成pwm.o和pwm_fun.o,
2)然后再将这两个*.o文件链接成pwm_driver.o,
3)最后生成pwm_driver.ko 。
9、测试蜂鸣器驱动
1)进入/root/drivers/ioctl 目录, 执行build础脚本文件编译和上传ioctl 文件〈如果启动多个Android 设备,要选择上传到S3C6410 开发板。
2)在测试PWM 驱动之前,先要按照上一节的方法编译和安装PWM 驱动,然后进入开发板终端的Idata/local 目录, 输入打开和关闭PWM的明令 。
3)由于ioctl 命令必须要求输入I/O命令的参数,但PWM 驱动未使用I/O 命令参数。所以ioctl 最后一个命令行参数可以任意输入。执行上面的命令后,如果输出(# . / ioctl /dev/pwm_dev 1 0)的信息,并且PWM. 可以正常发出尖叫声,说明PWM 驱动测试成功。
10、Linux代码的重用:
1)在头文件中加载即可使用到原来所有的功能,还有动态方式就是一个驱动使用另一个驱动的资源。
2)对于像蜂鸣器这样的实验,它的内部文件有很多,所有要有很多的源代码以用于妥善管理。
3)有多个文件的话,module-y指定所有的文件,然后将会生成一个build.sh脚本,使用sh执行,使用dmesg查看日志信息。
4)代码重用分为静态和动态的。静态重用是生成.ko内核,动态重用是模块依赖,一个驱动使用另一个驱动模块里导出的符号。
5)重启开发板或者模拟器.ko文件就会自动消失。使用异常情况卸载(1.初始化函数卸载。2.卸载函数被阻塞)
6)卸载一个驱动,需要输入一堆命令查询module结构体的首地址,安装和下载force_kill_driver驱动。
7)蜂鸣器的驱动实现原理与LED基本相同,但是实现方式不同,因为PWM是由多个文件组成的。
8)静态函数结构体,PWM设备文件open函数,使用信号量控制在同一时刻 只能打开PWM设备文件,然后close函数释放信号量,ioctl()函数处理I/O命令,设置文件设备file_operation设备,最后在最开始初始化信号量,移除信号量。在pwm.h文件PWM_IOTCL_START打开,PWM_IOTCL_STOP停止,生成.ko文件,编译成功。
第九章
1、硬件抽象层:HAL,它是建立在Linux驱动之上的一套程序库。
2、在Android中加入HAL的目的:
1)统一硬件的调用接口
2)解决了GPL版权问题
3)针对一些特殊的要求。
3、可以利用位于用户空间的HAL代码来辅助Linux驱动完成一些工作。
4、Android HAL架构。
5、led驱动增加HAL,主要是将所有的业务逻辑从LED驱动移到HAL模块,而LED驱动只保留读写寄存器的功能。
6、HAL步骤:
1)编写Linux驱动
2)编写HAL Library
3)编写Service Library 精简LED驱动
7、编写HAL模块的步骤和原理:
1)定义结构体和宏 编写HAL模块需要使用到3个非常重要的结构体,在第一步需要定义两个新的结构体。
2)编写HAL模块的open函数 open函数是HAL模块的入口点。本例中使用的是led_device_open函数。该函数主要做如下三个工作。初始化hw_device_t的子结构体。 打开设备文件。 初始化寄存器。
3)定义hw_module_methhods_t 结构体变量
4)定义HAL_MODULE_INFO_SYM函数
5)编写HAL模块的close 函数 当HAL模块被卸载后会调用close函数
6)编写控制LED的函数
第十章
嵌入式Linux的调试技术
1、 在Linux文件系统中,/proc经常被用来作为内核空间与用户空间进行数据交换的工
2、 /proc 文件系统的行为方式与设备文件系统(/dev)类似。
3、 /proc是虚拟文件系统,也就是说,/proc并不是真正的文件系统,而是内存映射。
4、 所有读写/proc的操作都是对内存的读写。
5、 所有读写/proc文件系统的速度要远比读写/dev文件系统的速度快。
6、 /proc文件系统也可作为Linux驱动与用户空间程序交互的工具。
7、 在Linux系统中提供了一类工具。通过这些工具可以逐行跟踪程序的代码,就好像可视化开发工具的step into和step over一样。这些工具包含用于调试用户空间程序的gdb、gdbserver和调试内核空间的kgdb。
8、 对于任何一位内核代码的编写者来说,最急迫的问题之一就是如何完成调试。由于内核是一个不与特定进程相关的功能集合,所以内核代码无法轻易地放在调试器中执行,而且也很难跟踪。同样,要想复现内核代码中的错误也是相当困难的,因为这种错误可能导致整个系统崩溃,这样也就破坏了可以用来跟踪它们的现场。
9、 通过打印调试最普通的调试技术就是监视,即在应用程序编程中,在一些适当的地点调用printf显示监视信息。调试内核代码的时候,则可以用 printk 来完成相同的工作。
10、 调试内核的方法(使用调试器来一步步地跟踪代码,查看变量和计算机寄存器的值):
1) 使用gdb,gdb在探究系统内部行为时非常有用。在我们这个层次上,熟练使用调试器,需要掌握 gdb 命令、了解目标平台的汇编代码,还要具备对源代码和优化后的汇编码进行匹配的能力。
2) 使用Kgdb,kgdb 程序(使用 gdb 的远程主机 Linux 内核调试器)提供了一种使用 gdb 调试 Linux 内核的机制。kgdb 程序是内核的扩展,它让您能够在远程主机上运行gdb时连接到运行用kgdb扩展的内核机器。可以接着深入到内核中、设置断点、检查数据并进行其它操作(类似于您在应用程序上使用 gdb 的方式)。这个补丁的主要特点之一就是运行gdb的主机在引导过程中连接到目标机器(运行要被调试的内核)。这让您能够尽早开始调试。请注意,补丁为Linux内核添加了功能,所以gdb可以用来调试Linux内核。(使用kgdb需要两台机器:一台是开发机器,另一台是测试机器,一条串行线(空调制解调器电缆)将通过机器的串口连接它们)