网站建设购买模板,网页设计素材为什么拖不进ps,360应用商店,网站建设托管产品图在成功加载驱动模块之后#xff0c;还需要使用 mknod命令创建设备节点#xff0c;才能在/dev目录下创建对应的设备文件。自动创建设备节点的功能需要依赖 mdev 设备管理机制#xff0c;在使用 buildroot 构建 rootfs 的时候#xff0c;会默认构建 mdev 的功能#xff0c;m… 在成功加载驱动模块之后还需要使用 mknod命令创建设备节点才能在/dev目录下创建对应的设备文件。自动创建设备节点的功能需要依赖 mdev 设备管理机制在使用 buildroot 构建 rootfs 的时候会默认构建 mdev 的功能mdev 机制不做深究。对于驱动代码编写来说一般在驱动注册成功后添加自动创建设备节点的相关代码。 class 类 首先需要创建一个 class 类在Linux系统中类是一个用于组织设备驱动程序的层次结构。每个设备都属于一个特定的类而设备驱动程序则与类相关联。Linux系统中有许多预定义的类每个类都有其特定的设备类型。其中一些常见的类包括 /dev/tty该类包含终端设备例如控制台、串口、终端仿真器等。 /dev/input该类包含输入设备例如鼠标、键盘、触摸屏等。 /dev/sda该类包含磁盘设备例如硬盘、固态硬盘、U盘等。 /dev/video该类包含视频设备例如摄像头、视频采集卡等。 /dev/net该类包含网络设备例如以太网卡、无线网卡等。 类层次结构允许Linux系统在设备驱动程序之上建立更高层次的抽象从而使不同类型的设备能够使用相同的接口和API。例如一个应用程序可以使用统一的API来访问不同类型的输入设备而不需要了解具体的设备类型或驱动程序实现。这提高了系统的可移植性和灵活性。 class 是个结构体定义在文件 include/linux/device.h 中宏 class_create用来创建一个类内容如下
#define class_create(owner, name) \({ \static struct lock_class_key __key; \__class_create(owner, name, __key); \})struct class *__class_create(struct module *owner, const char *name,struct lock_class_key *key)… 存在两个参数解释如下
owner 指向将拥有这个结构类的模块的指针一般为 THIS_MODULE
name 类名字 返回值是个指向结构体 class的指针也就是创建的类。 驱动卸载的时候需要删除掉类类的删除函数是 void class_destroy(struct class *cls)参数 cls 就指向要删除的类。 创建设备 创建完类之后还需要在这个类下创建一个设备使用 device_create 函数在指定类下创建设备device_create 函数在drivers/base/core.c中原型如下
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
可变参数函数参数解释如下
class 设备要创建在哪个类下面
parent 父设备一般为NULL
devt 设备号
drvdata 设备可能会使用的一些数据一般为NULL
fmt 设备名字如果设置fmtxxx就会创建/dev/xxx的设备文件
返回值为创建好的设备。 卸载驱动的时候需要删除device_create创建的设备设备删除的函数为device_destroy,函数原型如下
void device_destroy(struct class *class, dev_t devt)
class 指向要删除的设备指针
devt 要删除的设备号 用法举例
static int __init chrdevTest_init(void)
{.../*创建 class 类*/g_ChrDevBase_t.class class_create(THIS_MODULE, g_ChrDevBase_t.devName);if(g_ChrDevBase_t.class NULL){printk(Created Class Failed\r\n);}else{printk(Created Class Success\r\n);}/*创建设备*/g_ChrDevBase_t.device device_create(g_ChrDevBase_t.class, NULL,g_ChrDevBase_t.devid, NULL, DEVICE_NAME);if(g_ChrDevBase_t.device NULL){printk(Created Device Failed\r\n);}else{printk(Created Device Success\r\n);}return 0;
}static void __exit chrdevTest_exit(void)
{...device_destroy(g_ChrDevBase_t.class, g_ChrDevBase_t.devid);class_destroy(g_ChrDevBase_t.class);printk(unregister\r\n);
}