新字符设备驱动所涉及的函数

发布时间:2023年12月28日

一.? 简介

经过前面字符驱动的实战操作,我们已经掌握了 Linux 字符设备驱动开发的基本步骤,字符 设备驱动开发重点是使用 register_chrdev 函数注册字符设备,当不再使用设备时就使用 unregister_chrdev 函数注销字符设备。
register_chrdev ()函数 unregister_chrdev() 这两个函数是老版本驱动使用的函数。现在新的 字符设备驱动已经不再使用这两个函数,而是使用 Linux 内核推荐的新字符设备驱动 API 函数。
本文之后我们来学习,如何编写新字符设备驱动,并且在驱动模块加载时自动创建设备节 点文件。
这里主要掌握 新字符设备驱动所涉及的函数的使用。

.? 新字符设备驱动原理

1.? 分配和释放设备号

(1)? 旧的字符设备注册函数的弊端

使用 register_chrdev() 函数注册字符设备时,只需要给定一个主设备号即可,但是这样会 带来两个问题:
①? 需要我们事先确定好哪些主设备号没有使用(即确认开发板上所有字符设备都没有使用的一个主设备号)。
②? 会将一个主设备号下的所有次设备号都使用掉(因为register_chrdev() 函数的函参只传递了了主设备号,而没有传入次设备号导致的)。
例如,现在设置 LED 这个主设备号为 200 ,那么 0~1048575(2^20-1) 这个区间的次设备号就全部都被 LED 一个设备分走了。这样太浪 费次设备号了!一个 LED 设备肯定只能有一个主设备号,一个次设备号。

(2) 新的注册设备号 / 申请设备号函数

解决这两个问题最好的方法就是要使用设备号的时候向 Linux 内核申请,需要几个就申请 几个,由 Linux 内核分配设备可以使用的设备号。
如果没有指定设备号的话,就使用如下函数来申请设备号
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)

如果给定了设备的主设备号和次设备,号就使用如下所示函数来注册设备号即可:
int register_chrdev_region(dev_t from, unsigned count, const char *name)
参数 from 是要申请的起始设备号,也就是给定的设备号;
参数 count 是要申请的数量,一 般都是一个;
参数 name 是设备名字。

注 销 字 符 设 备 之 后 要 释 放 掉 设 备 号 , 不 管 是 通 过 alloc_chrdev_region 函 数 还 是
register_chrdev_region 函数申请的设备号,统一使用如下释放函数:
void unregister_chrdev_region(dev_t from, unsigned count)

新字符设备驱动下,设备号分配示例代码如下(可以在NXP 官方提供的 Linux内核源码中搜索到):
int major; /* 主设备号 */
int minor; /* 次设备号 */
dev_t devid; /* 设备号 */

if (major) { /* 定义了主设备号 */
       devid = MKDEV(major, 0); /* 大部分驱动次设备号都选择 0 */
       register_chrdev_region(devid, 1, "test");
} 
else { /* 没有定义设备号 */
       alloc_chrdev_region(&devid, 0, 1, "test"); /* 申请设备号 *
       major = MAJOR(devid); /* 获取分配号的主设备号 */
       minor = MINOR(devid); /* 获取分配号的次设备号 */
}

如果要注销设备号的话,使用如下代码即可:
unregister_chrdev_region(devid, 1); /* 注销设备号 */

2. 新的字符设备注册方法

(1) 字符设备结构

(2)? 字符设备驱动涉及的另外几个函数

上面了解了字符设备新的注册方法中涉及的:申请设备号函数alloc_chrdev_region(),或注册设备号的函数 register_chrdev_region(),释放设备号函数 unregister_chrdev_region()。

这里接下来继续了解新的字符设备驱动涉及的函数。申请号设备号后,就是初始化字符设备,最后,就是向 Linux内核添加设备,处理完功能后,最终需要删除设备。

cdev_init() 函数

(3)? cdev_add() 函数

(4) cdev_del() 函数

文章来源:https://blog.csdn.net/wojiaxiaohuang2014/article/details/135256727
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。