📄 dobotmsclass.c
字号:
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 + -