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

📄 dobotmsclass.c

📁 瑞萨单片机开发软代码.非常实用小巧的平台,很多应用都可以在上面实现.
💻 C
📖 第 1 页 / 共 3 页
字号:
			cswDataGVar->cswMeaningType.dCSWDataResidue -= byteLVar;
			
			if(BufPtr[DATA_INFO].sPtr == BufPtr[DATA_INFO].ePtr)
			{//write the block, write data to flash
			if( Cache->WriteCache.Addr/512 == 0xfffff )
				{ 
					if( Cache->WriteCache.Buf[0] == 0x55 &
						Cache->WriteCache.Buf[1] == 0xaa &
						Cache->WriteCache.Buf[2] == 0x55 &
						Cache->WriteCache.Buf[3] == 0xaa
					)
					{
						switch( GetShort( &Cache->WriteCache.Buf[4] ))//judge the private command type
						{
							case 0x0000: //InitCode 
								//example for the private command
								//then we analyse the command packet
								//the host data have save into the buffer Cache->WriteCache.Buf[]
								//The max packet is 512 bytes.
								//0x55 0xaa 0x55 0xaa  0x00 0x00 0x00 0x00 0x00 0x00 .......
								//The ID              |cmd type |len      |Index    | The data 
 								//	g_private_cmd = 00;
	       			    		SCI_Str("\r\nCase0000h:The transfer data = \r\n");
							//	GetShort( &Cache->WriteCache.Buf[10] )
							    temp=GetShort( &Cache->WriteCache.Buf[6] );
								for( i = 0; i< temp; i++ )
								{
//									SCI_HexS( GetShort( &Cache->WriteCache.Buf[4*i+8] ));   //code type
//									SCI_HexS( GetShort( &Cache->WriteCache.Buf[4*i+10]));  //code
									switch(GetShort( &Cache->WriteCache.Buf[4*i+8] ))
										{
                                         case 0x0000:   //write command to main LCD
										 //index_out(GetShort( &Cache->WriteCache.Buf[4*i+10] )); //16BIT
										   index_out(Cache->WriteCache.Buf[4*i+11]); //8BIT
   										   index_out(Cache->WriteCache.Buf[4*i+10]); //8BIT
										 break;
										 case 0x0001:	//write data to main LCD
										 //data_out(GetShort( &Cache->WriteCache.Buf[4*i+10] ));
 										   data_out(Cache->WriteCache.Buf[4*i+11]); //8BIT
   										   data_out(Cache->WriteCache.Buf[4*i+10]); //8BIT
										 break;
                                         //case 0x0002:   //write command to sub LCD
										 index_out(GetShort( &Cache->WriteCache.Buf[4*i+10] ));
										 break;
										 case 0x0003:	//write data to sub LCD
										// data_out(GetShort( &Cache->WriteCache.Buf[4*i+10] ));
										 break;
										}
									WaitTime( 10 );
								}
								break;

							case 0x0001:  //2byte data write
       			    		SCI_Str("\r\nCase0001h:The transfer 2byte data = \r\n");
							data_out(GetShort( &Cache->WriteCache.Buf[8] ));
								break;

							case 0x0002:  //2byte Instruction write
       			    		SCI_Str("\r\nCase00002h:The transfer 2byte Instruction = \r\n");
							index_out(GetShort( &Cache->WriteCache.Buf[8] ));
								break;
							case 0x0003:  //write bmp picture file 65k color data
       			    	//	SCI_Str("\r\nCase00003h:The transfer bmp picture file 65k color data = \r\n");
						    temp=GetShort( &Cache->WriteCache.Buf[6] );
						//	temp=temp/2;
							for( i = 0; i< temp; i++ )
								{
								 //data_out(GetShort( &Cache->WriteCache.Buf[2*i+8] ));  //16BIT
 										   data_out(Cache->WriteCache.Buf[2*i+9]); //8BIT
   										   data_out(Cache->WriteCache.Buf[2*i+8]); //8BIT
								}
								break;
							case 0x0004:  //Send execute the video command.
       			    	//	SCI_Str("\r\nCase00004h:Send execute the video command ! \r\n");
							Delaytime=GetShort( &Cache->WriteCache.Buf[8] );

								break;
							case 0x0005:  //Send Operate code.
       			    	//	SCI_Str("\r\nCase00004h:Send execute the video command ! \r\n");
							OperateCode=GetShort( &Cache->WriteCache.Buf[8] );

								break;

						}
					}
					
					return;
				}
				else
				{
					//write the block, write data to flash
					BULK_WRITE();                    // API call
				}

			//	BULK_WRITE();                    // API call
			}
			
			if (byteLVar < receiveByteLVar) 
			{	/*	Transfered data is over Function expectant data length	*/
				/*	not put away in data buffer	*/
				cbwDataGVar->cbwType.dCBWDataTransferLength -= (receiveByteLVar - byteLVar);
				cswDataGVar->cswMeaningType.dCSWDataResidue -= (receiveByteLVar - byteLVar);
				cswDataGVar->cswMeaningType.bCSWStatus = 0x01;

				/*	set up data buffer pointers	*/
				BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
				BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
				
				byteLVar = ActBulkOut(interruptBitStreamLVar,epInfoNumberLVar,DATA_INFO);
			}
		}
		
		else 
		{	/*	not put away in data buffer	*/
			BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
			
			byteLVar = ActBulkOut(interruptBitStreamLVar,epInfoNumberLVar,DATA_INFO);
			
			cbwDataGVar->cbwType.dCBWDataTransferLength -= byteLVar;
			cswDataGVar->cswMeaningType.dCSWDataResidue -= byteLVar;
		}
	}
	
	else 
	{	/*	not EP_BOT_OUT_FULL interrupt ?	Status Transport	*/
		/*	set up data buffer pointers	*/
		BufPtr[CSWCBW_INFO].sPtr = &cswDataGVar->byteVal[0];
		BufPtr[CSWCBW_INFO].ePtr = &cswDataGVar->byteVal[13];
		          
		if (report_wp!=0)
		{   // write-protect check
			// indicate command failure
			cswDataGVar->cswMeaningType.bCSWStatus = 0x01;   // indicate command error, request sense to report write protect
			report_wp = 0;
		}	
		else
		{
		 if ((cswDataGVar->cswMeaningType.dCSWDataResidue != 0) && (cbwDataGVar->cbwType.dCBWDataTransferLength == 0) && (cswDataGVar->cswMeaningType.bCSWStatus == 0x00)) 
		 {	/*	Transfered data is under Function expectant data length	*/
	 		/*	Status is set 0x02	*/
   			cswDataGVar->cswMeaningType.bCSWStatus = 0x02; 
	     }
	    } 

		if (cswDataGVar->cswMeaningType.dCSWDataResidue < 0){
			cswDataGVar->cswMeaningType.dCSWDataResidue = ~cswDataGVar->cswMeaningType.dCSWDataResidue;
			cswDataGVar->cswMeaningType.dCSWDataResidue++;
		}
		
		/*	change CSWDataResidue to little endian	*/
		cswDataGVar->cswMeaningType.dCSWDataResidue = ConvReflexn((unsigned char*)&cswDataGVar->cswMeaningType.dCSWDataResidue,4);
		
		ActBulkIn(0,USE_IN_EP,CSWCBW_INFO);
		
		/*	state is set "WAIT"	*/
		EpInfo[USE_OUT_EP].PresentState = WAIT;
		
		/*	mask EP_BOT_IN_TR interrupt */
		SET_BULK_IN_INTERRUPT4
		
		/*	clear EP__BOT_IN_TR interrupt flag	*/
		BULK_ITFF_CLEAR
	}

	//SCI_Str("RTS");
}

