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

📄 hub.c

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