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

📄 usbh_usbds_api.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
					if(ret != USBH_USBD_STATUS_SUCCESS) {
						connect_status = 1;
						break;
					}
					USBH_USBD_Mode = USBH_USBD_MODE_SADDR;			/* SET ADDRESS */
					UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
					USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
				}
				break;

			case USBH_USBD_MODE_SADDR:							/* SET ADDRESS */
				if(UsbDevInfo == &RootHubDev) {
					USBH_USBD_Mode = USBH_USBD_MODE_SCFG;			/* SET CONFIGURATION DESCRIPTOR */
					USBH_USBDS_DelListURB(psURB);
				} else {
					psCurUSBDev = psURB->psDev;
					USBH_USBDS_DelListURB(psURB);
					/* Throw notification of device recognition finish ( USBH_USBD_MSG_CONNECT_OK )  */
					// Message is returned in call back function.
					add_flg = 0;

					/* Post-process of SET ADDRESS */
					UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev );

					if(UsbDevListWK->sUsbDes.Dev.bDeviceClass != USBH_HSBD_HUB_CLASS_CODE){
						/* Notify of connecting besides HUB class */
						for( i = 0; i < USBH_USBD_CLASSDRIVERNUM; i++ ){
							USBH_USBDS_ExecCallback(ClassINFO[i].pfnEntryClassCallback, USBH_USBD_MSG_CONNECT_OK, psCurUSBDev->devNum, UsbDevListWK);
						}
					}

					/* In case of parent is hub, carry out connecting if there is un-connect device in the port of parent hub */
					UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev->psParent );
					UsbDevListWK->statRESET &= ~(UsbDevListWK->statusChange);
					if(UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE) {

						for(i=0; i<8; i++) {
							if(UsbDevListWK->hubStat & (1<<i)) {
								add_flg = 1;
								SavhubStat = (1<<i);
								UsbDevInfo = USBH_USBDS_AddListDev();
								UsbDevInfo->sUsbDev.psParent = (USBH_USBD_USBDEV *)psCurUSBDev->psParent;

								UsbDevInfo->sUsbDev.port = i;

								ret = USBH_HCD_AllocDev((USBH_HCD_USBDEV *)&UsbDevInfo->sUsbDev);
								if(ret != USBH_USBD_STATUS_SUCCESS) {
									return;
								}
								/* MaxPacketsize of FS is set until Device Descriptor can be acquired. */
								UsbDevInfo->sUsbDev.epMaxPacketIn[0] = ENUM_MAXPKTSIZE_FULL;
								UsbDevInfo->sUsbDev.epMaxPacketOut[0] = ENUM_MAXPKTSIZE_FULL;

								USBH_USBD_Mode = USBH_USBD_MODE_COMP;
								/* SetPortFeature(PORT_RESET) */
								wURB = USBH_USBDS_AddURBList();
								if(wURB == (USBH_USBD_URB *)USBH_USBD_STATUS_UNSUCCESSFUL) {
									continue;
								}

								wURB->psDev	= (USBH_USBD_USBDEV *)psCurUSBDev->psParent;
								wURB->pipe	= USBH_USBD_SetPipeType(USBH_HCD_PIPE_CONTROL, ENUM_EP0, wURB->psDev->devNum, USBH_HCD_DIR_OUT);
								USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)wURB->pSetupPacket, BREQ_SETFEATURE_PORT, 0, i, USBH_USBD_PORT_RESET);
								USBH_USBDS_SetTranPara(wURB, 0, 0, 0, USBH_USBDS_GetStatusCallbackProc);

								ret = USBH_HCD_SubmitURB((USBH_HCD_URB *)wURB);
								if(ret != USBH_USBD_STATUS_SUCCESS) {
									USBH_USBDS_DelListURB(wURB);
								}
								break;
							}
						}
						if(add_flg==0) {
							/* Carry out configuration of hub devices connected to same hub. */
							UsbDevListWK = (USBH_USBD_DEVLIST_HEAD *)DeviceCtlTbl.DevInfo;
							while( UsbDevListWK ) {
								if( (UsbDevListWK->sUsbDev.psParent == psCurUSBDev->psParent) && (UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE) ) {
									if(UsbDevListWK->sUsbDev.eState != USBH_USBD_USB_STATE_CONFIGURED) {
										UsbDevListWK->ClassID = USBH_HSBD_HUB_CLASS_ID;
										USBH_USBD_Mode = USBH_USBD_MODE_SCFG;		/* SET CONFIGURATION */
										hubStart = 10;
										USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 1 );
										return;
									}
								}
								UsbDevListWK = UsbDevListWK->psNext;
							}
						}
					}
					/* Post-process of SET ADDRESS */
					UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev );

					if(UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE){
						/* In case of connecting device is hub, don't notify connect call back. */
						if(UsbDevListWK->sUsbDev.eState != USBH_USBD_USB_STATE_CONFIGURED) {
							UsbDevListWK->ClassID = USBH_HSBD_HUB_CLASS_ID;
							if(add_flg)	{
								break;
							}
							/* It will be proceessed internally incase of hub class ( for configuration use of hub directly under root hub ) */
							USBH_USBD_Mode = USBH_USBD_MODE_SCFG;		/* SET CONFIGURATION */
							USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
						}
#if 0
					} else {
						/* Notify of connecting besides HUB class */
						for( i = 0; i < USBH_USBD_CLASSDRIVERNUM; i++ ){
							USBH_USBDS_ExecCallback(ClassINFO[i].pfnEntryClassCallback, USBH_USBD_MSG_CONNECT_OK, psCurUSBDev->devNum, UsbDevListWK);
						}
#endif
					}

					if(add_flg==0) {
						/* Carry out configuration of hub device which is not configured with SET CONFIGURATION. */
						UsbDevListWK = (USBH_USBD_DEVLIST_HEAD *)DeviceCtlTbl.DevInfo;
						while( UsbDevListWK ) {
							if((psCurUSBDev != &UsbDevListWK->sUsbDev) && (UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE) ) {
								if(UsbDevListWK->sUsbDev.eState != USBH_USBD_USB_STATE_CONFIGURED) {
									UsbDevListWK->ClassID = USBH_HSBD_HUB_CLASS_ID;
									USBH_USBD_Mode = USBH_USBD_MODE_SCFG;		/* SET CONFIGURATION */
									hubStart = 10;
									USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 1 );
									break;
								}
							}
							UsbDevListWK = UsbDevListWK->psNext;
						}
					}
				}
				break;

			case USBH_USBD_MODE_CPORTCON:						/* At the device cut off */
				/* Detect cuting  off parent HUB of device to cut off, search and delete port number connected to HUB */
				psCurUSBDev = psURB->psDev;
				USBH_USBDS_DelListURB(psURB);

				USBH_USBDS_DelALLDev(psCurUSBDev);
				break;

			case USBH_USBD_MODE_SCFG:							/* SET CONFIGURATION DESCRIPTOR */
				if(UsbDevInfo == &RootHubDev) {
					USBH_USBD_Mode = USBH_USBD_MODE_GHUBDES;		/* GET HUBDESCRIPTOR */
					USBH_USBDS_DelListURB(psURB);
				} else {
					USBH_USBDS_DelListURB(psURB);
					USBH_USBD_Mode = USBH_USBD_MODE_GHUBDES;		/* GET HUBDESCRIPTOR */
					UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
					USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
				}
				break;

			case USBH_USBD_MODE_GHUBDES:					/* GET HUBDESCRIPTOR */
				if(UsbDevInfo == &RootHubDev) {
					ret = AnalizeDescriptor(USBH_USBD_DTYPE_HUBVAL, psURB->pTransBuf, &RootHubDev.sUsbDes, USBH_USBD_OFF);
					if(ret == USBH_USBD_STATUS_SUCCESS) {
						USBH_USBD_Mode = USBH_USBD_MODE_INTRIN;
					}
					USBH_USBDS_DelListURB(psURB);
				} else {
					psCurUSBDev = psURB->psDev;
					UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
					ret = AnalizeDescriptor(USBH_USBD_DTYPE_HUBVAL, psURB->pTransBuf, &UsbDevListWK->sUsbDes, USBH_USBD_OFF);
					USBH_USBDS_DelListURB(psURB);
					if(ret != USBH_USBD_STATUS_SUCCESS) {
						connect_status = 1;
						break;
					}
					portPowerNum = 1;
					/* At the time of connecting of plura HUBs to same HUB */
					if(hubStart == 0) {
						portPowerDo = 1;
					}
					UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );

					USBH_USBD_Mode = USBH_USBD_MODE_INTRIN;

					USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
				}
				break;

			case USBH_USBD_MODE_SPORTPWR:
				if(UsbDevInfo == &RootHubDev) {
					// Message is returned in call back function
					USBH_USBDS_ExecCallback(pfnInit.Callback, USBH_USBD_MSG_INIT_CMP, pfnInit.retValue, NULL);
					usbdInitialize = 0;
					USBH_USBDS_DelListURB(psURB);
				} else {
					psCurUSBDev = psURB->psDev;
					USBH_USBDS_DelListURB(psURB);

					portPowerNum++;
					UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
					if(	portPowerNum <= UsbDevListWK->sUsbDes.Hub.bNbrPorts ){
						USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
					} else {

						/* Carry out configuration of hub device which is not configured with SET CONFIGURATION. */
						UsbDevListWK = (USBH_USBD_DEVLIST_HEAD *)DeviceCtlTbl.DevInfo;
						while( UsbDevListWK ) {
							if((psCurUSBDev != &UsbDevListWK->sUsbDev) && (UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE) ) {
								if(UsbDevListWK->sUsbDev.eState != USBH_USBD_USB_STATE_CONFIGURED) {
									UsbDevListWK->ClassID = USBH_HSBD_HUB_CLASS_ID;
									USBH_USBD_Mode = USBH_USBD_MODE_SCFG;		/* SET CONFIGURATION */
									hubStart = 10;
									USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 1 );
									return;
								}
							}
							UsbDevListWK = UsbDevListWK->psNext;
						}

						portPowerDo = 0;
						/* Joint bit is initialized. */
						UsbDevListWK->statRESET = 0;
 
						USBH_USBD_Mode = USBH_USBD_MODE_COMP;
					}
				}
				break;
		}
	} else {

		/*
		   When it fails the request that uses it with the enumeration I do retransmission.
		*/
		psCurUSBDev = psURB->psDev;
		USBH_USBDS_DelListURB(psURB);

		if(psCurUSBDev->devNum != 0) {
			UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev );
			switch(USBH_USBD_Mode) {
				case USBH_USBD_MODE_DEVDES8:						/* GET DEVICE DESCRIPTOR(Get TotalLength only) */
					USBH_USBDS_DeviceEnumeration(USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0);
					break;
				case USBH_USBD_MODE_DEVDES:							/* GET DEVICE DESCRIPTOR */
					UsbDevInfo->sUsbDev.epMaxPacketIn[0] = UsbDevInfo->sUsbDes.Dev.bMaxPacketSize0;
					UsbDevInfo->sUsbDev.epMaxPacketOut[0] = UsbDevInfo->sUsbDes.Dev.bMaxPacketSize0;
					USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
					break;
				case USBH_USBD_MODE_CFGDES8:						/* CONFIGURATION DESCRIPTOR( Get TotalLength only ) */
					USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
					break;
				case USBH_USBD_MODE_CFGDES:							/* CONFIGURATION DESCRIPTOR */
					USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
					break;
				case USBH_USBD_MODE_SADDR:							/* SET ADDRESS */
					USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
					break;
				case USBH_USBD_MODE_CPORTCON:						/* DEVICE DISCONNECT */
					break;
				case USBH_USBD_MODE_SCFG:							/* SET CONFIGURATION DESCRIPTOR */
					break;
				case USBH_USBD_MODE_GHUBDES:					/* GET HUBDESCRIPTOR */
					break;
				case USBH_USBD_MODE_SPORTPWR:
					portPowerNum--;
					break;
			}
		} else {
			UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev->psParent );
			UsbDevListWK->statRESET &= ~(1<<psCurUSBDev->port);
		}
	}
}

