飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 10850|回复: 30

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

[复制链接]
  • TA的每日心情
    开心
    2019-3-25 14:18
  • 签到天数: 881 天

    [LV.10]以坛为家III

    发表于 2015-7-31 08:54:17 | 显示全部楼层 |阅读模式
    全书分为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

    下载地址:
    游客,如果您要查看本帖隐藏内容请回复

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2024-1-13 00:30
  • 签到天数: 1483 天

    [LV.10]以坛为家III

    发表于 2015-8-2 07:15:57 | 显示全部楼层
    感谢楼主分享
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    前天 19:35
  • 签到天数: 1571 天

    [LV.Master]伴坛终老

    发表于 2015-8-30 19:58:07 | 显示全部楼层
    谢谢楼主的分享!!!
    PYG19周年生日快乐!
  • TA的每日心情

    2023-4-16 16:38
  • 签到天数: 122 天

    [LV.7]常住居民III

    发表于 2015-9-22 19:39:11 | 显示全部楼层
    资源不错啊
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2024-3-23 11:37
  • 签到天数: 108 天

    [LV.6]常住居民II

    发表于 2015-11-1 06:17:16 | 显示全部楼层
    安卓驱动值得去学学
    PYG19周年生日快乐!
  • TA的每日心情

    2016-2-7 08:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-2-7 23:40:04 | 显示全部楼层
    感谢分享好东西~~~
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 1455 天

    [LV.10]以坛为家III

    发表于 2016-3-4 20:54:38 | 显示全部楼层
    很好,谢谢分享!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2016-4-7 07:30:34 | 显示全部楼层
    感谢楼主分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表