您的位置:首页 > 移动开发 > Android开发

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

2016-11-01 09:22 483 查看
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函数.

参考:

<<Linux那些事儿之我是HUB>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: