新字符设备驱动所涉及的函数
2023-12-28 14:44:14
一.? 简介
经过前面字符驱动的实战操作,我们已经掌握了
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!