📄 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 + -