展开全部

主编推荐语

嵌入式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上
  • 参考文献
  • 术语表
展开全部

评分及书评

评分不足
1个评分
  • 用户头像
    给这本书评了
    5.0

    Linux 设备驱动领域,已经有不少相关书籍面市。但是,还没有一本专门针对嵌入式 Linux 驱动的书籍。本书作者在嵌入式 Linux 领域工作多年,实践经验丰富。本书正是专门针对嵌入式 Linux 领域中常用的各种设备驱动程序而编写的,可以作为 Linux 设备驱动领域的有益补充。

      转发
      评论

    出版方

    机械工业出版社有限公司

    机械工业出版社是全国优秀出版社,自1952年成立以来,坚持为科技、为教育服务,以向行业、向学校提供优质、权威的精神产品为宗旨,以“服务社会和人民群众需求,传播社会主义先进文化”为己任,产业结构不断完善,已由传统的图书出版向着图书、期刊、电子出版物、音像制品、电子商务一体化延伸,现已发展为多领域、多学科的大型综合性出版社,涉及机械、电工电子、汽车、计算机、经济管理、建筑、ELT、科普以及教材、教辅等领域。