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

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值