描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111684558丛书名: 电子与嵌入式系统设计译丛
编辑推荐
1.本书基于三种主流开发板(包括Raspberry Pi 3 Model B)编写了近30个驱动程序的实验,帮助读者学习和掌握在嵌入式Linux系统中开发驱动程序的技巧和方法,这些驱动程序支持NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837微处理器。2.本书作者在嵌入式系统方面有超过15年的丰富工程实践经验,他通过技术研讨会、实践讲习班和本书的方式,将他在嵌入式Linux与Linux设备驱动程序开发的技巧和方法传播和分享。本书中文版译者也是相关领域的专家和爱好者,通过他们的专业翻译,也让读者原汁原味地理解和体会该书的精华。3.本书配套的开发工具和实验代码都可以从网上获得,或者通过书中作者提供的访问链接下载,方便读者阅读实践。
内容简介
嵌入式微处理器功能强大、节能和低成本与嵌入式Linux系统的灵活性结合,促使业界许多公司基于嵌入式微处理器开发出了很多新产品。本书教读者基于设备树嵌入式Linux系统如何开发设备驱动程序。读者将学习编写不同类型的Linux驱动程序,以及与内核和用户空间交互的应用程序程序接口(API)和方法。本书以实战为核心,阐述了Linux内核基础知识,将编写大约30个驱动程序并移植到三种不同的微处理器上。本书在实验部分中基于NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837三种不同微处理器详细阐述了驱动程序的开发的实现,读者可参考实验部分选择开发和测试自己的驱动程序。在阅读本书之前,建议读者先购买一个基于这些微处理器之一的开发板,板上至少应有一个SPI和I2C控制器,例如Raspberry Pi3模型B板。
目 录
译者序
前言
作者简介
第1章 构建系统1
1.1 引导加载程序1
1.2 Linux内核3
1.3 系统调用接口和C运行时库6
1.4 系统共享库7
1.5 根文件系统8
1.6 Linux启动过程9
1.7 构建嵌入式Linux系统10
1.8 设置以太网通信11
1.9 为NXP i.MX7D处理器构建嵌入式Linux系统11
1.9.1 简介12
1.9.2 主机软件包12
1.9.3 设置repo工具13
1.9.4 Yocto工程的安装和映像构建13
1.9.5 Yocto 之外的工作15
1.9.6 构建Linux内核18
1.9.7 安装TFTP服务器20
1.9.8 安装NFS服务器20
1.9.9 设置U-Boot环境变量21
1.10 为Microchip SAMA5D2处理器构建嵌入式Linux系统21
1.10.1 简介22
1.10.2 主机软件包22
1.10.3 Yocto工程的安装和映像构建22
1.10.4 Yocto 之外的工作25
1.10.5 构建Linux内核25
1.10.6 安装TFTP服务器27
1.10.7 安装NFS服务器27
1.10.8 设置U-Boot环境变量28
1.11 为Broadcom BCM2837处理器构建Linux嵌入式系统28
1.11.1 Raspbian28
1.11.2 构建Linux内核29
1.11.3 将文件复制到Raspberry Pi31
1.12 使用Eclipse33
1.12.1 用于内核源码的Eclipse配置33
1.12.2 用于开发Linux驱动程序的Eclipse配置38
第2章 Linux设备与驱动模型42
2.1 总线核心驱动42
2.2 总线控制器驱动45
2.3 设备驱动45
2.4 设备树简介46
第3章 简驱动程序50
3.1 许可证51
3.2 实验3-1:“helloworld”模块51
3.3 代码清单3-1:helloworld_imx.c52
3.4 代码清单3-2:Makefile52
3.5 helloworld_imx.ko演示53
3.6 实验3-2:“带参数的helloworld”模块53
3.7 代码清单3-3:helloworld_imx_with_parameters.c54
3.8 helloworld_imx_with_parameters.ko演示54
3.9 实验3-3:“helloworld计时”模块55
3.10 代码清单3-4:helloworld_imx_with_timing.c55
3.11 helloworld_imx_with_timing.ko演示56
第4章 字符设备驱动57
4.1 实验4-1:“helloworld字符设备”模块59
4.2 代码清单4-1:helloworld_imx_char_driver.c63
4.3 代码清单4-2:Makefile65
4.4 代码清单 4-3:ioctl_test.c65
4.5 helloworld_imx_char_driver.ko演示66
4.6 将模块添加到内核构建66
4.7 使用设备文件系统创建设备文件67
4.8 实验4-2:“class字符设备”模块68
4.9 代码清单4-4:helloworld_imx_class_driver.c70
4.10 helloworld_imx_class_driver.ko演示72
4.11 杂项字符设备驱动72
4.12 实验4-3:“杂项字符设备”模块73
4.13 代码清单4-5:misc_imx_driver.c74
4.14 misc_imx_driver.ko演示75
第5章 平台设备驱动76
5.1 实验5-1:“平台设备”模块78
5.2 代码清单5-1:hellokeys_imx.c81
5.3 hellokeys_imx.ko演示82
5.4 操作硬件的文档82
5.5 硬件命名约定83
5.6 引脚控制器84
5.7 引脚控制子系统86
5.8 设备树引脚控制器绑定92
5.9 GPIO 控制器驱动96
5.10 GPIO描述符使用者接口98
5.10.1 获取和释放GPIO98
5.10.2 使用GPIO99
5.10.3 GPIO映射到中断99
5.10.4 GPIO设备树100
5.11 在内核和用户态之间交换数据100
5.12 MMIO(内存映射I/O)设备访问101
5.13 实验5-2:“RGB LED平台设备”模块103
5.13.1 i.MX7D处理器的硬件描述103
5.13.2 SAMA5D2处理器的硬件描述105
5.13.3 BCM2837处理器的硬件描述107
5.13.4 i.MX7D处理器的设备树107
5.13.5 SAMA5D2处理器的设备树111
5.13.6 BCM2837处理器的设备树114
5.13.7 “RGB LED平台设备”模块的代码描述115
5.14 代码清单5-2:ledRGB_sam_platform.c119
5.15 ledRGB_sam_platform.ko演示124
5.16 平台驱动资源124
5.17 Linux LED类126
5.18 实验5-3:“RGB LED类”模块128
5.18.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树128
5.18.2 “RGB LED类”模块的代码描述130
5.19 代码清单5.3:ledRGB_sam_class_platform.c134
5.20 ledRGB_sam_class_platform.ko演示137
5.21 用户态中的平台设备驱动137
5.22 用户定义的I/O:UIO139
5.22.1 UIO如何运转140
5.22.2 内核中的UIO API141
5.23 实验5-4:“LED UIO平台”模块142
5.23.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树143
5.23.2 “LED UIO平台”模块的代码描述144
5.24 代码清单5-4:led_sam_UIO_platform.c146
5.25 代码清单5-5:UIO_app.c148
5.26 led_sam_UIO_platform.ko及UIO_app演示150
第6章 I2C从端驱动151
6.1 Linux I2C 子系统152
6.2 编写I2C 从端驱动155
6.2.1 注册I2C从端驱动155
6.2.2 在设备树中声明I2C设备157
6.3 实验6-1:“I2C I/O 扩展设备”模块159
6.3.1 i.MX7D处理器的硬件描述159
6.3.2 SAMA5D2 处理器的硬件描述159
6.3.3 BCM2837处理器的硬件描述160
6.3.4 i.MX7D处理器的设备树161
6.3.5 SAMA5D2处理器的设备树162
6.3.6 BCM2837处理器的设备树163
6.3.7 “I2C I/O扩展设备”模块的代码描述164
6.4 代码清单6-1:io_imx_expander.c167
6.5 io_imx_expander.ko演示170
6.6 sysfs文件系统171
6.7 实验6-2:“I2C多显LED”模块174
6.7.1 i.MX7D处理器的硬件描述175
6.7.2 SAMA5D2处理器的硬件描述176
6.7.3 BCM2837处理器的硬件描述176
6.7.4 i.MX7D处理器的设备树177
6.7.5 SAMA5D2处理器的设备树178
6.7.6 BCM2837处理器的设备树180
6.7.7 ACPI和设备树的统一设备属性接口181
6.7.8 “I2C多显LED”模块的代码描述182
6.8 代码清单6-2:ltc3206_imx_led_class.c186
6.9 ltc3206_imx_led_class.ko演示192
第7章 处理设备驱动中的中断194
7.1 GPIO控制器在Linux内核的中断域196
7.2 设备树中断处理203
7.3 在Linux设备驱动中申请中断206
7.4 实验7-1:“按钮中断设备”模块207
7.4.1 i.MX7D处理器的硬件描述208
7.4.2 SAMA5D2处理器的硬件描述208
7.4.3 BCM2837处理器的硬件描述208
7.4.4 i.MX7D 处理器的设备树208
7.4.5 SAMA5D2 处理器的设备树209
7.4.6 BCM2837 处理器的设备树210
7.4.7 “按钮中断设备”模块的代码描述211
7.5 代码清单7-1:int_imx_key.c213
7.6 int_imx_key.ko演示215
7.7 延迟工作215
7.7.1 软中断216
7.7.2 tasklet217
7.7.3 定时器218
7.7.4 线程化的中断221
7.7.5 工作队列223
7.8 内核中的锁226
7.8.1 锁和单处理器内核227
7.8.2 在中断和进程上下文之间共享自旋锁227
7.8.3 在用户上下文使用锁227
7.9 内核中的睡眠228
7.10 实验7-2:“睡眠设备”模块229
7.10.1 i.MX7D处理器的设备树230
7.10.2 SAMA5D2处理器的设备树231
7.10.3 BCM2837处理器的设备树232
7.10.4 “睡眠设备”模块的代码描述233
7.11 代码清单7-2:int_imx_key_wait.c236
7.12 int_imx_key_wait.ko演示239
7.13 内核线程239
7.14 实验7-3:“keyled类”模块240
7.14.1 i.MX7D处理器的硬件描述240
7.14.2 SAMA5D2处理器的硬件描述241
7.14.3 BCM2837处理器的硬件描述241
7.14.4 i.MX7D 处理器的设备树242
7.14.5 SAMA5D2处理器的设备树245
7.14.6 BCM2837处理器的设备树247
7.14.7 “keyled类”模块的代码描述249
7.15 代码清单7-3:keyled_imx_class.c255
7.16 keyled_imx_class.ko演示264
第8章 在Linux驱动中分配内存266
8.1 查询ARM的MMU转换表267
8.2 Linux地址的类型271
8.3 用户进程的虚拟地址到物理地址的映射273
8.4 内核的虚拟地址到物理地址的映射273
8.5 内核内存分配器275
8.5.1 页面分配器275
8.5.2 页面分配器接口275
8.5.3 SLAB分配器276
8.5.4 SLAB分配器接口278
8.5.5 kmalloc内存分配器279
8.6 实验8-1:“链表内存分配”模块280
8.7 代码清单8-1:linkedlist_imx_platform.c283
8.8 linkedlist_imx_platform.ko演示287
第9章 在Linux设备驱动中使用DMA288
9.1 缓存一致性288
9.2 Linux DMA引擎API289
9.3 实验9-1:“流式DMA”模块295
9.4 代码清单9-1:sdma_imx_m2m.c302
9.5 sdma_imx_m2m.ko演示 306
9.6 DMA分散/聚集映射306
9.7 实验9-2:“分散/聚集DMA设备”模块 307
9.8 代码清单9-2:sdma_imx_sg_m2m.c310
9.9 sdma_imx_sg_m2m.ko演示 315
9.10 用户态DMA315
9.11 实验9-3:“用户态DMA”模块317
9.12 代码清单9-3:sdma_imx_mmap.c319
9.13 代码清单9-4:sdma.c323
9.14 sdma_imx_mmap.ko演示324
第10章 输入子系统设备驱动框架325
10.1 输入子系统驱动程序326
10.2 实验10-1:“输入子系统加速度计”模块327
10.2.1 设备树329
10.2.2 使用I2C交互的输入框架330
10.2.3 使用输入设备的输入框架331
10.3 代码清单10-1:i2c_imx_accel.c334
10.4 i2c_imx_accel.ko演示336
10.5 在Linux中使用SPI337
10.6 Linux的SPI子系统339
10.7 编写SPI从设备驱动程序 342
10.7.1 注册SPI从设备驱动程序 342
10.7.2 在设备树中声明SPI设备343
10.8 实验10-2:“SPI加速度计输入设备”模块346
10.8.1 i.MX7D 处理器的硬件描述347
10.8.2 SAMA5D2处理器的硬件描述 347
10.8.3 BCM2837处理器的硬件描述 348
10.8.4 i.MX7D处理器的设备树348
10.8.5 SAMA5D2处理器的设备树 349
10.8.6 BCM2837处理器的设
前言
作者简介
第1章 构建系统1
1.1 引导加载程序1
1.2 Linux内核3
1.3 系统调用接口和C运行时库6
1.4 系统共享库7
1.5 根文件系统8
1.6 Linux启动过程9
1.7 构建嵌入式Linux系统10
1.8 设置以太网通信11
1.9 为NXP i.MX7D处理器构建嵌入式Linux系统11
1.9.1 简介12
1.9.2 主机软件包12
1.9.3 设置repo工具13
1.9.4 Yocto工程的安装和映像构建13
1.9.5 Yocto 之外的工作15
1.9.6 构建Linux内核18
1.9.7 安装TFTP服务器20
1.9.8 安装NFS服务器20
1.9.9 设置U-Boot环境变量21
1.10 为Microchip SAMA5D2处理器构建嵌入式Linux系统21
1.10.1 简介22
1.10.2 主机软件包22
1.10.3 Yocto工程的安装和映像构建22
1.10.4 Yocto 之外的工作25
1.10.5 构建Linux内核25
1.10.6 安装TFTP服务器27
1.10.7 安装NFS服务器27
1.10.8 设置U-Boot环境变量28
1.11 为Broadcom BCM2837处理器构建Linux嵌入式系统28
1.11.1 Raspbian28
1.11.2 构建Linux内核29
1.11.3 将文件复制到Raspberry Pi31
1.12 使用Eclipse33
1.12.1 用于内核源码的Eclipse配置33
1.12.2 用于开发Linux驱动程序的Eclipse配置38
第2章 Linux设备与驱动模型42
2.1 总线核心驱动42
2.2 总线控制器驱动45
2.3 设备驱动45
2.4 设备树简介46
第3章 简驱动程序50
3.1 许可证51
3.2 实验3-1:“helloworld”模块51
3.3 代码清单3-1:helloworld_imx.c52
3.4 代码清单3-2:Makefile52
3.5 helloworld_imx.ko演示53
3.6 实验3-2:“带参数的helloworld”模块53
3.7 代码清单3-3:helloworld_imx_with_parameters.c54
3.8 helloworld_imx_with_parameters.ko演示54
3.9 实验3-3:“helloworld计时”模块55
3.10 代码清单3-4:helloworld_imx_with_timing.c55
3.11 helloworld_imx_with_timing.ko演示56
第4章 字符设备驱动57
4.1 实验4-1:“helloworld字符设备”模块59
4.2 代码清单4-1:helloworld_imx_char_driver.c63
4.3 代码清单4-2:Makefile65
4.4 代码清单 4-3:ioctl_test.c65
4.5 helloworld_imx_char_driver.ko演示66
4.6 将模块添加到内核构建66
4.7 使用设备文件系统创建设备文件67
4.8 实验4-2:“class字符设备”模块68
4.9 代码清单4-4:helloworld_imx_class_driver.c70
4.10 helloworld_imx_class_driver.ko演示72
4.11 杂项字符设备驱动72
4.12 实验4-3:“杂项字符设备”模块73
4.13 代码清单4-5:misc_imx_driver.c74
4.14 misc_imx_driver.ko演示75
第5章 平台设备驱动76
5.1 实验5-1:“平台设备”模块78
5.2 代码清单5-1:hellokeys_imx.c81
5.3 hellokeys_imx.ko演示82
5.4 操作硬件的文档82
5.5 硬件命名约定83
5.6 引脚控制器84
5.7 引脚控制子系统86
5.8 设备树引脚控制器绑定92
5.9 GPIO 控制器驱动96
5.10 GPIO描述符使用者接口98
5.10.1 获取和释放GPIO98
5.10.2 使用GPIO99
5.10.3 GPIO映射到中断99
5.10.4 GPIO设备树100
5.11 在内核和用户态之间交换数据100
5.12 MMIO(内存映射I/O)设备访问101
5.13 实验5-2:“RGB LED平台设备”模块103
5.13.1 i.MX7D处理器的硬件描述103
5.13.2 SAMA5D2处理器的硬件描述105
5.13.3 BCM2837处理器的硬件描述107
5.13.4 i.MX7D处理器的设备树107
5.13.5 SAMA5D2处理器的设备树111
5.13.6 BCM2837处理器的设备树114
5.13.7 “RGB LED平台设备”模块的代码描述115
5.14 代码清单5-2:ledRGB_sam_platform.c119
5.15 ledRGB_sam_platform.ko演示124
5.16 平台驱动资源124
5.17 Linux LED类126
5.18 实验5-3:“RGB LED类”模块128
5.18.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树128
5.18.2 “RGB LED类”模块的代码描述130
5.19 代码清单5.3:ledRGB_sam_class_platform.c134
5.20 ledRGB_sam_class_platform.ko演示137
5.21 用户态中的平台设备驱动137
5.22 用户定义的I/O:UIO139
5.22.1 UIO如何运转140
5.22.2 内核中的UIO API141
5.23 实验5-4:“LED UIO平台”模块142
5.23.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树143
5.23.2 “LED UIO平台”模块的代码描述144
5.24 代码清单5-4:led_sam_UIO_platform.c146
5.25 代码清单5-5:UIO_app.c148
5.26 led_sam_UIO_platform.ko及UIO_app演示150
第6章 I2C从端驱动151
6.1 Linux I2C 子系统152
6.2 编写I2C 从端驱动155
6.2.1 注册I2C从端驱动155
6.2.2 在设备树中声明I2C设备157
6.3 实验6-1:“I2C I/O 扩展设备”模块159
6.3.1 i.MX7D处理器的硬件描述159
6.3.2 SAMA5D2 处理器的硬件描述159
6.3.3 BCM2837处理器的硬件描述160
6.3.4 i.MX7D处理器的设备树161
6.3.5 SAMA5D2处理器的设备树162
6.3.6 BCM2837处理器的设备树163
6.3.7 “I2C I/O扩展设备”模块的代码描述164
6.4 代码清单6-1:io_imx_expander.c167
6.5 io_imx_expander.ko演示170
6.6 sysfs文件系统171
6.7 实验6-2:“I2C多显LED”模块174
6.7.1 i.MX7D处理器的硬件描述175
6.7.2 SAMA5D2处理器的硬件描述176
6.7.3 BCM2837处理器的硬件描述176
6.7.4 i.MX7D处理器的设备树177
6.7.5 SAMA5D2处理器的设备树178
6.7.6 BCM2837处理器的设备树180
6.7.7 ACPI和设备树的统一设备属性接口181
6.7.8 “I2C多显LED”模块的代码描述182
6.8 代码清单6-2:ltc3206_imx_led_class.c186
6.9 ltc3206_imx_led_class.ko演示192
第7章 处理设备驱动中的中断194
7.1 GPIO控制器在Linux内核的中断域196
7.2 设备树中断处理203
7.3 在Linux设备驱动中申请中断206
7.4 实验7-1:“按钮中断设备”模块207
7.4.1 i.MX7D处理器的硬件描述208
7.4.2 SAMA5D2处理器的硬件描述208
7.4.3 BCM2837处理器的硬件描述208
7.4.4 i.MX7D 处理器的设备树208
7.4.5 SAMA5D2 处理器的设备树209
7.4.6 BCM2837 处理器的设备树210
7.4.7 “按钮中断设备”模块的代码描述211
7.5 代码清单7-1:int_imx_key.c213
7.6 int_imx_key.ko演示215
7.7 延迟工作215
7.7.1 软中断216
7.7.2 tasklet217
7.7.3 定时器218
7.7.4 线程化的中断221
7.7.5 工作队列223
7.8 内核中的锁226
7.8.1 锁和单处理器内核227
7.8.2 在中断和进程上下文之间共享自旋锁227
7.8.3 在用户上下文使用锁227
7.9 内核中的睡眠228
7.10 实验7-2:“睡眠设备”模块229
7.10.1 i.MX7D处理器的设备树230
7.10.2 SAMA5D2处理器的设备树231
7.10.3 BCM2837处理器的设备树232
7.10.4 “睡眠设备”模块的代码描述233
7.11 代码清单7-2:int_imx_key_wait.c236
7.12 int_imx_key_wait.ko演示239
7.13 内核线程239
7.14 实验7-3:“keyled类”模块240
7.14.1 i.MX7D处理器的硬件描述240
7.14.2 SAMA5D2处理器的硬件描述241
7.14.3 BCM2837处理器的硬件描述241
7.14.4 i.MX7D 处理器的设备树242
7.14.5 SAMA5D2处理器的设备树245
7.14.6 BCM2837处理器的设备树247
7.14.7 “keyled类”模块的代码描述249
7.15 代码清单7-3:keyled_imx_class.c255
7.16 keyled_imx_class.ko演示264
第8章 在Linux驱动中分配内存266
8.1 查询ARM的MMU转换表267
8.2 Linux地址的类型271
8.3 用户进程的虚拟地址到物理地址的映射273
8.4 内核的虚拟地址到物理地址的映射273
8.5 内核内存分配器275
8.5.1 页面分配器275
8.5.2 页面分配器接口275
8.5.3 SLAB分配器276
8.5.4 SLAB分配器接口278
8.5.5 kmalloc内存分配器279
8.6 实验8-1:“链表内存分配”模块280
8.7 代码清单8-1:linkedlist_imx_platform.c283
8.8 linkedlist_imx_platform.ko演示287
第9章 在Linux设备驱动中使用DMA288
9.1 缓存一致性288
9.2 Linux DMA引擎API289
9.3 实验9-1:“流式DMA”模块295
9.4 代码清单9-1:sdma_imx_m2m.c302
9.5 sdma_imx_m2m.ko演示 306
9.6 DMA分散/聚集映射306
9.7 实验9-2:“分散/聚集DMA设备”模块 307
9.8 代码清单9-2:sdma_imx_sg_m2m.c310
9.9 sdma_imx_sg_m2m.ko演示 315
9.10 用户态DMA315
9.11 实验9-3:“用户态DMA”模块317
9.12 代码清单9-3:sdma_imx_mmap.c319
9.13 代码清单9-4:sdma.c323
9.14 sdma_imx_mmap.ko演示324
第10章 输入子系统设备驱动框架325
10.1 输入子系统驱动程序326
10.2 实验10-1:“输入子系统加速度计”模块327
10.2.1 设备树329
10.2.2 使用I2C交互的输入框架330
10.2.3 使用输入设备的输入框架331
10.3 代码清单10-1:i2c_imx_accel.c334
10.4 i2c_imx_accel.ko演示336
10.5 在Linux中使用SPI337
10.6 Linux的SPI子系统339
10.7 编写SPI从设备驱动程序 342
10.7.1 注册SPI从设备驱动程序 342
10.7.2 在设备树中声明SPI设备343
10.8 实验10-2:“SPI加速度计输入设备”模块346
10.8.1 i.MX7D 处理器的硬件描述347
10.8.2 SAMA5D2处理器的硬件描述 347
10.8.3 BCM2837处理器的硬件描述 348
10.8.4 i.MX7D处理器的设备树348
10.8.5 SAMA5D2处理器的设备树 349
10.8.6 BCM2837处理器的设
前 言
嵌入式系统已经成为我们日常生活中不可或缺的一部分。它们被部署在移动设备、网络基础设施、家庭和消费设备、数字标牌、医学成像、汽车信息娱乐以及许多其他工业应用中。嵌入式系统的使用正呈指数级增长。今天的处理器是由硅制成的,硅本身是由地球上丰富的材料之一—沙子制成的。处理器技术已经从2000年的90 nm制造技术发展到今天的14 nm,预计到2021年将缩小至7 nm或5 nm。
今天的嵌入式处理器包括多核64位CPU,这些CPU采用先进的14 nm工艺制造,具有广泛的异构计算能力。这些异构计算能力包括功能强大的GPU和DSP,它们被设计为运行经过训练的神经网络,并使下一代虚拟现实应用程序能够应用于单核或双核嵌入式处理器上,可以运行为不断增长的物联网和工业市场而设计的高能效、低成本的应用程序。现在,在一个价值几美元的处理器上运行嵌入式Linux系统是可能的,并且新的处理器还在不断问世,成本也在不断下降。
嵌入式Linux的灵活性,为嵌入式计算而设计的高效、节能的处理器的可用性,以及新处理器的低成本,使许多工业公司在嵌入式处理器的基础上开发新的产品成为可能。现在的工程师手中有强大的工具来开发以前无法想象的应用程序,但是他们需要了解当前Linux提供的丰富特性。
嵌入式Linux固件开发人员需要了解底层硬件功能控制,以便能够为多个外设编写接口,如GPIO、串行总线、定时器、DMA、CAN、USB和LCD。
下面是一个底层硬件控制的真实例子:假设嵌入式Linux的固件开发人员正在设计一个需要与三个不同的UART通信的Linux应用程序。一台Linux SBC(单板计算机)有三个可用的UART,但是在测试应用程序时,看起来只有两个可用的UART。原因是处理器的引脚可以被多路复用到不同的功能中,同一个引脚可以是UART引脚、I2C引脚、SPI引脚、GPIO等。要激活第三个UART,固件开发人员首先必须在内核代码中查找描述该SBC硬件的设备树(DT)源文件,其次必须检查系统,看看在这些DT文件中是否创建并激活了这些缺失的UART设备。如果没有包含该UART设备节点,则可以使用其他已创建的UART节点作为参考来创建它。之后,新的UART焊点必须多路复用为UART功能,确保它们不会与DT中使用相同焊点的其他设备发生冲突。
在使用设备树的Linux系统中,当在设备树中声明某个设备时,会由内核加载该设备的驱动程序。驱动程序从设备树节点中检索配置数据(例如,分配给该设备的物理地址,该设备触发的中断,以及设备特定的信息)。在本书中,将对设备树进行详细解释,你将看到设备树在开发Linux设备驱动程序中的重要作用。
本书将告诉你如何为设备树嵌入式Linux系统开发设备驱动程序。你将学会如何编写不同类型的Linux驱动程序,以及如何使用适当的API(应用程序接口)实现与内核和用户态的交互。本书内容以实用为主,但也提供重要的理论基础知识。
本书编写了近30个驱动程序,并将其移植到三种不同的处理器上。你可以选择NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837三种处理器来开发和测试这些驱动程序,本书的实验部分详细介绍了这些驱动程序的实现。在你开始阅读之前,建议你使用一个开发板,这个开发板需要有一些GPIO,以及至少一个SPI和I2C控制器。本书详细介绍了用于开发驱动程序的不同评估板的硬件配置,其中用于实现驱动程序的单板包括著名的Raspberry Pi 3 Model B。我鼓励你在开始阅读之前,先找到一块这样的单板,因为本书的内容注重实践,用单板做实验将有助于你应用贯穿全书的理论知识。
你将学习如何开发驱动程序,从简单的不与任何外部硬件交互的驱动程序,到管理不同类型设备(如加速度计、DAC、ADC、RGB LED、多显LED控制器、I/O扩展器和按钮)的驱动程序。你还将开发DMA驱动程序、管理中断的驱动程序,以及通过写入/读取处理器内部寄存器来控制外部设备的驱动程序。为了简化这些驱动程序的开发,你将使用不同类型的框架:杂项框架、LED框架、UIO框架、输入框架和IIO工业框架。
本书是一个学习工具,可以帮助读者在没有任何领域知识的情况下开始开发驱动程序。本书的写作目的是介绍如何开发没有高度复杂性的驱动程序,这既有助于强化主要的驱动程序开发概念,也有助于读者开始开发自己的驱动程序。记住,开发驱动程序的好方法不是从头开始写。你可以重用与Linux内核主线驱动程序类似的免费代码。本书中所写的所有驱动程序都遵循GPL许可,因此你可以在相同许可证下修改和重新发布它们。
本书的目标读者
对于想知道如何从头开始开发驱动程序的嵌入式Linux应用开发者来说,本书是理想之作。本书也适合为非设备树内核开发过驱动程序,并想学习如何创建新的基于设备树的驱动程序的嵌入式软件开发者。本书还适合那些想学习如何使用Linux处理嵌入式平台底层硬件的学生和爱好者。读者如果能事先具备C语言、嵌入式Linux和Yocto工程工具的基本知识,对阅读本书将有所帮助,但这不是必需的。
本书结构
第1章首先描述嵌入式Linux系统的主要部分,以及构建它的不同方法,解释为什么选择Yocto工程和Debian作为构建选项。接下来,详细介绍如何使用Yocto和De
今天的嵌入式处理器包括多核64位CPU,这些CPU采用先进的14 nm工艺制造,具有广泛的异构计算能力。这些异构计算能力包括功能强大的GPU和DSP,它们被设计为运行经过训练的神经网络,并使下一代虚拟现实应用程序能够应用于单核或双核嵌入式处理器上,可以运行为不断增长的物联网和工业市场而设计的高能效、低成本的应用程序。现在,在一个价值几美元的处理器上运行嵌入式Linux系统是可能的,并且新的处理器还在不断问世,成本也在不断下降。
嵌入式Linux的灵活性,为嵌入式计算而设计的高效、节能的处理器的可用性,以及新处理器的低成本,使许多工业公司在嵌入式处理器的基础上开发新的产品成为可能。现在的工程师手中有强大的工具来开发以前无法想象的应用程序,但是他们需要了解当前Linux提供的丰富特性。
嵌入式Linux固件开发人员需要了解底层硬件功能控制,以便能够为多个外设编写接口,如GPIO、串行总线、定时器、DMA、CAN、USB和LCD。
下面是一个底层硬件控制的真实例子:假设嵌入式Linux的固件开发人员正在设计一个需要与三个不同的UART通信的Linux应用程序。一台Linux SBC(单板计算机)有三个可用的UART,但是在测试应用程序时,看起来只有两个可用的UART。原因是处理器的引脚可以被多路复用到不同的功能中,同一个引脚可以是UART引脚、I2C引脚、SPI引脚、GPIO等。要激活第三个UART,固件开发人员首先必须在内核代码中查找描述该SBC硬件的设备树(DT)源文件,其次必须检查系统,看看在这些DT文件中是否创建并激活了这些缺失的UART设备。如果没有包含该UART设备节点,则可以使用其他已创建的UART节点作为参考来创建它。之后,新的UART焊点必须多路复用为UART功能,确保它们不会与DT中使用相同焊点的其他设备发生冲突。
在使用设备树的Linux系统中,当在设备树中声明某个设备时,会由内核加载该设备的驱动程序。驱动程序从设备树节点中检索配置数据(例如,分配给该设备的物理地址,该设备触发的中断,以及设备特定的信息)。在本书中,将对设备树进行详细解释,你将看到设备树在开发Linux设备驱动程序中的重要作用。
本书将告诉你如何为设备树嵌入式Linux系统开发设备驱动程序。你将学会如何编写不同类型的Linux驱动程序,以及如何使用适当的API(应用程序接口)实现与内核和用户态的交互。本书内容以实用为主,但也提供重要的理论基础知识。
本书编写了近30个驱动程序,并将其移植到三种不同的处理器上。你可以选择NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837三种处理器来开发和测试这些驱动程序,本书的实验部分详细介绍了这些驱动程序的实现。在你开始阅读之前,建议你使用一个开发板,这个开发板需要有一些GPIO,以及至少一个SPI和I2C控制器。本书详细介绍了用于开发驱动程序的不同评估板的硬件配置,其中用于实现驱动程序的单板包括著名的Raspberry Pi 3 Model B。我鼓励你在开始阅读之前,先找到一块这样的单板,因为本书的内容注重实践,用单板做实验将有助于你应用贯穿全书的理论知识。
你将学习如何开发驱动程序,从简单的不与任何外部硬件交互的驱动程序,到管理不同类型设备(如加速度计、DAC、ADC、RGB LED、多显LED控制器、I/O扩展器和按钮)的驱动程序。你还将开发DMA驱动程序、管理中断的驱动程序,以及通过写入/读取处理器内部寄存器来控制外部设备的驱动程序。为了简化这些驱动程序的开发,你将使用不同类型的框架:杂项框架、LED框架、UIO框架、输入框架和IIO工业框架。
本书是一个学习工具,可以帮助读者在没有任何领域知识的情况下开始开发驱动程序。本书的写作目的是介绍如何开发没有高度复杂性的驱动程序,这既有助于强化主要的驱动程序开发概念,也有助于读者开始开发自己的驱动程序。记住,开发驱动程序的好方法不是从头开始写。你可以重用与Linux内核主线驱动程序类似的免费代码。本书中所写的所有驱动程序都遵循GPL许可,因此你可以在相同许可证下修改和重新发布它们。
本书的目标读者
对于想知道如何从头开始开发驱动程序的嵌入式Linux应用开发者来说,本书是理想之作。本书也适合为非设备树内核开发过驱动程序,并想学习如何创建新的基于设备树的驱动程序的嵌入式软件开发者。本书还适合那些想学习如何使用Linux处理嵌入式平台底层硬件的学生和爱好者。读者如果能事先具备C语言、嵌入式Linux和Yocto工程工具的基本知识,对阅读本书将有所帮助,但这不是必需的。
本书结构
第1章首先描述嵌入式Linux系统的主要部分,以及构建它的不同方法,解释为什么选择Yocto工程和Debian作为构建选项。接下来,详细介绍如何使用Yocto和De
评论
还没有评论。