瑞芯微Rockchip开发者社区
直播中

听风说梦

10年用户 965经验值
擅长:可编程逻辑 嵌入式技术 EMC/EMI设计
私信 关注
[问答]

如何对USB设备的hub进行初始化呢

如何对USB设备的hub进行初始化呢?其初始化过程是怎样的呢?

回帖(1)

林芸

2022-3-3 13:39:59
Platform: ROCKCHIP

OS: Android 6.0

Kernel: 3.10.92

上一篇文件小结了USB设备的枚举过程,而设备是插入到hub上才被检测到的.

这里小结hub的初始化,假设初始化之前USB设备已经插入,并且这里讨论的是

root hub,非root hub的行为会和u***设备类似.

u*** core初始化会创建一个hub thread, 来处理USB设备插入后的枚举事件.

u***_init ->    core/u***.c

u***_hub_init ->    hub.c

u***_register    //和其他USB设备一样注册到core中,让core知道它的存在.

hub_thread ->

hub_events    //while循环,第一次进来后hub event list是空,马上退出然后进入休眠.

wait_event_freezable    //休眠等待测到有u***插入.

对于root hub,它和host controller一起的,也就是说有host controller,就一定有root hub存在,

在host controller初始化时会一并将root hub注册.

ehci_rk_init -> echi-rockchip.c

platform_driver_register ->

ehci_rk_probe ->

u***_add_hcd ->

u***_alloc_dev     //分配root hub的u***_device

register_root_hub ->

u***_new_device ->

u***_enumerate_device    //枚举获取root hub信息

device_add ->    进而调用hub drvier的probe

hub_probe ->    hub.c

hub_configure    ->

u***_get_status    //获得hub device状态

u***_alloc_urb    //分配urb

u***_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阶段

u***_submit_urb    //提交urb

kick_khubd    ->

wake_up(&khubd_wait) ->    //接下来就是枚举设备的过程了.

hub_thread ->

hub_events ->

hub_port_connect_change ->

u***_alloc_dev

u***_set_device_state    //USB_STATE_POWERED:上电状态

choose_devnum

hub_port_init

u***_new_device

u***_enumerate_device

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

更多回帖

发帖
×
20
完善资料,
赚取积分