打印

[bug更新] EP93XX的wince问题

[复制链接]
1988|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mmd2102|  楼主 | 2007-7-12 17:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 EP9315 EP9312 EP9307(EP9302/01没测试过)系统若不按照如下的方式做,可能会出现的情况:

 当系统未启动时,插上USB设备(U盘、鼠标、键盘、wifi模块等)系统上电后识别不到USB设备,只有把这些设备重新拔一次才能重新识别到。

出现这个想象的原因是:微软PB4.2/5.0系统的问题,与cirrus无关系。


解决办法:

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 file:
   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::LPSC;

//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 );
......................
}


相关链接:http://www.embedall.com

相关帖子

沙发
coke| | 2007-7-12 19:11 | 只看该作者

不错!

使用特权

评论回复
板凳
HQGBOY| | 2007-7-13 08:16 | 只看该作者

好..顶.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

645

帖子

0

粉丝