上電前插入USB設備,啟動后無法識別


我們的平台usb設備電源是上電后就一直供應的,這樣造成了一些上電前插入的USB設備在系統啟動后無法識別,必須重新插拔一次.有些設備又可以正常識別.
DEBUG usb 驅動發現,usb驅動在初始化的時候會查詢每個端口的狀態,並且會嘗試枚舉設備,但是上電前插入的設備在GetDescriptor的時候會失敗,失敗后usb驅動會執行ResetAndPoweronPort,再進行嘗試,在失敗3次以后就會DisablePort,造成無法識別設備. 重新插拔一次后,在GetDescriptor的時候就可以正常返回,枚舉設備成功.
現在硬件已經做好,沒有辦法通過控制usb電源,或者拉低拉高數據線來模擬usb插拔.有沒有人遇到過這種問題,有沒有什么通過修改usb驅動的辦法能解決它呢.

28 个解决方案

#1


我的wince系統也有這問題!感覺重啟系統時最好能使usb設備電源也掉一次就好了,這樣上電后就和剛插入的一樣了,但是具體怎么實現還不理解呢?幫頂下!

#2


搜到一個老外也遇到這個問題,下面的回答是叫他用usb分析儀看看,可惜我沒有呀
Hi all,

I am running Windows CE 5.0 with all available QFEs (including January 2008)
on a Samsung SMDK2410 CPU.

I have a problem with the USB OHCI (1.1) Host Controler:
-start device with a USB device attached to the single OHCI (USB 1.1) Host
Controller port
-occasionally (approximately 5-10 times out of 400 starts) the USB device is
not recognized

The problem occurs in the CHub::AttachDevice() function
(…\DRIVERS\USB\HCD\COMMON\cdevice.cpp):
-in the state machine in the
DEVICE_CONFIG_STATUS_SCHEDULING_GET_DEVICE_DESCRIPTOR_TEST step, I get an
USB_DEVICE_NOT_RESPONDING_ERROR (= 0x5).
-now the state machine goes back to the
DEVICE_CONFIG_STATUS_RESET_AND_ENABLE_PORT state and tries 2 more times
-ultimately after the 3 reties get the same error message the attach fails

The only way that I found to fix that problem is:
-physically unplugging the USB device and plugging it back in
-rebooting the system

Both solutions are not an option for me!

I also tried:
-more reties (10)
-timeout (100ms) before each retry
-powering off and repowering USB port between the reties
-making CHub::HubStatusChangeThread() belief the device was unplugged so do
a DetachDevice() and then (even after powering off and repowering the USB
port) let CHub::HubStatusChangeThread() do the AttachDevice() again

With all of these attempts the problem persisted: the device descriptor
could not be retrieved and the attach failed.

Any help is appreciated

Thanks
-Jochen 

#3


期待答案。友情幫頂了,我們不用USB,所以一直沒有研究。

#4


終於在萬能的google上搜索到了答案,以下是EP93xx的bugfix
實驗證明對於s3c24xx也是有用的

The file describes the cause and the fix of Windows CE 5.0's USB device
detection problem during power-up.  

1. USB Device Detection Problem during Powering-Up
   - Connect USB devices to EDB93xx's USB ports when the board is
     powered-off.
   - Power on EDB93xx.
   - Wait until CE 5.0 is fully loaded.
   - One or several USB devices are not detected by CE 5.0.


2. The Cause
   In USB's Open Host Controller Interface (OHCI) Specification, in
   Register HcRhDescriptorA (EP93xx address 0x80020048), Bits 24-31
   are PowerOnToPowerGoodTime. This POTPGT byte specifies the duration
   Host Controller Driver has to wait before accessing a powered-on port
   of the Root Hub.  It is implementation-specific.  The unit of time
   is 2 msec. The duration is calculated as POTPGT x 2msec.

   EP93xx's default value of Register HcRhDescriptorA is 0x02001203.
   The value of the POTPGT byte is 0x02. 2*2msec=4msec. It needs 4 msec
   delay after the Host Controller has supplied power to the Root Hub.
   
   The start-up sequence for EDB93xx's USB host controller should be

   1. Host Controller supplies power to the Root Hub.
   2. Delay 4 msec.
   3. Set Host Controller to Operational state. Access USB ports. Start
      to send SOF tokens...etc.

   CE 5.0's USB driver doesn't implement the code to read the HcRhDescriptorA
   register and deploy the required delay.  
   
   
3. The Fix:
   
   Add the 4-msec delay to CE's USB host driver then rebuild the platform.

   Modify the filebr>   WINCE500\PUBLIC\COMMON\OAK\DRIVERS\USB\HCD\OHCD2\chw.cpp
   Please look at the code "//QQQQQ" below.


BOOL CHW::Initialize(void)
{
..................
    InterruptDisable( m_dwSysIntr ); // Just to make sure this is really ours.
    // Initialize Interrupt. When interrupt id # m_sysIntr is triggered,
    // m_hUsbInterruptEvent will be signaled. Last 2 params must be NULL
    if ( !InterruptInitialize( m_dwSysIntr, m_hUsbInterruptEvent, NULL, NULL) )
{
        DEBUGMSG(ZONE_ERROR, (TEXT("-CHW::Initialize. Error on
InterruptInitializern")));
        return FALSE;
    }

    // Apply power to all root hub ports, just like OHCI.
    m_portBase->HcRhDescriptorA.NPS = 1;
    m_portBase->HcRhStatus.reg= HcRegisters::HcRhStatus:PSC;

//QQQQQQQ Add 4msec delay that is required by Host Controller.
Sleep(4);   
    
    // Start up our IST - the parameter passed to the thread
    // is unused for now
    DEBUGCHK( m_hUsbInterruptThread == NULL &&
              m_fUsbInterruptThreadClosing == FALSE );
    m_hUsbInterruptThread = CreateThread( 0, 0, UsbInterruptThreadStub, this, 0,
NULL );
    if ( m_hUsbInterruptThread == NULL ) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CHW::Initialize. Error creating
ISTn")));
        return FALSE;
    }
    CeSetThreadPriority( m_hUsbInterruptThread, g_IstThreadPriority );
......................
}

#5


恭喜了!

#6


樓主太強了, 佩服! 佩服!

#7


貌似更改硬件也可以。。。對USB口D+串一101電容接地也可以。。。。

#8


看了一下 wince60 的 code, 它是加上

    Sleep(m_portBase->HcRhDescriptorA.POTPGT * 2);

供大家參考

Paul, Chao @ Techware

#9


Sleep(m_portBase->HcRhDescriptorA.POTPGT * 2); 更加合理,謝謝paul_chao

#10


以前遇到過
標記一下!

#11


這個要收藏!

#12


學習了

#13


學習

#14


標記 學習

#15


學習了,標記

#16


mark  謝謝

#17


Sleep(m_portBase->HcRhDescriptorA.POTPGT * 2);

#18


學習

#19


這個要收藏,

#20


高手很多啊

#21


樓上的都是高手啊,學習了,贊

#22


我也遇到同樣問題,明天試一下。

#23


進來學習了:)

#24


強頂
我的設備有的時候會同步不上,在PC上顯示“無法識別的USB設備”
不知道有沒有人遇到過

#25


牛人,build and sysgen 后問題解決

#26


路過!!!

#27


在哪加啊  ??? 急 我是菜鳥

#28


我家了,也sysgen了,怎么有問題

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com