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

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

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

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.

相关文章
|
存储 Ubuntu 安全
百度搜索:蓝易云【Ubuntu系统离线安装Telnet服务教程。】
确保在进行任何系统配置更改之前备份重要的数据,并在操作过程中小心谨慎,以免造成不必要的问题。
411 0
|
Web App开发 缓存 JavaScript
Python:Python语言下载库或包的常见whl文件集合
Python:Python语言下载库或包的常见whl文件集合
Python:Python语言下载库或包的常见whl文件集合
|
存储 应用服务中间件 API
MinIO 参数解析与限制
MinIO 参数解析与限制 MinIO server 在默认情况下会将所有配置信息存到 ${HOME}/.minio/config.json 文件中。 以下部分提供每个字段的详细说明以及如何自定义它们。
6386 0
|
开发框架 网络协议 Unix
【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别
【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别
670 1
|
搜索推荐 数据可视化 持续交付
喷泉模型在项目管理中的实际应用与优势
喷泉模型是一种迭代开发方法,强调阶段性交付和动态调整,适合需求不明确或变化频繁的项目。通过持续反馈优化产品,不仅能紧跟需求变化,还能为客户创造早期价值。结合看板工具,可进一步提升团队协作和项目管理效率。
263 4
喷泉模型在项目管理中的实际应用与优势
|
人工智能 自然语言处理 测试技术
这些VLM竟都是盲人?GPT-4o、Sonnet-3.5相继败于视力测试
【7月更文挑战第28天】新研究表明VLM在简单视觉任务上的局限性。论文《Vision language models are blind》指出, GPT-4o、Claude-3.5 Sonnet等顶级模型在如判断形状重叠或字母识别等基本任务上表现不佳。另一研究在CVPR'24上介绍了一个新框架, 利用TRUMANS数据集生成精细的人物动作, 包括手部运动, 显示出在复杂场景下的强大能力, 尽管仍面临一定的局限。[论文链接](https://arxiv.org/pdf/2407.06581) [TRUMANS](https://arxiv.org/pdf/2403.08629)
306 4
|
人工智能 弹性计算 自然语言处理
解决方案应用实例 | 零售云业务中台+超级App,阿里云助力海底捞全面实现“云上捞”
2018年,海底捞和阿里云合作搭建数据中台、业务中台和移动中台的基础架构,并在此基础上升级了海底捞超级App,重构了会员体系。同年,海底捞在北京开设了第一家智慧餐厅,采用了自动配锅机、智能传菜机器人和智能厨房管理系统。2019年,海底捞的订餐排号系统搬上云端。到2020年,海底捞将自动配锅机和智能传菜机器人推向了数百家门店,同时,后勤行政系统也上云,从前端到后端所有核心业务系统全部上云,海底捞至此全面实现了“云上捞”。
6225 2
解决方案应用实例 | 零售云业务中台+超级App,阿里云助力海底捞全面实现“云上捞”
|
存储 监控 前端开发
局域网管理软件的前端设计与实现:HTML/CSS在网络拓扑展示中的应用
本文探讨了局域网管理软件的前端设计,强调了HTML/CSS在网络拓扑展示中的作用。通过HTML/CSS创建设备节点和绘制连线,实现清晰的网络设备连接展示。此外,利用JavaScript定时收集监控数据,并通过HTTP请求自动提交到网站,便于管理员进行数据分析,提升了局域网管理效率。
321 3
|
Java API Apache
详尽分享百度翻译api
详尽分享百度翻译api
394 0
|
JavaScript 前端开发 API
vue3没有this怎么办?
vue3没有this怎么办?
522 1

热门文章

最新文章