主要参考整理《Linux设备驱动开发详解》
2. kobject 内核对象----设备模型的核心部分:
kobject 结构体: 间: /linux/include/linux/kobject.h
kobj_type 结构体:
sys_ops 结构体 :
操作 kobject 的函数 :
初始化kobject:
void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
设置kobject 的名称:
int kobject_set_name(struct kobject *kobj, const char *name, ...)
__attribute__((format(printf, 2, 3)));
清除 kobject :
void kobject_del(struct kobject *kobj);
。。。。。。。。。
具体的操作可以在使用的时候参考。
3. kset 结构体 : kset 是具有相同类型的kobject的集合,其结构体如下:
注: 形象地来说: kset 类似于一个具有相同属性的链表集合,kobject 则是一个个单独的个体;而当koject 进入链表或者退出链表是会产生一些事件(kset_uevent_ops)
kset_uevent_ops 结构体;
4. subsystem内核对象子系统: subsystem是一系列kset的集合,描述系统中某一类设备子系统。
5. Linux设备模型组件:
1) 系统中的任一设备在设备模型(udev)中都是通过一个 device 对象描述,其结构如下:
device描述了系统中设备的相关信息以及相互间的关系,以及使用到的总线和使用到得驱动程序。
Linux中还提供了一些操作device设备的方法:
extern int __must_check device_register(struct device *dev);
extern void device_unregister(struct device *dev);
extern void device_initialize(struct device *dev);
extern int __must_check device_add(struct device *dev);
extern void device_del(struct device *dev);
extern int device_for_each_child(struct device *dev, void *data,
int (*fn)(struct device *dev, void *data));
extern struct device *device_find_child(struct device *dev, void *data,
int (*match)(struct device *dev, void *data));
extern int device_rename(struct device *dev, char *new_name);
extern int device_move(struct device *dev, struct device *new_parent);
注意: 在linux中, device结构体一般不会单独使用,而是结合device使用: 例如在wm8350中 见:linux/include/linux/mfs/wm8350/core.h
2)系统中的每个驱动程序都有一个device_driver对象描述:
3) 系统中的总线用 struct bus_type 表示
4) 系统中的设备类用 struct class ,表示某一类设备。
5) 设备类的驱动程序: struct class_device :
6) 当发生设备加入或者删除时会调用 class_interface 的成员函数:
7) 属性: