Android深度探索卷1HAL与驱动开发
¥
25.62
2.6折
¥
99
八五品
仅1件
作者李宁 著
出版社人民邮电出版社
出版时间2013-01
版次1
装帧平装
上书时间2024-11-22
商品详情
- 品相描述:八五品
图书标准信息
-
作者
李宁 著
-
出版社
人民邮电出版社
-
出版时间
2013-01
-
版次
1
-
ISBN
9787115298027
-
定价
99.00元
-
装帧
平装
-
开本
16开
-
纸张
胶版纸
-
页数
637页
-
字数
969千字
-
正文语种
简体中文
- 【内容简介】
-
《Android深度探索(卷1):HAL与驱动开发》分为4篇,分别从搭建开发环境,Linux驱动和AndroidHAL的基础知识,开发Linux驱动的高级技术和分析典型的Linux驱动源代码4个方面介绍Android和Linux的底层开发。本书使用的试验环境是UbuntuLinux12.04LTS、Android模拟器和S3C6410开发板。在第1篇详细介绍了如何搭建和使用这3个试验环境。第2篇通过3个Linux驱动的完整案例(统计单词个数驱动、LED驱动和蜂鸣器驱动)从不同角度来讨论如何开发一个完整的Linux驱动。并且通过完整的案例介绍了如何编写AndroidHAL,以及如何与Linux驱动交互。第3篇则介绍了开发Linux驱动所需要的高级技术,这些技术包括并发控制、阻塞和非阻塞I/O、异步编程、Linux中断和底半部、时间管理、内存管理和I/O访问。最后一部分分析了一些典型Linux驱动的源代码(RTC驱动、LCD驱动、音频驱动、块设备驱动、网络设备驱动和USB驱动)。
《Android深度探索(卷1):HAL与驱动开发》注重理论和实践相结合。在介绍了大量的基础知识的同时,为每一个知识点提供了完整的案例,使读者可以通过实际的代码更好地理解Linux驱动和Android底层技术。
为了使读者更好地实践本书提供的实例代码,在随书光盘中除了提供源代码文件外,还提供了一个VMWareUbuntuLinux12.04LTS的虚拟环境。读者可以在Windows、Linux和MacOSX上,通过VMWare打开该虚拟机文件来学习和测试本书的例子(虚拟环境中也带了一套本书提供的例子代码)。
《Android深度探索(卷1):HAL与驱动开发》适合底层开发的程序员和编程爱好者使用,也适合作为相关培训学校的Android底层开发培训教材。
- 【作者简介】
-
拥有超过10年的软件开发经验,曾任某知名企业项目经理,对Android有深入的研究,是国内第一批Android实践者。
- 【目录】
-
第一篇Android驱动开发前的准备
第1章Android系统移植与驱动开发概述
1.1Android系统架构
1.2Android系统移植的主要工作
1.3查看Linux内核版本
1.4Linux内核版本号的定义规则
1.5如何学习Linux驱动开发
1.6Linux设备驱动
1.6.1设备驱动的发展和作用
1.6.2设备的分类及特点
1.7见识一下什么叫Linux驱动:LED
1.8小结
第2章搭建Android开发环境
2.1Android底层开发需要哪些工具
2.2安装JDK
2.3搭建Android应用程序开发环境
2.3.1安装AndroidSDK
2.3.2安装Eclipse
2.3.3安装ADT
2.3.4配置ADT
2.3.5建立AVD
2.4安装AndroidNDK开发环境
2.4.1下载AndroidNDK
2.4.2安装CDT
2.4.3命令行方式编译AndroidNDK程序
2.4.4导入AndroidNDK的例子
2.4.5配置AndroidNDK的集成开发环境
2.5安装交叉编译环境
2.6小结
第3章Git使用入门
3.1安装Git
3.2查看Git文档
3.3源代码的提交与获取
3.3.1创建版本库:gitinit
3.3.2将文件提交到本地版本库:gitcommit
3.3.3创建本地分支:gitbranch
3.3.4切换本地分支:gitcheckout
3.3.5在GitHub上创建开源项目
3.3.6上传源代码到GitHub:gitpush
3.3.7从GitHub下载源代码:gitclone
3.4小结
第4章源代码的下载和编译
4.1下载、编译和测试Android源代码
4.1.1配置Android源代码下载环境
4.1.2Android源代码目录结构解析
4.1.3下载Android源代码中的一部分
4.1.4编译Android源代码
4.1.5out目录结构分析
4.1.6将自己的APK作为Android内置程序发布
4.1.7用模拟器测试system.img文件
4.2下载和编译Linux内核源代码
4.2.1下载Linux内核源代码
4.2.2Linux内核源代码的目录结构
4.2.3安装Android内核的编译环境
4.2.4配置和编译Linux内核
4.3小结
第5章搭建S3C6410开发板的测试环境
5.1S3C6410开发板简介
5.2安装串口调试工具:minicom
5.3烧写Android系统
5.4配置有线网络
5.5小结
第二篇Android底层开发入门
第6章第一个Linux驱动程序:统计单词个数
6.1Linux驱动到底是个什么东西
6.2编写Linux驱动程序的步骤
6.3第一个Linux驱动:统计单词个数
6.3.1编写Linux驱动程序前的准备工作
6.3.2编写Linux驱动程序的骨架(初始化和退出驱动)
6.3.3指定与驱动相关的信息
6.3.4注册和注销设备文件
6.3.5指定回调函数
6.3.6实现统计单词数的算法
6.3.7编译、安装、卸载Linux驱动程序
6.4使用多种方式测试Linux驱动
6.4.1使用UbuntuLinux测试Linux驱动
6.4.2在Android模拟器上通过原生(Native)C程序测试Linux驱动
6.4.3使用AndroidNDK测试Linux驱动
6.4.4使用Java代码直接操作设备文件来测试Linux驱动
6.4.5使用S3C6410开发板测试Linux驱动
6.4.6将驱动编译进Linux内核进行测试
6.5使用Eclipse开发和测试Linux驱动程序
6.5.1在Eclipse中开发Linux驱动程序
6.5.2在Eclipse中测试Linux驱动
6.6小结
第7章LED将为我闪烁:控制发光二级管
7.1LED驱动的实现原理
7.2编写LED驱动
7.2.1体验LED驱动的奇妙
7.2.2创建LED驱动的设备文件
7.2.3卸载LED驱动的设备文件
7.2.4设置寄存器与初始化LED驱动
7.2.5控制LED
7.2.6LED驱动的模块参数
7.2.7LED驱动的完整代码
7.3测试LED驱动
7.3.1编写测试I/O控制命令的通用程序
7.3.2使用NDK测试LED驱动
7.3.3使用Java测试LED驱动
7.4LED驱动的移植
7.5小结
第8章让开发板发出声音:蜂鸣器驱动
8.1Linux驱动的代码重用
8.1.1编译是由多个文件组成的Linux驱动
8.1.2Linux驱动模块的依赖(导出符号)
8.2强行卸载Linux驱动
8.3蜂鸣器(PWM)驱动
8.3.1蜂鸣器驱动的原理
8.3.2实现蜂鸣器驱动
8.3.3测试蜂鸣器驱动
8.4小结
第9章硬件抽象层:HAL
9.1为什么要在Android中加入HAL
9.2AndroidHAL架构
9.3为LED驱动增加HAL
9.3.1编写一款支持HAL的Linux驱动程序的步骤
9.3.2颠覆Linux驱动的设计理念:精简LED驱动
9.3.3测试读写寄存器操作
9.3.4编写调用LED驱动的HAL模块
9.3.5编写调用HAL模块的Service
9.3.6HAL模块的存放路径和命名规则
9.3.7编写调用Service的Java库
9.3.8测试LED驱动
9.4小结
第10章嵌入式Linux的调试技术
10.1打印内核调试信息:printk
10.2防止printk函数降低Linux驱动性能
10.3通过虚拟文件系统(/proc)进行数据交互
10.4调试工具
10.4.1用gdb调试用户空间程序
10.4.2用gdbserver远程调试用户空间程序
10.4.3用kgdb远程调试内核程序
10.5小结
第三篇Linux驱动开发高级技术
第11章Linux驱动程序中的并发控制
11.1并发和竞态
11.2原子操作
11.2.1整型原子操作
11.2.264位整型原子操作
11.2.3位原子操作
11.2.4用原子操作阻止设备文件被多个进程打开
11.3自旋锁(SpinLock)
11.3.1自旋锁的使用方法
11.3.2使用自旋锁保护临界区
11.3.3读写自旋锁
11.3.4使用读写自旋锁保护临界区
11.3.5顺序锁(seqlock)
11.3.6使用顺序锁写入正在读取的共享资源
11.4读-复制-更新(RCU)机制
11.4.1RCU的原理
11.4.2RCUAPI
11.4.3RCU的应用
11.5信号量(Semaphore)
11.5.1信号量的使用
11.5.2信号量用于同步
11.5.3读写信号量
11.5.4使用读写信号量保护临界区
11.6互斥体(Mutex)
11.7完成量(Completion)
11.8小结
第12章Linux驱动程序中的阻塞和非阻塞I/O
12.1等待队列
12.1.1等待队列原理
12.1.2等待队列的API
12.1.3等待队列的使用方法
12.1.4支持休眠和唤醒的Linux驱动
12.2轮询操作
12.2.1用户空间的select函数
12.2.2内核空间的poll函数
12.2.3以非阻塞的方式访问Linux驱动
12.3小结
第13章Linux驱动程序中的异步编程
13.1信号与异步通知
13.1.1Linux信号
13.1.2接收Linux信号
13.1.3发送信号
13.2异步I/O(AIO)
13.2.1异步操作的API
13.2.2异步读写本地文件
13.2.3Linux驱动中的异步函数(aio_read和aio_write)
13.2.4接收信号时异步读取数据
13.2.5AIO中的回调函数
13.3小结
第14章Linux中断和底半部
14.1什么是中断
14.2中断处理程序
14.3Linux中断处理的核心:顶半部和底半部
14.4获取Linux系统的中断统计信息
14.5Linux中断编程
14.5.1注册中断处理程序
14.5.2注销中断处理程序
14.5.3编写中断处理函数
14.5.4共享中断处理程序
14.5.5禁止和激活中断
14.5.6禁止和激活中断线
14.5.7获取中断系统的状态
14.5.8与中断编程相关的函数和宏
14.6实例:S3C6410实时钟中断
14.7中断中下文
14.8中断的实现原理
14.9底半部
14.9.1为什么要使用底半部
14.9.2实现底半部的机制
14.9.3软中断
14.9.4Tasklet
14.9.5实例:Tasklet演示
14.9.6软中断处理线程(ksoftirqd)
14.9.7工作队列(workqueue)
14.9.8与工作队列相关的API
14.9.9实例:工作队列演示
14.10小结
第15章时间管理
15.1Linux内核中的时间概念
15.1.1时钟频率
15.1.2提高时钟频率的优点和缺点
15.2节拍总数(jiffies)
15.2.1访问jiffies
15.2.2jiffies、时间和时钟频率之间的转换
15.2.3jiffies的回绕
15.2.4用户空间和时钟频率
15.3实时时钟和定时器
15.4时钟中断处理程序的实现
15.5读写本地时间
15.6内核定时器
15.6.1如何使用内核定时器
15.6.2实例:秒表定时器
15.7内核延迟
15.7.1忙等待
15.7.2短延迟
15.7.3休眠延迟(schedule_timeout)
15.8小结
第16章内存管理与I/O访问
16.1内存管理模式
16.1.1内存的基本单位:页(Page)
16.1.2页的逻辑划分:区(zone)
16.1.3获取页
16.1.4释放页
16.2分配连续的内存空间(Kmalloc)
16.2.1gfp_mask标志
16.2.2释放内存(kfree)
16.3分配不连续的内存空间(vmalloc)
16.4全局缓存(slab)
16.4.1Slab层的实现原理
16.4.2Slab分配器
16.4.3示例:从Slab高速缓存中分配和释放对象
16.5Linux内存池
16.5.1内存池的实现原理
16.5.2示例:从内存池获取对象
16.6虚拟地址与物理地址之间的转换
16.7设备I/O端口与I/O内存
16.7.1读写I/O端口
16.7.2读写I/O内存
16.7.3将I/O端口映射为I/O内存
16.7.4申请和释放设备I/O端口和I/O内存
16.7.5使用设备I/O端口和I/O内存的一般步骤
16.8内核空间与用户空间共享数据
16.8.1内存映射与VMA
16.8.2示例:用户程序读取内核空间数据
16.9I/O内存静态映射
16.10小结
第四篇Linux设备驱动与Android底层开发
第17章RTC驱动
17.1实时时钟(RTC)结构与移植内容
17.1.1RTC系统的结构
17.1.2RTC驱动主要的移植工作
17.2RTC系统中的Android部分
17.2.1警报管理:AlarmManager
17.2.2警报服务:AlarmManagerService
17.2.3直接与Alarm驱动交互的JNI代码
17.3Alarm驱动的分析与移植
17.3.1Alarm驱动简介
17.3.2Alarm驱动中的关键数据结构
17.3.3Alarm驱动的应用层接口(alarm_dev.c)代码分析
17.3.4Alarm驱动的通用文件(alarm.c)代码分析
17.4RTC驱动的分析与移植
17.4.1实时时钟(RTC)的特性
17.4.2RTC的结构
17.4.3RTC芯片的寄存器
17.4.4RTC驱动的用户空间接口
17.4.5RTC系统组件之间的调用关系
17.4.6设备文件(/dev/rtc0)的I/O命令
17.4.7sysfs虚拟文件处理函数
17.4.8proc虚拟文件处理函数
17.5小结
第18章LCD驱动
18.1LCD简介
18.1.1液晶的工作原理
18.1.2LCD的种类
18.1.3LCD的技术参数
18.1.4LCD时序图
18.2LCD驱动结构分析和移植要点
18.3帧缓冲(FrameBuffer)驱动设计与实现
18.3.1FrameBuffer设备
18.3.2示例:通过dd命令与FrameBuffer设备文件交互
18.3.3示例:编写访问FrameBuffer设备文件的程序
18.3.4FrameBuffer驱动的架构
18.3.5FrameBuffer驱动主要的数据结构
18.3.6如何在Linux内核中查找指定的内容
18.3.7FrameBuffer驱动设备事件的处理(fbmem.c)
18.3.8FrameBuffer驱动源代码分析与移植
18.4FrameBuffer驱动的HAL层分析
18.4.1Gralloc库
18.4.2初始化HALGralloc的核心结构体
18.4.3获取GrallocHAL模块
18.4.4与FrameBuffer设备文件交互
18.5调用GrallocHAL库
18.6小结
第19章音频驱动
19.1音频驱动基础
19.1.1数字音频简介
19.1.2ALSA架构简介
19.1.3ALSA设备文件
19.1.4数字采样与数字录音
19.1.5混音器
19.1.6音频驱动的目录结构
19.1.7音频设备硬件接口
19.1.8ALSA架构支持的声卡芯片
19.2AC97芯片的寄存器
19.2.1控制寄存器
19.2.2状态寄存器
19.2.3编解码器命令寄存器
19.2.4编解码器状态寄存器
19.2.5PCM输出/输入通道FIFO数据寄存器
19.2.6MIC输入通道FIFO地址寄存器
19.2.7PCM输出/输入通道FIFO数据寄存器
19.2.8MIC输入通道FIFO数据寄存器
19.3创建声卡
19.3.1声卡的顶层数据结构
19.3.2创建声卡的步骤
19.3.3示例:基于ARM的AC97音频驱动
19.4音频逻辑设备
19.4.1创建PCM设备
19.4.2创建录音和播放设备文件节点
19.4.3创建Control设备数据结构
19.4.4创建Control设备
19.4.5注册与打开音频字符设备
19.5嵌入式设备中的ALSA(ASoC)
19.5.1什么是ASoC
19.5.2ASoC的硬件架构
19.5.3ASoC的软件架构
19.5.4如何确定S3C开发板使用了哪个音频驱动
19.5.5ASoC架构中的Machine
19.5.6ASoC架构中的Codec
19.5.7ASoC架构中的Platform
19.6音频驱动的HAL分析
19.6.1实现HALLibrary
19.6.2调用HALLibrary
19.7小结
第20章Linux块设备驱动
20.1块设备简介
20.2块设备的体系架构
20.3块设备的数据结构与相关操作
20.3.1磁盘设备(gendisk结构体)
20.3.2block_device_operations结构体
20.3.3I/O请求(request结构体)
20.3.4请求队列(request_queue结构体)
20.3.5块I/O(bio结构体)
20.4块设备的加载和卸载
20.5块设备的打开和释放
20.6块设备的ioctl函数
20.7块设备驱动的I/O请求处理
20.7.1依赖请求队列
20.7.2不依赖请求队列
20.8实例1:依赖请求队列的RamDisk
20.9在嵌入式设备上测试块设备驱动
20.9.1编译、配置和安装Busybox
20.9.2测试块设备驱动
20.10实例2:不依赖请求队列的RamDisk
20.11扇区与磁盘碎片整理
20.12小结
第21章网络设备驱动
21.1Linux网络设备驱动的结构
21.1.1网络协议接口层
21.1.2网络设备接口层
21.1.3设备驱动功能层
21.1.4网络设备与媒介层
21.2网络设备驱动设计与实现
21.2.1网络设备的注册与注销
21.2.2网络设备的初始化
21.2.3网络设备的打开与释放
21.2.4发送数据
21.2.5接收数据
21.2.6网络连接状态
21.3示例:DM9000网卡设备驱动
21.3.1如何确定S3C6410开发板使用的网络设备
21.3.2DM9000网卡硬件描述
21.3.3网络设备驱动的定义与安装
21.3.4初始化DM9000网卡设备驱动
21.3.5移出网络设备
21.3.6打开和停止DM9000网卡
21.3.7发送数据
21.3.8接收数据
21.3.9设置广播地址
21.4小结
第22章USB驱动
22.1USB设备简介
22.2USB驱动与USB核心之间的交互
22.2.1端点(Endpoint)
22.2.2接口(Interfaces)
22.2.3配置(Config)
22.3USB设备的核心数据结构
22.3.1USB设备:usb_device结构体
22.3.2USB驱动:usb_driver结构体
22.3.3识别USB设备:usb_device_id结构体
22.3.4USB端点:usb_host_endpoint结构体
22.3.5USB接口:usb_interface结构体
22.3.6USB配置:usb_host_config结构体
22.4描述符数据结构
22.4.1设备描述符
22.4.2配置描述符
22.4.3接口描述符
22.4.4端点描述符
22.4.5字符串描述符
22.4.6查看描述符信息
22.5USB和sysfs
22.6URB(USB请求块)
22.6.1URB结构体
22.6.2URB的处理流程
22.6.3简单的批量与控制URB
22.7USB驱动程序的结构
22.8鼠标驱动分析
22.9小结
……
点击展开
点击收起
— 没有更多了 —
以下为对购买帮助不大的评价