1.本书基于三种主流发板(包括Raspberry Pi 3 Model B)编写了近30个驱动程序的实验,帮助读者学习和掌握在嵌式Linux系统中发驱动程序的技巧和方法,这些驱动程序支持NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837微处理器。2.本书作者在嵌式系统方面有超过15年的丰富工程实践经验,他通过技术研讨会、实践讲习班和本书的方式,将他在嵌式Linux与Linux设备驱动程序发的技巧和方法传播和分享。本书中文版译者也是相关领域的专家和爱好者,通过他们的专业翻译,也让读者原汁原味地理解和体会该书的精华。3.本书配套的发工具和实验代码都可以从网上获得,或者通过书中作者提供的访问下载,方便读者阅读实践。
售 价:¥
纸质售价:¥119.20购买纸书
温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印
为你推荐
译者序
前言
作者简介
第1章 构建系统
1.1 引导加载程序
1.2 Linux内核
1.3 系统调用接口和C运行时库
1.4 系统共享库
1.5 根文件系统
1.6 Linux启动过程
1.7 构建嵌入式Linux系统
1.8 设置以太网通信
1.9 为NXP i.MX7D处理器构建嵌入式Linux系统
1.9.1 简介
1.9.2 主机软件包
1.9.3 设置repo工具
1.9.4 Yocto工程的安装和映像构建
1.9.5 Yocto之外的工作
1.9.6 构建Linux内核
1.9.7 安装TFTP服务器
1.9.8 安装NFS服务器
1.9.9 设置U-Boot环境变量
1.10 为Microchip SAMA5D2处理器构建嵌入式Linux系统
1.10.1 简介
1.10.2 主机软件包
1.10.3 Yocto工程的安装和映像构建
1.10.4 Yocto之外的工作
1.10.5 构建Linux内核
1.10.6 安装TFTP服务器
1.10.7 安装NFS服务器
1.10.8 设置U-Boot环境变量
1.11 为Broadcom BCM2837处理器构建Linux嵌入式系统
1.11.1 Raspbian
1.11.2 构建Linux内核
1.11.3 将文件复制到Raspberry Pi
1.12 使用Eclipse
1.12.1 用于内核源码的Eclipse配置
1.12.2 用于开发Linux驱动程序的Eclipse配置
第2章 Linux设备与驱动模型
2.1 总线核心驱动
2.2 总线控制器驱动
2.3 设备驱动
2.4 设备树简介
第3章 最简驱动程序
3.1 许可证
3.2 实验3-1:“helloworld”模块
3.3 代码清单3-1:helloworld_imx.c
3.4 代码清单3-2:Makefile
3.5 helloworld_imx.ko演示
3.6 实验3-2:“带参数的helloworld”模块
3.7 代码清单3-3:helloworld_imx_with_parameters.c
3.8 helloworld_imx_with_parameters.ko演示
3.9 实验3-3:“helloworld计时”模块
3.10 代码清单3-4:helloworld_imx_with_timing.c
3.11 helloworld_imx_with_timing.ko演示
第4章 字符设备驱动
4.1 实验4-1:“helloworld字符设备”模块
4.2 代码清单4-1:helloworld_imx_char_driver.c
4.3 代码清单4-2:Makefile
4.4 代码清单4-3:ioctl_test.c
4.5 helloworld_imx_char_driver.ko演示
4.6 将模块添加到内核构建
4.7 使用设备文件系统创建设备文件
4.8 实验4-2:“class字符设备”模块
4.9 代码清单4-4:helloworld_imx_class_driver.c
4.10 helloworld_imx_class_driver.ko演示
4.11 杂项字符设备驱动
4.12 实验4-3:“杂项字符设备”模块
4.13 代码清单4-5:misc_imx_driver.c
4.14 misc_imx_driver.ko演示
第5章 平台设备驱动
5.1 实验5-1:“平台设备”模块
5.2 代码清单5-1:hellokeys_imx.c
5.3 hellokeys_imx.ko演示
5.4 操作硬件的文档
5.5 硬件命名约定
5.6 引脚控制器
5.7 引脚控制子系统
5.8 设备树引脚控制器绑定
5.9 GPIO控制器驱动
5.10 GPIO描述符使用者接口
5.10.1 获取和释放GPIO
5.10.2 使用GPIO
5.10.3 GPIO映射到中断
5.10.4 GPIO设备树
5.11 在内核和用户态之间交换数据
5.12 MMIO(内存映射I/O)设备访问
5.13 实验5-2:“RGB LED平台设备”模块
5.13.1 i.MX7D处理器的硬件描述
5.13.2 SAMA5D2处理器的硬件描述
5.13.3 BCM2837处理器的硬件描述
5.13.4 i.MX7D处理器的设备树
5.13.5 SAMA5D2处理器的设备树
5.13.6 BCM2837处理器的设备树
5.13.7 “RGB LED平台设备”模块的代码描述
5.14 代码清单5-2:ledRGB_sam_platform.c
5.15 ledRGB_sam_platform.ko演示
5.16 平台驱动资源
5.17 Linux LED类
5.18 实验5-3:“RGB LED类”模块
5.18.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树
5.18.2 “RGB LED类”模块的代码描述
5.19 代码清单5.3:ledRGB_sam_class_platform.c
5.20 ledRGB_sam_class_platform.ko演示
5.21 用户态中的平台设备驱动
5.22 用户定义的I/O:UIO
5.22.1 UIO如何运转
5.22.2 内核中的UIO API
5.23 实验5-4:“LED UIO平台”模块
5.23.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树
5.23.2 “LED UIO平台”模块的代码描述
5.24 代码清单5-4:led_sam_UIO_platform.c
5.25 代码清单5-5:UIO_app.c
5.26 led_sam_UIO_platform.ko及UIO_app演示
第6章 I2C从端驱动
6.1 Linux I2C子系统
6.2 编写I2C从端驱动
6.2.1 注册I2C从端驱动
6.2.2 在设备树中声明I2C设备
6.3 实验6-1:“I2C I/O扩展设备”模块
6.3.1 i.MX7D处理器的硬件描述
6.3.2 SAMA5D2处理器的硬件描述
6.3.3 BCM2837处理器的硬件描述
6.3.4 i.MX7D处理器的设备树
6.3.5 SAMA5D2处理器的设备树
6.3.6 BCM2837处理器的设备树
6.3.7 “I2C I/O扩展设备”模块的代码描述
6.4 代码清单6-1:io_imx_expander.c
6.5 io_imx_expander.ko演示
6.6 sysfs文件系统
6.7 实验6-2:“I2C多显LED”模块
6.7.1 i.MX7D处理器的硬件描述
6.7.2 SAMA5D2处理器的硬件描述
6.7.3 BCM2837处理器的硬件描述
6.7.4 i.MX7D处理器的设备树
6.7.5 SAMA5D2处理器的设备树
6.7.6 BCM2837处理器的设备树
6.7.7 ACPI和设备树的统一设备属性接口
6.7.8 “I2C多显LED”模块的代码描述
6.8 代码清单6-2:ltc3206_imx_led_class.c
6.9 ltc3206_imx_led_class.ko演示
第7章 处理设备驱动中的中断
7.1 GPIO控制器在Linux内核的中断域
7.2 设备树中断处理
7.3 在Linux设备驱动中申请中断
7.4 实验7-1:“按钮中断设备”模块
7.4.1 i.MX7D处理器的硬件描述
7.4.2 SAMA5D2处理器的硬件描述
7.4.3 BCM2837处理器的硬件描述
7.4.4 i.MX7D处理器的设备树
7.4.5 SAMA5D2处理器的设备树
7.4.6 BCM2837处理器的设备树
7.4.7 “按钮中断设备”模块的代码描述
7.5 代码清单7-1:int_imx_key.c
7.6 int_imx_key.ko演示
7.7 延迟工作
7.7.1 软中断
7.7.2 tasklet
7.7.3 定时器
7.7.4 线程化的中断
7.7.5 工作队列
7.8 内核中的锁
7.8.1 锁和单处理器内核
7.8.2 在中断和进程上下文之间共享自旋锁
7.8.3 在用户上下文使用锁
7.9 内核中的睡眠
7.10 实验7-2:“睡眠设备”模块
7.10.1 i.MX7D处理器的设备树
7.10.2 SAMA5D2处理器的设备树
7.10.3 BCM2837处理器的设备树
7.10.4 “睡眠设备”模块的代码描述
7.11 代码清单7-2:int_imx_key_wait.c
7.12 int_imx_key_wait.ko演示
7.13 内核线程
7.14 实验7-3:“keyled类”模块
7.14.1 i.MX7D处理器的硬件描述
7.14.2 SAMA5D2处理器的硬件描述
7.14.3 BCM2837处理器的硬件描述
7.14.4 i.MX7D处理器的设备树
7.14.5 SAMA5D2处理器的设备树
7.14.6 BCM2837处理器的设备树
7.14.7 “keyled类”模块的代码描述
7.15 代码清单7-3:keyled_imx_class.c
7.16 keyled_imx_class.ko演示
第8章 在Linux驱动中分配内存
8.1 查询ARM的MMU转换表
8.2 Linux地址的类型
8.3 用户进程的虚拟地址到物理地址的映射
8.4 内核的虚拟地址到物理地址的映射
8.5 内核内存分配器
8.5.1 页面分配器
8.5.2 页面分配器接口
8.5.3 SLAB分配器
8.5.4 SLAB分配器接口
8.5.5 kmalloc内存分配器
8.6 实验8-1:“链表内存分配”模块
8.7 代码清单8-1:linkedlist_imx_platform.c
8.8 linkedlist_imx_platform.ko演示
第9章 在Linux设备驱动中使用DMA
9.1 缓存一致性
9.2 Linux DMA引擎API
9.3 实验9-1:“流式DMA”模块
9.4 代码清单9-1:sdma_imx_m2m.c
9.5 sdma_imx_m2m.ko演示
9.6 DMA分散/聚集映射
9.7 实验9-2:“分散/聚集DMA设备”模块
9.8 代码清单9-2:sdma_imx_sg_m2m.c
9.9 sdma_imx_sg_m2m.ko演示
9.10 用户态DMA
9.11 实验9-3:“用户态DMA”模块
9.12 代码清单9-3:sdma_imx_mmap.c
9.13 代码清单9-4:sdma.c
9.14 sdma_imx_mmap.ko演示
第10章 输入子系统设备驱动框架
10.1 输入子系统驱动程序
10.2 实验10-1:“输入子系统加速度计”模块
10.2.1 设备树
10.2.2 使用I2C交互的输入框架
10.2.3 使用输入设备的输入框架
10.3 代码清单10-1:i2c_imx_accel.c
10.4 i2c_imx_accel.ko演示
10.5 在Linux中使用SPI
10.6 Linux的SPI子系统
10.7 编写SPI从设备驱动程序
10.7.1 注册SPI从设备驱动程序
10.7.2 在设备树中声明SPI设备
10.8 实验10-2:“SPI加速度计输入设备”模块
10.8.1 i.MX7D处理器的硬件描述
10.8.2 SAMA5D2处理器的硬件描述
10.8.3 BCM2837处理器的硬件描述
10.8.4 i.MX7D处理器的设备树
10.8.5 SAMA5D2处理器的设备树
10.8.6 BCM2837处理器的设备树
10.8.7 “SPI加速度计输入设备”模块的代码描述
10.9 代码清单10-2:adxl345_imx.c
10.10 adxl345_imx.ko演示
第11章 设备驱动中的工业IO子系统
11.1 IIO设备的sysfs接口
11.2 IIO设备通道
11.3 iio_info数据结构
11.4 缓冲区
11.4.1 IIO缓冲区的sysfs接口
11.4.2 设置IIO缓冲区
11.4.3 触发器
11.4.4 触发式缓冲区
11.5 工业I/O事件
11.6 IIO工具
11.7 实验11-1:“IIO子系统DAC”模块
11.7.1 设备树
11.7.2 用作I2C交互的工业框架
11.7.3 用作IIO设备的工业框架
11.8 代码清单11-1:ltc2607_imx_dual_device.c
11.9 实验11-2:“SPIDEV双通道ADC用户”应用程序的“IIO子系统DAC”模块
11.9.1 i.MX7D处理器的硬件描述
11.9.2 SAMA5D2处理器的硬件描述
11.9.3 BCM2837处理器的硬件描述
11.9.4 i.MX7D处理器的设备树
11.9.5 SAMA5D2处理器的设备树
11.9.6 BCM2837处理器的设备树
11.10 代码清单11-2:LTC2422_spidev.c
11.11 ltc2607_imx_dual_device.ko配合LTC2422_spidev使用演示
11.12 实验11-3:“IIO子系统ADC”模块
11.12.1 设备树
11.12.2 用作SPI交互的工业框架
11.12.3 用作IIO设备的工业框架
11.13 代码清单11-3:ltc2422_imx_dual.c
11.14 代码清单11-4:ltc2422_app.c
11.15 ltc2422_imx_dual.ko配合ltc2422_app使用演示
11.16 实验11-4:“具备硬件触发功能的IIO子系统ADC”模块
11.16.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树
11.16.2 驱动里的睡眠和唤醒
11.16.3 中断管理
11.17 代码清单11-5:ltc2422_imx_trigger.c
11.18 ltc2422_imx_trigger.ko配合LTC2422_app使用演示
第12章 在Linux设备驱动程序中使用regmap API
12.1 regmap的实现
12.2 实验12-1:“SPI regmap IIO设备”模块
12.3 代码清单12-1:adxl345_imx_iio.c
12.4 adxl345_imx_iio.ko演示
第13章 Linux USB设备驱动
13.1 USB 2.0总线拓扑
13.2 USB总线枚举和设备布局
13.3 USB数据传输
13.4 USB设备类别
13.5 USB描述符
13.5.1 USB设备描述符
13.5.2 USB配置描述符
13.5.3 USB接口描述符
13.5.4 USB端点描述符
13.5.5 USB字符串描述符
13.5.6 USB HID描述符
13.6 Linux USB子系统
13.7 编写Linux USB设备驱动程序
13.7.1 注册USB设备驱动程序
13.7.2 Linux主机端数据类型
13.7.3 USB请求块
13.8 实验13-1:USB HID设备应用程序
13.8.1 步骤1:创建一个新工程
13.8.2 步骤2:配置Harmony
13.8.3 步骤3:修改生成的代码
13.8.4 步骤4:声明USB状态机的状态
13.8.5 步骤5:添加新成员到APP_DATA类型
13.8.6 步骤6:声明接收缓冲区和发送缓冲区
13.8.7 步骤7:初始化新成员
13.8.8 步骤8:处理弹出
13.8.9 步骤9:处理HID事件
13.8.10 步骤10:创建USB状态机
13.8.11 步骤11:调度新的报告接收请求
13.8.12 步骤12:接收、准备和发送报告
13.8.13 步骤13:烧写应用程序
13.9 实验13-2:“USB LED”模块
13.10 代码清单13-1:usb_led.c
13.11 usb_led.ko演示
13.12 实验13-3:“USB LED和开关”模块
13.13 代码清单13-2:usb_urb_int_led.c
13.14 usb_urb_int_led.ko演示
13.15 实验13-4:“连接到USB多显LED的I2C”模块
13.16 代码清单13-3:usb_ltc3206.c
13.17 usb_ltc3206.ko演示
附录 将内核模块移植到Microchip SAMA5D27-SOM1上
参考文献
术语表
买过这本书的人还买过
读了这本书的人还在读
同类图书排行榜