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

📄 dobotmsclass.c

📁 瑞萨单片机开发软代码.非常实用小巧的平台,很多应用都可以在上面实现.
💻 C
📖 第 1 页 / 共 3 页
字号:
		EP0_IER_ENABLE
		/*	mask EP0i_TR interrupt	*/
		CTRL_IN_REG_SET
		PutPacket(&EpInfo[1],&BufPtr[0]);
	}
	else if (EpInfo[0].PresentState == TRANS_OUT)
	{
		EP0_IER_ENABLE
		/*	enable EP0i_TR interrupt	*/
		CTRL_OUT_REG_SET
	}
	else {
		// set EP0 interrupt enable register disable
		EP0_IER_DISABLE
		// set EP0 STALL
		STALL_REGISTER |= EpInfo[epInfoNumberLVar].stallEnable;
	}
	GET_INTERRUPT_ENABLE                                                           
}

             
/***************************************************************************
Function Name	:ActControlInOut(unsigned long ,unsigned char,unsigned char )
Working			:Select Control transfer Stage
Return Value	:void
***************************************************************************/
void	ActControlInOut(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar ,unsigned char dataBuffNumberLVar)
{
	if (EpInfo[0].PresentState == TRANS_OUT) {
		epInfoNumberLVar++;
		ActControlOut(interruptBitStreamLVar,epInfoNumberLVar);
	}
	else {
		ActControlIn(interruptBitStreamLVar,epInfoNumberLVar);
	}
}

/***************************************************************************
Function Name	:ActControlIn(unsigned long ,unsigned char )
Working			:Executing Control transfer Data Stage and Status Stage
				:in case Data Stage direction is IN
Return Value	:void
***************************************************************************/
void	ActControlIn(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar) 
{
	//SCI_Str("\r\nACI");
/*------------------- end of status stage -----------------------------*/
	if ((interruptBitStreamLVar & EP0_O_ACK_BITS) == EP0_O_ACK_BITS) 
	{	/*	EP0o_TS (completed receive)	*/
		/*	clear EP0 interrupt flag except for SETUP	*/
		CTRL_IN_OTSF_CLEAR
		
		EpInfo[0].PresentState = WAIT;
		/*	set read_finish flag	*/
		READ_TRIGER_REGISTER = EpInfo[epInfoNumberLVar].getFinish;
		/*	completed Control transfer	*/
	}
/*-------------- transition state (from data to status) ---------*/
	else 
	{	/*	EP0i_TS(completed transfer)	*/
		/*	clear EP0i_TS interrupt flag	*/
		CTRL_ITSF_CLEAR

		CTRL_IN_OTSF_CLEAR

		PutPacket(&EpInfo[epInfoNumberLVar],&BufPtr[0]);
	}
}

/***************************************************************************
Function Name	:ActControlOut(unsigned long ,unsigned char )
Working			:Executing Control transfer Data Stage and Status Stage
				:in case Data Stage direction is OUT
Return Value	:void
***************************************************************************/
void	ActControlOut(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar) 
{

	enum SetCompleteType setcomplete;

/*------------------ data stage --------------------------------*/
	if ((interruptBitStreamLVar & EP0_O_ACK_BITS) == EP0_O_ACK_BITS) {	/*	EP0o_TS (completed receive)	*/
		/*	clear EP0o_TS interrupt flag	*/
		CTRL_OTSF_CLEAR
		
		GetPacket(&EpInfo[epInfoNumberLVar],&BufPtr[0]);
	}
/*-------------- transition state (from data to status) ---------*/
	else if ((interruptBitStreamLVar & EP0_I_NACK_BITS) == EP0_I_NACK_BITS) {	/*	EP0i_TR(transfer request)	*/
		/*	clear EP0i_TR interrupt flag	*/
		CTRL_ITRF_CLEAR

		/*	handling Data Stage transfered data	*/
		setcomplete = INCOMPLETE;
		setcomplete = SetControlOutContents(&transStageGPtr,&BufPtr[0]);

		if (setcomplete != INCOMPLETE) {
			/*	enable taranfer packet data in FIFO after completed Data Stage	*/
			WRITE_TRIGER_REGISTER = EpInfo[epInfoNumberLVar].putEnable;
		}
		else {
			error();
		}
	}
/*------------------ end of status stage -------------------------*/
	else {	/*	EP0i_TS(completed transfer)	*/
		/*	clear EP0i_TS interrupt flag	*/
		CTRL_ITSF_CLEAR
		
		EpInfo[0].PresentState = WAIT;
		/*	completed Control transfer	*/
	}
}


