linux设备驱动

开发的内核模块可通过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:非系统库

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值