计算机
类型
8.7
豆瓣评分
可以朗读
语音朗读
589千字
字数
2021-06-01
发行日期
展开全部
主编推荐语
嵌入式Linux驱动领域开发的实战指南,带你从0到1学习驱动程序开发。
内容简介
嵌入式微处理器功能强大、节能和低成本与嵌入式Linux系统的灵活性结合,促使业界许多公司基于嵌入式微处理器开发出了很多新产品。
本书教读者基于设备树嵌入式Linux系统如何开发设备驱动程序。读者将学习编写不同类型的Linux驱动程序,以及与内核和用户空间交互的应用程序程序接口(API)和方法。
本书以实战为核心,阐述了Linux内核基础知识,将编写大约30个驱动程序并移植到三种不同的微处理器上。本书在实验部分中基于NXPi.MX7D、MicrochipSAMA5D2和BroadcomBCM2837三种不同微处理器详细阐述了驱动程序的开发的实现,读者可参考实验部分选择开发和测试自己的驱动程序。
在阅读本书之前,建议读者先购买一个基于这些微处理器之一的开发板,板上至少应有一个SPI和I2C控制器,例如RaspberryPi3模型B板。
目录
- 版权信息
- 译者序
- 前言
- 作者简介
- 第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上
- 参考文献
- 术语表
展开全部
出版方
机械工业出版社有限公司
机械工业出版社是全国优秀出版社,自1952年成立以来,坚持为科技、为教育服务,以向行业、向学校提供优质、权威的精神产品为宗旨,以“服务社会和人民群众需求,传播社会主义先进文化”为己任,产业结构不断完善,已由传统的图书出版向着图书、期刊、电子出版物、音像制品、电子商务一体化延伸,现已发展为多领域、多学科的大型综合性出版社,涉及机械、电工电子、汽车、计算机、经济管理、建筑、ELT、科普以及教材、教辅等领域。