// orignal from "dobulk.c"
short	ActBulkOut(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar ,unsigned char dataBuffNumberLVar) 
{
	short		getByteLVar = 0;
	BULK_OTSF_CLEAR
	
	if ((*EpInfo[epInfoNumberLVar].FifoSize & 0x03) == 0x00) 
		getByteLVar = GetPacket4S(&EpInfo[epInfoNumberLVar],&BufPtr[dataBuffNumberLVar]);
	else
		getByteLVar = GetPacket(&EpInfo[epInfoNumberLVar],&BufPtr[dataBuffNumberLVar]);
	return getByteLVar;
}

//**** Transfer data from RAM to FIFO via DMA request by USB controller
short	ActBulkOut_DMA(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar ,unsigned char dataBuffNumberLVar) 
{
	register unsigned long getByteLVar;
	register BuffType* temp_BP = &BufPtr[dataBuffNumberLVar]; 
	/*	receiving data size in FIFO	*/

    // DMAC0 for FIFO<->RAM (share 1 channel DMA)
    DMAC.MAR0A.LONG = (unsigned long)epinfo_ptr[epInfoNumberLVar]->epdrLPtr;  // src. address, FIFO addr
    DMAC.MAR0B.LONG = (unsigned long)temp_BP->sPtr;     // dest. address, RAM addr

	getByteLVar = BufPtr[DATA_INFO].ePtr-BufPtr[DATA_INFO].sPtr;    // no. of bytes to receive

    // ** use burst mode for first time, then activate by DREQ1 for the rest
    // DMAC0 for FIFO<->RAM (share 1 channel DMA)
    USBFM.UDMAR.BYTE = 0x08;                   // enable USB EP2o DREQ0 request
    DMAC.DMABCR.FULLADD.BIT.DTME0 = 1;         // enable dmac
    DMAC.DMACR0.FULLADD.SHORT = 0x0027;        // FIFO->RAM, byte access, src fixed, normal mode, dst+1, burst
    DMAC.ETCR0A = 0x40;                        // no. of byte to transfer (FIFO size)
    DMAC.ETCR0B = (getByteLVar/64)-1;          // no. of block to be received
    DMAC.DMABCR.FULLADD.BIT.DTE0 = 1;
    while(DMAC.DMABCR.FULLADD.BIT.DTE0==1);    // chk transfer finish

    // ** activate by DREQ1 for 2~4/8/16 block of 64 bytes FIFO data
    DMAC.DMACR0.FULLADD.SHORT = 0x1823;        // FIFO->, byte access, src fixed, blk mode, dst+1, DREQ1 activate   
    DMAC.ETCR0A = 0x4040;                      // no. of byte to transfer (FIFO size)
    DMAC.DMABCR.FULLADD.BIT.DTME0 = 1;         // enable dmac
    DMAC.DMABCR.FULLADD.BIT.DTE0 = 1;
    while(DMAC.DMABCR.FULLADD.BIT.DTE0==1);    // chk transfer finish
    USBFM.UDMAR.BYTE = 0x00;                   // disable USB EP2o DREQ0 request
    DMAC.DMABCR.FULLADD.BIT.DTME0 = 0;         // disable dmac

	//if (getByteLVar == readArea)
	READ_TRIGER_REGISTER = epinfo_ptr[epInfoNumberLVar]->getFinish; //	set Read_Finish flag
	
	temp_BP->sPtr += getByteLVar;
	return ((short)getByteLVar);
}


