linux总线对象bus_type

linux总线对象bus_type

struct bus_type {
    const char      *name; //总线名字
    struct bus_attribute    *bus_attrs;
    struct device_attribute *dev_attrs;
    struct driver_attribute *drv_attrs;

    int (*match)(struct device *dev, struct device_driver *drv);
    int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
    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 {
    struct kset subsys; //总线的kset
    struct kset *drivers_kset; //驱动对象的kset
    struct kset *devices_kset; //设备对象的kset
    struct klist klist_devices;
    struct klist klist_drivers;
    struct blocking_notifier_head bus_notifier;
    unsigned int drivers_autoprobe:1;
    struct bus_type *bus;
};
//注册总线
/base/bus.c
int __init buses_init(void)
{
    bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
    if (!bus_kset)
        return -ENOMEM;
    return 0;
}

int bus_register(struct bus_type *bus)
{
    priv = kzalloc(sizeof(struct bus_type_private), GFP_KERNEL);

    priv->subsys.kobj.kset = bus_kset; 
    priv->subsys.kobj.ktype = &bus_ktype; //kobject_type

    retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name);

    retval = kset_register(&priv->subsys); //注册subsys的kset

    retval = bus_create_file(bus, &bus_attr_uevent); //创建 sysbus 的 attr 
    priv->devices_kset = kset_create_and_add("devices", NULL,  //创建subsys的kset的driver
            &priv-subsys.kobj

    priv->drivers_kset = kset_create_and_add("drivers", NULL,  //创建subsys的kset的device
            &priv->subsys.kobj);

}

举例:操作总线属性
//操作属性文件

static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);

#define BUS_ATTR(_name, _mode, _show, _store)   \
    struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)

举例:

int bus_register(struct bus_type *bus)
{
    retval = bus_create_file(bus, &bus_attr_uevent);

    retval = add_probe_files(bus);
        retval = bus_create_file(bus, &bus_attr_drivers_probe);
        retval = bus_create_file(bus, &bus_attr_drivers_autoprobe);
}

static BUS_ATTR(drivers_autoprobe, S_IWUSR | S_IRUGO,
        show_drivers_autoprobe, store_drivers_autoprobe);

#define BUS_ATTR(_name, _mode, _show, _store)   \
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)

static ssize_t show_drivers_autoprobe(struct bus_type *bus, char *buf)
{
    return sprintf(buf, "%d\n", bus->p->drivers_autoprobe);
}

static ssize_t store_drivers_autoprobe(struct bus_type *bus,
                       const char *buf, size_t count)
{
    if (buf[0] == '0')
        bus->p->drivers_autoprobe = 0;
    else
        bus->p->drivers_autoprobe = 1;
    return count;
}

//应用空间修改attr文件的值 
[root@EmbedSky i2c]# cat drivers_autoprobe 
1
[root@EmbedSky i2c]# echo 0 > drivers_autoprobe
[root@EmbedSky i2c]# cat drivers_autoprobe 
0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值