前言
<<Linux platform子系统【1】-PLATFORM(平台)总线详解>>
中分析了注册struct bus_type platform_bus_type
的过程,但是在int __init platform_bus_init(void)
中还提前注册了一个(struct device)platform_bus
。
- 为什么要提前注册一个 虚拟的设备?
- 设备注册到
platform_bus
的具体过程是什么呢? - 从设备树解析到注册设备具体的过程
Linux I2C子系统【1】-I2C_adapter和I2C_client
一、为什么要提前注册一个 虚拟的设备(struct device)platform_bus?
coding
struct device {
struct device *parent;
struct device_private *p;
};
struct device platform_bus = {
.init_name = "platforms",
};
int __init platform_bus_init(void)
{
int error;
early_platform_cleanup();
error = device_register(&platform_bus);
error = bus_register(&platform_bus_type);
return error;
}
首先来理解一下device_register
:
linux设备模型六(device细节)
- 从上可知系统上电初始化
设备集合
/* /sys/devices/ */ int __init devices_init(void){ struct kset *devices_kset = devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); printk(KERN_INFO "devices_kset=%s\n\n",devices_kset->kobj.name)(devices_kset=devices) } int device_register(struct device *dev)/*device_register(&platform_bus)*/ { device_initialize(dev); /* 初始化通用数据结构 */ return device_add(dev); /* 加入到该dev所属bus上 */ }
- 因为
platform
本身属于一个虚拟bus
,那么设备struct device platform_bus
放在哪个总线上?
/* 画重点了!!!---------给设备探测相应的驱动开始寻找设备所对应的驱动------------ 去bus上找dev对应的drv,主要执行__device_attach,主要进行match,sys_add,执行probe函数和绑定等操作 */
到最后发现,struct device platform_bus
没有相对应的bus
,只是在文件系统下面显示/sys/devices/platform
,之后为后面实际的设备,提供分组的父设备void bus_probe_device(struct device *dev) { struct bus_type *bus = dev->bus; struct subsys_interface *sif; if (!bus) /* device要查找自己bus上的driver,所以bus必须存在 */ return; }
- 总体经历
- 因为
-->device_register(platform_bus)
-->device_initialize(platform_bus);
{
dev->kobj.kset = devices_kset;
}
-->device_add(platform_bus);
-->device_private_init(dev);
{
dev->p = kzalloc(sizeof(struct device_private), GFP_KERNEL);
}
-->bus_add_device(platform_bus);/* 添加设备的总线属性 将设备加入到管理它的bus总线的设备连表上
-->bus_probe_device(dev); /* 画重点了!!!!!!!!!!!!---------给设备探测相应的驱动开始寻找设备所对应的驱动------------ 去bus上找dev对应的drv,主要执行__device_attach,主要进行match,sys_add,执行probe函数和绑定等操作 */