版本 | 颁布日期 | 修订章节 |
---|---|---|
0.1 | 2015.08.13 | 撰写草稿 |
0.2 | 2015.12.07 | 整合字符型设备驱动 |
0.3 | 2015.12.07 | 整理文档,尚未验证驱动源码 |
0.4 | 2016.02.28 | 补充信息,整理结构关系 |
0.5 | 2016.03.13 | 验证驱动程序,正式发布 |
文章目录
Linux设备驱动一些概念
Linux一切皆是文件,串口、鼠标、键盘等,在内核中都体现为一个文件。如果要操作一个硬件,就通过操作其对应的文件。
操作一个文件需要的步骤:(大象放冰箱)
1、 打开文件:不同类型文件,打开方法不一样。
2、 操作文件:不同文件读写方法不同。操作方法:读、写、定位。
3、 关闭文件。
编写一个特定设备的驱动程序
1、 主要实现这个设备的操作方法;-------驱动编程的主要工作;
2、 把实现的文件操作方法向系统注册;------字符设备模型;
3、 给用户空间提供访问的接口 ----有dev下的设备文件;
Linux下是分层的,分为内核空间和用户空间
默认情况下:
内核空间和用户空间的比例是3:1,在Linux源码配置中可以修改
目的:保证系统安全,不允许应用程序直接访问硬件。
例:任何一个软件,具有直接控制网卡功能,只要把网卡参数设置错误,则整个系统都不能用网卡。
分层操作,如果应用软件出问题,不会影响系统
内核空间:3~4G,运行驱动程序
用户空间:0~3G,运行应用程序-----main这类程序
4、 驱动程序运行在内核空间,应用程序运行在应用空间,不能直接交流,需要驱动程序给应用程序提供访问接口;
5、 每一类设备驱动都有特定的编程框架(模型),学习驱动编写,重点是学习每一类设备的编程框架。每一种文集操作方法也是特定的编程框架;
6、 设备号。每一个设备都会有一个正整数表示的设备号。
设备号由主设备号和次设备号组成
主设备号:表示一种设备
次设备号:表示一种设备中的具体哪一个
例:4个串口驱动都是相同的,(寄存器空间不同,但操作方法、逻辑相同)
就是主设备号相同,次设备号不同
[root@ZX20150811 /dev]# ls -l | grep ttySAC
crw-rw---- 1 root root 204, 64 Aug 12 2015 ttySAC0
crw-rw---- 1 root root 204, 65 Aug 12 2015 ttySAC1
crw-rw---- 1 root root 204, 66 Aug 12 2015 ttySAC2
crw-rw---- 1 root root 204, 67 Aug 12 2015 ttySAC3
串口:ttySAC,有4个串口,主设备号为204
现在要使用串口0
打开/dev/ttySAC0
配置波特率、数据位、停止位、校验位,就可以对串口读写操作.
关闭串口
驱动分类
字符设备
以字节为单位,进行顺序访问的设备。
例:串口、鼠标、键盘、按键、触摸屏、LED……
有个例外:LCD,可以随机访问,因为他是一块内存来实现显示。
实际工作中最常见的也是使用最多的,这类设备一般会在dev目录下有一个对应的设备文件。
块设备
以块为单位进行访问,(可以随机访问)的设备。
块:512字节
一次可以读写一块或多块。
例子:SD卡、U盘、硬盘、eMMC、Flash等存储类设备。
网络设备
网络通信设备
例:网卡、WiFi(无线网卡)
这类设备不同于字符设备和块设备,在dev目录下没有对应的设备文件,操作方法也不一样。
Linux字符设备
结构体赋值C99新标准
标准C99结构体赋值方法
struct miscdevice
{
.min