/*=============================================================================================
// Function_Name: USBH_USBDS_DeviceEnumeration
//
// description	: Carry out device emulation.
//
// argument 	: type								Object type ( USBH_USBD_ENUME_ROOTHUB: root hub, USBH_USBD_ENUME_DEVICE: device )( in )
//				: *wUsbDev							USB device structure ( in )
//
// return		: USBH_USBD_STATUS_SUCCESS			Process finish normally
===============================================================================================*/
STATIC_T	long USBH_USBDS_DeviceEnumeration( UCHAR type, USBH_USBD_DEVLIST_HEAD *wUsbDev, UCHAR hub )
{
	USBH_USBD_URB	*TmpUrb=0, turb;
	long			retValue=USBH_USBD_STATUS_UNSUCCESSFUL;
	USHORT			wTotalLength;
	UCHAR			deviceaddress=0;


	turb.pfnComplete = USBH_USBDS_DeviceCallbackProc;
	switch(USBH_USBD_Mode) {
		case USBH_USBD_MODE_DEVDES8:	/* GET DEVICE DESCRIPTOR ( TotalLength acquisition only ) */
		case USBH_USBD_MODE_DEVDES:		/* GET DEVICE DESCRIPTOR */
		case USBH_USBD_MODE_DEVQDES:	/* DEVICE QUALIFIER DESCRIPTOR */
		case USBH_USBD_MODE_CFGDES8:	/* CONFIGURATION DESCRIPTOR ( TotalLength acquisition only ) */
		case USBH_USBD_MODE_CFGDES:		/* CONFIGURATION DESCRIPTOR */
			memset(GDdata, 0, GETDESCRIPTER_DEFSIZE);
			TmpUrb = USBH_USBDS_AddURBList();
			if(TmpUrb == (USBH_USBD_URB *)USBH_USBD_STATUS_UNSUCCESSFUL) {
				return USBH_USBD_STATUS_UNSUCCESSFUL;
			}

			TmpUrb->psDev	= (USBH_USBD_USBDEV *)&wUsbDev->sUsbDev ;		/* (in ) */
			TmpUrb->pipe	= USBH_USBD_SetPipeType(USBH_HCD_PIPE_CONTROL, ENUM_EP0, DEF_DEVAD0, USBH_HCD_DIR_IN);
			switch(USBH_USBD_Mode) {
			case USBH_USBD_MODE_DEVDES8:				/* Read 8 bytes only for getting data size to get */
				USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, 0x08, 0, USBH_USBD_DTYPE_DEVICE);
				break;
			case USBH_USBD_MODE_DEVDES:
				if(type == USBH_USBD_ENUME_ROOTHUB) {
					wTotalLength = RootHubDev.sUsbDes.Dev.bLength;
				} else {
					wTotalLength = UsbDevInfo->sUsbDes.Dev.bLength;
				}

				wTotalLength = MIN(sizeof(GDdata), wTotalLength);

				USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, wTotalLength, 0, USBH_USBD_DTYPE_DEVICE);
				break;
			case USBH_USBD_MODE_DEVQDES:
				USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, USBH_USBD_MAXPACKETSIZE, 0, USBH_USBD_DTYPE_QUALIF);
				break;
			case USBH_USBD_MODE_CFGDES8:				/* Read 8 bytes only for getting data size to get */
				USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, 0x08, 0, USBH_USBD_DTYPE_CONFIG);
				break;
			case USBH_USBD_MODE_CFGDES:
				if(type == USBH_USBD_ENUME_ROOTHUB) {
					wTotalLength = MAKEWORD(RootHubDev.sUsbDes.Config.wTotalLength[0], RootHubDev.sUsbDes.Config.wTotalLength[1]);
				} else {
					wTotalLength = MAKEWORD(UsbDevInfo->sUsbDes.Config.wTotalLength[0], UsbDevInfo->sUsbDes.Config.wTotalLength[1]);
				}

				wTotalLength = MIN(sizeof(GDdata), wTotalLength);

				USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, wTotalLength, 0, USBH_USBD_DTYPE_CONFIG);
				break;
			}
			USBH_USBDS_SetTranPara(TmpUrb, 0, GDdata, (ULONG)MAKEWORD(((SETUP_REQUEST *)TmpUrb->pSetupPacket)->wLengthL, ((SETUP_REQUEST *)TmpUrb->pSetupPacket)->wLengthH), turb.pfnComplete);

			retValue = USBH_HCD_SubmitURB((USBH_HCD_URB *)TmpUrb);
			if( retValue != USBH_USBD_STATUS_SUCCESS ) {
				USBH_USBDS_DelListURB(TmpUrb);
			}
			break;

		case USBH_USBD

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -