声明:也是参考前面两位大神而写出来的。作为学生,如果有不对的,不喜勿喷。进入正题。
1.BUS相关的数据结构
struct bus_type {
//bus的名称,
const char *name;
//bus相关的属性
struct bus_attribute *bus_attrs;
//device相关的属性
struct device_attribute *dev_attrs;
//驱动相关的属性
struct driver_attribute *drv_attrs;
//用来匹配设备和对应的驱动实际调用的函数,1代表匹配成功,0就失败
int (*match)(struct device *dev, struct device_driver *drv);
//总线对uevent的环境变量添加,大体我也不明白
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
//在匹配成功时调用的函数,bus->probe和drv->probe中只会有一个起效,同时存在时使用bus->probe。
int (*probe)(struct device *dev);
//顾名思义,删除设备和驱动的函数
int (*remove)(struct device *dev);
void (*shutdown)(struct device *dev);
int (*suspend)(struct device *dev, pm_message_t state);
int (*resume)(struct device *dev);
const struct dev_pm_ops *pm;
struct bus_type_private *p;
};
struct bus_type_private {
//代表BUS所属类型
struct kset subsys;
//代表bus目录下的drivers子目录。
struct kset *drivers_kset;
//代表bus目录下的deivce子目录
struct kset *devices_kset;
//管理设备的链表
struct klist klist_devices;
//管理驱动的链表
struct klist klist_drivers;
struct blocking_notifier_head bus_notifier;
unsigned int drivers_autoprobe:1;
struct bus_type *bus;
};
struct bus_attribute {
//相关的属性
struct attribute attr;
//绑定读的函数
ssize_t (*show)(struct bus_type *bus, char *buf);
//绑定写的函数
ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
};
BUS_ATTR宏就是定义 一个bus_attribute类型的结构体变量并且填充它
#define BUS_ATTR(_name, _mode, _show, _store) \
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)
这样做 方便设置bus的属性
2.看设备驱动框架的代码,我建议还是从下往上看,因为初始化的代码一般都放在下面。从下网上分析,可以直观的看出它的整体结构逻辑。
int __init buses_init(void)
{
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
if (!bus_kset)
return -ENOMEM;
return 0;
}
(1)kset_create_and_add函数,这个函数在device的创建我已经讲过了,这里做个总结:
1.kset_create函数创建一个容器【设置容器里面对象的名字;填充它的uevent_ops(这个不太懂略过)、kobj.parent(对象所属的父类,因为bus没有父类,所以是NULL)、kobj.ktype(对象的属性和读写操作)、kobj.kset(设置所属的容器,BUS就是一个容器,所以等于NULL)】
2.kset_register函数,里面重要的函数就是kobject_add_internal,这个函数对kset里面的kobject设置了正确的所属关系(也就是设置parent和kset),并且创建了kobject为名字的目录(创建这个目录的代码我也看不懂,能力有限)
3.具体的bus目录就建立起来了。从这里看,bus和device的建立过程大体上是相同的。