前面看过了设备驱动模型中的bus、device、driver,这三种都是有迹可循的。其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动。但本节要介绍的class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口相似的一类设备的集合,常见的设备类的有block、tty、input、usb等等。 class对应的代码在drivers/base/class.c中,对应的头文件在include/linux/device.h和drivers/base/base.h中。
还是先来看class涉及的结构。
[cpp] view plaincopy 1. struct class {
2. const char *name;
3. struct module *owner;
4.
5. struct class_attribute *class_attrs;
6. struct device_attribute *dev_attrs;
7. struct kobject *dev_kobj;
8.
9. int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);
10. char *(*devnode)(struct device *dev, mode_t *mode);
11.
12. void (*class_release)(struct class *class);
13. void (*dev_release)(struct device *dev);
14.
15. int (*suspend)(struct device *dev, pm_message_t state);
16. int (*resume)(struct device *dev);
17.
18. const struct dev_pm_ops *pm;
19.
20. struct class_private *p;
21. };
struct class就是设备驱动模型中通用的设备类结构。
name代表类名称,但和bus/device/driver中的名称一样,是初始名称,实际使用的是内部kobj包含的动态创建的名称。
owner是class所属的模块,虽然class是涉及一类设备,但也是由相应的模块注册的。比如usb类就是由usb模块注册的。
class_attrs是class给自己添加的属性,dev_attrs是class给所包含的设备添加的属性。这里就像bus中一样,只是bus是bus、driver、device全部包含的。