驱动开发 day3 9/12

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

1.驱动注册

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

2.创建设备类

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

API:

复制代码
struct class * class_create(struct module *owner,const char *name );
功能:申请一个设备类并初始化,向上提交目录信息
参数:
owner:指向当前内核模块自身的一个模块指针,填写THIS_MODULE
name:向上提交的目录名
返回值:成功返回申请的struct class对象空间首地址,失败返回错误码指针
在内核空间最顶层会预留4K空间,当struct class函数调用失败后函数会返回一个指向这4K空间的指针


bool __must_check IS_ERR(__force const void *ptr)
功能:判断指针是否指向4K预留空间
参数:要判断的指针
返回值:如果指着指向4K预留空间返回逻辑真,否则返回逻辑假

long __must_check PTR_ERR(__force const void *ptr)
功能:通过错误码指针得到错误码

3.创建设备对象

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

API:

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

4.内核自动产生hotplug 事件

5.hotplug事件通知udev进程

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

相关推荐
木白CPP11 小时前
Linux 驱动UART子系统源码分析
linux·运维·服务器·驱动开发·嵌入式硬件·开源软件
恒锐丰-罗生2 天前
小体积大驱动|LTK8833 双通道 H 桥电机驱动芯片,电池供电设备首选动力方案
驱动开发·嵌入式硬件·硬件工程
正点原子4 天前
【正点原子Linux连载】 第十章 pinctrl和gpio子系统实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
星马梦缘5 天前
“零一”智能硬件开发挑战赛 宣传稿
驱动开发·智能硬件·活动·培训·科协
小此方6 天前
Re:Linux系统篇(五十四)线程篇 · 七:互斥锁的底层实现原理:从硬件上下文、原子交换指令(Swap)到并发封装实战
linux·运维·驱动开发
芯片设计-曾工7 天前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
平凡的小蚂蚁9 天前
Exynos4412-POP-7inLCD裸机开发完整教程(STM32 库风格)
驱动开发·stm32·单片机·嵌入式硬件·嵌入式·硬件工程
小此方9 天前
Re:Linux系统篇(五十二)线程篇 · 五:直击 Linux 内核底层:TCB 与 LWP 一体两面全解析(附自定义线程封装)
linux·运维·驱动开发
胡八一9 天前
虚拟串口com0com安装教程
驱动开发·stm32·单片机
智者知已应修善业9 天前
【三位数字显示计时定时器设计-同步方式】2025-6-30
驱动开发·经验分享·笔记·硬件架构·硬件工程