GeekCat 发表于 2015-7-31 08:54:17

《Android深度探索(卷1) HAL与驱动开发》.(李宁) PDF

全书分为4篇,分别从搭建开发环境,Linux驱动和Android HAL的基础 知识,开发Linux驱动的高级技术和分析典型的Linux驱动源代码4个方面介 绍Android和Linux的底层开发。本书使用的试验环境是Ubuntu Linux12.04 LTS、Android模拟器和S3C6410开发板。在第1篇详细介绍了如何搭建和使用 这3个试验环境。第2篇通过3个Linux驱动的完整案例(统计单词个数驱动、 LED驱动和蜂鸣器驱动)从不同角度来讨论如何开发一个完整的Linux驱动。 并且通过完整的案例介绍了如何编写Android HAL,以及如何与Linux驱动交 互。第3篇则介绍了开发Linux驱动所需要的高级技术,这些技术包括并发控 制、阻塞和非阻塞I/O、异步编程、Linux中断和底半部、时间管理、内存管 理和I/O访问。最后一部分分析了一些典型Linux驱动的源代码(RTC驱动、 LCD驱动、音频驱动、块设备驱动、网络设备驱动和USB驱动)。 李宁编著的《Android深度探索(卷1):HAL与驱动开发》注重理论和 实践相结合。在介绍了大量的基础知识的同时,为每一个知识点提供了完整 的案例,使读者可以通过实际的代码更好地理解Linux驱动和Android底层技 术。 为了使读者更好地实践本书提供的实例代码,在随书光盘中除了提供源 代码文件外,还提供了一个VMWare Ubuntu Linux12.04 LTS的虚拟环境。读 者可以在Windows、Linux和Mac OS X上,通过VMWare打开该虚拟机文件来学 习和测试本书的例子(虚拟环境中也带了一套本书提供的例子代码)。 《Android深度探索(卷1):HAL与驱动开发》适合底层开发的程序员 和编程爱好者使用,也适合作为相关培训学校的Android底层开发培训教材 。

目录目录

第一篇Android驱动开发前的准备1

第1章Android系统移植与驱动开发概述3
1.1Android系统架构3
1.2Android系统移植的主要工作4
1.3查看Linux内核版本5
1.4Linux内核版本号的定义规则6
1.5如何学习Linux驱动开发7
1.6Linux设备驱动8
1.6.1设备驱动的发展和作用8
1.6.2设备的分类及特点9
1.7 见识一下什么叫Linux驱动:LED9
1.8小结11

第2章搭建Android开发环境12
2.1Android底层开发需要哪些工具12
2.2安装JDK13
2.3搭建Android应用程序开发环境13
2.3.1安装Android SDK13
2.3.2安装Eclipse15
2.3.3安装ADT16
2.3.4配置ADT18
2.3.5建立AVD19
2.4安装Android NDK开发环境20
2.4.1下载Android NDK20
2.4.2安装CDT21
2.4.3命令行方式编译Android NDK程序21
2.4.4导入Android NDK的例子22
2.4.5配置Android NDK的集成开发环境22
2.5安装交叉编译环境25
2.6小结28

第3章Git使用入门29
3.1安装Git29
3.2查看Git文档30
3.3源代码的提交与获取31
3.3.1创建版本库:git init31
3.3.2将文件提交到本地版本库:git commit32
3.3.3创建本地分支:git branch33
3.3.4切换本地分支:git checkout34
3.3.5在GitHub上创建开源项目34
3.3.6上传源代码到GitHub:git push36
3.3.7从GitHub下载源代码:git clone39
3.4小结39

第4章源代码的下载和编译41
4.1下载、编译和测试Android源代码41
4.1.1配置Android源代码下载环境41
4.1.2Android源代码目录结构解析43
4.1.3下载Android源代码中的一部分44
4.1.4编译Android 源代码46
4.1.5out目录结构分析48
4.1.6将自己的APK作为Android内置程序发布49
4.1.7用模拟器测试system.img文件50
4.2下载和编译Linux内核源代码51
4.2.1下载Linux内核源代码51
4.2.2Linux内核源代码的目录结构51
4.2.3安装Android内核的编译环境52
4.2.4配置和编译Linux内核53
4.3小结57

