• 驱动开发 day3 9/12


    udev机制创建设备文件实现过程

    1.驱动注册

    通过内核提供的驱动注册api获取设备号,为创建设备文件提供设备号

    2.创建设备类

    通过内核提供的class_create( )创建一个设备类,向上提交目录信息:构造struct class 变量并初始化,创建一个设备类的目录:/sys/class/类名

    API:

    1. struct class * class_create(struct module *owner,const char *name );
    2. 功能:申请一个设备类并初始化,向上提交目录信息
    3. 参数:
    4. owner:指向当前内核模块自身的一个模块指针,填写THIS_MODULE
    5. name:向上提交的目录名
    6. 返回值:成功返回申请的struct class对象空间首地址,失败返回错误码指针
    7. 在内核空间最顶层会预留4K空间,当struct class函数调用失败后函数会返回一个指向这4K空间的指针
    8. bool __must_check IS_ERR(__force const void *ptr)
    9. 功能:判断指针是否指向4K预留空间
    10. 参数:要判断的指针
    11. 返回值:如果指着指向4K预留空间返回逻辑真,否则返回逻辑假
    12. long __must_check PTR_ERR(__force const void *ptr)
    13. 功能:通过错误码指针得到错误码

    3.创建设备对象

    通过内核提供的device_create( )以及获取的设备号创建该类设备中的一个设备,向上提交该设备节点信息:构造struct device 变量并初始化,在设备类目录下创建设备信息文件:/sys/class/类名/设备信息文件

    API:

    1. struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
    2. 功能:创建一个设备对象,向上提交设备节点信息
    3. 参数:
    4. cls:向上提交目录时得到的类对象指针
    5. parent:当前申请的对象前一个节点的地址,不知道就填 NULL
    6. devt:设备号 主设备号<<20|次设备号
    7. MKDEV(主设备号,次设备号):根据主设备号和次设备号得到设备号
    8. MAJOR(dev):根据设备号获取主设备号
    9. MINOR(dev):根据设备号获取次设备号
    10. dridata:申请的device对象的私有数据,填写NULL
    11. fmt:向上提交的设备节点名
    12. ...:不定长参数
    13. 返回值:成功返回申请到的device对象首地址,失败返回错误码指针,指向4K预留空间

    4.内核自动产生hotplug 事件

    5.hotplug事件通知udev进程

    6.udev进程在/sys/class/类名/设备信息文件目录下查找设备信息,在/dev下创建设备文件

  • 相关阅读:
    大黑书《离散数学及其应用》之Dijkstra算法
    MQTT 连接优化指南
    【赛码网刷题】动态规划之上台阶
    18.项目开发之前端项目搭建测试
    nginx location / 区别
    项目实战 - tpshop商城项目环境搭建
    【数据结构(三)】单向环形链表和约瑟夫问题(3)
    【1678. 设计 Goal 解析器】
    Linux---用户组命令(groupadd、groupdel、groupmod、newgrp、getent)
    嵌入式开发人员使用基于组件的固件的5个理由
  • 原文地址:https://blog.csdn.net/qq_56558010/article/details/132839281