开发的内核模块可通过GitHub存储库访问,网址为
https://github.com/ALIBERA/linux_book_2nd_edition。
https://www.cnblogs.com/bonelee/p/6524322.html nm
嵌入式设备的应用:
在移动设备中
网络基础设施
家用和消费类设备
数字标牌
医学成像
汽车信息娱乐
许多其他工业应用
linux外设:
GPIO,串行总线(uart),计时器(timers)
DMA,CAN,USB,LCD
实际场景case:
--》Linux嵌入式固件 开发人员正在设计一个
需要与三个不同的UART通讯的Linux应用程序
结果:一个Linux使用带有三个可用UART的SBC(单板计算机),
但是当应用程序测试时,看起来只有两个功能UART
原因:
1. 处理器具有复用为不同功能的引脚,并且同一引脚可以是UART引脚,I2C引脚,
SPI引脚,GPIO等。
2. 要激活第三个UART,固件开发人员首先必须寻找
内核中的设备树(DT)源文件,描述了所使用的SBC的硬件。
3.其次,必须检查是否在这些DT文件中创建并启用了
丢失的UART设备。 如果不包括UART设备节点,则可以
使用其他已创建的UART节点来创建它。
4. 之后,必须复用新的UART,以实现UART功能,
确保它们与DT中其他设备没有冲突。
在设备树Linux系统中,设备驱动程序由设备加载时由内核加载
在设备树中声明。驱动程序从DT节点检索配置数据(例如,
分配给设备的物理地址,设备触发的中断以及设备
具体信息)。“设备树”有非常重要作用,特别是在
Linux设备驱动程序的开发中。
要解决的问题:
1. 如何为Device Tree Linux嵌入式系统开发设备驱动程序
2. 编写不同类型的Linux驱动程序以及适当的API与
内核空间和用户空间接口的方法
要掌握的内容:
1. GPIO,SPI控制器和I2C 控制器
2. 加速度计accelerometers
3. DAC与ADC
4. RGB灯
5. Multidisplay LED控制器
6. I/O扩展器
7. button
8. DMA的driver,管理中断的驱动程序以及
在内部寄存器中进行读写的驱动程序
处理器来控制外部设备
参考框架:
Misc framework
LED framework
UIO framework
Input framework
IIO公用framework
使用yocto project tool构建系统
如何使用Yocto构建Linux嵌入式映像
如何在Yocto之外编译Linux内核
Linux设备和驱动程序模型:
“总线”驱动程序之间的关系,
“总线控制器”驱动程序和“设备”驱动程序
设备树用法
字符驱动程序:
如何使用系统调用从用户空间调用驱动程序的操作
如何进行交换内核和用户空间之间的数据
如何识别和创建每个Linux设备
传统上使用“ mknod”命令创建静态设备
如何使用“ devtmpfs”创建设备文件
如何创建设备类和设备sysfs下的驱动程序条目
平台驱动程序:
什么是平台驱动程序
平台设备如何在设备树中静态描述
以及将设备与设备关联的过程 驱动程序,称为“绑定”。
Pinctrl子系统
新的GPIO描述符使用者接口
开发控制外部的驱动程序
设备将外设地址从物理映射到虚拟地址
在内核空间中从虚拟地址writing/reading操作
使用linux led子系统控制leds灯
使用UIO框架开发用户空间驱动
声明I2C设备的设备树方式
开发I2C客户端驱动程序
向平台驱动程序增加sysfs支持,通过sysfs entries控制硬件
在平台驱动中处理中断
硬件中断与软件中断的处理
中断控制器和具有中断功能的外围节点在设备树中链接的方式
driver管理外部中断
在内核态下延时调度代码的方式,该调度代码可以运行在进程上下文中,使用“工作队列”或"线程中断“,或在中断上下文使用softirqs, tasklets, timers
用户程序使用"等待队列"进入睡眠状态,然后通过中断唤醒
MMU,linux中不同类型的地址,内核内存分配器
Linux DMA子系统,不同类型的DMA映射
驱动程序来管理内存到内存事务,在没有CPU干预的情况下,使用DMA scather/gather 映射和来自用户空间的DMA使用 mmap()系统调用。
linux spi子系统,设备驱动程序的输入子系统框架
工业I/O子系统(IIO),IIO包括ADC, DAC, 陀螺仪(gyroscopes),加速度计(accelerometers),磁力计(magnetometers),压力计和proximity
传感器
设置IIO触发缓存buffer和IIO事件
如何使用“ spidev”驱动程序从用户空间与SPI总线进行交互
IIO子系统驱动程序通过硬件触发中断管理I2C DAC和SPI ADC
linux的应用区域,例如消费类电子产品(例如机顶盒, 智能电视,PVR(个人录像机),IVI(车载信息娱乐系统),
网络设备 (例如路由器,交换机,WAP(无线访问点)或无线路由器),机器控制,
工业自动化,导航设备,航天器飞行软件和医疗仪器 一般来说)。
嵌入式linux的特点
•Linux的主要优点是能够重用组件。Linux提供可伸缩性
由于其模块化和可配置性。
•开源。没有使用费或许可费。
•移植到广泛的硬件体系结构,平台和设备。
•广泛支持应用程序和通信协议(例如,TCP / IP堆栈,USB堆栈,
图形工具包库)。
•活跃的开发人员社区的大力支持。
linux的主要组件:Bootloader, Kernel, System
call interface, C-Runtime library, System shared libraries and Root filesystem
Bootloader,内核,系统调用接口,C运行时库,系统共享库和根文件系统。
bootloader这块,主要使用uboot,U-Boot是标准 适用于ARM Linux的引导程序。
U-Boot主线位于http://git.denx.de/u-boot.git, 是U-Boot Wiki上的专用页面,位于http://www.denx.de/wiki/U-Boot/SourceCode。
linux内核的文件目录:
/ arch / <arch>:特定于体系结构的代码
/ arch / <arch> / <mach>:机器/板专用代码
/ Documentation:内核文档。别错过!
/ ipc:进程间通信
/ mm:内存管理
/ fs:文件系统
/ include:内核头
/ include / asm- <arch>:与体系结构和机器相关的头文件
/ include / linux:Linux内核核心标头
/ init:Linux初始化(包括main.c)
/ block:内核块层代码
/ net:网络功能
/ lib:常见的内核帮助器功能
/ kernel:通用内核结构
/ arch:特定于体系结构的代码
/ crypto:密码学代码
/ security:安全组件
/ drivers:内置驱动程序(不包括可加载模块)
Makefile:Linux顶级Makefile(设置arch和版本)
/ scripts:内部或外部使用的脚本
uname -r --》 查询内核版本
gnu c库函数,glibc,uClibc,eglibc,dietlibc,newlib;GNU C库glibc是Yocto项目中使用的默认C库
它跟随所有相关标准,包括ISO C11和POSIX.1-2008。
glibc的说明,https://www.gnu.org/software/libc/manual/
System Shared Libraries系统共享库是程序在启动时加载的库。当共享库已正确安装,
此后启动的所有程序将自动使用新的共享 库。系统共享库通常与用户空间应用程序链接以提供它 访问特定的系统功能。
该系统功能可以是独立的 例如压缩或加密算法,或者需要访问底层内核资源,或者 硬件。
在后一种情况下,该库提供了一个简单的API,该API提取了 内核或直接驱动程序访问。
主要有以下库
•Libc:标准C库(C运行时库)。基本语言支持和操作系统
平台服务。直接访问OS系统-Call-Interface。
•Libm:数学库。常见的基本数学函数和浮点数
由System V,ANSI C,POSIX等定义的环境例程
•Libpthread:POSIX线程库。libc中的功能,维护以提供
•Libdl:动态链接器库。libc中的功能,维护以提供向后兼容。
•Libcrypt:加密库。加密和解密处理例程。
•Libpam:PAM(可插入身份验证模块)库。PAM的例程。
•Libz:压缩/解压缩库。通用数据压缩和通缩功能。
•Libncurses:CRT屏幕处理和优化程序包。整体画面,窗口
和垫操作;输出到窗户和垫子上;读取端子输入;控制
通过终端和光标输入和输出选项;环境查询例程;颜色
操纵 使用软标签键。
•Libutil:系统实用程序库。各种系统相关的实用程序
库所在位置
/ lib:启动所需的库
/ usr / lib:大多数系统库
/ usr / local / lib:非系统库