第5章搭建S3C6410开发板的测试环境58
5.1S3C6410开发板简介58
5.2安装串口调试工具:minicom60
5.3烧写Android系统62
5.4配置有线网络65
5.5小结66

第二篇Android底层开发入门67

第6章第一个Linux驱动程序:统计单词个数69
6.1Linux驱动到底是个什么东西69
6.2编写Linux驱动程序的步骤70
6.3第一个Linux驱动:统计单词个数71
6.3.1编写Linux驱动程序前的准备工作72
6.3.2编写Linux驱动程序的骨架初始化和退出驱动72
6.3.3指定与驱动相关的信息75
6.3.4注册和注销设备文件78
6.3.5指定回调函数80
6.3.6实现统计单词数的算法84
6.3.7编译、安装、卸载Linux驱动程序87
6.4使用多种方式测试Linux驱动88
6.4.1使用Ubuntu Linux测试Linux驱动88
6.4.2在Android模拟器上通过原生NativeC程序测试Linux驱动90
6.4.3使用Android NDK测试Linux驱动93
6.4.4使用Java代码直接操作设备文件来测试Linux驱动98
6.4.5使用S3C6410开发板测试Linux驱动100
6.4.6将驱动编译进Linux内核进行测试101
6.5使用Eclipse开发和测试Linux驱动程序105
6.5.1在Eclipse中开发Linux驱动程序105
6.5.2在Eclipse中测试Linux驱动109
6.6小结110

第7章LED将为我闪烁:控制发光二级管111
7.1LED驱动的实现原理111
7.2编写LED驱动112
7.2.1体验LED驱动的奇妙112
7.2.2创建LED驱动的设备文件113
7.2.3卸载LED驱动的设备文件118
7.2.4设置寄存器与初始化LED驱动118
7.2.5控制LED121
7.2.6LED驱动的模块参数123
7.2.7LED驱动的完整代码125
7.3测试LED驱动129
7.3.1编写测试I/O控制命令的通用程序130
7.3.2使用NDK测试LED驱动132
7.3.3使用Java测试LED驱动135
7.4LED驱动的移植136
7.5小结138

第8章让开发板发出声音:蜂鸣器驱动139
8.1Linux驱动的代码重用139
8.1.1编译是由多个文件组成的Linux驱动139
8.1.2Linux驱动模块的依赖导出符号142
8.2强行卸载Linux驱动146
8.3蜂鸣器PWM驱动151
8.3.1蜂鸣器驱动的原理151
8.3.2实现蜂鸣器驱动152
8.3.3测试蜂鸣器驱动155
8.4小结155

第9章硬件抽象层:HAL156
9.1为什么要在Android中加入HAL156
9.2Android HAL架构157
9.3为LED驱动增加HAL158
9.3.1编写一款支持HAL的Linux驱动程序的步骤159
9.3.2颠覆Linux驱动的设计理念:精简LED驱动159
9.3.3测试读写寄存器操作166
9.3.4编写调用LED驱动的HAL模块169
9.3.5编写调用HAL模块的Service178
9.3.6HAL模块的存放路径和命名规则182
9.3.7编写调用Service的Java库186
9.3.8测试LED驱动187
9.4小结188

第10章嵌入式Linux的调试技术189
10.1打印内核调试信息:printk189
10.2防止printk函数降低Linux 驱动性能192
10.3通过虚拟文件系统/proc进行数据交互195
10.4调试工具200
10.4.1用gdb调试用户空间程序200
10.4.2用gdbserver远程调试用户空间程序201
10.4.3用kgdb远程调试内核程序203
10.5小结204

第三篇Linux驱动开发高级技术205

