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脚本文件完成卸载工作。

时间: 2024-10-09 20:22:02

Android深度探索HAL读书笔记8的相关文章

Android深度探索HAL读书笔记9

看了本书第九章,我学习到了: HAL(抽象硬件层)是建立在linux驱动之上的一套程序库,这套程序库是属于内核层之上的应用层——系统运行库层. Linux驱动代码类型:访问硬件寄存器的代码和业务逻辑代码. Linux内核采用GPL协议,该协议要求源代码必须开源,即linux驱动必须开源. Android增加HAL的目的:①避免应用程序直接访问linux驱动②保护私人财产,满足不想开源的linux驱动作者的要求,带HAL的linux驱动相当于将数据从HAL传到寄存器,即从寄存器传到HAL的“数据二

《Android深度探索》读书笔记10

看了本书第十章,我学习到了: 1.printk函数:运行在内核空间,linux驱动只能用printk来打印内核调试信息.函数原型:asmlikage int printk(const char *fmt).第一个参数表示格式字符串,后面是可变参数,第一个参数若为KERN_DEBUG和KERN_WARNING,值分别为<7>.<4>,数字表示输出的日志级别,默认为KERN_WARNING.该函数既可以将日志信息写入到日志文件,也可将日志信息写到控制台.Printk文件输出日志信息的输

Android深度探索HAL与驱动开发 第四章

Android深度探索HAL与驱动开发 第四章 源代码的下载和编译 读书笔记 一.下载编译和测试Android源代码 1.配置Android源代码下载环境 创建一个用于存放下载脚本文件的目录(可将该文件放到任何一个目录在这里使用-/bin) # mkdir ~/bin # PATH=~/bin:$PATH 2.下载repo脚本文件(用于下载Android源代码) # curl htttps://dl-ssl.google.com/dl/googlesource/git-repo/repo> ~/

Android深度探索HAL与驱动开发 第三章

Android深度探索HAL与驱动开发 第三章 Git使用入门 读书笔记 Git是对源代码进行管理的软件. 一.安装Git # apt-get install git # apt-get install git-doc git-emall git-gui gitk 用以下命令控制Git: # apt-get install git-core # apt-get install git-doc git-svn git-email git-gui gitk 二.查看Git文档 查看git-check

Android深度探索HAL与驱动开发 第二章

Android深度探索HAL与驱动开发 第二章 搭建Android开发环境 读书笔记 一.Android底层开发需要的工具 1.JDK6或以上版本 2.Eclipse3.4或以上版本 3.ADT(用于开发Android的应用程序) 4.CDT(用于开发Android NDK程序) 5.Android SDK 6.Android NDK 7.交叉编译环境 8.Linux内核源代码 9.Android源代码 10.用于调试开发板的串口工具:minicom 二.安装JDK 下载JDK后在终端输入 #

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

Google为Android加入HAL主要有如下的目的. 统一硬件的调用接口.由于HAL 有标准的调用接口,所以可以利用HAL屏蔽Linux 驱动复杂.不统一的接口. 解决了GPL版权问题.由于Linux 内核基于GPL协议,而Android 基于Apache Licence 2 . 0.协议.因此Google 玩了个“穿越“,将原本位于Linux驱动中的敏感代码向上移了一个层次.这样这些敏感代码就摆脱了GPL 协议的束缚, 那些不想开源的Linux驱动作者也就没必要开源了. 针对一些特殊的要求

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

1.1   Android拥有非常完善的系统构架可以分为四层: 第一层:Linux内核.主要包括驱动程序以及管理内存.进程.电源等资源的程序 第二层:C/C++代码库.主要包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:android SDK API 直接面向应用程序的Java APK 第四层:应用程序.直接面向最终用户的Java应用程序 1.2  Android系统移植的主要工作 Android移植可以分为应用移植和系统移植两个部分.(本书对移植没有太多的介绍) Andr

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

通过蜂鸣器的实现原理,实现一个完整的蜂呜器驱动,可以打开和关闭蜂鸣器. PWM驱动的实现方式不同于LED驱动, PWM 驱动将由多个文件组成.这也是大多数 Linux 驱动的标准实现方式. 刚开始是LED驱动的代码重用,Linux 驱动的代码重用有很多种方法.可以采用标准 C程序的方式.将要重用的代码放在其他 的文件 (在头文件中声明〉中. 如果要使用某些功能, include 相应的头文件即可〈这种方式称为 静态重用〉.也可以使用另外一种动态重用的方式,也就是一个 Linux 驱动可以使用另外

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

第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们经常用的手机类似, 也包含显示屏. 键盘. Wi-Fi. 蓝牙等模块(可 能有的是选配〉.但与手机不同的是在开发板上安装嵌入式系统要比手机容易得多.而且一般开发 扳都有很多扩展的端口,可以很容易开发定制的硬件, 并与开发板链接.因此,开发板相对于孚机 来说,更适合对程序进行测试,尤其适合对底层的 L