利用的kernel API:
class_create: 创建class
class_destroy: 销毁class
device_create: 创建device
device_destroy: 销毁device
#define class_create(owner, name) \ 271({ \ 272 static struct lock_class_key __key; \ 273 __class_create(owner, name, &__key); \ 274})
linux-2.6.28/linux/drivers/base/class.c
struct class *__class_create(struct module *owner, const char *name,
224 struct lock_class_key *key)
在/sys/class目录下创建类目录
owner 是模块结构体参数,一般是固定的:THIS_MODULE
name 在/sys/class 目录下的类目录的名字。
key 应该是一种锁机制,是函数内部使用的,不需要用户传递。(请高手解答)
class_destroy:
-----------------------------------------------------------------
linux-2.6.28/include/linux/device.h
266extern void class_destroy(struct class *cls);
在/sys/class目录下删除类目录
device_create:
----------------------------------------------------------------
linux-2.6.28/include/linux/device.h
504extern struct device *device_create(struct class *cls, struct device *parent,
505 dev_t devt, void *drvdata,
506 const char *fmt, ...)
507 __attribute__((format(printf, 5, 6)));
cls:类的结构体。由class_creat创建
parent:父设备指针,一般是NULL。
dev:记录主设备号和次设备号。
drvdata : 一般是NULL
fmt: 所要建立的设备文件的名字,/dev目录下的设备文件。
后面是GCC内联函数。这个我也不懂。
这个函数可以自动建立设备文件
/dev目录下可以看到
device_destroy:
----------------------------------------------------------------
linux-2.6.28/include/linux/device.h
508extern void device_destroy(struct class *cls, dev_t devt);
509
销毁此设备。
在卸载模块时,必须要销毁class和device。不然就无法加载此设备。需要重启计算机才行。
下面一个例子使用以上函数:
|