asp网站开发实训,微信客户端官网,福建工商网上登记平台,个人网店系统自动创建设备节点
#xff08;一#xff09;创建设备节点的机制
1. mknod
将驱动编译到内核中#xff0c;在内核启动时驱动自动被安装执行
2.devfs#xff08;2.4内核#xff09;
3. udev#xff08;2.6内核至今#xff09; 注#xff1a;hotplug — 热插拔
一创建设备节点的机制
1. mknod
将驱动编译到内核中在内核启动时驱动自动被安装执行
2.devfs2.4内核
3. udev2.6内核至今 注hotplug — 热插拔
二API
1. 向上提交目录
#include linux/device.h
struct class * class_create(owner, name)
功能向上提交目录
参数owner:THIS_MODULE 这个宏和模块安装卸载相关并且会记录模块的引用计数值。name:目录名
返回值成功返回结构体指针失败返回错误码指针补通过IS_ERR(cls)来判断是否失败。该宏定义在在cls是错误码指针时返回真否则为假当cls是错误码指针时可以通过PTR_ERR(cls)来获得失败返回的错误码
2. 销毁目录
#include linux/device.h
void class_destroy(struct class *cls)
功能销毁向上提交目录后产生的结构体
参数cls:结构体指针
返回值无3. 向上提交创建节点的信息
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt,...)
功能向上提交创建节点的信息
参数class:指向目录的句柄parent:填写为NULLdevt:设备号 241,0(24120|0)MKDEV(major,minor) //将主和次设备号合成设备号MAJOR(devno); //从设备号中获取主设备号MINOR(devno); //从设备号中获取次设备号drvdata:驱动的私有数据一般填写为NULL。fmt,...:创建节点的名字 myled%d,i
返回值成功返回结构体指针失败返回错误码指针注MKDEV(ma,mi) 将主次设备号拼接成设备号MAJOR(devno) 从设备号中获取主设备号MINOR(devno) 从设备号中获取次设备号
4. 销毁节点的信息
void device_destroy(struct class *class, dev_t devt)
功能销毁节点的信息
参数class:指向目录的句柄devt:设备号 241,0(24120|0)
返回值无5. IS_ERR(cls)的实现机制
三使用示例
功能需求在上一篇驱动的基础上加入自动创建设备节点而无需使用mknod来手动创建 需求分析 设备文件是需要在应用层的open函数就需要使用因此在驱动中自动创建节点就必须要在mydev_open函数之前实现因此在mydev_init函数中进行自动创建设备节点在mydev_exit函数中进行销毁创建的设备节点 代码实现此处只展示有修改的代码部分 LED.c
static int __init myioctl_init(void){//入口注册设备majorregister_chrdev(0,CHRNAME,myfops); //第一个参数为0表示由系统分配主设备号此时返回值就是系统分配的主设备号if(major 0){//说明出错返回了错误码错误码均为负数pr_err(register_chrdev error:%d\n,major);return major; //失败返回错误码}printk(major%d\n,major);//向上提交目录mycls class_create(THIS_MODULE,class_name);if(IS_ERR(mycls)){//成功返回结构体指针失败返回错误码指针//为真则说明是错误码指针pr_err(class create error:%ld\n,PTR_ERR(mycls));return PTR_ERR(mycls); //出错返回错误码}//向上提交节点信息mydev device_create(mycls,NULL,MKDEV(major,0),NULL,myioctl);if(IS_ERR(mydev)){//成功返回结构体指针失败返回错误码指针//为真则说明是错误码指针pr_err(class create error:%ld\n,PTR_ERR(mydev));return PTR_ERR(mydev); //出错返回错误码}return 0; //成功返回0
}static void __exit myioctl_exit(void){//销毁节点信息device_destroy(mycls,MKDEV(major,0));//销毁目录信息class_destroy(mycls);//出口销毁设备unregister_chrdev(major,CHRNAME);
}