short	ActBulkIn(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar ,unsigned char dataBuffNumberLVar) 
{
	//	transfer data byte size	
	short		putByteLVar = 0;
	//BULK_ITSF_CLEAR

	if ((((unsigned char)BufPtr[dataBuffNumberLVar].ePtr - (unsigned char)BufPtr[dataBuffNumberLVar].sPtr) & 0x3F) == 0x00) 
		putByteLVar = PutPacket4S(&EpInfo[epInfoNumberLVar],&BufPtr[dataBuffNumberLVar]);
	else
		putByteLVar = PutPacket(&EpInfo[epInfoNumberLVar],&BufPtr[dataBuffNumberLVar]);
	return putByteLVar;
}

//**** Transfer data from RAM to FIFO via DMA request by USB controller
short	ActBulkIn_DMA(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar ,unsigned char dataBuffNumberLVar) 
{
	//	transfer data byte size	
	//register unsigned int putByteLVar;
//	BULK_ITSF_CLEAR

    DMAC.MAR0A.LONG = (unsigned long)BufPtr[dataBuffNumberLVar].sPtr;      // source address
    DMAC.MAR0B.LONG = (unsigned long)epinfo_ptr[epInfoNumberLVar]->epdrLPtr;  // dest. address


     //** use burst mode first time, then activate by DREQ0 for others
     USBFM.UDMAR.BYTE = 0x02;                      // enable USB EP2i DREQ0 request              
     DMAC.DMABCR.FULLADD.BIT.DTME0 = 1;            // enable dmac
     DMAC.DMACR0.FULLADD.SHORT = 0x2007;           // RAM->FIFO, byte access, src+1, normal mode, dst. fixed, burst
     DMAC.ETCR0A = 0x40;                           // no. of byte to transfer
     //DMAC.ETCR0B = (putByteLVar/64)-1;             // calculate block need to transfer
     DMAC.ETCR0B = 7;                              // calculate block need to transfer (always 512 bytes)
     DMAC.DMABCR.FULLADD.BIT.DTE0 = 1;
     Cache->ReadCache.Modified = 0;                       // 
     while(DMAC.DMABCR.FULLADD.BIT.DTE0==1);       // chk transfer finish

     //** activate by DREQ0 for 2~8 block of 64 bytes FIFO data
     DMAC.DMACR0.FULLADD.SHORT = 0x2803;           // RAM->FIFO, byte access, src+1, blk mode, dst. fixed, DREQ0 actative
     DMAC.ETCR0A = 0x4040;                         // 64 bytes per block
     DMAC.DMABCR.FULLADD.BIT.DTME0 = 1;            // enable dmac
     DMAC.DMABCR.FULLADD.BIT.DTE0 = 1;   
     
     // read flash data
     BULK_READ();
     
     while(DMAC.DMABCR.FULLADD.BIT.DTE0==1);       // chk transfer finish
     USBFM.UDMAR.BYTE = 0x00;                      // disable USB EP2i DREQ0 request              
     DMAC.DMABCR.FULLADD.BIT.DTME0 = 0;            // disable dmac
    
	//SCI_Str("-END");
	/*	enable transfer data in FIFO	*/ 
    WRITE_TRIGER_REGISTER = epinfo_ptr[epInfoNumberLVar]->putEnable;

	return (512);
}


// original from "docontrol.c"
/***************************************************************************
Function Name	:ActControl(void)
Working			:Executing Control transfer SetUp Stage
Return Value	:void
***************************************************************************/
void	ActControl(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar, unsigned char dataBuffNumberLVar) 
{
	/*	ISET_CLEAR;	clear interrupt flag	*/
	SETUP_INTF_CLEAR
	
	/*	clear In and Out FIFOs	*/
	FIFO_CLEAR_REGISTER = EpInfo[epInfoNumberLVar].fifoClearEnable;
	
	EpInfo[0].PresentState = WAIT;
	contCMDGPtr.sPtr = &ep0PacketGVar.byteVal[0];
	contCMDGPtr.ePtr = &ep0PacketGVar.byteVal[8];
	
	GetPacket(&EpInfo[epInfoNumberLVar],&contCMDGPtr);
	
	/*	decode Setup Commands	*/
	DecStandardCommands();
	
//	GO_DATA_STAGE
	
	if (EpInfo[0].PresentState == TRANS_IN) {
		// set EP0 interrupt enable register enable

⌨️ 快捷键说明

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