本文共 3301 字,大约阅读时间需要 11 分钟。
struct i2c_client *i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) struct i2c_client *client; client->adapter = adap; client->dev.platform_data = info->platform_data; client->dev.parent = &client->adapter->dev; client->dev.bus = &i2c_bus_type; client->dev.type = &i2c_client_type; dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap), client->addr); status = device_register(&client->dev); =>int device_register(struct device *dev) device_initialize(dev); =>void device_initialize(struct device *dev) dev->kobj.kset = devices_kset; kobject_init(&dev->kobj, &device_ktype); return device_add(dev); =>int device_add(struct device *dev) parent = get_device(dev->parent); setup_parent(dev, parent); error = kobject_add(&dev->kobj, dev->kobj.parent, NULL); error = device_create_file(dev, &uevent_attr); if (MAJOR(dev->devt)) error = device_create_file(dev, &devt_attr); error = device_create_sys_dev_entry(dev); =>int device_create_sys_dev_entry(struct device *dev) struct kobject *kobj = device_to_dev_kobj(dev); if (kobj) format_dev_t(devt_str, dev->devt); error = sysfs_create_link(kobj, &dev->kobj, devt_str); error = device_add_class_symlinks(dev); =>int device_add_class_symlinks(struct device *dev) error = sysfs_create_link(&dev->kobj, &dev->class->p->class_subsys.kobj, "subsystem"); //举例,实设备下定义subsystem反指虚设备 /sys/devices/e f000 0000.soc/f f011 9100.i2c/i2c-3/3-0055/rtc/rtc0 ]# ls -l subsystem->../../../../../../../class/rtc error = sysfs_create_link(&dev->class->p->class_subsys.kobj, &dev->kobj, dev_name(dev)); error = sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device"); //举例, /sys/class/rtc ]# ls -l rtc0->../../devices/e f000 0000.soc/f f011 9100.i2c/i2c-3/3-0055/rtc/rtc0 device->../../../3-0055 error = device_add_attrs(dev); error = bus_add_device(dev); =>int bus_add_device(struct device *dev) struct bus_type *bus = bus_get(dev->bus); if (bus) error = device_add_attrs(bus, dev); error = sysfs_create_link(&bus->p->devices_kset->kobj, &dev->kobj, dev_name(dev)); //举例,bus是虚设备,所以链接指向实际设备 /sys/bus/i2c/devices ]# ls -l 3-0055->../../../devices/e f000 0000.soc/f f011 9100.i2c/i2c-3/3-0055 error = sysfs_create_link(&dev->kobj, &dev->bus->p->subsys.kobj, "subsystem"); //举例,实设备下定义subsystem反指虚设备 /sys/devices/e f000 0000.soc/f f011 9100.i2c/i2c-3/3-0055 ]# ls -l subsystem->../../../../../bus/i2c klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices); if (dev->bus) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_ADD_DEVICE, dev); kobject_uevent(&dev->kobj, KOBJ_ADD); bus_probe_device(dev); if (parent) klist_add_tail(&dev->p->knode_parent, &parent->p->klist_children); if (dev->class) klist_add_tail(&dev->knode_class, &dev->class->p->class_devices); list_for_each_entry(class_intf, &dev->class->p->class_interfaces, node) if (class_intf->add_dev) class_intf->add_dev(dev, class_intf);
参考文章
五、2sysfs API总结 博客好好学习一下 https://blog.csdn.net/qq_20678703/article/details/52670871六 设备驱动模型-总线
https://blog.csdn.net/qq_20678703/article/details/52688958