// original from "dorequest.c"
/***************************************************************************
Function Name	:DecStandardCommands(void)
Working			:Executing Standard Setup Commands
Return Value	:void
***************************************************************************/
void	DecStandardCommands(void) 
{
	BufPtr[0].sPtr = deviceDiscriptorGVar[0].d_data;
	BufPtr[0].ePtr = BufPtr[0].sPtr + (unsigned short)ConvReflexn(&ep0PacketGVar.access1Type.wLength_B1,2);

	switch(ep0PacketGVar.access1Type.bmRequest) {
	/*	What is command type & recipient ?	*/
		case	0x80:
		/*	Trans.In , Standard,  Device	*/
			if(ep0PacketGVar.access1Type.bRequest == 6) {
			/*	Get Descriptor	*/
				if (ep0PacketGVar.access0Type.wValue == 0x0001) {
				/*	Device Descriptor	*/
					BufPtr[0].sPtr = deviceDiscriptorGVar[0].d_data;
					BufPtr[0].ePtr = BufPtr[0].sPtr + (unsigned short)ConvReflexn(&ep0PacketGVar.access1Type.wLength_B1,2);
   					if (ep0PacketGVar.access1Type.wLength_B1 > deviceDiscriptorGVar[0].length)
   					 BufPtr[0].ePtr = BufPtr[0].sPtr + deviceDiscriptorGVar[0].length;        
				}
				else if (ep0PacketGVar.access0Type.wValue == 0x0002) {
				/*	Configuration Descriptor	*/
					BufPtr[0].sPtr = configurationDiscriptorGVar[0].d_data;
					BufPtr[0].ePtr = BufPtr[0].sPtr + (unsigned short)ConvReflexn(&ep0PacketGVar.access1Type.wLength_B1,2);
   					if ((((unsigned short)ep0PacketGVar.access1Type.wLength_B2)<<8 | (unsigned short)ep0PacketGVar.access1Type.wLength_B1) > configurationDiscriptorGVar[0].length)
   					 BufPtr[0].ePtr = BufPtr[0].sPtr + configurationDiscriptorGVar[0].length;        
				}
				else if ((ep0PacketGVar.access0Type.wValue & 0x00FF) == 0x0003) {
				/*	String Descriptor	*/
					BufPtr[0].sPtr = stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].d_data;
   					// get discriptor length (i.e. send discriptor length only)
   					BufPtr[0].ePtr = BufPtr[0].sPtr + stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].length;        // only 4 byte for String Descriptor Zero
				}
				else {
					EpInfo[0].PresentState = STALL;
				}
            }
			else {
				EpInfo[0].PresentState = STALL;
			}
			break;

		case	0x00:
		/*	standard commands, Trans.Out, Standard, Device	*/
			if(ep0PacketGVar.access1Type.bRequest == 7) 
			{	/*	Set Descriptor	*/
				/*	set write pointers	*/
				BufPtr[0].sPtr = &controlBeginGVar[0];
				BufPtr[0].ePtr = &controlBeginGVar[0] + (unsigned short)ConvReflexn(&ep0PacketGVar.access1Type.wLength_B1,2);
				if (BufPtr[0].ePtr > &controlBeginGVar[CONTROL_DATA_AREA]){
				    BufPtr[0].ePtr = &controlBeginGVar[CONTROL_DATA_AREA];
				}

				/*	set Descriptors data area	*/
				if (ep0PacketGVar.access0Type.wValue == 0x0001) {
				/*	Device Descriptor	*/
					transStageGPtr.beginPtr = deviceDiscriptorGVar[0].d_data;
					transStageGPtr.endPtr = (unsigned char*)((deviceDiscriptorGVar[0].d_data) + (deviceDiscriptorGVar[0].length));
				}
				else if(ep0PacketGVar.access0Type.wValue == 0x0002) {
				/*	Configuration Descriptor	*/
					transStageGPtr.beginPtr = configurationDiscriptorGVar[0].d_data;
					transStageGPtr.endPtr = (unsigned char*)((configurationDiscriptorGVar[0].d_data) + (configurationDiscriptorGVar[0].length));
				}
				else if((ep0PacketGVar.access0Type.wValue & 0x00FF) == 0x0003) {
				/*	String Descriptor	*/
					transStageGPtr.beginPtr = stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].d_data;
					transStageGPtr.endPtr = (unsigned char*)(stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].d_data + stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].length);
				}
				else {
					EpInfo[0].PresentState = STALL;
				}
			}
			else        
			{
			 	EpInfo[0].PresentState = STALL;
			}
			break;
		/*	class commands	*/
		/*	These case are class commands.	*/
		case	0x20:	/*	0010 0000	*/	
		case	0x21:	/*	0010 0001	*/	
		case	0x22:	/*	0010 0010	*/	
		case	0x23:	/*	0010 0011	*/	
		case	0xA0:	/*	1010 0000	*/	
		case	0xA1:	/*	1010 0001	*/	
		case	0xA2:	/*	1010 0010	*/	
		case	0xA3:	/*	1010 0011	*/	
			if (UNKNOWN_CTRL_COMMAND == DecBOTClassCommands()){	/*	Bulk-Only Transport Mass Storage Class comannds	*/
				EpInfo[0].PresentState = STALL;
			}
			break;

		/*	These case are vender commands.	*/
		case	0x40:	/*	0100 0000	*/	
		case	0x41:	/*	0100 0001	*/	
		case	0x42:	/*	0100 0010	*/	
		case	0x43:	/*	0100 0011	*/	
		case	0xC0:	/*	1100 0000	*/	
		case	0xC1:	/*	1100 0001	*/	
		case	0xC2:	/*	1100 0010	*/	
		case	0xC3:	/*	1100 0011	*/	
		/*	Type is Vendor. Recipient is Device.	*/
			if (UNKNOWN_CTRL_COMMAND == DecVenderCommands()){
				EpInfo[0].PresentState = STALL;
			}
			break;

		default:
		/*	 the other case	*/
			EpInfo[0].PresentState = STALL;
			break;
	}

	
	if (EpInfo[0].PresentState != STALL)
	{
		//	set firmware state by Data Stage direction
		if ((ep0PacketGVar.access1Type.bmRequest & 0x80) == 0x80) 
		{	//	data transfer direction is Function to Host
			EpInfo[0].PresentState = TRANS_IN;
		}
		else 
		{	//	data transfer direction is Host to Function
			EpInfo[0].PresentState = TRANS_OUT;
		}
	}	
}


