📄 hub.c
字号:
UINT8 GetDeviceDescr( PUINT8 buf ) // 获取设备描述符
{
UINT8 s, len;
UsbDevEndpSize = DEFAULT_ENDP0_SIZE;
s = HostCtrlTransfer374( SetupGetDevDescr, buf, &len ); // 执行控制传输
if ( s == USB_INT_SUCCESS ) {
UsbDevEndpSize = ( (PUSB_DEV_DESCR)buf ) -> bMaxPacketSize0; // 端点0最大包长度,这是简化处理,正常应该先获取前8字节后立即更新UsbDevEndpSize再继续
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 ); // 执行控制传输
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 ); // 执行控制传输
if ( s == USB_INT_SUCCESS ) {
if ( len < ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL ) s = USB_INT_BUF_OVER; // 描述符长度错误
}
}
}
return( s );
}
UINT8 SetUsbAddress( UINT8 addr ) // 设置USB设备地址
{
UINT8 s;
UINT8 BufSetAddr[ sizeof( SetupSetUsbAddr ) ] ;
memcpy ( BufSetAddr, SetupSetUsbAddr, sizeof( SetupSetUsbAddr ) );
( (PUSB_SETUP_REQ)BufSetAddr ) -> wValueL = addr; // USB设备地址
s = HostCtrlTransfer374( BufSetAddr, NULL, NULL ); // 执行控制传输
if ( s == USB_INT_SUCCESS ) {
SetHostUsbAddr( addr ); // 设置USB主机当前操作的USB设备地址
}
mDelaymS( 3 ); // 等待USB设备完成操作
return( s );
}
UINT8 SetUsbConfig( UINT8 cfg ) // 设置USB设备配置
{
UINT8 BufSetCfg[ sizeof( SetupSetUsbConfig ) ] ;
memcpy ( BufSetCfg, SetupSetUsbConfig, sizeof( SetupSetUsbConfig ) );
( (PUSB_SETUP_REQ)BufSetCfg ) -> wValueL = cfg; // USB设备配置
return( HostCtrlTransfer374( BufSetCfg, NULL, NULL ) ); // 执行控制传输
}
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 ); // 执行控制传输
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 ); // 执行控制传输
}
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 ); // 执行控制传输
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 ); // 执行控制传输
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 ); // 执行控制传输
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 ); // 执行控制传输
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 ); // 执行控制传输
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 ); // 执行控制传输
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 ); // 执行控制传输
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 ); // 执行控制传输
return s;
}
*/
UINT8 DeviceEnum( UINT8 addr )
{
UINT8 s , i ;
//printf( "SetUsbAddress:\n" );
s = SetUsbAddress( addr ); // 设置USB设备地址
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");
/* 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 */
//printf( "\nSetUsbConfig:\n " );
s = SetUsbConfig( bConfig ); // 设置USB设备配置
if ( s != USB_INT_SUCCESS ) return s;
return s;
}
UINT8 HubEnum( UINT8 addr )
{
UINT8 s , i ;
//printf( "SetAddress:\n" );
s = SetUsbAddress( addr ); // 设置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;// 只保留端点的地址
for ( i = 0; i < ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL; i ++ ) printf( "0x%02X ", (UINT16)( buf[i] ) );
printf( "\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上的端口数量
//printf("HUB at %02x have %02x ports.\n",(UINT16)addr,(UINT16)bNumPort);
//if( p_HUB_Descr->wHubCharacteristics[0] & 0x04 ) printf("带有集线器的复合设备\n");
//else printf("单一的集线器产品\n");
/*
printf("Get Status: ");
s = GetStatus( );
if ( s != USB_INT_SUCCESS ) {
printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 终止操作,等待USB设备拔出
}
printf(" %02x %02x\n",(UINT16)buf[0],(UINT16)buf[1]);
*/
//printf( "SetUsbConfig:\n" );
s = SetUsbConfig( bConfig ); // 设置USB设备配置
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( ) // 对相关集线器的端口进行查询操作,只查询一次,看有没连接或移除事件
{
UINT8 s , i ;
//printf("p\n");
Write374Byte( REG_USB_ADDR, bAddr ); // 设置为选到的集线器地址
for( i= 1; i<= bNumPort; i++ ) // 查询集线器的端口是否有变化
{
s = GetPortStatus( 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) ) // 发现有设备连接
{
bPORTchange = i; // 端口上有设备连接
i = FIND_ATTACH; // 表示有设备连接
//printf("HUB at %02x Port%02x's current status:",(UINT16)bAddr,(UINT16)bPORTchange);
s = GetPortStatus( bPORTchange ); // 把端口状态显示出来
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("有设备连接\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -