嵌入式Linux设备驱动程序开发指南(原书第2版)

嵌入式Linux设备驱动程序开发指南(原书第2版)

查阅电子书
手机扫码
  • 微信扫一扫

    关注微信公众号

因版权原因待上架

编辑推荐

嵌入式Linux驱动领域开发的实战指南,带你从0到1学习驱动程序开发。

内容简介

嵌入式微处理器功能强大、节能和低成本与嵌入式Linux系统的灵活性结合,促使业界许多公司基于嵌入式微处理器开发出了很多新产品。

本书教读者基于设备树嵌入式Linux系统如何开发设备驱动程序。读者将学习编写不同类型的Linux驱动程序,以及与内核和用户空间交互的应用程序程序接口(API)和方法。

本书以实战为核心,阐述了Linux内核基础知识,将编写大约30个驱动程序并移植到三种不同的微处理器上。本书在实验部分中基于NXPi.MX7D、MicrochipSAMA5D2和BroadcomBCM2837三种不同微处理器详细阐述了驱动程序的开发的实现,读者可参考实验部分选择开发和测试自己的驱动程序。

在阅读本书之前,建议读者先购买一个基于这些微处理器之一的开发板,板上至少应有一个SPI和I2C控制器,例如RaspberryPi3模型B板。

作者简介

作者阿尔贝托·利贝拉尔·德·洛斯里奥斯,是Arrow Electronics的现场应用工程师,在嵌入式系统方面有超过15年的经验。在过去的几年里,他一直在Arrow公司支持高端处理器和FPGA产品。Alberto也是Linux爱好者,在过去的几年里,他举办了多场关于嵌入式Linux与Linux设备驱动程序的技术研讨会和实践讲习班。Alberto的专业技能还包括多媒体芯片(SoC)和嵌入式实时操作系统(RTOS)。他目前居住在西班牙马德里,他最大的爱好是和女儿一起在马德里市中心散步,他还喜欢阅读电影杂志和观看科幻电影。

章节目录

版权信息

译者序

前言

作者简介

第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上

参考文献

术语表

嵌入式Linux设备驱动程序开发指南(原书第2版)是2021年由机械工业出版社有限公司出版,作者[西] 阿尔贝托·利贝拉尔·德·洛斯里奥斯。

得书感谢您对《嵌入式Linux设备驱动程序开发指南(原书第2版)》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

购买这本书

你可能喜欢
RISC-V架构与嵌入式开发快速入门 电子书
为了促进RISC-V在国内的普及,尤其是被广大初学者接受和快速入门,本书将分享和总结一些使用RISC-V进行嵌入式开发的相关技术和经验,主要面向对RISC-V感兴趣的入门用户,包括嵌入式软件开发和硬件设计人员。 本书的姊妹版《手把手教你设计CPU——RISC-V处理器篇》已经出版,提供了一个非常高效的超低功耗开源RISC-V处理器学习案例——蜂鸟E203,并对其进行了全方面剖析和讲解,解决了在CPU硬件设计方面中文资料欠缺的问题。
嵌入式Linux C语言程序设计基础教程(微课版) 电子书
本书较为全面地介绍了嵌入式开发中C语言编程的基础知识。全书共11章,内容包括嵌入式LinuxC语言开发工具、数据、数据的输入输出、运算符和表达式、程序结构和控制语句、数组、指针、函数、用户自定义数据类型、嵌入式C语言的用法、嵌入式Linux内核常见数据结构。每章都提供详细的练习题和视频讲解,通过练习、操作实践及相关视频,帮助读者巩固所学的内容。本书可以作为院校嵌入式相关专业和计算机相关专业的教材,
Swift 3开发指南 电子书
本书是基于Xcode8编写而成的,通过大量通俗易懂的案例全面讲解了Swift语言开发的相关内容。书中包含常量与变量、基本数据类型,以及Swift语言中的新数据类型—元组型和可选型的内容。同时,本书中还讲解了运算符和表达式、流程控制语句、字符和字符串、collection类型、函数和闭包。此外,Swift面向对象的枚举、结构体、类,以及内存管理、协议与抽象类型、错误处理、链式编程等内容本书也有所涉及
iOS 9开发指南 电子书
全书共39章,循序渐进地讲解了iOS9应用开发的基本知识。本书从搭建开发环境讲起,依次讲解了Objective-C语言基础,Swift语言基础,CocoaTouch,XcodeInterfaceBuilder界面开发,使用Xcode编写MVC程序,文本框和文本视图,按钮和标签,滑块、步进和图像,开关控件和分段控件,Web视图控件、可滚动视图控件和翻页控件,提醒和操作表,工具栏、日期选择器,表视图,
Linux操作系统(第3版) 电子书
以RedHat Linux 7为讲解版本,全面讲解linux知识。