Android深度探索HAL读书笔记8

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android深度探索HAL读书笔记8相关的知识,希望对你有一定的参考价值。

看了本书第八章,我学习到了:

  1. 蜂鸣器是开发板自带的一个硬件设备,控制蜂鸣器发声是通过向寄存器写入特定的值实现的。PWM驱动不同于LED 驱动,其由多个文件组成,在编译时将这些文件进行联合编译。
  2. 蜂鸣器也称为PWM(脉冲宽度调制),基本原理是通过脉冲来控制蜂鸣器的打开和停止。

 

PWM连接到了TOUT1端口,使用端口F的GPFCON寄存器进行控制。宏S3C64XX_GPFCON表示寄存器GPFCON的虚拟地址。仅用最高两位(30、31位)控制PWM。最高两位为

10时,打开PWM;为00时停止PWM。用iowrite32函数为GPFCON设置不同的值。

  1. 实现蜂鸣器驱动:PWM驱动由pwm.c、pwm_fun.c、pwm_fun.h组成。

编译PWM驱动的Makefile:obj-m :=pwm_driver.o  pwm_driver-objs :=pwm.o pwm_file

将两个.c文件链接成pwm_driver.o,最后生成 .ko 文件。执行build.sh脚本文件安装pwm

驱动,再测试pwm驱动,使其发出声音。

  1. Linux驱动的代码重用:Linux驱动分成多个文件,这些文件中的数据结构、函数代码可以被多个驱动使用。

静态重用:采用c语言方式,include文件即可。动态重用:一个linux驱动使用另一个驱动中的函数、变量、宏等。

  1. 编译是由多个文件组成的linux驱动。c/c++语言编译多个源码文件时,若1.c使用了2.c的函数,需要在1.c中用extern预先定义1.c的函数,extern只在编译阶段起作用,可省略;或使用2.h定义2.c的函数,然后在1.c中include”2.h”。若linux驱动仅有一个源代码文件,Makefile文件中obj-m的值可以和源码文件同名。
  2. 代码共享的方式:模块依赖(导出符号),即在一个驱动模块里使用另一个驱动模块里的被导出的符号(常量、变量、函数)export。

depmod命令用于分析linux模块之间的依赖性,需要指定所有相关的linux模块文件名(绝对路径),在modules.dep文件中使用“:”确定了各模块的依赖关系,之后用modprobe命令装载linux模块。

  1. 强行卸载驱动:

①   初始化函数崩溃时:引用计数器的值和引用者不一致,只需将当前的linux驱动模块的引用计数器清零。使用两个函数:try_module_get(struct module *module)、module_put(struct module *module)

②   卸载函数被阻塞时:问题根源是卸载函数,只需将原来的卸载函数替换成一个空的卸载函数即可。

以上两种情况都需要获取module结构体指针,该结构体表示了linux驱动的相关信息。

执行 cat /proc/kallsysms | grep _this_module | grep bad_driver1获取该驱动结构体的首地址。

由于module结构体的地址在内核空间,只能编写linux驱动(force_kill_driver)来卸载另一个驱动。

为了实现工作自动化,编写一个build.sh脚本文件来自动查找、截取module结构体首地址,以及自动完成其他工作。将卸载驱动的命令写入该脚本文件。执行#sh build.sh卸载指定linux驱动模块。

force_kill_driver/bad_driver目录提供了两个出错的linux驱动:bad_driver1(情况一)、bad_driver2(情况二)。bad_driver目录也提供了一个build.sh脚本文件。执行该脚本文件会自动编译安装这两个出错驱动。

在安装force_kill_driver驱动来卸载这两个出错驱动时须先安装,再执行两次build.sh脚本文件完成卸载工作。

 

以上是关于Android深度探索HAL读书笔记8的主要内容,如果未能解决你的问题,请参考以下文章

Android深度探索(卷1)HAL与驱动开发第六章读书笔记

Android深度探索HAL读书笔记9

Android深度探索--HAL与驱动开发----第九章读书笔记

Android深度探索--HAL与驱动开发----第九章读书笔记

Android深度探索读书笔记 第九章

Android深度探索--HAL与驱动开发----第十章读书笔记