11-4~6 字符设备驱动开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、字符驱动初步认识 (2)
(一)字符设备驱动框架 (2)
(二)主设备号 (2)
(三)创建设备节点: (4)
1.手动创建 (4)
2.自动创建(通过udev/mdev机制) (4)
(四)应用程序与驱动的交互 (5)
1.驱动中实现文件io操作接口: (5)
2.调用IO接口 (7)
3.应用程序需要传递数据给驱动 (8)
4.控制外设 (9)
二、字符设备驱动开发 (10)
(一)应用程序和驱动扮演的是什么角色 (10)
(二)步骤: (10)
1.实现模块加载和卸载入口函数 (10)
2.在模块加载入口函数中 (10)
(三)规范: (11)
1.面向对象编程思想 (11)
(四)做出错处理 (12)
(五)操作寄存器地址到方式: (12)
三、 Day4作业 (13)
四、 Day5作业 (14)
五、 Day6作业 (14)
一、字符驱动基本操作
(一)字符设备驱动框架
用户空间对驱动的操作其实就是文件IO
字符设备:所产生的数据是字符流
大部分设备都是字符设备,如:LCD,keyboard,I2c等。
因为字符设备的数据是从寄存器中产生,所以数据量不大,速度快
字符设备的读取方式:文件IO
块设备:存储设备,数据以块为单位。如:硬盘、u盘、flash、sd卡等
读取的数据量大,速度慢
内核对这样的操作进行优化机制,如缓冲,文件系统层等
网络设备:因为是走协议的,linux把网络设备全部做成socket设备
当用户空间输入open打开一个字符设备的时候,会调用在字符设备驱动中会对应的XX_open,这个XX_open是一一对应的。而用户空间的open和内核中的open 对应关系是由,设备节点管理的。而设备节点就是一个文件,在这个文件中通过设备号来做到意义对应。
作为字符设备驱动要素:
1,必须有一个设备号,用在众多到设备驱动中进行区分
2,用户必须知道设备驱动对应到设备节点(设备文件)
linux把所有到设备都看成文件
crw-r----- 1 root root 13, 64 Mar 28 20:14 event0
crw-r----- 1 root root 13, 65 Mar 28 20:14 event1
crw-r----- 1 root root 13, 66 Mar 28 20:14 event2
3,对设备操作其实就是对文件操作,应用空间操作open,read,write的时候实际在驱动代码有对应到open, read,write
(二)主设备号
作为驱动必须有一个主设备号--向系统申请
功能:申请主设备号
原型:int register_chrdev(unsigned int major, const char * name, const
struct file_operations * fops)
参数:1:major:主设备号
设备号(32bit--dev_t)==主设备号(高12bit) + 次设备号(20bit) 主设备号:表示一类设备--camera
次设备号:表示一类设备中某一个:前置,后置
给定到方式有两种:
1)动态--参数1直接填0,通过返回值记录系统分配的号
2)静态--指定一个整数,250
2: name:描述一个设备信息,可以自定义
/proc/devices列举出所有到已经注册的设备
3: fops:文件操作对象--提供open, read,write
返回值:正确:0
错误:负数(在内核中,习惯错误时返回负数,-E...)错误码宏
功能:取消设备号
原型:void unregister_chrdev(unsigned int major, const char * name) 参数:1:主设备号
2:描述一个设备信息,可以自定义
(三)创建设备节点:
1.手动创建
缺点/dev/目录中的文件都是在内存中,断电后/dev/文件就会消失
mknod /dev/设备名类型主设备号次设备号
比如:
mknod /dev/chr0 c 250 0
[root@farsight drv_module]# ls /dev/chr0 -l
crw-r--r-- 1 0 0 250, 0 Jan 1 00:33 /dev/chr0
2.自动创建(通过udev/mdev机制)
*创建时先创建类再创建设备文件,销毁时反过来,先销毁设备文件再销毁类
功能:创建一个类(节点类型)
原型:struct class *class_create(owner, name)
参数:1:THIS_MODULE
2:字符串名字,自定义
返回值:class指针
功能:创建一个设备文件
原型:struct device *device_create
(struct class * class, struct device * parent,
dev_t devt,void * drvdata, const char * fmt,...) 参数:1:class结构体,class_create调用之后到返回值
2:表示父亲,一般直接填NULL
3:设备号类型 dev_t
dev_t devt
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
#define MKDEV(major,minor)(((ma) << MINORBITS(20位)) | (mi)) 4:私有数据,一般直接填NULL
5和6:表示可变参数,字符串,表示设备节点名字