Linux那些事儿之我是Sysfs(5)举例二sculld
2015-03-19 17:21
232 查看
不妨再把sculld的代码也分析一下,先看初始函数
sculld_init()
-> register_ldd_driver()
->driver_register()
->bus_add_driver()
-> register_ldd_device()
->device_register()
->device_add()
->kobject_add()
->bus_add_device()
首先注册驱动,看bus_add_driver()
drivers/base/bus.c
kobject_init_and_add,把自己kobject链接到内核中去。
driver_attach(drv); 在总线中寻找,有没有设备可以让这个driver驱动。
drivers/base/dd.c
然后注册设备,
drivers/base/bus.c
device_add_groups,把设备连入其总线的设备组中。
sysfs_create_link,创建了一个链接。
接下来进入sysfs部分。
人面不知何处去,桃花依旧笑春风。 唐·崔护·题都城南庄
sculld_init()
-> register_ldd_driver()
->driver_register()
->bus_add_driver()
-> register_ldd_device()
->device_register()
->device_add()
->kobject_add()
->bus_add_device()
首先注册驱动,看bus_add_driver()
drivers/base/bus.c
int bus_add_driver(struct device_driver *drv) { struct bus_type *bus; struct driver_private *priv; int error = 0; bus = bus_get(drv->bus); if (!bus) return -EINVAL; pr_debug("bus: '%s': add driver %s\n", bus->name, drv->name); priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { error = -ENOMEM; goto out_put_bus; } klist_init(&priv->klist_devices, NULL, NULL); priv->driver = drv; drv->p = priv; priv->kobj.kset = bus->p->drivers_kset; error = kobject_init_and_add(&priv->kobj, &driver_ktype, NULL, "%s", drv->name); if (error) goto out_unregister; klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers); if (drv->bus->p->drivers_autoprobe) { error = driver_attach(drv); if (error) goto out_unregister; } module_add_driver(drv->owner, drv); error = driver_create_file(drv, &driver_attr_uevent); if (error) { printk(KERN_ERR "%s: uevent attr (%s) failed\n", __func__, drv->name); } error = driver_add_groups(drv, bus->drv_groups); if (error) { /* How the hell do we get out of this pickle? Give up */ printk(KERN_ERR "%s: driver_create_groups(%s) failed\n", __func__, drv->name); } if (!drv->suppress_bind_attrs) { error = add_bind_files(drv); if (error) { /* Ditto */ printk(KERN_ERR "%s: add_bind_files(%s) failed\n", __func__, drv->name); } } return 0; out_unregister: kobject_put(&priv->kobj); kfree(drv->p); drv->p = NULL; out_put_bus: bus_put(bus); return error; }
kobject_init_and_add,把自己kobject链接到内核中去。
driver_attach(drv); 在总线中寻找,有没有设备可以让这个driver驱动。
drivers/base/dd.c
int driver_attach(struct device_driver *drv) { return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); }
然后注册设备,
drivers/base/bus.c
int bus_add_device(struct device *dev) { struct bus_type *bus = bus_get(dev->bus); int error = 0; if (bus) { pr_debug("bus: '%s': add device %s\n", bus->name, dev_name(dev)); error = device_add_attrs(bus, dev); if (error) goto out_put; error = device_add_groups(dev, bus->dev_groups); if (error) goto out_groups; error = sysfs_create_link(&bus->p->devices_kset->kobj, &dev->kobj, dev_name(dev)); if (error) goto out_id; error = sysfs_create_link(&dev->kobj, &dev->bus->p->subsys.kobj, "subsystem"); if (error) goto out_subsys; klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices); } return 0; out_subsys: sysfs_remove_link(&bus->p->devices_kset->kobj, dev_name(dev)); out_groups: device_remove_groups(dev, bus->dev_groups); out_id: device_remove_attrs(bus, dev); out_put: bus_put(dev->bus); return error; }
device_add_groups,把设备连入其总线的设备组中。
sysfs_create_link,创建了一个链接。
接下来进入sysfs部分。
人面不知何处去,桃花依旧笑春风。 唐·崔护·题都城南庄
相关文章推荐
- Linux那些事儿之我是Sysfs(5)举例二sculld
- 【转】Linux那些事儿之我是Sysfs(5)举例二sculld
- Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容
- Linux那些事儿之我是Sysfs(13)举例四:sysfs读入普通文件内容
- Linux那些事儿之我是Sysfs(4)举例一lddbus
- 【转】Linux那些事儿之我是Sysfs(13)举例四:sysfs读入普通文件内容
- 【转】Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容
- Linux那些事儿之我是Sysfs(13)举例四:sysfs读入普通文件内容
- Linux那些事儿之我是Sysfs(4)举例一lddbus
- 【转】Linux那些事儿之我是Sysfs(4)举例一lddbus
- Linux那些事儿之我是Sysfs(4)举例一lddbus
- Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容
- Linux那些事儿之Linux sysfs -- 剖析版本虽旧,桃花依旧笑春风
- Linux那些事儿之我是Sysfs(7)dentry与inode
- 【转】Linux那些事儿之我是Sysfs(final)后记
- 【转】Linux那些事儿之我是Sysfs(3)设备模型上层容器
- 【转】Linux那些事儿之我是Sysfs(6)文件系统
- Linux那些事儿之我是Sysfs(5)举例二sculld
- 【转】Linux那些事儿之我是Sysfs(10)sysfs 创建目录
- 【转】Linux那些事儿之我是Sysfs(8)一起散散步-pathwalk