/***************************************************************************
Function Name	:DecVenderCommands(void)
Working			:Executing Vendor Commands
Return Value	:enum	DecControlCmdDoneType
***************************************************************************/
enum	DecControlCmdDoneType	DecVenderCommands(void) {
	return UNKNOWN_CTRL_COMMAND;
}


/***************************************************************************
Function Name	:DecBOTClassCommands(void)
Working			:Executing BOT Class Commands
Return Value	:enum	DecControlCmdDoneType
***************************************************************************/
enum	DecControlCmdDoneType	DecBOTClassCommands(void) 
{
	enum	DecControlCmdDoneType Command_Done = CTRL_COMMAND_DONE;
	
	switch (ep0PacketGVar.access1Type.bRequest) 
	{
		case 255:
		/*	Bulk-Only Mass Storage Reset	*/
			BufPtr[0].sPtr = &controlBeginGVar[0];
			BufPtr[0].ePtr = &controlBeginGVar[0];
			
			/*	clear using FIFO	*/
			CLEAR_BULK_FIFO_OF_SOFT_RESET
			
			/*	state is set "WAIT"	*/
			EpInfo[USE_OUT_EP].PresentState = WAIT;
			
			/*	clear stall bit	*/
			BOT_ALL_EP_STALL_OFF
			break;

		case 254:
		/*	Get Max LUN	*/
			controlBeginGVar[0] = 0x00;
			
			BufPtr[0].sPtr = &controlBeginGVar[0];
			BufPtr[0].ePtr = &controlBeginGVar[1];
			break;

		default:
		/*	the other case	*/       
			Command_Done = UNKNOWN_CTRL_COMMAND;
			break;
	}                               
	return Command_Done;
}

⌨️ 快捷键说明

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