第11章Linux驱动程序中的并发控制207
11.1并发和竞态207
11.2 原子操作208
11.2.1整型原子操作208
11.2.264位整型原子操作210
11.2.3位原子操作211
11.2.4用原子操作阻止设备文件被多个进程打开212
11.3 自旋锁Spin Lock214
11.3.1自旋锁的使用方法215
11.3.2使用自旋锁保护临界区217
11.3.3读写自旋锁220
11.3.4使用读写自旋锁保护临界区223
11.3.5顺序锁seqlock228
11.3.6使用顺序锁写入正在读取的共享资源230
11.4读—复制—更新RCU机制232
11.4.1RCU的原理232
11.4.2RCU API234
11.4.3RCU的应用237
11.5信号量Semaphore238
11.5.1信号量的使用239
11.5.2信号量用于同步240
11.5.3读写信号量242
11.5.4使用读写信号量保护临界区243
11.6互斥体Mutex245
11.7完成量Completion248
11.8小结252

第12章Linux驱动程序中的阻塞和非阻塞I/O253
12.1等待队列253
12.1.1等待队列原理253
12.1.2等待队列的API254
12.1.3等待队列的使用方法258
12.1.4支持休眠和唤醒的Linux驱动258
12.2轮询操作261
12.2.1用户空间的select函数261
12.2.2内核空间的poll函数261
12.2.3以非阻塞的方式访问Linux驱动262
12.3 小结266

第13章Linux驱动程序中的异步编程267
13.1信号与异步通知267
13.1.1Linux信号267
13.1.2接收Linux信号268
13.1.3发送信号271
13.2异步I/OAIO276
13.2.1异步操作的API277
13.2.2异步读写本地文件280
13.2.3Linux驱动中的异步函数aio_read和aio_write282
13.2.4接收信号时异步读取数据283
13.2.5AIO中的回调函数285
13.3小结286

第14章Linux中断和底半部287
14.1什么是中断287
14.2中断处理程序288
14.3Linux 中断处理的核心:顶半部和底半部288
14.4获取Linux 系统的中断统计信息289
14.5Linux 中断编程290
14.5.1注册中断处理程序290
14.5.2注销中断处理程序293
14.5.3编写中断处理函数293
14.5.4共享中断处理程序294
14.5.5禁止和激活中断294
14.5.6禁止和激活中断线295
14.5.7获取中断系统的状态296
14.5.8与中断编程相关的函数和宏296
14.6实例:S3C6410实时钟中断297
14.7中断中下文299
14.8中断的实现原理300
14.9底半部303
14.9.1为什么要使用底半部304
14.9.2实现底半部的机制304
14.9.3软中断305
14.9.4Tasklet309
14.9.5实例:Tasklet演示313
14.9.6软中断处理线程ksoftirqd314
14.9.7工作队列work queue315
14.9.8与工作队列相关的API321
14.9.9实例:工作队列演示322
14.10小结324

第15章时间管理325
15.1Linux内核中的时间概念325
15.1.1时钟频率326
15.1.2提高时钟频率的优点和缺点326
15.2节拍总数jiffies327
15.2.1访问jiffies328
15.2.2jiffies、时间和时钟频率之间的转换328
15.2.3jiffies的回绕331
15.2.4用户空间和时钟频率332
15.3实时时钟和定时器333
15.4时钟中断处理程序的实现334
15.5读写本地时间337
15.6内核定时器340
15.6.1如何使用内核定时器341
15.6.2实例:秒表定时器343
15.7内核延迟347
15.7.1忙等待347
15.7.2短延迟348
15.7.3休眠延迟schedule_timeout349
15.8小结351

第16章内存管理与I/O访问352
16.1内存管理模式352
16.1.1内存的基本单位:页Page352
16.1.2页的逻辑划分:区zone354
16.1.3获取页361
16.1.4释放页363
16.2分配连续的内存空间Kmalloc364
16.2.1gfp_mask标志365
16.2.2释放内存kfree368
16.3分配不连续的内存空间vmalloc369
16.4全局缓存slab370
16.4.1Slab层的实现原理371
16.4.2Slab分配器373
16.4.3示例:从Slab高速缓存中分配和释放对象375
16.5Linux内存池376
16.5.1内存池的实现原理377
16.5.2示例:从内存池获取对象381
16.6虚拟地址与物理地址之间的转换384
16.7设备I/O端口与I/O内存385
16.7.1读写I/O端口385
16.7.2读写I/O内存385
16.7.3将I/O端口映射为I/O内存387
16.7.4申请和释放设备I/O端口和I/O内存387
16.7.5使用设备I/O端口和I/O内存的一般步骤388
16.8内核空间与用户空间共享数据389
16.8.1内存映射与VMA390
16.8.2示例:用户程序读取内核空间数据392
16.9I/O内存静态映射395
16.10小结397

