?? hub.c
字號:
count = 0;
n = 0;
bPORTchange = 0;
bMine = 0;
bChange = 0;
}
else if ( s != USB_INT_SUCCESS ) // 出錯
{
if( bAddr != 1 )
{
//printf( "ERROR = %02X\n", (UINT16)s );
;
}
else
{
//printf("Root hub removed.\n");
;
}
goto WaitDeviceOut; // 終止操作,等待USB設備拔出
}
else // 集線器有響應
{
if( bPORTchange != 0 ) // 選中的集線器上有端口發生變化
{
if( bChange == FIND_ATTACH ) // 發現設備連接事件
{
//printf("Hub at address %02x Port %02x find attaching.\n",(UINT16)bAddr,(UINT16)bPORTchange);
Write374Byte( REG_USB_ADDR, 0x00 ); // 發現了新設備,地址設置0
if( bMine == LOW_SPEED )
{
//HostSetLowSpeed( ); //設置為低速模式
//s = SetPortFeature( bChange, PORT_LOW_SPEED );
k = 0;
while(1) // 找沒用過的地址空間
{
if( p_Dev_Addr->Num[k].bAddr == 0 ) break; // 表中有空項就跳出
k++;
}
p_Dev_Addr->Num[count].KUNO.HUB.bSlavePort[(bPORTchange-1)] = k + 1; // 集線器發生連接事件的端點項指向連接設備的地址
p_Dev_Addr->Num[k].bUpPort = bAddr; // 指向上一級集線器的地址
bAddr = k + 1; // 自己找到的未用地址
bDevNum++; // 功能設備加1
printf( "******** Appoint address %d to attached device ********\n",(UINT16)bAddr );
printf("OK\n");
////// 錄入功能設備信息
p_Dev_Addr->Num[k].bAddr = bAddr;
p_Dev_Addr->Num[k].bDevType = FUNCTION_DEV;
p_Dev_Addr->Num[k].KUNO.DEV.bSpeed = bMine;
}
else if( bMine == FULL_SPEED )
{
HostSetFullSpeed( ); // 設置為全速模式
printf( "GetDeviceDescr: " );
s = GetDeviceDescr( buf ); // 獲取設備描述符
if ( s != USB_INT_SUCCESS )
{
//printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 終止操作,等待USB設備拔出
}
for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ ) printf( "0x%02X ", (UINT16)( buf[i] ) );
printf( "\n" );
k = 0;
while(1) // 找沒用過的地址空間
{
if( p_Dev_Addr->Num[k].bAddr == 0 ) break; // 表中有空項就跳出
k++;
}
p_Dev_Addr->Num[count].KUNO.HUB.bSlavePort[(bPORTchange-1)] = k + 1; // 集線器發生連接事件的端點項指向連接設備的地址
p_Dev_Addr->Num[k].bUpPort = bAddr; // 指向上一級集線器的地址
bAddr = k + 1; // 自己找到的未用地址
if( ((PUSB_DEV_DESCR)buf ) -> bDeviceClass == 0x09 ) // 是HUB
{
bHubNum++; // 集線器數量加一
printf( "******** Appoint address %d to attached hub ********\n",(UINT16)bAddr );
s = HubEnum( bAddr ); // 集線器枚舉
if ( s != USB_INT_SUCCESS )
{
//printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 終止操作,等待USB設備拔出
}
printf("OK\n");
//// 錄入集線器信息
p_Dev_Addr->Num[k].bAddr = bAddr;
p_Dev_Addr->Num[k].bDevType = HUB_TYPE;
p_Dev_Addr->Num[k].bEndpSize = UsbDevEndpSize;
p_Dev_Addr->Num[k].KUNO.HUB.bNumPort = bNumPort;
p_Dev_Addr->Num[k].KUNO.HUB.bHUBendp = bHUBendp;
p_Dev_Addr->Num[k].KUNO.HUB.bInterval = bInterval;
p_Dev_Addr->Num[k].KUNO.HUB.bSlavePort[0] = 0;
p_Dev_Addr->Num[k].KUNO.HUB.bSlavePort[1] = 0;
p_Dev_Addr->Num[k].KUNO.HUB.bSlavePort[2] = 0;
p_Dev_Addr->Num[k].KUNO.HUB.bSlavePort[3] = 0;
p_Dev_Addr->Num[k].KUNO.HUB.bSlavePort[4] = 0;
p_Dev_Addr->Num[k].KUNO.HUB.bSlavePort[5] = 0;
p_Dev_Addr->Num[k].KUNO.HUB.bSlavePort[6] = 0;
}
else // 是設備
{
bDevNum++; // 功能設備加1
printf( "******** Appoint address %d to attached device ********\n",(UINT16)bAddr );
s = DeviceEnum( bAddr );
if ( s != USB_INT_SUCCESS )
{
//printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 終止操作,等待USB設備拔出
}
printf("OK\n");
////// 錄入功能設備信息
p_Dev_Addr->Num[k].bAddr = bAddr;
p_Dev_Addr->Num[k].bDevType = FUNCTION_DEV;
p_Dev_Addr->Num[k].bEndpSize = UsbDevEndpSize;
p_Dev_Addr->Num[k].KUNO.DEV.bSpeed = bMine;
}
}
count++; // 查詢下一個集線器
n++;
}
else if( bChange == FIND_REMOVE ) // 發現設備移除事件
{
count = 0; // 回主集線器查詢
n = 0;
//printf("Hub at address %02x Port %02x find removed.\n",(UINT16)bAddr,(UINT16)bPORTchange);
m = p_Dev_Addr->Num[(bAddr-1)].KUNO.HUB.bSlavePort[(bPORTchange-1)]; // 取出該移除設備的地址
//printf("m %02x\n",(UINT16)m);
if( m != 0 ) // 被移除的最上層設備的地址,該設備下可能還連接有別的設備
{
if( p_Dev_Addr->Num[(m-1)].bDevType == FUNCTION_DEV && p_Dev_Addr->Num[(m-1)].bAddr != 0 ) // 移除的是設備
{
printf("######## The removed device's address is %d ########\n",(UINT16)m);
p_Dev_Addr->Num[(m-1)].bAddr = 0; // 取消被移除的最上層功能設備的表項
bDevNum--; // 功能設備數量減1
}
else if( p_Dev_Addr->Num[(m-1)].bDevType == HUB_TYPE && p_Dev_Addr->Num[(m-1)].bAddr != 0 ) // 移除的是集線器
{
printf("######## The removed hub's address is %d ########\n",(UINT16)m);
p_Dev_Addr->Num[(m-1)].bAddr = 0; // 取消被移除的最上層集線器的表項
bHubNum--; // 集線器數量減一
for( k = 0; k< 7; k++ ) // 判斷該移除的最上層集線器的端口上有沒連接設備
{
if( p_Dev_Addr->Num[(m-1)].KUNO.HUB.bSlavePort[k] != 0 ) // 移除的最上層集線器的端口上找到連接的次級設備
{
m1 = p_Dev_Addr->Num[(m-1)].KUNO.HUB.bSlavePort[k]; // 取出下一級地址
if( p_Dev_Addr->Num[(m1-1)].bDevType == FUNCTION_DEV && p_Dev_Addr->Num[(m1-1)].bAddr != 0 ) // 移除的是設備
{
printf("######## The removed device's address is %d ########\n",(UINT16)m1);
p_Dev_Addr->Num[(m1-1)].bAddr = 0; // 取消被移除的次最上層功能設備的表項
bDevNum--; // 功能設備數量減1
}
else if( p_Dev_Addr->Num[(m1-1)].bDevType == HUB_TYPE && p_Dev_Addr->Num[(m-1)].bAddr != 0 ) // 移除的是集線器
{
printf("######## The removed hub's address is %d ########\n",(UINT16)m1);
p_Dev_Addr->Num[(m1-1)].bAddr = 0; // 取消被移除的次最上層集線器的表項
bHubNum--; // 集線器數量減一
for( k1 = 0; k1 < 7; k1 ++ )
{
if( p_Dev_Addr->Num[(m1-1)].KUNO.HUB.bSlavePort[k1] != 0 ) // 次級集線器端口上找到次次級設備
{
m2 = p_Dev_Addr->Num[(m1-1)].KUNO.HUB.bSlavePort[k1]; // 保留次次級設備地址
if( p_Dev_Addr->Num[(m2-1)].bDevType == FUNCTION_DEV && p_Dev_Addr->Num[(m2-1)].bAddr != 0 ) // 移除的是設備
{
printf("######## The removed device's address is %d ########\n",(UINT16)m2);
p_Dev_Addr->Num[(m2-1)].bAddr = 0; // 取消被移除的次次最上層功能設備的表項
bDevNum--; // 功能設備數量減1
}
else if( p_Dev_Addr->Num[(m2-1)].bDevType == HUB_TYPE && p_Dev_Addr->Num[(m2-1)].bAddr != 0 ) // 移除的是集線器
{
printf("######## The removed hub's address is %d ########\n",(UINT16)m2);
p_Dev_Addr->Num[(m2-1)].bAddr = 0; // 取消被移除的次次最上層集線器的表項
bHubNum--; // 集線器數量減一
for( k2 = 0; k2 < 7; k2++ )
{
if( p_Dev_Addr->Num[(m2-1)].KUNO.HUB.bSlavePort[k2] != 0 ) // 次次級集線器端口上找到次次次級設備
{
m3 = p_Dev_Addr->Num[(m2-1)].KUNO.HUB.bSlavePort[k2]; //// 保留次次次級設備地址
if( p_Dev_Addr->Num[(m3-1)].bDevType == FUNCTION_DEV && p_Dev_Addr->Num[(m3-1)].bAddr != 0 ) // 移除的是設備
{
printf("######## The removed device's address is %d ########\n",(UINT16)m3);
p_Dev_Addr->Num[(m3-1)].bAddr = 0; // 取消被移除的次次次最上層功能設備的表項
bDevNum--; // 功能設備數量減1
}
else if( p_Dev_Addr->Num[(m3-1)].bDevType == HUB_TYPE && p_Dev_Addr->Num[(m3-1)].bAddr != 0 ) // 移除的是集線器
{
printf("######## The removed hub's address is %d ########\n",(UINT16)m3);
p_Dev_Addr->Num[(m3-1)].bAddr = 0; // 取消被移除的次次次最上層集線器的表項
bHubNum--; // 集線器數量減一
/////到此,只支持最多縱向5級集線器連接
}
}
} // 找不到次次次級設備就退出
}
}
} // 找不到次次級設備就退出
}
}
} // 找不到次級設備就退出
}
}
}
}
else // 選中的集線器上沒有發現變化,繼續查看下一個集線器的狀態
{
count++;
n++;
}
}
}
}
}
else // 第一層連接上來的是功能設備,端口已經用完
{
printf( "Function device at address 1, no hub.\n");
kk = 0;
s = DeviceEnum( 0x01 );
if ( s != USB_INT_SUCCESS ) {
//printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 終止操作,等待USB設備拔出
}
}
printf( "USB device ready now\n" );
/* do something, read/write ...
len = out_endp_size;
Write374Block( RAM_HOST_TRAN, len, buf );
Write374Byte( REG_USB_LENGTH, len );
s = WaitHostTransact374( out_endp_addr, DEF_USB_PID_OUT, FALSE, 1000 );
s = WaitHostTransact374( in_endp_addr, DEF_USB_PID_IN, FALSE, 1000 );
len = Read374Byte( REG_USB_LENGTH );
Read374Block( RAM_HOST_RECV, len, buf );
len = out_endp_size;
Write374Block( RAM_HOST_TRAN, len, buf );
Write374Byte( REG_USB_LENGTH, len );
s = WaitHostTransact374( out_endp_addr, DEF_USB_PID_OUT, TRUE, 1000 );
s = WaitHostTransact374( in_endp_addr, DEF_USB_PID_IN, TRUE, 1000 );
len = Read374Byte( REG_USB_LENGTH );
Read374Block( RAM_HOST_RECV, len, buf );
*/
printf( "do something, read / write ......\n" );
WaitDeviceOut: // 等待USB設備拔出
for( mm = 0; mm < 700; mm++ ) xbuf[mm] = 0;
if( kk ) printf("Root hub removed\n");
else printf( "Wait Device Out\n" );
kk = 0;
while ( 1 ) {
if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主機中斷則處理
if ( Query374DeviceIn( ) == FALSE ) break; // 沒有USB設備
}
mDelaymS( 100 ); // 等待設備完全斷開,消除插拔抖動
if ( Query374DeviceIn( ) ) goto WaitDeviceOut; // 沒有完全斷開
// HostSetBusFree( ); // 設定USB主機空閑,主要目的是關閉SOF
for( mm = 0; mm < 700; mm++ ) xbuf[mm] = 0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -