[bug更新] EP93XX的wince问题

[复制链接]
2693|2
 楼主| mmd2102 发表于 2007-7-12 17:37 | 显示全部楼层 |阅读模式
&nbsp;EP9315&nbsp;EP9312&nbsp;EP9307(EP9302/01没测试过)系统若不按照如下的方式做,可能会出现的情况:<br /><br />&nbsp;当系统未启动时,插上USB设备(U盘、鼠标、键盘、wifi模块等)系统上电后识别不到USB设备,只有把这些设备重新拔一次才能重新识别到。<br /><br />出现这个想象的原因是:微软PB4.2/5.0系统的问题,与cirrus无关系。<br /><br /><br />解决办法:<br /><br />The&nbsp;file&nbsp;describes&nbsp;the&nbsp;cause&nbsp;and&nbsp;the&nbsp;fix&nbsp;of&nbsp;Windows&nbsp;CE&nbsp;5.0's&nbsp;USB&nbsp;device&nbsp;<br />detection&nbsp;problem&nbsp;during&nbsp;power-up.&nbsp;&nbsp;<br /><br />1.&nbsp;USB&nbsp;Device&nbsp;Detection&nbsp;Problem&nbsp;during&nbsp;Powering-Up:<br /><br />&nbsp;&nbsp;&nbsp;-&nbsp;Connect&nbsp;USB&nbsp;devices&nbsp;to&nbsp;EDB93xx's&nbsp;USB&nbsp;ports&nbsp;when&nbsp;the&nbsp;board&nbsp;is&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;powered-off.<br />&nbsp;&nbsp;&nbsp;-&nbsp;Power&nbsp;on&nbsp;EDB93xx.<br />&nbsp;&nbsp;&nbsp;-&nbsp;Wait&nbsp;until&nbsp;CE&nbsp;5.0&nbsp;is&nbsp;fully&nbsp;loaded.<br />&nbsp;&nbsp;&nbsp;-&nbsp;One&nbsp;or&nbsp;several&nbsp;USB&nbsp;devices&nbsp;are&nbsp;not&nbsp;detected&nbsp;by&nbsp;CE&nbsp;5.0.<br /><br /><br />2.&nbsp;The&nbsp;Cause:<br /><br />&nbsp;&nbsp;&nbsp;In&nbsp;USB's&nbsp;Open&nbsp;Host&nbsp;Controller&nbsp;Interface&nbsp;(OHCI)&nbsp;Specification,&nbsp;in&nbsp;<br />&nbsp;&nbsp;&nbsp;Register&nbsp;HcRhDescriptorA&nbsp;(EP93xx&nbsp;address&nbsp;0x80020048),&nbsp;Bits&nbsp;24-31&nbsp;<br />&nbsp;&nbsp;&nbsp;are&nbsp;PowerOnToPowerGoodTime.&nbsp;This&nbsp;POTPGT&nbsp;byte&nbsp;specifies&nbsp;the&nbsp;duration<br />&nbsp;&nbsp;&nbsp;Host&nbsp;Controller&nbsp;Driver&nbsp;has&nbsp;to&nbsp;wait&nbsp;before&nbsp;accessing&nbsp;a&nbsp;powered-on&nbsp;port<br />&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;Root&nbsp;Hub.&nbsp;&nbsp;It&nbsp;is&nbsp;implementation-specific.&nbsp;&nbsp;The&nbsp;unit&nbsp;of&nbsp;time&nbsp;<br />&nbsp;&nbsp;&nbsp;is&nbsp;2&nbsp;msec.&nbsp;The&nbsp;duration&nbsp;is&nbsp;calculated&nbsp;as&nbsp;POTPGT&nbsp;x&nbsp;2msec.<br /><br />&nbsp;&nbsp;&nbsp;EP93xx's&nbsp;default&nbsp;value&nbsp;of&nbsp;Register&nbsp;HcRhDescriptorA&nbsp;is&nbsp;0x02001203.&nbsp;<br />&nbsp;&nbsp;&nbsp;The&nbsp;value&nbsp;of&nbsp;the&nbsp;POTPGT&nbsp;byte&nbsp;is&nbsp;0x02.&nbsp;2*2msec=4msec.&nbsp;It&nbsp;needs&nbsp;4&nbsp;msec&nbsp;<br />&nbsp;&nbsp;&nbsp;delay&nbsp;after&nbsp;the&nbsp;Host&nbsp;Controller&nbsp;has&nbsp;supplied&nbsp;power&nbsp;to&nbsp;the&nbsp;Root&nbsp;Hub.<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;The&nbsp;start-up&nbsp;sequence&nbsp;for&nbsp;EDB93xx's&nbsp;USB&nbsp;host&nbsp;controller&nbsp;should&nbsp;be<br /><br />&nbsp;&nbsp;&nbsp;1.&nbsp;Host&nbsp;Controller&nbsp;supplies&nbsp;power&nbsp;to&nbsp;the&nbsp;Root&nbsp;Hub.<br />&nbsp;&nbsp;&nbsp;2.&nbsp;Delay&nbsp;4&nbsp;msec.<br />&nbsp;&nbsp;&nbsp;3.&nbsp;Set&nbsp;Host&nbsp;Controller&nbsp;to&nbsp;Operational&nbsp;state.&nbsp;Access&nbsp;USB&nbsp;ports.&nbsp;Start&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;send&nbsp;SOF&nbsp;tokens...etc.<br /><br />&nbsp;&nbsp;&nbsp;CE&nbsp;5.0's&nbsp;USB&nbsp;driver&nbsp;doesn't&nbsp;implement&nbsp;the&nbsp;code&nbsp;to&nbsp;read&nbsp;the&nbsp;HcRhDescriptorA<br />&nbsp;&nbsp;&nbsp;register&nbsp;and&nbsp;deploy&nbsp;the&nbsp;required&nbsp;delay.&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />3.&nbsp;The&nbsp;Fix:&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;Add&nbsp;the&nbsp;4-msec&nbsp;delay&nbsp;to&nbsp;CE's&nbsp;USB&nbsp;host&nbsp;driver&nbsp;then&nbsp;rebuild&nbsp;the&nbsp;platform.<br /><br />&nbsp;&nbsp;&nbsp;Modify&nbsp;the&nbsp;file:<br />&nbsp;&nbsp;&nbsp;WINCE500\PUBLIC\COMMON\OAK\DRIVERS\USB\HCD\OHCD2\chw.cpp<br />&nbsp;&nbsp;&nbsp;Please&nbsp;look&nbsp;at&nbsp;the&nbsp;code&nbsp;&quot;//QQQQQ&quot;&nbsp;below.<br /><br /><br />BOOL&nbsp;CHW::Initialize(void)<br />{<br />..................<br />&nbsp;&nbsp;&nbsp;&nbsp;InterruptDisable(&nbsp;m_dwSysIntr&nbsp;);&nbsp;//&nbsp;Just&nbsp;to&nbsp;make&nbsp;sure&nbsp;this&nbsp;is&nbsp;really&nbsp;ours.<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Initialize&nbsp;Interrupt.&nbsp;When&nbsp;interrupt&nbsp;id&nbsp;#&nbsp;m_sysIntr&nbsp;is&nbsp;triggered,<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;m_hUsbInterruptEvent&nbsp;will&nbsp;be&nbsp;signaled.&nbsp;Last&nbsp;2&nbsp;params&nbsp;must&nbsp;be&nbsp;NULL<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;!InterruptInitialize(&nbsp;m_dwSysIntr,&nbsp;m_hUsbInterruptEvent,&nbsp;NULL,&nbsp;NULL)&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUGMSG(ZONE_ERROR,&nbsp;(TEXT(&quot;-CHW::Initialize.&nbsp;Error&nbsp;on<br />InterruptInitializern&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Apply&nbsp;power&nbsp;to&nbsp;all&nbsp;root&nbsp;hub&nbsp;ports,&nbsp;just&nbsp;like&nbsp;OHCI.<br />&nbsp;&nbsp;&nbsp;&nbsp;m_portBase-&gtHcRhDescriptorA.NPS&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;m_portBase-&gtHcRhStatus.reg=&nbsp;HcRegisters::HcRhStatus::LPSC;<br /><br />//QQQQQQQ&nbsp;Add&nbsp;4msec&nbsp;delay&nbsp;that&nbsp;is&nbsp;required&nbsp;by&nbsp;Host&nbsp;Controller.<br />Sleep(4);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Start&nbsp;up&nbsp;our&nbsp;IST&nbsp;-&nbsp;the&nbsp;parameter&nbsp;passed&nbsp;to&nbsp;the&nbsp;thread<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;is&nbsp;unused&nbsp;for&nbsp;now<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUGCHK(&nbsp;m_hUsbInterruptThread&nbsp;==&nbsp;NULL&nbsp;&&<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_fUsbInterruptThreadClosing&nbsp;==&nbsp;FALSE&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;m_hUsbInterruptThread&nbsp;=&nbsp;CreateThread(&nbsp;0,&nbsp;0,&nbsp;UsbInterruptThreadStub,&nbsp;this,&nbsp;0,<br />NULL&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;m_hUsbInterruptThread&nbsp;==&nbsp;NULL&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUGMSG(ZONE_ERROR,&nbsp;(TEXT(&quot;-CHW::Initialize.&nbsp;Error&nbsp;creating<br />ISTn&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;CeSetThreadPriority(&nbsp;m_hUsbInterruptThread,&nbsp;g_IstThreadPriority&nbsp;);<br />......................<br />}<br /><br /><br /> 相关链接:<a href='http://www.embedall.com'>http://www.embedall.com</a>
coke 发表于 2007-7-12 19:11 | 显示全部楼层

不错!

  
HQGBOY 发表于 2007-7-13 08:16 | 显示全部楼层

好..顶.

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

645

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部