字符设备驱动高级篇1——新接口介绍
以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。
一、概览
1、新接口与老接口
(1)老接口:register_chrdev()
- 通过第一个参数是否为0,判断内核是否自动分配设备号,或者就是该参数表示的设备号;
- 此函数完成设备号分配,以及注册设备驱动的功能;
(2)新接口:register_chrdev_region() +cdev_add()
- 先注册设备号,然后再注册设备驱动。
- 卸载时先卸载设备驱动,然后注销设备号。
- register_chrdev_region()(传参表示要某个设备号),或者alloc_chrdev_region()(让内核自动分配设备号)。
- cdev_add()(注册设备驱动)。
2、新接口涉及的内容
(1)cdev结构体
(2)设备号
- 由主设备号和次设备号组成;
- 属于dev_t类型(其实就是int类型);
- MKDEV(由主次设备号得出设备号);
- MAJOR(从设备号中提取主设备号);
- MINOR(从设备号中提取次设备号);
(3)相关函数
- cdev_alloc:分配空间
- cdev_init:初始化
- cdev_add:注册驱动
- cdev_del:注销驱动
(3)总结
- 使用register_chrdev_region (申请设备号)+ cdev_init(分配空间) + cdev_add(注册设备驱动)进行字符设备驱动注册;
- 使用cdev_del(注销设备驱动)+unregister_chrdev_region(注销设备号)来注销字符设备驱动。
- 即新接口将老接口的一步分为两步完成:申请设备号,然后注册设备驱动。
二、接口函数
1、register_chrdev_region函数申请想要的设备号
- 此函数用来申请设备号(包括主次设备号);
- 假如是 200(主设备号), 0 1 2 3(次设备号) ,则from为MKDEV(200,0)(MKDEV用来合成设备号,0表示起始次设备号),count为4(表示有四个次设备号);
2、alloc_chrdev_region函数自动分配设备号
- register_chrdev_region,要事先知道所使用的主、次设备号,则要先用cat /proc/devices查看有没有使用。
- 可以使用alloc_chrdev_region,让内核自动分配一个主设备号。
- 如果申请成功,则把得到的设备号放入第一个参数dev中。
3、cdev_init函数
- 主要将cdev和fops关联起来。将传入的文件操作结构体指针赋值给cdev的ops
- 可以不使用此函数,直接用下面的代码。
//cdev_init(pcdev, &test_fops);pcdev->owner = THIS_MODULE;pcdev->ops = &test_fops;
4、cdev_add函数
- 此函数用来注册设备驱动。
5、cdev_alloc函数
(1)函数
(2)从内存角度体会cdev_alloc用与不用的差别
//static struct cdev test_cdev;//这个变量分配在数据段,整个程序运行期间都存在,不够灵活static struct cdev *pcdev; //只占4个字节,之后cdev_alloc给它实例化,分配在堆上,可以按需分配。由cdev_del释放pcdev = cdev_alloc(); // 给pcdev分配内存,指针实例化
6、代码
(1)注册
- 先注册主次设备号,然后才使用cdev_add()注册字符设备
// 使用新的cdev接口来注册字符设备驱动,需要2步// 第1步:注册主次设备号mydev = MKDEV(MYMAJOR, 0);//MYMAJOR在这里是200,这里合成了要申请的设备号,即200,0retval = register_chrdev_region(mydev, MYCNT, MYNAME);//这里申请刚才合成的设备号if (retval) {printk(KERN_ERR "Unable to register minors for %s\n", MYNAME);return -EINVAL;}printk(KERN_INFO "register_chrdev_region success\n");// 第2步:注册字符设备驱动cdev_init(&test_cdev, &test_fops);//这步其实可以用其他代码来代替,见下节retval = cdev_add(&test_cdev, mydev, MYCNT);//注册字符设备驱动if (retval) {printk(KERN_ERR "Unable to cdev_add\n");return -EINVAL;}printk(KERN_INFO "cdev_add success\n");
(2)注销
// 使用新的接口来注销字符设备驱动,注销分2步:// 第一步真正注销字符设备驱动用cdev_delcdev_del(&test_cdev);// 第二步去注销申请的主次设备号unregister_chrdev_region(mydev, MYCNT);
字符设备驱动高级篇1——新接口介绍相关推荐
- 字符设备驱动高级篇6——内核提供的读写寄存器接口
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.前面访问寄存器的方式 通过定义指向寄存器的指针,然后解引用来对寄存器进行操作. (1)行不行?sure! (2 ...
- 字符设备驱动高级篇3——自动创建字符设备驱动的设备文件
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.问题描述 使用mknod创建设备文件的缺点: 能否自动生成和删除设备文件: 2.解决方案:udev(嵌入式中用 ...
- 字符设备驱动高级篇5——静态映射表、动态映射结构体方式操作寄存器
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.静态映射表建立过程分析 1.建立映射表的三个关键部分 (1)映射表描述 具体物理地址和虚拟地址的值相关的宏定义 ...
- 字符设备驱动高级篇4——设备类(自动创建和删除设备文件)相关代码分析
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 主要涉及class_create和device_create函数. 1.sys文件系统简介 (1)sys文件系统的 ...
- 字符设备驱动高级篇2——字符设备驱动注册代码分析
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.老接口register_chrdev分析 (1)代码函数调用关系 register_chrdev __regi ...
- 龙芯2k按键中断驱动_字符设备驱动-高级篇按键中断程序驱动
驱动源码: #include "linux/module.h" #include"linux/kernel.h" #include"linux/fs. ...
- 3.字符设备驱动高级
3.1.注册字符设备驱动新接口register_chrdev_region与老接口register_chrdev 在 2.6 的内核之后,新增了一个 register_chrdev_region 函数 ...
- 字符设备驱动基础篇4——字符设备驱动读写接口的操作实践
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考资料:http://www.cnblogs.com/biaohc/p/6575074.html. 一.细节 1.自动分配主设备号 注册函 ...
- Linux系统aboutyou,Linux字符设备驱动高级
设备号:主设备号 + 次设备号 也可以叫主次设备号 新接口注册字符设备驱动,其实就是填充这个struct cdev类型的结构体,主要填充的内容就是 file_operations这个结构体变量,让 ...
最新文章
- TCP网络那点破事!三次握手、四次挥手、TIME-WAIT、HTTP 2.0 ....
- css元素与浏览器边框,别具光芒CSS属性、浏览器兼容与网页布局
- oracle password_verify_function,使用PASSWORD_VERIFY_FUNCTION设置用户密码复杂度
- Python中的常见面试题
- 怎么通过邮箱发超大附件?介绍一种基于云服务的方法
- python断言区间_断言整数在范围内
- plsq如何快捷整理代码_我收藏的几个更快搬砖的vscode快捷键
- gradle 项目打包成多个jar包_自从用完 Gradle 后,有点嫌弃 Maven 了!
- oracle union all 特别慢_Oracle查询性能优化
- 力扣-205 同构字符串
- 空间线与空间平面之间的夹角关系
- C51语言检测电平变化,单片机引脚上的电平变化
- 一元二次方程的解法(Python语言)
- 1、u3d 下载、安装
- springboot实现微信小程序二维码生成
- 将svg编译成字体图标
- 【PPT】《使用ChatGPT一键制作带自动配图的PPT演讲稿》- 知识点目录
- 用Python写了一个网易云音乐(附源码、视频教程)
- 计算机大连理工三年级下册教案,大连理工大学版信息技术三年级上册教案.doc...
- 风靡全球的英雄联盟手游,竟然没有国服,只能教你玩国际服了...