图书介绍
Android深度探索 卷1 HAL与驱动开发【2025|PDF|Epub|mobi|kindle电子书版本百度云盘下载】

- 李宁编著 著
- 出版社: 北京:人民邮电出版社
- ISBN:9787115298027
- 出版时间:2013
- 标注页数:637页
- 文件大小:277MB
- 文件页数:649页
- 主题词:移动终端-应用程序-程序设计
PDF下载
下载说明
Android深度探索 卷1 HAL与驱动开发PDF格式电子书版下载
下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!
(文件页数 要大于 标注页数,上中下等多册电子书除外)
注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具
图书目录
第一篇 Android驱动开发前的准备1
第1章 Android系统移植与驱动开发概述3
1.1 Android系统架构3
1.2 Android系统移植的主要工作4
1.3 查看Linux内核版本5
1.4 Linux内核版本号的定义规则6
1.5 如何学习Linux驱动开发7
1.6 Linux设备驱动8
1.6.1 设备驱动的发展和作用8
1.6.2 设备的分类及特点9
1.7 见识一下什么叫Linux驱动:LED9
1.8 小结11
第2章 搭建Android开发环境12
2.1 Android底层开发需要哪些工具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.2 Android源代码目录结构解析43
4.1.3 下载Android源代码中的一部分44
4.1.4 编译Android源代码46
4.1.5 out目录结构分析48
4.1.6 将自己的APK作为Android内置程序发布49
4.1.7 用模拟器测试system.img文件50
4.2 下载和编译Linux内核源代码51
4.2.1 下载Linux内核源代码51
4.2.2 Linux内核源代码的目录结构51
4.2.3 安装Android内核的编译环境52
4.2.4 配置和编译Linux内核53
4.3 小结57
第5章 搭建S3C6410开发板的测试环境58
5.1 S3C6410开发板简介58
5.2 安装串口调试工具:minicom60
5.3 烧写Android系统62
5.4 配置有线网络65
5.5 小结66
第二篇 Android底层开发入门67
第6章 第一个Linux驱动程序:统计单词个数69
6.1 Linux驱动到底是个什么东西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模拟器上通过原生(Native)C程序测试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.1 LED驱动的实现原理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.6 LED驱动的模块参数123
7.2.7 LED驱动的完整代码125
7.3 测试LED驱动129
7.3.1 编写测试I/O控制命令的通用程序130
7.3.2 使用NDK测试LED驱动132
7.3.3 使用Java测试LED驱动135
7.4 LED驱动的移植136
7.5 小结138
第8章 让开发板发出声音:蜂鸣器驱动139
8.1 Linux驱动的代码重用139
8.1.1 编译是由多个文件组成的Linux驱动139
8.1.2 Linux驱动模块的依赖(导出符号)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.2 Android HAL架构157
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.6 HAL模块的存放路径和命名规则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.2 64位整型原子操作210
11.2.3 位原子操作211
11.2.4 用原子操作阻止设备文件被多个进程打开212
11.3 自旋锁(Spin Lock)214
11.3.1 自旋锁的使用方法215
11.3.2 使用自旋锁保护临界区217
11.3.3 读写自旋锁220
11.3.4 使用读写自旋锁保护临界区223
11.3.5 顺序锁(seqlock)228
11.3.6 使用顺序锁写入正在读取的共享资源230
11.4 读—复制—更新(RCU)机制232
11.4.1 RCU的原理232
11.4.2 RCU API234
11.4.3 RCU的应用237
11.5 信号量(Semaphore)238
11.5.1 信号量的使用239
11.5.2 信号量用于同步240
11.5.3 读写信号量242
11.5.4 使用读写信号量保护临界区243
11.6 互斥体(Mutex)245
11.7 完成量(Completion)248
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.1 Linux信号267
13.1.2 接收Linux信号268
13.1.3 发送信号271
13.2 异步I/O(AIO)276
13.2.1 异步操作的API277
13.2.2 异步读写本地文件280
13.2.3 Linux驱动中的异步函数(aio read和aio write)282
13.2.4 接收信号时异步读取数据283
13.2.5 AIO中的回调函数285
13.3 小结286
第14章 Linux中断和底半部287
14.1 什么是中断287
14.2 中断处理程序288
14.3 Linux中断处理的核心:顶半部和底半部288
14.4 获取Linux系统的中断统计信息289
14.5 Linux中断编程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.4 Tasklet309
14.9.5 实例:Tasklet演示313
14.9.6 软中断处理线程(ksoftirqd)314
14.9.7 工作队列(workqueue)315
14.9.8 与工作队列相关的API321
14.9.9 实例:工作队列演示322
14.10 小结324
第15章 时间管理325
15.1 Linux内核中的时间概念325
15.1.1 时钟频率326
15.1.2 提高时钟频率的优点和缺点326
15.2 节拍总数(jiffies)327
15.2.1 访问jiffies328
15.2.2 jiffies、时间和时钟频率之间的转换328
15.2.3 jiffies的回绕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_timeout)349
15.8 小结351
第16章 内存管理与I/O访问352
16.1 内存管理模式352
16.1.1 内存的基本单位:页(Page)352
16.1.2 页的逻辑划分:区(zone)354
16.1.3 获取页361
16.1.4 释放页363
16.2 分配连续的内存空间(Kmalloc)364
16.2.1 gfp_mask标志365
16.2.2 释放内存(kfree)368
16.3 分配不连续的内存空间(vmalloc)369
16.4 全局缓存(slab)370
16.4.1 Slab层的实现原理371
16.4.2 S1ab分配器373
16.4.3 示例:从Slab高速缓存中分配和释放对象375
16.5 Linux内存池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.9 I/O内存静态映射395
16.10 小结397
第四篇 Linux设备驱动与Android底层开发399
第17章 RTC驱动401
17.1 实时时钟(RTC)结构与移植内容401
17.1.1 RTC系统的结构401
17.1.2 RTC驱动主要的移植工作403
17.2 RTC系统中的Android部分403
17.2.1 警报管理:AlarmManager403
17.2.2 警报服务:AlarmManagerService406
17.2.3 直接与Alarm驱动交互的JNI代码409
17.3 Alarm驱动的分析与移植411
17.3.1 Alarm驱动简介411
17.3.2 Alarm驱动中的关键数据结构412
17.3.3 Alarm驱动的应用层接口(alarm_dev.c)代码分析414
17.3.4 Alarm驱动的通用文件(alarm.c)代码分析419
17.4 RTC驱动的分析与移植423
17.4.1 实时时钟(RTC)的特性423
17.4.2 RTC的结构423
17.4.3 RTC芯片的寄存器425
17.4.4 RTC驱动的用户空间接口427
17.4.5 RTC系统组件之间的调用关系428
17.4.6 设备文件(/dev/rtc0)的I/O命令435
17.4.7 sysfs虚拟文件处理函数437
17.4.8 proc虚拟文件处理函数438
17.5 小结440
第18章 LCD驱动441
18.1 LCD简介441
18.1.1 液晶的工作原理441
18.1.2 LCD的种类442
18.1.3 LCD的技术参数444
18.1.4 LCD时序图444
18.2 LCD驱动结构分析和移植要点446
18.3 帧缓冲(FrameBuffer)驱动设计与实现447
18.3.1 FrameBuffer设备447
18.3.2 示例:通过dd命令与FrameBuffer设备文件交互448
18.3.3 示例:编写访问FrameBufier设备文件的程序449
18.3.4 FrameBuffer驱动的架构451
18.3.5 FrameBuffer驱动主要的数据结构452
18.3.6 如何在Linux内核中查找指定的内容455
18.3.7 FrameBuffer驱动设备事件的处理(fbmem.c)458
18.3.8 FrameBuffer驱动源代码分析与移植461
18.4 FrameBuffer驱动的HAL层分析469
18.4.1 Gralloc库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.2 ALSA架构简介483
19.1.3 ALSA设备文件483
19.1.4 数字采样与数字录音484
19.1.5 混音器485
19.1.6 音频驱动的目录结构486
19.1.7 音频设备硬件接口487
19.1.8 ALSA架构支持的声卡芯片488
19.2 AC97芯片的寄存器489
19.2.1 控制寄存器489
19.2.2 状态寄存器490
19.2.3 编解码器命令寄存器490
19.2.4 编解码器状态寄存器491
19.2.5 PCM输出/输入通道FIFO数据寄存器491
19.2.6 MIC输入通道FIFO地址寄存器491
19.2.7 PCM输出/输入通道FIFO数据寄存器492
19.2.8 MIC输入通道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 嵌入式设备中的ALSA(ASoC)516
19.5.1 什么是ASoC517
19.5.2 ASoC的硬件架构517
19.5.3 ASoC的软件架构518
19.5.4 如何确定S3C开发板使用了哪个音频驱动518
19.5.5 ASoC架构中的Machine520
19.5.6 ASoC架构中的Codec529
19.5.7 ASoC架构中的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.2 block_device_operations结构体550
20.3.3 I/O请求(request结构体)551
20.3.4 请求队列(request_queue结构体)553
20.3.5 块I/O(bio结构体)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.1 Linux网络设备驱动的结构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.2 DM9000网卡硬件描述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.1 USB设备简介607
22.2 USB驱动与USB核心之间的交互608
22.2.1 端点(Endpoint)608
22.2.2 接口(Interfaces)609
22.2.3 配置(Config)609
22.3 USB设备的核心数据结构610
22.3.1 USB设备:usb_device结构体610
22.3.2 USB驱动:usb_driver结构体611
22.3.3 识别USB设备:usb_device_id结构体612
22.3.4 USB端点:usb_host_endpoint结构体613
22.3.5 USB接口:usb_interface结构体613
22.3.6 USB配置: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.5 USB和sysfs618
22.6 URB(USB请求块)620
22.6.1 URB结构体621
22.6.2 URB的处理流程622
22.6.3 简单的批量与控制URB625
22.7 USB驱动程序的结构626
22.8 鼠标驱动分析633
22.9 小结637
热门推荐
- 1632146.html
- 3878206.html
- 2309484.html
- 2723968.html
- 2588857.html
- 1735683.html
- 3149792.html
- 1317288.html
- 869354.html
- 3374199.html
- http://www.ickdjs.cc/book_2347917.html
- http://www.ickdjs.cc/book_1576899.html
- http://www.ickdjs.cc/book_3475262.html
- http://www.ickdjs.cc/book_3885939.html
- http://www.ickdjs.cc/book_2009283.html
- http://www.ickdjs.cc/book_3506306.html
- http://www.ickdjs.cc/book_2914825.html
- http://www.ickdjs.cc/book_228956.html
- http://www.ickdjs.cc/book_3277171.html
- http://www.ickdjs.cc/book_520503.html