第四篇Linux设备驱动与Android底层开发399

第17章RTC驱动401
17.1实时时钟RTC结构与移植内容401
17.1.1RTC系统的结构401
17.1.2RTC驱动主要的移植工作403
17.2RTC系统中的Android部分403
17.2.1警报管理:AlarmManager403
17.2.2警报服务:AlarmManagerService406
17.2.3直接与Alarm驱动交互的JNI代码409
17.3Alarm驱动的分析与移植411
17.3.1Alarm驱动简介411
17.3.2Alarm驱动中的关键数据结构412
17.3.3Alarm驱动的应用层接口alarm_dev.c代码分析414
17.3.4Alarm驱动的通用文件alarm.c代码分析419
17.4RTC驱动的分析与移植423
17.4.1实时时钟RTC的特性423
17.4.2RTC的结构423
17.4.3RTC芯片的寄存器425
17.4.4RTC驱动的用户空间接口427
17.4.5RTC系统组件之间的调用关系428
17.4.6设备文件/dev/rtc0的I/O命令435
17.4.7sysfs虚拟文件处理函数437
17.4.8proc虚拟文件处理函数438
17.5小结440

第18章LCD驱动441
18.1LCD简介441
18.1.1液晶的工作原理441
18.1.2LCD的种类442
18.1.3LCD的技术参数444
18.1.4LCD时序图444
18.2LCD驱动结构分析和移植要点446
18.3帧缓冲FrameBuffer驱动设计与实现447
18.3.1FrameBuffer设备447
18.3.2示例:通过dd命令与FrameBuffer设备文件交互448
18.3.3示例:编写访问FrameBuffer设备文件的程序449
18.3.4FrameBuffer驱动的架构451
18.3.5FrameBuffer驱动主要的数据结构452
18.3.6如何在Linux内核中查找指定的内容455
18.3.7FrameBuffer驱动设备事件的处理fbmem.c458
18.3.8FrameBuffer驱动源代码分析与移植461
18.4FrameBuffer驱动的HAL层分析469
18.4.1Gralloc库469
18.4.2初始化HAL Gralloc的核心结构体470
18.4.3获取Gralloc HAL模块472
18.4.4与FrameBuffer设备文件交互475
18.5调用Gralloc HAL库478
18.6小结481

第19章音频驱动482
19.1音频驱动基础482
19.1.1数字音频简介482
19.1.2ALSA架构简介483
19.1.3ALSA设备文件483
19.1.4数字采样与数字录音484
19.1.5混音器485
19.1.6音频驱动的目录结构486
19.1.7音频设备硬件接口487
19.1.8ALSA架构支持的声卡芯片488
19.2AC97芯片的寄存器489
19.2.1控制寄存器489
19.2.2状态寄存器490
19.2.3编解码器命令寄存器490
19.2.4编解码器状态寄存器491
19.2.5PCM输出/输入通道FIFO数据寄存器491
19.2.6MIC输入通道FIFO地址寄存器491
19.2.7PCM输出/输入通道FIFO数据寄存器492
19.2.8MIC输入通道FIFO数据寄存器492
19.3创建声卡492
19.3.1声卡的顶层数据结构492
19.3.2创建声卡的步骤493
19.3.3示例:基于ARM的AC97音频驱动496
19.4音频逻辑设备501
19.4.1创建PCM设备501
19.4.2创建录音和播放设备文件节点504
19.4.3创建Control设备数据结构508
19.4.4创建Control设备514
19.4.5注册与打开音频字符设备515
19.5嵌入式设备中的ALSAASoC516
19.5.1什么是ASoC517
19.5.2ASoC的硬件架构517
19.5.3ASoC的软件架构518
19.5.4如何确定S3C开发板使用了哪个音频驱动518
19.5.5ASoC架构中的Machine520
19.5.6ASoC架构中的Codec529
19.5.7ASoC架构中的Platform531
19.6音频驱动的HAL分析534
19.6.1实现HAL Library534
19.6.2调用HAL Library541
19.7小结545

