Linux内核之BUS驱动设备模型理解

来源:互联网 发布:centos 安装 分区 编辑:程序博客网 时间:2024/06/06 04:28

声明:也是参考前面两位大神而写出来的。作为学生,如果有不对的,不喜勿喷。进入正题。

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的建立过程大体上是相同的。

0 0
原创粉丝点击