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

📄 pe_usb.c

📁 GM8120 linux driver.
💻 C
📖 第 1 页 / 共 5 页
字号:
					if (bdir == 1)						u8fifo_n &= 0x0F;					else						u8fifo_n >>= 4;					if (u8fifo_n >= FOTG200_Periph_MAX_FIFO)	// over the Max. fifo count ?						return FALSE;														// Check the FIFO had been enable ?					if ((mUsbFIFOConfigRd(u8fifo_n) & FIFOEnBit) == 0)						return FALSE;					if (bdir == 1)						// IN direction ?						RecipientStatusLow = mUsbEPinStallST(u8ep_n);					else						RecipientStatusLow = mUsbEPoutStallST(u8ep_n);				}			}	        	break;		default :			return FALSE;	}	// return RecipientStatus;	u8Tmp[0] = RecipientStatusLow;	u8Tmp[1] = RecipientStatusHigh;	vOTGCxFWr( u8Tmp, 2);		eOTGCxFinishAction = ACT_DONE;	return TRUE; }/////////////////////////////////////////////////////////////////////////////////		bClear_OTGfeature()//		Description://			1. Send 2 bytes status to host.//		input: none//		output: TRUE or FALSE (BOOLEAN)///////////////////////////////////////////////////////////////////////////////BOOLEAN bClear_OTGfeature(void){	INT8U u8ep_n;	INT8U u8fifo_n;	BOOLEAN bdir;	switch (ControlOTGCmd.Value)		// FeatureSelector	{		case 0:		// ENDPOINT_HALE			// Clear "Endpoint_Halt", Turn off the "STALL" bit in Endpoint Control Function Register			if(ControlOTGCmd.Index == 0x00)				bOTGEP0HaltSt = FALSE;			else			{				u8ep_n = ControlOTGCmd.Index & 0x7F;		// which ep will be clear				bdir = ControlOTGCmd.Index >> 7;			// the direction of this ep				if (u8ep_n > FOTG200_Periph_MAX_EP)			// over the Max. ep count ?					return FALSE;				else				{					u8fifo_n = mUsbEPMapRd(u8ep_n);		// get the relatived FIFO number					if (bdir == 1)						u8fifo_n &= 0x0F;					else						u8fifo_n >>= 4;					if (u8fifo_n >= FOTG200_Periph_MAX_FIFO)	// over the Max. fifo count ?						return FALSE;														// Check the FIFO had been enable ?					if ((mUsbFIFOConfigRd(u8fifo_n) & FIFOEnBit) == 0)						return FALSE;					if (bdir == 1)						// IN direction ?					{						mUsbEPinRsTgSet(u8ep_n);		// Set Rst_Toggle Bit						mUsbEPinRsTgClr(u8ep_n);		// Clear Rst_Toggle Bit						mUsbEPinStallClr(u8ep_n);		// Clear Stall Bit					}					else					{						mUsbEPoutRsTgSet(u8ep_n);		// Set Rst_Toggle Bit						mUsbEPoutRsTgClr(u8ep_n);		// Clear Rst_Toggle Bit						mUsbEPoutStallClr(u8ep_n);		// Clear Stall Bit					}				}			}			break;            		 		case 1 :   		// Device Remote Wakeup			// Clear "Device_Remote_Wakeup", Turn off the"RMWKUP" bit in Main Control Register			mUsbRmWkupClr();	            break;		case 2 :   		// Test Mode			return FALSE;          				default :			return FALSE;	}	eOTGCxFinishAction = ACT_DONE;	return TRUE; }/////////////////////////////////////////////////////////////////////////////////		bSet_OTGfeature()//		Description://			1. Process Cx Set feature command.//		input: none//		output: TRUE or FALSE (BOOLEAN)///////////////////////////////////////////////////////////////////////////////BOOLEAN bSet_OTGfeature(void){	INT8U i;	INT8U u8ep_n;	INT8U u8fifo_n;	INT8U u8Tmp[52];	INT8U * pp;	BOOLEAN bdir;		switch (ControlOTGCmd.Value)		// FeatureSelector	{		case 0:	// ENDPOINT_HALE			// Set "Endpoint_Halt", Turn on the "STALL" bit in Endpoint Control Function Register			if(ControlOTGCmd.Index == 0x00)				bOTGEP0HaltSt = TRUE;			else			{				u8ep_n = ControlOTGCmd.Index & 0x7F;		// which ep will be clear				bdir = ControlOTGCmd.Index >> 7;			// the direction of this ep				if (u8ep_n > FOTG200_Periph_MAX_EP)			// over the Max. ep count ?					return FALSE;				else				{					u8fifo_n = mUsbEPMapRd(u8ep_n);		// get the relatived FIFO number					if (bdir == 1)						u8fifo_n &= 0x0F;					else						u8fifo_n >>= 4;					if (u8fifo_n >= FOTG200_Periph_MAX_FIFO)	// over the Max. fifo count ?						return FALSE;														// Check the FIFO had been enable ?					if ((mUsbFIFOConfigRd(u8fifo_n) & FIFOEnBit) == 0)						return FALSE;					if (bdir == 1)						// IN direction ?						mUsbEPinStallSet(u8ep_n);		// Clear Stall Bit					else						mUsbEPoutStallSet(u8ep_n);		// Set Stall Bit				}			}			break; 		case 1 :   		// Device Remote Wakeup 			// Set "Device_Remote_Wakeup", Turn on the"RMWKUP" bit in Mode Register			mUsbRmWkupSet();			eOTGCxFinishAction = ACT_DONE;	            break;		case 2 :   		// Test Mode			switch ((ControlOTGCmd.Index >> 8))	// TestSelector			{				case 0x1:	// Test_J					mUsbTsMdWr(TEST_J);					eOTGCxFinishAction = ACT_DONE;					break;								case 0x2:	// Test_K					mUsbTsMdWr(TEST_K);					eOTGCxFinishAction = ACT_DONE;					break;										case 0x3:	// TEST_SE0_NAK					mUsbTsMdWr(TEST_SE0_NAK);					eOTGCxFinishAction = ACT_DONE;					break;										case 0x4:	// Test_Packet					mUsbTsMdWr(TEST_PKY);					mUsbEP0DoneSet();			// special case: follow the test sequence					//////////////////////////////////////////////					// Jay ask to modify, 91-6-5 (Begin)		//					//////////////////////////////////////////////					pp = u8Tmp;					for (i=0; i<9; i++)			// JKJKJKJK x 9					{						(*pp) = (0x00);						pp ++;					}					(*pp) = (0xAA);					pp ++;					(*pp) = (0x00);					pp ++;												for (i=0; i<8; i++)			// 8*AA					{						(*pp) = (0xAA);						pp ++;					}										for (i=0; i<8; i++)			// 8*EE					{						(*pp) = (0xEE);						pp ++;					}					(*pp) = (0xFE);					pp ++;											for (i=0; i<11; i++)		// 11*FF					{						(*pp) = (0xFF);						pp ++;					}										(*pp) = (0x7F);					pp ++;					(*pp) = (0xBF);					pp ++;					(*pp) = (0xDF);					pp ++;					(*pp) = (0xEF);					pp ++;					(*pp) = (0xF7);					pp ++;					(*pp) = (0xFB);					pp ++;					(*pp) = (0xFD);					pp ++;					(*pp) = (0xFC);					pp ++;					(*pp) = (0x7E);					pp ++;					(*pp) = (0xBF);					pp ++;					(*pp) = (0xDF);					pp ++;					(*pp) = (0xFB);					pp ++;					(*pp) = (0xFD);					pp ++;					(*pp) = (0xFB);					pp ++;					(*pp) = (0xFD);					pp ++;					(*pp) = (0x7E);					vOTGCxFWr( u8Tmp, 52);							//////////////////////////////////////////////					// Jay ask to modify, 91-6-5 (End)			//					//////////////////////////////////////////////					// Turn on "r_test_packet_done" bit(flag) (Bit 5)					mUsbTsPkDoneSet();					break;								case 0x5:	// Test_Force_Enable					//FUSBPort[0x08] = 0x20;	//Start Test_Force_Enable					break;							default:					return FALSE;					}	         	break; 		case 3 :   		//For OTG => b_hnp_enable			  			  OTGP_HNP_Enable();  			  eOTGCxFinishAction = ACT_DONE; 			              break;			 		case 4 :   		//For OTG => b_hnp_enable			  			    			  eOTGCxFinishAction = ACT_DONE; 			              break;		 		case 5 :   		//For OTG => b_hnp_enable			  			 printf(">>> Please Connect to an alternate port on the A-device for HNP...\n");  			  eOTGCxFinishAction = ACT_DONE; 			              break;				default :			return FALSE;	}	return TRUE;}/////////////////////////////////////////////////////////////////////////////////		bSet_OTGaddress()//		Description://			1. Set USB bus addr to FOTG200 Device register.//		input: none//		output: TRUE or FALSE (BOOLEAN)///////////////////////////////////////////////////////////////////////////////BOOLEAN bSet_OTGaddress(void){	if (ControlOTGCmd.Value >= 0x0100)		return FALSE;	else	{		mUsbDevAddrSet(ControlOTGCmd.Value);		eOTGCxFinishAction = ACT_DONE;		return TRUE;	}}/////////////////////////////////////////////////////////////////////////////////		bGet_OTGdescriptor()//		Description://			1. Point to the start location of the correct descriptor.//			2. set the transfer length and return descriptor information back to host//		input: none//		output: TRUE or FALSE (BOOLEAN)///////////////////////////////////////////////////////////////////////////////BOOLEAN bGet_OTGdescriptor(void){	//////////////// Decide the display descriptor length(range) //////////////    switch ((INT8U)(ControlOTGCmd.Value >> 8))    {		case 1:					// device descriptor			pu8OTGDescriptorEX = &u8OTGDeviceDescriptorEX[0];			u16OTGTxRxCounter = u8OTGDeviceDescriptorEX[0];			break;		case 2:	 				// configuration descriptor								// It includes Configuration, Interface and Endpoint Table			switch ((INT8U)ControlOTGCmd.Value)			{				case 0x00:		// configuration no: 0			        	pu8OTGDescriptorEX = &u8ConfigOTGDescriptorEX[0];	        			u16OTGTxRxCounter = u8ConfigOTGDescriptorEX[2] + (u8ConfigOTGDescriptorEX[3] << 8);			            break;				default:	        			return FALSE;			}			 break;								case 3:   				// string descriptor								// DescriptorIndex = low_byte of wValue			switch ((INT8U)ControlOTGCmd.Value)			{				case 0x00:			        	pu8OTGDescriptorEX = &u8OTGString00DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString00DescriptorEX[0];			 		break;			 				 	case 0x10:			        	pu8OTGDescriptorEX = &u8OTGString10DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString10DescriptorEX[0];			 		break;			 				 	case 0x20:			        	pu8OTGDescriptorEX = &u8OTGString20DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString20DescriptorEX[0];			 		break;			 				 	case 0x30:			        	pu8OTGDescriptorEX = &u8OTGString30DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString30DescriptorEX[0];			 		break;			 					 	case 0x40:			        	pu8OTGDescriptorEX = &u8OTGString40DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString40DescriptorEX[0];			 		break;			 					 	case 0x50:			        	pu8OTGDescriptorEX = &u8OTGString50DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString50DescriptorEX[0];			 		break;			 					 	default:        			return FALSE;			}			 break;	            				case 4:   					// interface descriptor			// It cannot be accessed individually, it must follow "Configuraton"	        	break;          				case 5:   					// endpoint descriptor			// It cannot be accessed individually, it must follow "Configuraton"	            break;		case 6:   					// Device_Qualifier descritor	        	pu8OTGDescriptorEX = &u8OTGDeviceQualifierDescriptorEX[0];   			u16OTGTxRxCounter = u8OTGDeviceQualifierDescriptorEX[0];   				            break;            		case 7:   					// Other_Speed_Configuration			// It includes Configuration, Interface and Endpoint Table	        	pu8OTGDescriptorEX = &u8OtherSpeedConfigOTGDescriptorEX[0];			u16OTGTxRxCounter = u8OtherSpeedConfigOTGDescriptorEX[2] + 							 (u8OtherSpeedConfigOTGDescriptorEX[3] << 8);	            break;       	default:	        	return FALSE;	}	if (u16OTGTxRxCounter > ControlOTGCmd.Length)		u16OTGTxRxCounter = ControlOTGCmd.Length;   			//if (u16OTGTxRxCounter==0)//Bruce;;Add;;Test   			//   {mUsbEP0DoneSet();//Bruce;;Add;;Test   			//    return TRUE;//Bruce;;Add;;Test   			//   }//Bruce;;Add;;Test	eOTGCxCommand = CMD_GET_DESCRIPTOR;	vOTGEP0TxData();	return TRUE;}          	/////////////////////////////////////////////////////////////////////////////////		bSet_OTGdescriptor()//		Description://			1. Point to the start location of the correct descriptor.//			2. Set the transfer length, and we will save data into sdram when Rx interrupt occure//		input: none//		output: TRUE or FALSE (BOOLEAN)///////////////////////////////////////////////////////////////////////////////BOOLEAN bSet_OTGdescriptor(void){	switch ((INT8U)(ControlOTGCmd.Value >> 8))	{		case 1:					// device descriptor	        	pu8OTGDescriptorEX = &u8OTGDeviceDescriptorEX[0];	        	u16OTGTxRxCounter = u8OTGDeviceDescriptorEX[0];	            break;		case 2:	 				// configuration descriptor			// It includes Configuration, Interface and Endpoint Table			// DescriptorIndex = low_byte of wValue			switch ((INT8U)ControlOTGCmd.Value)			{				case 0x00:		// configuration no: 0			        	pu8OTGDescriptorEX = &u8ConfigOTGDescriptorEX[0];	        			u16OTGTxRxCounter = u8ConfigOTGDescriptorEX[0];			            break;				default:	        			return FALSE;			}			 break;								case 3:   				// string descriptor			// DescriptorIndex = low_byte of wValue			switch ((INT8U)ControlOTGCmd.Value)			{				case 0x00:			        	pu8OTGDescriptorEX = &u8OTGString00DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString00DescriptorEX[0];			 		break;			 				 	case 0x10:			        	pu8OTGDescriptorEX = &u8OTGString10DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString10DescriptorEX[0];			 		break;			 				 	case 0x20:			        	pu8OTGDescriptorEX = &u8OTGString20DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString20DescriptorEX[0];			 		break;			 				 	case 0x30:			        	pu8OTGDescriptorEX = &u8OTGString30DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString30DescriptorEX[0];			 		break;			 					 	case 0x40:			        	pu8OTGDescriptorEX = &u8OTGString40DescriptorEX[0];	        			u16OTGTxRxCounter = u8OTGString40DescriptorEX[0];			 		break;

⌨️ 快捷键说明

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