第20章Linux块设备驱动546
20.1块设备简介546
20.2块设备的体系架构546
20.3块设备的数据结构与相关操作549
20.3.1磁盘设备gendisk结构体549
20.3.2block_device_operations结构体550
20.3.3I/O请求request结构体551
20.3.4请求队列request_queue结构体553
20.3.5块I/Obio结构体555
20.4块设备的加载和卸载557
20.5块设备的打开和释放559
20.6块设备的ioctl函数559
20.7块设备驱动的I/O请求处理560
20.7.1依赖请求队列560
20.7.2不依赖请求队列561
20.8实例1:依赖请求队列的RamDisk562
20.9在嵌入式设备上测试块设备驱动567
20.9.1编译、配置和安装Busybox567
20.9.2测试块设备驱动569
20.10实例2:不依赖请求队列的RamDisk570
20.11扇区与磁盘碎片整理576
20.12小结577

第21章网络设备驱动578
21.1Linux网络设备驱动的结构578
21.1.1网络协议接口层579
21.1.2网络设备接口层583
21.1.3设备驱动功能层585
21.1.4网络设备与媒介层585
21.2网络设备驱动设计与实现586
21.2.1网络设备的注册与注销586
21.2.2网络设备的初始化587
21.2.3网络设备的打开与释放588
21.2.4发送数据589
21.2.5接收数据590
21.2.6网络连接状态590
21.3示例:DM9000网卡设备驱动591
21.3.1如何确定S3C6410开发板使用的网络设备591
21.3.2DM9000网卡硬件描述591
21.3.3网络设备驱动的定义与安装592
21.3.4初始化DM9000网卡设备驱动593
21.3.5移出网络设备597
21.3.6打开和停止DM9000网卡598
21.3.7发送数据600
21.3.8接收数据602
21.3.9设置广播地址605
21.4小结606

第22章USB驱动607
22.1USB设备简介607
22.2USB驱动与USB核心之间的交互608
22.2.1端点Endpoint608
22.2.2接口Interfaces609
22.2.3配置Config609
22.3USB设备的核心数据结构610
22.3.1USB设备:usb_device结构体610
22.3.2USB驱动:usb_driver结构体611
22.3.3识别USB设备:usb_device_id结构体612
22.3.4USB端点:usb_host_endpoint结构体613
22.3.5USB接口:usb_interface结构体613
22.3.6USB配置:usb_host_config结构体614
22.4描述符数据结构615
22.4.1设备描述符615
22.4.2配置描述符615
22.4.3接口描述符615
22.4.4端点描述符616
22.4.5字符串描述符616
22.4.6查看描述符信息616
22.5USB和sysfs618
22.6URBUSB请求块620
22.6.1URB结构体621
22.6.2URB的处理流程622
22.6.3简单的批量与控制URB625
22.7USB驱动程序的结构626
22.8鼠标驱动分析633
22.9小结637
下载地址:**** Hidden Message *****

airyu 发表于 2015-8-2 07:15:57

感谢楼主分享

noahcxu 发表于 2015-8-30 19:58:07

谢谢楼主的分享!!!

wakichen 发表于 2015-9-22 19:39:11

资源不错啊

shteach001 发表于 2015-11-1 06:17:16

安卓驱动值得去学学

super200893154 发表于 2016-2-7 23:40:04

感谢分享好东西~~~

ccs52a 发表于 2016-2-23 17:56:11

感谢分享!!!!!!!!!

mypsp2008 发表于 2016-3-4 20:54:38

很好,谢谢分享!

[email protected] 发表于 2016-4-7 07:30:34

感谢楼主分享

chdldy 发表于 2016-6-13 10:03:55

支持楼主
页: [1] 2 3 4
查看完整版本: 《Android深度探索(卷1) HAL与驱动开发》.(李宁) PDF