EHCI与OHCI驱动switch

问题:EHCI与OHCI是两个控制器,对应两个驱动程序,当一个设备插入root hub usb后,两个驱动是如何防止冲突的?

 

网上搜了好多资料,选了两个:

1.转自:http://www.voidcn.com/article/p-yrmifaao-rz.html

当EHCI驱动接受到复位和使能端口请求,它首先检查PORTSC寄存器的LineStatus位的值,如果该值指示的是一个全速设备(例如D+被检测到)EHCI驱动设置PortReset位为1并且设置PortEnable位为0进入复位过程。软件定时复位持续时间,然后写0到端口终止复位信号, 当软件从PortReset位读到0时复位过程才真正结束。EHCI驱动检查PORTSC的PortEnable位,如果该位为1,所连接的设备是高速设备,EHCI驱动(根HUB竞争者)发出一个改变报告给HUB 驱动,根HUB驱动继续枚举连接的设备。 而当端口复位过程结束后,PortEnable位指示一个全速设备插入,EHCI驱动设置PORTSC的PortOwner位为1,释放端口所有权给伴随HC。当EHCI驱动设置PortOwner位为1时,端口逻辑使收发器的连接状态对伴随HC的端口寄存器可用,OHCI或者UHCI继续枚举设备。

我的读后感:一个全速设备插上root hub usb端口,EHCI的中断首先被触发,然后EHCI发现这个设备不是高速,然后配置一个寄存器,把这个端口switch到ohci上,然后OHCI中断被触发...

 

2.http://t.zoukankan.com/hellokitty2-p-9981179.html

插上U盘产生中断调用usb_hcd_irq:
usb_hcd_irq
    ehci_irq
        usb_hcd_resume_root_hub
            queue_work(pm_wq, &hcd->wakeup_work); //hcd.c中的__usb_create_hcd中INIT_WORK(&hcd->wakeup_work, hcd_resume_work);
                hcd_resume_work
                usb_remote_wakeup
                usb_autoresume_device
                __pm_runtime_resume
                rpm_resume
                rpm_callback
                __rpm_callback
                usb_runtime_resume
                usb_resume_both
                usb_resume_interface
                hub_resume
                hub_activate //这个函数中会延时HUB_DEBOUNCE_STABLE时间
                    kick_hub_wq
                        queue_work(hub_wq, &hub->events) //hub.c的hub_probe中INIT_WORK(&hub->events, hub_event);
                            hub_event //hub.c
                                usb_reset_device //hub.c
                                    usb_reset_and_verify_device
                                        hub_port_init //hub.c
                                            hub_port_reset //hub.c 在这里面进行速率识别握手,默认路由到ehci上,握手就可能路由到ohci上,然后中断线程判断寄存器状态后ohci直接就处理了,然后ehci判断断开了连接就退出了。
                                            hub_set_address
                                port_event
                                    hub_port_connect_change
                                        hub_port_connect
                          hub_port_debounce_be_stable
                            hub_port_debounce //执行消抖操作
                                            usb_new_device
                                                usb_enumerate_device //hub.c 枚举设备

插入U盘产生的IO中断直接作用在ehci上,并由ehci先处理一遍。当由于速率识别,导致中断不再ehci上,此传输完成,hub_irq被调用,
然后它执行hub_event,之后触发一个硬中断,此中断由ohci处理了!

hub_port_init中有一句注释:

/* Reset the device; full speed may morph to high speed */
    /* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */

hub_port_reset

3.发现ehci-hcd.c中有个relinquish_port函数,这个函数就是把usb port switch给ohci的,这个函数只会在hub_port_connect时,某种情景会调用。

Assuming you have an EHCI controller (on a PCI card or motherboard)
and have compiled this driver as a module, load this like::

    # modprobe ehci-hcd

and remove it by::

    # rmmod ehci-hcd

You should also have a driver for a "companion controller", such as
"ohci-hcd"  or "uhci-hcd".  In case of any trouble with the EHCI driver,
remove its module and then the driver for that companion controller will
take over (at lower speed) all the devices that were previously handled
by the EHCI driver.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值