?? hub.c
字號:
UINT8 GetDeviceDescr( PUINT8 buf ) // 獲取設(shè)備描述符
{
UINT8 s, len;
UsbDevEndpSize = DEFAULT_ENDP0_SIZE;
s = HostCtrlTransfer374( SetupGetDevDescr, buf, &len ); // 執(zhí)行控制傳輸
if ( s == USB_INT_SUCCESS ) {
UsbDevEndpSize = ( (PUSB_DEV_DESCR)buf ) -> bMaxPacketSize0; // 端點(diǎn)0最大包長度,這是簡化處理,正常應(yīng)該先獲取前8字節(jié)后立即更新UsbDevEndpSize再繼續(xù)
if ( len < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL ) s = USB_INT_BUF_OVER; // 描述符長度錯誤
}
return( s );
}
UINT8 GetConfigDescr( PUINT8 buf ) // 獲取配置描述符
{
UINT8 s, len;
UINT8 BufLogDescr[ sizeof( SetupGetCfgDescr ) ] ;
s = HostCtrlTransfer374( SetupGetCfgDescr, buf, &len ); // 執(zhí)行控制傳輸
if ( s == USB_INT_SUCCESS ) {
if ( len < ( (PUSB_SETUP_REQ)SetupGetCfgDescr ) -> wLengthL ) s = USB_INT_BUF_OVER; // 返回長度錯誤
else {
memcpy ( BufLogDescr, SetupGetCfgDescr, sizeof( SetupGetCfgDescr ) );
( (PUSB_SETUP_REQ)BufLogDescr ) -> wLengthL = ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL; // 完整配置描述符的總長度
s = HostCtrlTransfer374( BufLogDescr, buf, &len ); // 執(zhí)行控制傳輸
if ( s == USB_INT_SUCCESS ) {
if ( len < ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL ) s = USB_INT_BUF_OVER; // 描述符長度錯誤
}
}
}
return( s );
}
UINT8 SetUsbAddress( UINT8 addr ) // 設(shè)置USB設(shè)備地址
{
UINT8 s;
UINT8 BufSetAddr[ sizeof( SetupSetUsbAddr ) ] ;
memcpy ( BufSetAddr, SetupSetUsbAddr, sizeof( SetupSetUsbAddr ) );
( (PUSB_SETUP_REQ)BufSetAddr ) -> wValueL = addr; // USB設(shè)備地址
s = HostCtrlTransfer374( BufSetAddr, NULL, NULL ); // 執(zhí)行控制傳輸
if ( s == USB_INT_SUCCESS ) {
SetHostUsbAddr( addr ); // 設(shè)置USB主機(jī)當(dāng)前操作的USB設(shè)備地址
}
mDelaymS( 3 ); // 等待USB設(shè)備完成操作
return( s );
}
UINT8 SetUsbConfig( UINT8 cfg ) // 設(shè)置USB設(shè)備配置
{
UINT8 BufSetCfg[ sizeof( SetupSetUsbConfig ) ] ;
memcpy ( BufSetCfg, SetupSetUsbConfig, sizeof( SetupSetUsbConfig ) );
( (PUSB_SETUP_REQ)BufSetCfg ) -> wValueL = cfg; // USB設(shè)備配置
return( HostCtrlTransfer374( BufSetCfg, NULL, NULL ) ); // 執(zhí)行控制傳輸
}
UINT8 GetHubDescriptor( )
{
UINT8 s,len;
buf[0] = GET_HUB_DESCRIPTOR;
buf[1] = GET_DESCRIPTOR;
buf[2] = 0x00;
buf[3] = 0x29;
buf[4] = 0x00;
buf[5] = 0x00;
buf[6] = 0x01;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
if ( s == USB_INT_SUCCESS )
{
buf[6] = buf[0];
buf[0] = GET_HUB_DESCRIPTOR;
buf[1] = GET_DESCRIPTOR;
buf[2] = 0x00;
buf[3] = 0x29;
buf[4] = 0x00;
buf[5] = 0x00;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
}
return s;
}
/*
UINT8 GetHubStatus( )
{
UINT8 s,len;
buf[0] = GET_HUB_STATUS;
buf[1] = GET_STATUS;
buf[2] = 0x00;
buf[3] = 0x00;
buf[4] = 0x00;
buf[5] = 0x00;
buf[6] = 4;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
return s;
}
*/
UINT8 GetPortStatus( UINT8 port )
{
UINT8 s,len;
buf[0] = GET_PORT_STATUS;
buf[1] = GET_STATUS;
buf[2] = 0x00;
buf[3] = 0x00;
buf[4] = port;
buf[5] = 0x00;
buf[6] = 4;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
return s;
}
UINT8 SetPortFeature( UINT8 port, UINT8 select )
{
UINT8 s,len;
buf[0] = SET_PORT_FEATURE;
buf[1] = SET_FEATURE;
buf[2] = select;
buf[3] = 0x00;
buf[4] = port;
buf[5] = 0x00;
buf[6] = 0x00;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
return s;
}
UINT8 ClearPortFeature( UINT8 port, UINT8 select )
{
UINT8 s,len;
buf[0] = CLEAR_PORT_FEATURE;
buf[1] = CLEAR_FEATURE;
buf[2] = select;
buf[3] = 0x00;
buf[4] = port;
buf[5] = 0x00;
buf[6] = 0x00;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
return s;
}
/*
UINT8 ClearHubFeature( UINT8 select )
{
UINT8 s,len;
buf[0] = CLEAR_HUB_FEATURE;
buf[1] = CLEAR_FEATURE;
buf[2] = select;
buf[3] = 0x00;
buf[4] = 0x00;
buf[5] = 0x00;
buf[6] = 0x00;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
return s;
}
*/
/*
UINT8 SetHubFeature( UINT8 select )
{
UINT8 s,len;
buf[0] = SET_HUB_FEATURE;
buf[1] = SET_FEATURE;
buf[2] = select;
buf[3] = 0x00;
buf[4] = 0x00;
buf[5] = 0x00;
buf[6] = 0x00;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
return s;
}
*/
/*
UINT8 GetBusState( UINT8 port)
{
UINT8 s,len;
buf[0] = GET_BUS_STATE;
buf[1] = GET_STATE;
buf[2] = 0x00;
buf[3] = 0x00;
buf[4] = port;
buf[5] = 0x00;
buf[6] = 0x01;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
return s;
}
*/
/*
UINT8 GetStatus( )
{
UINT8 s,len;
buf[0] = 0x80;
buf[1] = 0x00;
buf[2] = 0x00;
buf[3] = 0x00;
buf[4] = 0x00;
buf[5] = 0x00;
buf[6] = 0x02;
buf[7] = 0x00;
s = HostCtrlTransfer374( buf, buf, &len ); // 執(zhí)行控制傳輸
return s;
}
*/
UINT8 DeviceEnum( UINT8 addr )
{
UINT8 s , i ;
//printf( "SetUsbAddress:\n" );
s = SetUsbAddress( addr ); // 設(shè)置USB設(shè)備地址
if ( s != USB_INT_SUCCESS ) return s;
printf("GetConfigDescr:\n" );
s = GetConfigDescr( buf ); // 獲取配置描述符
if ( s != USB_INT_SUCCESS ) return s;
bConfig = ((PUSB_CFG_DESCR)buf ) -> bConfigurationValue;
for ( i = 0; i < ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL; i ++ ) printf( "0x%02X ", (UINT16)( buf[i] ) );
printf("\n");
/* 分析配置描述符,獲取端點(diǎn)數(shù)據(jù)/各端點(diǎn)地址/各端點(diǎn)大小等,更新變量endp_addr和endp_size等 */
//printf( "\nSetUsbConfig:\n " );
s = SetUsbConfig( bConfig ); // 設(shè)置USB設(shè)備配置
if ( s != USB_INT_SUCCESS ) return s;
return s;
}
UINT8 HubEnum( UINT8 addr )
{
UINT8 s , i ;
//printf( "SetAddress:\n" );
s = SetUsbAddress( addr ); // 設(shè)置HUB地址
if ( s != USB_INT_SUCCESS ) return s;
printf("GetConfigDescr:\n" );
s = GetConfigDescr( buf ); // 獲取配置描述符
if ( s != USB_INT_SUCCESS ) return s;
bHUBendp = ((PUSB_CFG_DESCR_LONG)buf)->endp_descr[0].bEndpointAddress;
bInterval = ((PUSB_CFG_DESCR_LONG)buf)->endp_descr[0].bInterval;
bConfig = ((PUSB_CFG_DESCR)buf ) -> bConfigurationValue;
bHUBendp = bHUBendp & 0x7f;// 只保留端點(diǎn)的地址
for ( i = 0; i < ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL; i ++ ) printf( "0x%02X ", (UINT16)( buf[i] ) );
printf( "\n" );
/* 分析配置描述符,獲取端點(diǎn)數(shù)據(jù)/各端點(diǎn)地址/各端點(diǎn)大小等,更新變量endp_addr和endp_size等 */
printf( "GetHubDescriptor:\n");
s = GetHubDescriptor( );
if ( s != USB_INT_SUCCESS ) return s;
for( i= 0; i< buf[0]; i++ ) printf( "0x%02x ",(UINT16)buf[i]);
printf("\n");
bNumPort = p_HUB_Descr->bNbrPorts; // hub上的端口數(shù)量
//printf("HUB at %02x have %02x ports.\n",(UINT16)addr,(UINT16)bNumPort);
//if( p_HUB_Descr->wHubCharacteristics[0] & 0x04 ) printf("帶有集線器的復(fù)合設(shè)備\n");
//else printf("單一的集線器產(chǎn)品\n");
/*
printf("Get Status: ");
s = GetStatus( );
if ( s != USB_INT_SUCCESS ) {
printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 終止操作,等待USB設(shè)備拔出
}
printf(" %02x %02x\n",(UINT16)buf[0],(UINT16)buf[1]);
*/
//printf( "SetUsbConfig:\n" );
s = SetUsbConfig( bConfig ); // 設(shè)置USB設(shè)備配置
if ( s != USB_INT_SUCCESS ) return s;
for( i= 1; i<= bNumPort; i++ ) // 各端口都上電
{
s = SetPortFeature( i, PORT_POWER );
if ( s != USB_INT_SUCCESS ) return s;
}
return s;
}
UINT8 PortEnum( ) // 對相關(guān)集線器的端口進(jìn)行查詢操作,只查詢一次,看有沒連接或移除事件
{
UINT8 s , i ;
//printf("p\n");
Write374Byte( REG_USB_ADDR, bAddr ); // 設(shè)置為選到的集線器地址
for( i= 1; i<= bNumPort; i++ ) // 查詢集線器的端口是否有變化
{
s = GetPortStatus( i ); // 獲取端口狀態(tài)
if ( s != USB_INT_SUCCESS ) return s;
//printf("HUB Port%02x's current status: %02x %02x %02x %02x\n",(UINT16)i,(UINT16)buf[0],(UINT16)buf[1],(UINT16)buf[2],(UINT16)buf[3]);
if( (buf[0] & 0x01) && (buf[2] & 0x01) ) // 發(fā)現(xiàn)有設(shè)備連接
{
bPORTchange = i; // 端口上有設(shè)備連接
i = FIND_ATTACH; // 表示有設(shè)備連接
//printf("HUB at %02x Port%02x's current status:",(UINT16)bAddr,(UINT16)bPORTchange);
s = GetPortStatus( bPORTchange ); // 把端口狀態(tài)顯示出來
if ( s != USB_INT_SUCCESS ) return s;
//printf(" %02x %02x %02x %02x\n",(UINT16)buf[0],(UINT16)buf[1],(UINT16)buf[2],(UINT16)buf[3]);
//if( buf[0] & 0x01 ) printf("有設(shè)備連接\n");
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -