<
中分析了注册struct bus_type platform_bus_type 的过程,但是在int __init platform_bus_init(void)中还提前注册了一个(struct device)platform_bus。
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放在哪个总线上?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函数和绑定等操作 */
