Linux驱动开发简述
Linux驱动开发简述
一、Linux驱动开发思维:
1、与逻辑开发区别:
裸机开发:主跟寄存器打交道,有些MCU会提供库
Linux下的驱动开发:直接操作寄存器不现实
2、Linux下驱动开发:根据Linux下的各种驱动框架进行开发。满足框架,Linux下各种驱动框架的掌握。
GPIO框架:使能、时钟、IO复用配置复用、配置IO属性输入输出、
Linux提供API GPIO操作函数
IIC外设:设备地址;i2c读写函数-读取外设地址、
SPI外设:读写SPI外设寄存器数据;spi操作函数:read、write、byte
分层:
host驱动:
设备驱动:
3、驱动最终表现是 /dev/xxx 文件
打开、关闭、读写。。。
4、新的内核支持设备树
.dts文件,Linux分析设备树文件(.dts文件),此文件描述了设备信息
二、Linux驱动开发分类
三大类:
1、字符设备驱动,最多:指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。
蜂鸣器、按键、灯、I2C、GPS、
-
-
-
- 字符设备驱动开发
-
-
驱动:获取外设、或者传感器数据,控制外设。数据会提交给应用程序。
Linux驱动编写既要编写一个驱动,还要编译一个简单地测试应用程序,APP。单片机下驱动和应用放到一个文件里面,杂糅到一起;Linux下驱动和应用程序是完全分开的
两种方式:编到内核;编译成一个.ko模块文件,动态加载
一、应用程序和驱动交互原理
内核空间、用户空间
交互:系统调用、异常(中断)、陷入
(系统调用原理及详细过程:https://blog.csdn.net/qq_36822217/article/details/107237670)
二、字符设备驱动开发流程
1、Linux里面一切皆文件,驱动设备表现就是一个/dev/下的文件,驱动加载成功后,会在/dev/下生成对应的文件,应用程序通过对这个文件进行相应的操作即可实现
应用程序调用open函数打开设备,比如led。应用程序通过write函数向/dev/led写数据,比如写1标识打开,写0表示关闭。如果要关闭设备那么就是close函数。
Linux应用程序对驱动程序的调用流程:
应用程序:open()、close()、read()、write()等其他API函数——》
库:对应的库函数 ——》
内核:通过系统调用进入内核 ——》
驱动程序:驱动程序中的对应函数 ——》
硬件:具体硬件设备
2、编写驱动的时候也需要编写驱动对应的open、close、write函数,字符设备驱动 file_operations结构体(–Linux内核驱动操作函数集合 ) 成员变量的实现就是驱动的开发
1>.考虑应用开发的便利性
2>.驱动时分驱动框架的,按照驱动框架编写
2、块设备驱动,存储:指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。
emc、flash
3、网络设备驱动:为支持通过文件接口处理网络连接,Linux使用了源于BSD的套接字抽象,套接字keil看作应用程序、文件接口、内核的网络之间的代理。
网卡
(一个设备不是说只属于一个类型,比如:USB WIFI,SDIO WIFI,属于网络设备驱动,又因为有USB、SDIO,也属于字符设备驱动)