新書推薦:

《
高胜算操盘:成功交易员完全教程美马塞尔林可著十年十二国版本帮助数百万交易者建立交易优势股票书籍
》
售價:HK$
500

《
亲子战争:全景解读2-6岁孩子的行为与心理,32个精选案例化解幼儿常见教养问题
》
售價:HK$
305

《
胡僧东来:汉唐时期的佛经翻译家和传播人
》
售價:HK$
500

《
电磁频谱中的战斗:美国海军和海军陆战队电子战飞机、作战与装备
》
售價:HK$
500

《
书法常识
》
售價:HK$
184

《
全新胡雪岩经商十二条戒律中国人的谋略之道善谋者赢天下能略者定乾坤全局成大事
》
售價:HK$
254

《
普林斯顿历史学研究指南
》
售價:HK$
484

《
即用是体:阳明学深度解读
》
售價:HK$
1309
|
| 編輯推薦: |
1.内容全面深入,涵盖Linux设备驱动开发的各个方面,从基础知识到高级主题,包括各种子系统、内存管理、中断处理等,为读者提供系统且全面的知识体系。 2.理论实践结合,不仅有详细的理论讲解,还包含大量源代码示例,帮助读者更好地理解和应用知识。 3.作者经验丰富,作者约翰·马迪厄是嵌入式Linux及内核工程师,具备深厚的专业知识和实践经验,行文兼具工程人的细致与凝练。 4.译者实力雄厚,由陈莉君、谢瑞莲等专业译者翻译,陈莉君在Linux内核领域有多年研究和教学经验。
|
| 內容簡介: |
本书讲解了Linux设备驱动开发的基础知识以及所用到的开发环境。全书分为17章,内容涵盖了各种Linux子系统、内存管理、RTC、IIO和IRQ管理等,还讲解了DMA和部分设备驱动程序的使用方法。在学完本书之后,读者将掌握Linux设备驱动开发过程中涉及的各种概念,并可以从零开始为嵌入式设备编写驱动程序。 阅读本书需要具备基本的C语言编程能力,且熟悉Linux基本命令。
|
| 關於作者: |
|
约翰·马迪厄是一位生活在法国巴黎的嵌入式Linux及内核工程师。他的主要工作是为物联网、交通、医疗、能源和军事等领域的企业开发设备驱动和板级支持包。他是LABCSMART公司的创始人兼首席顾问,该公司专注于提供嵌入式Linux和Linux内核工程方面的培训和服务。他还是一位开源和嵌入式系统爱好者,相信通过分享知识才能学到更多。他对拳击运动充满热情,已经专业练习了 6 年,现在仍通过志愿执教的方式延续着这份热情。
|
| 目錄:
|
第 1篇 Linux内核开发基础 第 1章 内核开发简介3 1.1 设置开发环境3 1.1.1 设置宿主机4 1.1.2 获取Linux内核源代码7 1.2 配置和构建Linux内核10 1.2.1 指定编译选项10 1.2.2 理解内核配置过程11 1.2.3 构建Linux内核15 第 2章 Linux内核模块的基本概念17 2.1 模块概念的介绍17 2.2 构建Linux内核模块21 2.2.1 理解Linux内核构建系统22 2.2.2 树外构建25 2.2.3 树内构建27 2.3 处理模块参数28 2.4 处理符号导出和模块依赖30 2.5 学习Linux内核编程技巧34 2.5.1 错误处理34 2.5.2 消息打印38 2.6 总结40 第3章 处理内核的核心辅助函数41 3.1 Linux内核加锁机制和共享资源41 3.1.1 自旋锁42 3.1.2 互斥锁46 3.1.3 trylock方法48 3.2 处理内核等待、睡眠和延迟机制50 3.2.1 等待队列50 3.2.2 内核中的简单睡眠54 3.2.3 内核延迟或忙等待54 3.3 深入理解Linux内核时间管理55 3.3.1 时钟源、时钟事件和节拍设备的概念55 3.3.2 使用标准内核低精度(low-res)定时器67 3.3.3 高精度定时器(hrtimer)73 3.4 实现工作延迟机制77 3.4.1 软中断(softirq)78 3.4.2 任务微调度(tasklet)82 3.4.3 工作队列(workqueue)86 3.4.4 新一代的工作队列90 3.5 内核中断处理93 3.6 总结109 第4章 编写字符设备驱动程序110 4.1 主设备号和次设备号的概念110 4.2 字符设备数据结构介绍111 4.2.1 设备文件操作介绍112 4.2.2 内核中文件的表示114 4.3 创建设备节点115 4.3.1 设备识别115 4.3.2 字符设备号的注册和分配115 4.3.3 在系统中初始化和注册字符设备116 4.4 实现文件操作119 4.4.1 在内核空间和用户空间之间交换数据119 4.4.2 实现打开文件操作120 4.4.3 实现释放文件操作121 4.4.4 实现写文件操作122 4.4.5 实现读取文件操作124 4.4.6 实现llseek文件操作126 4.5 总结135 第 2篇 Linux内核平台抽象和设备驱动程序 第5章 理解和利用设备树139 5.1 设备树机制的基本概念139 5.1.1 设备树命名约定140 5.1.2 认识别名、标签、phandle和路径141 5.1.3 理解节点和属性的覆盖144 5.1.4 设备树源代码和编译器145 5.2 如何表示和寻址设备151 5.2.1 如何处理SPI和I2C设备寻址152 5.2.2 内存映射设备和设备寻址153 5.3 处理资源155 5.3.1 resource结构体155 5.3.2 提取应用程序的特定数据158 5.4 总结162 第6章 设备、驱动程序和平台抽象简介163 6.1 Linux内核平台抽象和数据结构163 6.1.1 device结构体163 6.1.2 device_driver结构体165 6.1.3 设备/驱动程序匹配和模块(自动)加载170 6.1.4 设备声明—填充设备172 6.2 设备与驱动程序匹配机制详解173 6.3 总结176 第7章 平台设备和驱动程序的概念177 7.1 Linux内核中的平台核心抽象178 7.2 处理平台设备180 7.2.1 分配和注册平台设备180 7.2.2 在代码中如何避免分配平台设备182 7.2.3 使用平台资源183 7.3 平台驱动程序抽象和架构188 7.3.1 探测和释放平台设备188 7.3.2 在驱动程序中对它所支持的设备进行配置189 7.3.3 驱动程序的初始化和注册191 7.4 从零开始编写平台驱动程序193 7.5 总结198 第8章 编写I2C设备驱动程序199 8.1 Linux内核中的I2C框架抽象200 8.1.1 struct i2c_adapter简介200 8.1.2 I2C客户端和驱动程序数据结构202 8.1.3 I2C通信接口204 8.2 I2C设备驱动程序抽象和架构208 8.2.1 探测I2C设备208 8.2.2 实现i2c_driver.remove回调函数209 8.2.3 驱动程序的初始化和注册210 8.2.4 在驱动程序中配置设备211 8.2.5 实例化I2C设备212 8.3 如何避免编写I2C设备驱动程序213 8.4 总结216 第9章 编写SPI设备驱动程序217 9.1 Linux内核中的SPI框架抽象218 9.1.1 struct spi_controller简介218 9.1.2 struct spi_device简介222 9.1.3 struct spi_driver简介224 9.1.4 消息传输数据结构224 9.1.5 访问SPI设备227 9.2 SPI设备驱动程序抽象和架构231 9.2.1 探测SPI设备231 9.2.2 在驱动程序中提供设备信息233 9.2.3 实现spi_driver.remove回调函数234 9.2.4 驱动程序的初始化和注册235 9.2.5 实例化SPI设备236 9.3 如何避免编写SPI设备驱动程序237 9.4 总结242 第3篇 充分发挥硬件的潜力 第 10章 深入理解Linux内核内存分配245 10.1 Linux内核内存相关术语简介245 10.1.1 32位系统中的内核地址空间布局:低端内存和高端内存的概念247 10.1.2 低端内存的细节248 10.1.3 理解高端内存249 10.2 揭开地址转换和MMU的神秘面纱255 10.2.1 页查找和TLB259 10.2.2 TLB如何运作260 10.3 内存分配机制及其API261 10.3.1 页分配器262 10.3.2 Slab分配器263 10.3.3 kmalloc分配器267 10.3.4 vmalloc分配器270 10.3.5 关于进程内存分配的幕后短故事272 10.4 使用I/O内存与硬件通信274 10.4.1 PIO设备访问275 10.4.2 MMIO 设备访问276 10.5 内存(重)映射278 10.5.1 了解kmap()的用法278 10.5.2 将内核内存映射到用户空间280 10.6 总结286 第 11章 实现DMA支持287 11.1 设置DMA映射288 11.1.1 缓存一致性和DMA的概念288 11.1.2 DMA的内存映射288 11.1.3 创建一致性DMA映射290 11.1.4 创建流DMA映射290 11.1.5 单缓冲区映射291 11.1.6 分散/聚集映射292 11.1.7 流DMA映射的隐式和显式缓存一致性294 11.2 完成(completion)的概念295 11.3 DMA引擎API296 11.3.1 DMA控制器接口简介297 11.3.2 处理设备DMA寻址能力302 11.3.3 请求DMA通道304 11.3.4 配置DMA通道305 11.3.5 配置DMA传输307 11.3.6 提交DMA传输308 11.3.7 发出待处理的DMA请求并等待回调通知309 11.4 综合实例——单缓冲区的DMA映射310 11.5 关于循环DMA的说明317 11.6 了解DMA和设备树绑定321 11.7 总结322 第 12章 内存访问抽象化——Regmap API简介:寄存器映射抽象化323 12.1 初识Regmap324 12.2 Regmap初始化329 12.3 使用Regmap寄存器访问函数330 12.3.1 批量和多寄存器读写函数331 12.3.2 理解Regmap缓存系统332 12.4 将所有内容整合在一起—基于Regmap的SPI设备驱动程序示例334 12.5 从用户空间利用Regmap337 12.6 总结340 第 13章 揭秘内核IRQ框架341 13.1 中断的简要介绍341 13.2 理解中断控制器和中断多路复用342 13.3 深入研究高级外设IRQ管理351 13.3.1 了解IRQ及其传播353 13.3.2 链式IRQ354 13.4 揭秘per-CPU中断355 13.5 总结359 第 14章 LDM简介360 14.1 LDM数据结构简介360 14.1.1 总线361 14.1.2 驱动程序数据结构367 14.1.3 设备驱动程序注册368 14.1.4 设备数据结构369 14.1.5 设备注册370 14.2 深入理解LDM371 14.2.1 了解kobject结构体371 14.2.2 了解kobj_type375 14.2.3 了解kset结构体376 14.2.4 使用非默认属性377 14.2.5 使用二进制属性382 14.3 sysfs中的设备模型概述388 14.3.1 创建设备、驱动程序、总线和类相关属性389 14.3.2 使sysfs属性poll和select兼容394 14.4 总结395 第4篇 嵌入式领域内的多种内核子系统 第 15章 深入了解IIO框架399 15.1 IIO数据结构简介401 15.1.1 了解struct iio_dev401 15.1.2 了解struct iio_info405 15.1.3 IIO通道的概念407 15.1.4 区分通道411 15.1.5 将所有内容整合在一起——编写一个虚拟IIO驱动程序413 15.2 集成IIO触发缓冲区支持417 15.2.1 IIO触发器和sysfs(用户空间)420 15.2.2 IIO缓冲区424 15.2.3 将所有内容整合在一起426 15.3 访问IIO数据432 15.3.1 单次数据采集432 15.3.2 访问数据缓冲区433 15.4 内核中的IIO消费者接口436 15.5 编写用户空间的IIO应用程序439 15.5.1 扫描和创建IIO上下文441 15.5.2 遍历和管理IIO设备445 15.5.3 遍历和管理IIO通道445 15.5.4 使用触发器进行工作447 15.5.5 创建缓冲区并读取数据样本448 15.6 遍历用户空间IIO工具455 15.7 总结455 第 16章 充分利用引脚控制器和GPIO子系统456 16.1 硬件术语介绍456 16.2 引脚控制子系统介绍458 16.3 利用GPIO控制器接口464 16.3.1 编写GPIO控制器驱动程序468 16.3.2 在GPIO控制器中启用IRQ芯片470 16.3.3 在GPIO芯片中添加IRQ芯片支持474 16.3.4 GPIO控制器绑定方式477 16.4 充分利用GPIO子系统482 16.4.1 基于整数的GPIO接口(现已弃用)483 16.4.2 基于描述符的GPIO接口(推荐方式)486 16.5 学习如何避免编写GPIO客户端驱动程序494 16.5.1 告别旧的sysfs接口494 16.5.2 欢迎使用GPIO库libgpiod495 16.5.3 GPIO聚合器504 16.6 总结509 第 17章 利用Linux内核输入子系统510 17.1 Linux内核输入子系统简介510 17.2 分配和注册输入设备513 17.3 使用轮询输入设备514 17.4 生成和报告输入事件518 17.5 处理来自用户空间的输入设备520 17.6 总结524
|
|