[RK3288][Android6.0] USB hub初始化流程小结

Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92

上一篇文件小结了USB设备的枚举过程,而设备是插入到hub上才被检测到的.
这里小结hub的初始化,假设初始化之前USB设备已经插入,并且这里讨论的是
root hub,非root hub的行为会和usb设备类似.

usb core初始化会创建一个hub thread, 来处理USB设备插入后的枚举事件.
usb_init ->    core/usb.c
    usb_hub_init ->    hub.c
        usb_register    //和其他USB设备一样注册到core中,让core知道它的存在.
        hub_thread ->
            hub_events    //while循环,第一次进来后hub event list是空,马上退出然后进入休眠.
            wait_event_freezable    //休眠等待测到有usb插入.


对于root hub,它和host controller一起的,也就是说有host controller,就一定有root hub存在,
在host controller初始化时会一并将root hub注册.
ehci_rk_init -> echi-rockchip.c
    platform_driver_register ->
        ehci_rk_probe ->
            usb_add_hcd ->
                usb_alloc_dev     //分配root hub的usb_device
                register_root_hub ->
                    usb_new_device ->
                        usb_enumerate_device    //枚举获取root hub信息
                        device_add ->    进而调用hub drvier的probe
                            hub_probe ->    hub.c
                                hub_configure    ->
                                    usb_get_status    //获得hub device状态
                                    usb_alloc_urb    //分配urb
                                    usb_fill_int_urb    //填充中断类型的urb(hub支持control/int类型), 注意这里的hub_irq()参数,后面会重点提到.
                                    hub_activate ->
                                        schedule_delayed_work ->
                                            hub_init_func2 ->
                                                hub_activate    //HUB_INIT2阶段
                                                    schedule_delayed_work ->
                                                        hub_init_func3 ->
                                                            hub_activate ->//HUB_INIT3阶段
                                                                usb_submit_urb    //提交urb
                                                                kick_khubd    ->
                                                                    wake_up(&khubd_wait) ->    //接下来就是枚举设备的过程了.
                                                                        hub_thread ->
                                                                        hub_events ->
                                                                            hub_port_connect_change ->
                                                                                usb_alloc_dev
                                                                                usb_set_device_state    //USB_STATE_POWERED:上电状态
                                                                                choose_devnum
                                                                                hub_port_init
                                                                                usb_new_device
                                                                                usb_enumerate_device

                                                                                device_add    //接着就会调用到对应设备的probe函数.

参考:

<>

你可能感兴趣的:(子类__USB)