platform总线设备驱动代码分析

注册一个平台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下有很多地方都用了这种技巧,比如声卡的建立连接,键盘驱动的建立连接,都采用了全遍历的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值