⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hub.c

📁 CH374EVT.ZIP
💻 C
📖 第 1 页 / 共 4 页
字号:
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 + -