注册一个平台BUS
//我们从入口函数head.S说起:
struct device platform_bus = {
.bus_id = "platform",
};
struct bus_type platform_bus_type = {
.name = "platform",
.dev_attrs = platform_dev_attrs,
.match = platform_match,
.uevent = platform_uevent,
.suspend = platform_suspend,
.suspend_late = platform_suspend_late,
.resume_early = platform_resume_early,
.resume = platform_resume,
};
b start_kernel
rest_init();
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
kernel_init
do_basic_setup();
driver_init();
platform_bus_init();
device_register(&platform_bus); //向内核注册了一个platform_bus设备
bus_register(&platform_bus_type); //向总线注册了一个platform_bus_type
注意: platform bus不过是众多bus中的一个,可以通过ls /sys/bus/来查看系统里有哪些bus bus是一个虚拟概念和计算机中的术语物理总线似乎没啥关系
向平台增加一个驱动,平台会遍历所有的device,来看看是否匹配,如果匹配,则probe
//向系统增加一个驱动
//platform_driver_register
// driver_register
// bus_add_driver
// driver_attach
// bus_for_each_dev (遍历所有的设备)
// __driver_attach
// driver_probe_device
// if(match) really_probe
// ret = drv->probe(dev);
//
向平台增加一个设备,平台会遍历所有的driver,来看看是否匹配,匹配则probe
//向系统增加一个设备
//platform_device_register
// platform_device_add
// device_add
// bus_attach_device
// device_attach
// bus_for_each_drv (遍历所有驱动)
// __device_attach
// driver_probe_device
// if(match) really_probe
//
注意,linux下有很多地方都用了这种技巧,比如声卡的建立连接,键盘驱动的建立连接,都采用了全遍历的方式