以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。

一、概览

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——新接口介绍相关推荐

  1. 字符设备驱动高级篇6——内核提供的读写寄存器接口

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.前面访问寄存器的方式 通过定义指向寄存器的指针,然后解引用来对寄存器进行操作. (1)行不行?sure! (2 ...

  2. 字符设备驱动高级篇3——自动创建字符设备驱动的设备文件

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.问题描述 使用mknod创建设备文件的缺点: 能否自动生成和删除设备文件: 2.解决方案:udev(嵌入式中用 ...

  3. 字符设备驱动高级篇5——静态映射表、动态映射结构体方式操作寄存器

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.静态映射表建立过程分析 1.建立映射表的三个关键部分 (1)映射表描述 具体物理地址和虚拟地址的值相关的宏定义 ...

  4. 字符设备驱动高级篇4——设备类(自动创建和删除设备文件)相关代码分析

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 主要涉及class_create和device_create函数. 1.sys文件系统简介 (1)sys文件系统的 ...

  5. 字符设备驱动高级篇2——字符设备驱动注册代码分析

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.老接口register_chrdev分析 (1)代码函数调用关系 register_chrdev __regi ...

  6. 龙芯2k按键中断驱动_字符设备驱动-高级篇按键中断程序驱动

    驱动源码: #include "linux/module.h" #include"linux/kernel.h" #include"linux/fs. ...

  7. 3.字符设备驱动高级

    3.1.注册字符设备驱动新接口register_chrdev_region与老接口register_chrdev 在 2.6 的内核之后,新增了一个 register_chrdev_region 函数 ...

  8. 字符设备驱动基础篇4——字符设备驱动读写接口的操作实践

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考资料:http://www.cnblogs.com/biaohc/p/6575074.html. 一.细节 1.自动分配主设备号 注册函 ...

  9. Linux系统aboutyou,Linux字符设备驱动高级

    设备号:主设备号 + 次设备号   也可以叫主次设备号 新接口注册字符设备驱动,其实就是填充这个struct cdev类型的结构体,主要填充的内容就是 file_operations这个结构体变量,让 ...

最新文章

  1. TCP网络那点破事!三次握手、四次挥手、TIME-WAIT、HTTP 2.0 ....
  2. css元素与浏览器边框,别具光芒CSS属性、浏览器兼容与网页布局
  3. oracle password_verify_function,使用PASSWORD_VERIFY_FUNCTION设置用户密码复杂度
  4. Python中的常见面试题
  5. 怎么通过邮箱发超大附件?介绍一种基于云服务的方法
  6. python断言区间_断言整数在范围内
  7. plsq如何快捷整理代码_我收藏的几个更快搬砖的vscode快捷键
  8. gradle 项目打包成多个jar包_自从用完 Gradle 后,有点嫌弃 Maven 了!
  9. oracle union all 特别慢_Oracle查询性能优化
  10. 力扣-205 同构字符串
  11. 空间线与空间平面之间的夹角关系
  12. C51语言检测电平变化,单片机引脚上的电平变化
  13. 一元二次方程的解法(Python语言)
  14. 1、u3d 下载、安装
  15. springboot实现微信小程序二维码生成
  16. 将svg编译成字体图标
  17. 【PPT】《使用ChatGPT一键制作带自动配图的PPT演讲稿》- 知识点目录
  18. 用Python写了一个网易云音乐(附源码、视频教程)
  19. 计算机大连理工三年级下册教案,大连理工大学版信息技术三年级上册教案.doc...
  20. 风靡全球的英雄联盟手游,竟然没有国服,只能教你玩国际服了...

热门文章

  1. day13 迭代器和生成器
  2. 无限轮播图片的实现原理
  3. 谁说菜鸟不会数据分析--读书笔记
  4. 关于移动手机端富文本编辑器qeditor图片上传改造
  5. CAS单点登录配置[3]:服务器端配置
  6. Spring笔记③--spring的命名空间
  7. (转)Asp.Net生命周期系列一
  8. 基本排序算法及分析(二):冒泡排序
  9. 枚举enum、NS_ENUM 、NS_OPTIONS
  10. 数据存储和界面展示(二)