CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常
但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?
求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝
CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常
但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?
求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝
CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常
但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?
求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝
CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常
但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?
求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝
CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常
但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?
求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝
設(shè)備速度檢測了嗎,對于低速設(shè)備是否開啟前置包。詳細(xì)參考CH374EVT/EXAM/EMB_HUB例程。
設(shè)備速度檢測了的
這部分代碼如下,勞煩幫忙檢查一下
else if( Infor_DEV[hub_num].Itfac_Class==0x09) ?//對USB Hub設(shè)備進(jìn)行處理
{
//這里需要保存Hub上的端口數(shù)目
#ifdef DebugPrint
printf("Hub port\n");
#endif
//給 Hub的 外部端口上電
for(i=1;i<5;i++)
{
s = SetPortFeature( i, 8 );
}
//這里hub設(shè)備枚舉 結(jié)束
if ( s != USB_INT_SUCCESS )
{
#ifdef DebugPrint
printf("Ext-HUB Port%01d# power on error\n",(UINT16)i ); ?// 外部hub端口上電失敗
#endif
FailEnumDevice( hub_num );
return FALSE;
} // HUB枚舉成功
else
{
#ifdef DebugPrint
printf("Hub port power up ok\n");
#endif
}
// 選擇操作指定的ROOT-HUB端口,設(shè)置當(dāng)前USB速度以及被操作設(shè)備的USB地址
// SetHostUsbAddr(hub_num + 2 );
// //SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed );?
// Write374Byte( REG_USB_SETUP, BIT_SETP_HOST_MODE | BIT_SETP_AUTO_SOF );
? ? mDelaymS( 100 );
// 做點(diǎn)什么? ?給HUB各端口上電,查詢各端口狀態(tài),初始化有設(shè)備連接的HUB端口,初始化設(shè)備
for(i=1;i<5;i++)
{
//設(shè)置索引到相應(yīng)的端口 ,及USB總線默認(rèn)操作速度
// SetHostUsbAddr(hub_num + 2 );
// //SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed );?
// Write374Byte( REG_USB_SETUP, BIT_SETP_HOST_MODE | BIT_SETP_AUTO_SOF );
s = GetPortStatus( i ); ?//獲取端口狀態(tài)
if ( s != USB_INT_SUCCESS )
? ? {
#ifdef DebugPrint
printf("Get port state err\n");
#endif
return( s ); ?//可能是HUB斷開了
}
if ( (buf[0]&0x01) && (buf[2]&0x01) ) ? ?//有設(shè)備連接
{
s = GetPortStatus( i ); ?//獲取端口狀態(tài)
if ( s != USB_INT_SUCCESS ) return( s ); ?//可能是HUB斷開了
if(buf[1] & 0x02 ? 0 : 1) ?//低速還是全速
{
//
#ifdef DebugPrint
printf("Hub port low speed device\n");
#endif
}
else
{
#ifdef DebugPrint
printf("Hub port full speed device\n");
#endif
}
//---------------------對hub下的該設(shè)備進(jìn)行枚舉操作------------------------------
mDelaymS( 100 ); ?//等待Hub下的USB設(shè)備穩(wěn)定
s = SetPortFeature( i, PORT_RESET ); ?// 對有設(shè)備連接的端口復(fù)位 ?
if ( s != USB_INT_SUCCESS ) return( s ); //可能是HUB斷開了
#if 0
printf( "Reset port and then wait in\n" );
#endif
do { ?// 查詢復(fù)位的USB端口直到復(fù)位狀態(tài)完成
mDelaymS( 1 );
s = GetPortStatus( i );
if ( s != USB_INT_SUCCESS ) return( s ); ?//可能是HUB斷開了
} while ( buf[0] & 0x10 );?
? ? ? mDelaymS( 100 );
//清除連接或移除變化標(biāo)志
? ? ? s = ClearPortFeature( i, C_PORT_CONNECTION );
? ? ? if ( s != USB_INT_SUCCESS ) return( s );
s = GetPortStatus( i ); ?//再次讀取狀態(tài) ,復(fù)位設(shè)備是否還在
if ( s != USB_INT_SUCCESS ) return( s );
if ( (buf[0]&0x01) == 0 )
{
#ifdef DebugPrint
printf("Hub port no device\n");
#endif
return( s );
}
else
{
// -----------------------------對外部hub下的USB設(shè)備進(jìn)行枚舉-----------------
#ifdef DebugPrint
printf("enum hub port device\n");
#endif
? ? ? ??
// --選擇指定的Hub端口 ----設(shè)置USB設(shè)備的地址 為 0 ?進(jìn)行 一系列枚舉的操作-----
? ? ? ? // 這里Hub的操作端口已經(jīng)選擇好,只需要設(shè)備USB的地址為零即可和Hub下面的設(shè)備通訊
//SwitchHUBPort( 1 );
SetHostUsbAddr(0);//SetHostUsbAddr(0);
Write374Byte( REG_USB_SETUP, BIT_SETP_HOST_MODE | BIT_SETP_AUTO_SOF );?
//Write374Byte( REG_USB_SETUP, Read374Byte( REG_USB_SETUP ) | BIT_SETP_LOW_SPEED | BIT_SETP_AUTO_SOF );
? ? ? ? mDelaymS( 10 );
//-----------------------------獲取設(shè)備描述符----------------
目前就卡在切換0地址獲取Hub下面的描述符這一步驟上,
發(fā)完SetHostUsbAddr(0)之后,需要根據(jù)上面檢測到的HUB下設(shè)備速度進(jìn)行配置。
void?SelectHubPort( UINT8 HubIndex, UINT8 PortIndex )? // PortIndex=0選擇操作指定的ROOT-HUB端口,否則選擇操作指定的ROOT-HUB端口的外部HUB的指定端口
{
?if ( PortIndex ) {? // 選擇操作指定的ROOT-HUB端口的外部HUB的指定端口
??SetHostUsbAddr( DevOnHubPort[HubIndex][PortIndex-1].DeviceAddress );? // 設(shè)置USB主機(jī)當(dāng)前操作的USB設(shè)備地址
??if ( DevOnHubPort[HubIndex][PortIndex-1].DeviceSpeed == 0 )? // 通過外部HUB與低速USB設(shè)備通訊需要前置ID
???Write374Byte( REG_HUB_SETUP, Read374Byte( REG_HUB_SETUP ) | BIT_HUB_PRE_PID );? // 啟用PRE PID
??SetUsbSpeed( DevOnHubPort[HubIndex][PortIndex-1].DeviceSpeed );? // 設(shè)置當(dāng)前USB速度
?}
?else {? // 選擇操作指定的ROOT-HUB端口
??SetHostUsbAddr( RootHubDev[HubIndex].DeviceAddress );? // 設(shè)置USB主機(jī)當(dāng)前操作的USB設(shè)備地址
??SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed );? // 設(shè)置當(dāng)前USB速度
?}
}
謝謝指導(dǎo),目前已經(jīng)順利枚舉hub下面的設(shè)備了,順利讀取數(shù)據(jù)了,但是目前hub下的設(shè)備如果傳輸數(shù)據(jù)過多設(shè)備就掉了,就是鼠標(biāo)我晃一下設(shè)備就直接掉了,目前還是無法找到很好的解決方法
數(shù)據(jù)包的翻轉(zhuǎn)是否正確?此外對于鍵盤鼠標(biāo)等低速設(shè)備操作之前需要先選擇設(shè)備地址、開PRE PID、設(shè)置低速然后發(fā)包。結(jié)束后,仍需切換到全速。
數(shù)據(jù)包的翻轉(zhuǎn)不會有問題,設(shè)備地址,PRE PID 設(shè)置低速都做了,
出現(xiàn)的現(xiàn)象就是通過hub傳輸大量數(shù)據(jù),直接設(shè)備就掉了(鼠標(biāo)晃一下,鍵盤連著不停按),
而且還有一個現(xiàn)象,就是我的Hub是full speed的設(shè)備 鍵盤鼠標(biāo)也是但是在枚舉時候必須設(shè)置為低速設(shè)備才能正常枚舉
對于鍵盤鼠標(biāo)數(shù)據(jù)量并不算大。鍵盤鼠標(biāo)一般為低速設(shè)備,速度檢測對不對?BIT_HUBx_DX_IN判斷極性是否匹配,BIT_HUBx_POLAR代表當(dāng)前極性,由這兩個位來檢測和配置自身極性的。
謝謝答復(fù), 問題原因找到了?
是CH374發(fā)的硬件SOF 和傳輸時候疊加在一起的沖突導(dǎo)致的,但是目前還沒找到好的解決辦法