字符驱动设备原理及其相关函数(二)

简介: 字符驱动设备原理及其相关函数(二)

参看朱有鹏老师嵌入式视屏,第五部分第三章

1、(1)老接口:register_chrdev

(2)新接口:register_chrdev_region/alloc_chrdev_region + cdev

register_chrdev_region/alloc_chrdev_region注册设备号的作用,register_chrdev_region的作用是静态给一个设备号,alloc_chrdev_region的作用的由系统动态分配一个设备号;cdev是注册驱动,与file_operations挂钩

 

2、cdev结构体

cdev结构体路径:kernel/include/linux/cdev.h

(1) 我们关心的有两个,file_operation结构体、dev_t设备号

(2)相关函数:cdev_alloc(给结构体创建内存空间)、cdev_init(初始化)、cdev_add(像内核中注册驱动)、cdev_del(注销驱动)

 

3、函数解析

(1)cdev_init()函数讲解

void cdev_init(struct cdev *cdev, const struct file_operations *fops)

参数:*cdev表示cdev结构体,*fops表示file_operations结构体

没有返回值,作用是初始化cdev结构体、初始化file_operations结构体

(2)cdev_add()函数讲解

int cdev_add(struct cdev *p, dev_t dev, unsigned count)

参数:

p表示这个设备的cdev结构体

dev表示设备标号

count表示设备数量

返回值,大于0表示调价失败,等于0表示添加设备成功。

(3)int register_chrdev_region(dev_t from,unsigned int count,char*name)

//from为第一个设备编号,count为连续的设备个数,即是驱动程序所管理的设备个数,name为驱动程序名

实例如下:

现假设有一个设备驱动程序使用的主设备号是257,次设备号分别是0,1,2,3

其调用

int ret=register_chrdev_region(MKDEV(257,0),4,"demodev");

接下来还要判断ret返回值,若果返回值大于0,则说明创建设备号失败,否则创建成功。

(4)alloc_chrdev_region函数

该函数由系统协助分配设备号,分配的主设备号在1-254间

int alloc_chrdev_region(dev_t *dev,unisgned baseminor,unsigned count,const char*name)    

//dev仅用于输出的参数,在成功完成调用后将保存以分配范围的第一个编号。baseminor所请求的第一个编号,count是连续的分配个数,char为驱动程序名

 

4、使用class_create()函数和device_create()函数自动创建设备文件

问题:之前insmod xxx.ko安装一个模块之后,还要在命令行中执行【mknod /dev/test c 250 0】去手工创建设备文件,这样非常麻烦。现在要做的就是执行insmod之后,系统自动创建设备文件;执行rmmod之后,系统自动删除设备文件。

实现方式,   (1)class_create                    对应              class_destroy

(2)device_create                 对应              device_destroy

5、在chrdev_init中注册设备文件完成之后,用如下代码去实现自动创建设备文件。创建设备文件之后,才可以在应用层去访问这个设备。

1.  // 注册字符设备驱动完成后,添加设备类的操作,以让内核帮我们发信息
2.  // 给udev,让udev自动创建和删除设备文件
3.  test_class = class_create(THIS_MODULE, "aston_class");
4.  if (IS_ERR(test_class))
5.    return -EINVAL;
6.  // 最后1个参数字符串,就是我们将来要在/dev目录下创建的设备文件的名字
7.  // 所以我们这里要的文件名是/dev/test
8.  device_create(test_class, NULL, mydev, NULL, "test111");

在实验时,可以看到执行insmod指令之后,直接去/dev目录下查看设备,可以看到设备是存在的,我们这里命名设备为test111

同时ls /sys/class,可以看到目录中有我们创建的类aston_class.

目录
相关文章
|
9月前
|
Linux
Linux驱动开发(使用I2C总线设备驱动模型编写AT24C02驱动程序)
Linux驱动开发(使用I2C总线设备驱动模型编写AT24C02驱动程序)
111 0
|
12月前
|
Ubuntu Linux 编译器
字符驱动设备原理及其相关函数(一)
字符驱动设备原理及其相关函数(一)
83 0
|
13天前
|
Linux
【Linux驱动学习(1)】USB与input子系统,linux统一设备模型,枚举,USB描述符深入剖析
【Linux驱动学习(1)】USB与input子系统,linux统一设备模型,枚举,USB描述符深入剖析
|
2月前
|
监控 Windows
7.4 Windows驱动开发:内核运用LoadImage屏蔽驱动
在笔者上一篇文章`《内核监视LoadImage映像回调》`中`LyShark`简单介绍了如何通过`PsSetLoadImageNotifyRoutine`函数注册回调来`监视驱动`模块的加载,注意我这里用的是`监视`而不是`监控`之所以是监视而不是监控那是因为`PsSetLoadImageNotifyRoutine`无法实现参数控制,而如果我们想要控制特定驱动的加载则需要自己做一些事情来实现,如下`LyShark`将解密如何实现屏蔽特定驱动的加载。
49 0
7.4 Windows驱动开发:内核运用LoadImage屏蔽驱动
|
Ubuntu Linux 开发者
韦东山Linux驱动入门实验班(2)hello驱动---驱动层与应用层通讯,以及自动产生设备节点
韦东山Linux驱动入门实验班(2)hello驱动---驱动层与应用层通讯,以及自动产生设备节点
122 0
|
Linux 芯片
Linux驱动分析之SPI设备
前面我们对SPI控制器驱动进行了分析,接下来来分析SPI设备驱动。我们以DS1302驱动作为分析对象。DS1302是一款RTC芯片,估计很多人在学单片机时用到过。RTC芯片算是比较简单的,也方便分析理解。
Linux驱动分析之SPI设备
|
存储 Linux 开发者
【Linux学习笔记】设备驱动模型详解——总线、设备、驱动和类
设备驱动是计算机系统中的重要组成部分,它们允许操作系统与硬件交互。设备驱动模型是一种通用的抽象框架,用于描述操作系统如何管理硬件设备。这里我们将介绍设备驱动模型中的四个关键概念:总线、设备、驱动和类。
619 0
LED模板驱动程序的改造:总线设备驱动模型
LED模板驱动程序的改造:总线设备驱动模型
92 0
|
Linux
一文搞懂 USB 设备端驱动框架
hello 大家好,今天带领大家学习一下USB 设备端驱动 内核版本:4.4.94
821 0
复习单片机:串口通信(内含:1.代码部分+2.串口内部结构+3.串口控制寄存器 SCON+4.电源控制寄存器 PCON+5. 串口的使用方法+6.硬件设计+7.实验现象)
复习单片机:串口通信(内含:1.代码部分+2.串口内部结构+3.串口控制寄存器 SCON+4.电源控制寄存器 PCON+5. 串口的使用方法+6.硬件设计+7.实验现象)
325 1
复习单片机:串口通信(内含:1.代码部分+2.串口内部结构+3.串口控制寄存器 SCON+4.电源控制寄存器 PCON+5. 串口的使用方法+6.硬件设计+7.实验现象)