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