11-4~6 字符设备驱动开发

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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:表示可变参数,字符串,表示设备节点名字

相关文档
最新文档