驱动开发 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下创建设备文件

相关推荐
17(无规则自律)11 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
weiyvyy1 天前
从开发视角看硬件接口:接口开发的本质与全景图
驱动开发·单片机·嵌入式硬件·硬件工程
Dylan~~~2 天前
AI编程新范式:规范驱动开发SpecKit框架完全指南
驱动开发·ai编程
阿拉斯攀登2 天前
【RK3576 安卓 JNI/NDK 系列 04】JNI 核心语法(下):字符串、数组与对象操作
android·驱动开发·rk3568·瑞芯微·rk安卓驱动·jni字符串操作
weiyvyy2 天前
接口开发的完整流程:从需求到验证
驱动开发·嵌入式硬件·硬件架构·硬件工程
zly88653722 天前
windsurf rules与skill的使用
linux·c语言·开发语言·驱动开发
阿拉斯攀登3 天前
【RK3576 安卓 JNI/NDK 系列 09】RK3576 实战(三):JNI 调用 librga 实现 2D 硬件加速图像处理
android·驱动开发·rk3568·瑞芯微·rk安卓驱动·rk3576 rga加速
阿拉斯攀登4 天前
第 19 篇 驱动性能优化与功耗优化实战
android·驱动开发·瑞芯微·嵌入式驱动·安卓驱动
道一云黑板报4 天前
技术拆解:AI低代码架构设计与全链路落地实现
人工智能·驱动开发·低代码·ai·企业微信·ai编程·代码规范
LXY_BUAA4 天前
《嵌入式操作系统》_高级字符设备驱动_20260316
linux·运维·服务器·驱动开发