万本电子书0元读

万本电子书0元读

顶部广告

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

1.本书基于三种主流发板(包括Raspberry Pi 3 Model B)编写了近30个驱动程序的实验,帮助读者学习和掌握在嵌式Linux系统中发驱动程序的技巧和方法,这些驱动程序支持NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837微处理器。2.本书作者在嵌式系统方面有超过15年的丰富工程实践经验,他通过技术研讨会、实践讲习班和本书的方式,将他在嵌式Linux与Linux设备驱动程序发的技巧和方法传播和分享。本书中文版译者也是相关领域的专家和爱好者,通过他们的专业翻译,也让读者原汁原味地理解和体会该书的精华。3.本书配套的发工具和实验代码都可以从网上获得,或者通过书中作者提供的访问下载,方便读者阅读实践。

售       价:¥

纸质售价:¥114.90购买纸书

127人正在读 | 0人评论 7.1

作       者:(西)阿尔贝托·利贝拉尔·德·洛斯里奥斯(Alberto Liberal de los Ríos)

出  版  社:机械工业出版社

出版时间:2021-06-01

字       数:22.8万

所属分类: 科技 > 计算机/网络 > 软件系统

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
嵌式微处理器功能强大、节能和低成本与嵌式Linux系统的灵活性结合,促使业界许多公司基于嵌式微处理器发出了很多新产品。本书教读者基于设备树嵌式Linux系统如何发设备驱动程序。读者将学习编写不同类型的Linux驱动程序,以及与内核和用户空间交互的应用程序程序口(API)和方法。本书以实战为核心,阐述了Linux内核基础知识,将编写大约30个驱动程序并移植到三种不同的微处理器上。本书在实验部分中基于NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837三种不同微处理器详细阐述了驱动程序的发的实现,读者可参考实验部分选择发和测试自己的驱动程序。在阅读本书之前,建议读者先一个基于这些微处理器之一的发板,板上至少应有一个SPI和I2C控制器,例如Raspberry Pi3模型B板。<br/>【推荐语】<br/>1.本书基于三种主流发板(包括Raspberry Pi 3 Model B)编写了近30个驱动程序的实验,帮助读者学习和掌握在嵌式Linux系统中发驱动程序的技巧和方法,这些驱动程序支持NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837微处理器。2.本书作者在嵌式系统方面有超过15年的丰富工程实践经验,他通过技术研讨会、实践讲习班和本书的方式,将他在嵌式Linux与Linux设备驱动程序发的技巧和方法传播和分享。本书中文版译者也是相关领域的专家和爱好者,通过他们的专业翻译,也让读者原汁原味地理解和体会该书的精华。3.本书配套的发工具和实验代码都可以从网上获得,或者通过书中作者提供的访问下载,方便读者阅读实践。<br/>【作者】<br/>Alberto Liberty是Arrow Electronics的现场应用工程师,在嵌式系统方面有超过15年的经验。在过去的几年里,他一直在Arrow公司支持高端处理器和FPGA产品。Alberto也是Linux爱好者,在过去的几年里,他举办了多场关于嵌式Linux与Linux设备驱动程序的技术研讨会和实践讲习班。Alberto的专业技能还包括多媒体芯片(SoC)和嵌式实时操作系统(RTOS)。他目前居住在西班牙马德里,他的爱好是和女儿一起在马德里市中心散步,他还喜欢阅读电影杂志和观看科幻电影。<br/>
目录展开

译者序

前言

作者简介

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

参考文献

术语表

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部