📄 msfunction.c
字号:
{
int i;
__u32 volatile fifo;
if (usbTestMode == M_FTR_TESTJ)
usbREG_WRITE8(USB_REG_TESTMODE,M_TEST_J);
if (usbTestMode == M_FTR_TESTK)
usbREG_WRITE8(USB_REG_TESTMODE,M_TEST_K);
if (usbTestMode == M_FTR_TESTSE0)
usbREG_WRITE8(USB_REG_TESTMODE,M_TEST_SE0_NAK);
if (usbTestMode == M_FTR_TESTPKT)
{
fifo=FIFO_ADDRESS(usbEP[0].BltEP);
for (i=0; i < 53; i++)
*((__u8 volatile xdata *)fifo) = test_packet[i];
usbREG_WRITE8(USB_REG_CSR0, M_CSR0_INPKTRDY); //tx
usbREG_WRITE8(USB_REG_TESTMODE,M_TEST_PACKET);
}
usbTestMode = 0; /* reset */
}
#endif
if (dP->IReg & M_CSR0_P_SENTSTALL)
{
usbEP[0].IOState = EP_IDLE;
usbREG_WRITE8(USB_REG_CSR0, 0);
}
if (dP->IReg & M_CSR0_P_SETUPEND)
{
outreg = M_CSR0_P_SVDSETUPEND;
usbEP[0].IOState = EP_IDLE;
#ifdef USB_DEBUG
//printf("\r\nSETUPEND=%x ",outreg);
#endif
usbREG_WRITE8(USB_REG_CSR0, outreg);
}
if (usbEP[0].IOState == EP_IDLE)
{
if (dP->IReg & M_CSR0_RXPKTRDY)
{
outreg = M_CSR0_P_SVDRXPKTRDY;
usbEP[0].FifoRemain = dP->ICount;
usbEP[0].BytesRequested = 8;
usbEP[0].BytesProcessed = 0;
usbDRC_Fifo_Read_INT((__u8 *)&usbEP0Setup, 0);
usbSWOP_Setup(&usbEP0Setup);
#ifdef USB_DEBUG
//printf("\r\nbmRequestType = %x ",usbEP0Setup.bmRequestType);
//printf("\r\nbRequest = %x ",usbEP0Setup.bRequest);
//printf("\r\nwValue = %x ",usbEP0Setup.wValue);
//printf("\r\nwIndex = %x ",usbEP0Setup.wIndex);
//printf("\r\nwLength = %x ",usbEP0Setup.wLength);
printf("\r\n%x ",usbEP0Setup.bRequest);
#endif
parsestatus = usbParse_Received_Setup();
usbREG_WRITE8(USB_REG_INDEX, 0);
#ifdef USB_DEBUG
//printf("\r\nparsestatus = %x ",parsestatus);
//printf("\r\nREG_FADDR = %x ",usbREG_READ8(REG_FADDR));
#endif
if (parsestatus == USB_PID_ACK)
{
outreg |= M_CSR0_P_DATAEND;
if ((!usbSetFaddr) && (usbFaddr) && (usbUSBState < USB_ADDRESS))
{
usbChange_USB_State(USB_ADDRESS);
usbSetFaddr = 1;
#ifdef USB_DEBUG
//printf("\r\nusbSetFaddr = %x ",usbSetFaddr);
#endif
}
}
else if (parsestatus == USB_PID_OUT)
{
usbREG_WRITE8(USB_REG_CSR0, outreg);
#ifdef USB_DEBUG
//printf("\r\nPID_OUT = %x ",outreg);
#endif
outreg = 0;
usbEP[0].IOState = EP_RX;
usbEP[0].BytesProcessed = 0;
usbEP[0].BytesRequested = usbEP0Setup.wLength;
break;
}
else if (parsestatus == USB_PID_IN)
{
usbREG_WRITE8(USB_REG_CSR0, outreg);
#ifdef USB_DEBUG
//printf("\r\nPID_IN = %x ",outreg);
#endif
outreg = 0;
usbEP[0].IOState = EP_TX;
usbEP[0].LastPacket = 0;
usbEP[0].BytesProcessed = 0;
usbEP[0].BytesRequested = usbEP[0].transfer_buffer_length;
}
else
{
outreg = M_CSR0_P_SENDSTALL | M_CSR0_P_SVDRXPKTRDY;
}
}
else
{
if (usbSetFaddr)
usbREG_WRITE8(USB_REG_FADDR, usbFaddr);
#ifdef USB_DEBUG
//printf("\r\nusbSetFaddr = %x ",usbSetFaddr);
//printf("\r\nFADDR = %x ",usbREG_READ8(REG_FADDR));
#endif
usbSetFaddr = 0;
if (usbClearedEP)
{
usbClearedEP = 0;
}
}
}
if (usbEP[0].IOState == EP_TX)
outreg = usbFunction_Load_Fifo(0);
if (usbEP[0].IOState == EP_RX)
{
if (dP->IReg & M_CSR0_RXPKTRDY)
{
#if 1
//outreg = M_CSR0_P_SVDRXPKTRDY;
usbEP[0].FifoRemain = dP->ICount;
usbDRC_Fifo_Read_INT((__u8 *)usbEP[0].transfer_buffer,0);
//usbREG_WRITE8(USB_REG_CSR0, outreg);
//printf("\r\nRXurg = %x ",outreg);
#endif
outreg = 0;
if (usbEP[0].BytesProcessed >= usbEP[0].BytesRequested)
{
outreg |= M_CSR0_P_DATAEND;
usbEP[0].IOState = EP_IDLE;
usbREG_WRITE8(USB_REG_INDEX, 0);
usbREG_WRITE8(USB_REG_CSR0, outreg);
}
#if 1
outreg = M_CSR0_P_SVDRXPKTRDY;
//usbEP[0].FifoRemain = dP->ICount;
//usbDRC_Fifo_Read_INT((__u8 *)usbEP[0].transfer_buffer,0);
usbREG_WRITE8(USB_REG_CSR0, outreg);
//printf("\r\nRXurg = %x ",outreg);
outreg = 0;
#endif
}
}
if (outreg)
{
#ifdef USB_DEBUG
//printf("\r\noureg = %x ",outreg);
#endif
usbREG_WRITE8(USB_REG_CSR0, outreg);
if (usbHNPEnabled)
{
usbSet_DRC_Devctl((M_DEVCTL_HR + M_DEVCTL_SESSION));
}
}
break;
}
if (dP->IIntSrc == EP_RX)
{
if ((dP->IReg & M_RXCSR1_P_SENTSTALL)||!(dP->IReg & M_RXCSR1_RXPKTRDY))
{
usbBulkOutStatus = USB_ST_STALL;
outreg = 0;
usbREG_WRITE8(USB_REG_RXCSR1, outreg);
break;
}
else if (usbEP[ep].Halted)
{
usbBulkOutStatus = USB_ST_STALL;
outreg = M_RXCSR1_P_SENDSTALL;
usbREG_WRITE8(USB_REG_RXCSR1, outreg);
break;
}
else
{
usbEP[ep].FifoRemain = dP->ICount;
//printf("\r\n s=%x", usbEP[ep].FifoRemain);
//printf(",%x",OtgDeviceType);
switch(OtgDeviceType)
{
case Device_PictureBridge:
if (usbEP[ep].FifoRemain>0)
usbPictRxDataReceived=1;
//printf("\r\n s=%x", usbPictRxDataReceived);
break;
case Device_MassStorage:
if (usbEP[ep].FifoRemain==31)
{
usbEP[ep].BytesProcessed=0;
usbEP[ep].BytesRequested=dP->ICount;
usbEP[ep].transfer_buffer=usbCBW_Addr;
usbEP[ep].transfer_buffer_length=0;
if (usbEP[ep].FifoRemain < usbEP[ep].MaxEPSize)
usbEP[ep].LastPacket = 1;
else
{
if ((usbEP[ep].BytesProcessed + usbEP[ep].FifoRemain) >= usbEP[ep].BytesRequested)
usbEP[ep].LastPacket = 1;
else
usbEP[ep].LastPacket = 0;
}
#ifdef DMA
if (usbSet_DMAINT(ep, DMA_RX_ONE_IRQ) < 0)
{
#endif
usbDRC_Fifo_Read_INT((__u8 *)(usbEP[ep].transfer_buffer), ep);
if (((!usbEP[ep].FifoRemain) && (usbEP[ep].LastPacket)) || (usbEP[ep].BytesProcessed >= usbEP[ep].BytesRequested))
{
usbBulkOutStatus = USB_ST_NOERROR;
}
usbEP[ep].FifoRemain = usbRead_RxCount();
if (!usbEP[ep].FifoRemain)
#ifdef DMA
if (((__u8*)usbEP[ep].transfer_buffer)[15]!=0x2a)
{
//printf("cmd=%bx\n",((__u8*)usbEP[ep].transfer_buffer)[15]);
//printf("0x8B=%bx\n",XBYTE[0x268B]);
//usbSet_ClrRXMode1();
#endif
usbREG_WRITE8(USB_REG_RXCSR1, 0);
#ifdef DMA
}
}
#endif
usbMassCmdRevFlag=1;
}
else
{
if (usbEP[ep].FifoRemain>0)
{
usbMassRxDataReceived=1;
}
usbMassCmdRevFlag=0;
}
break;
default:
break;
}
break;
}
}
else
{
if (dP->IReg & M_TXCSR1_P_SENTSTALL)
{
if (ep==0x3)
usbIntInStatus=USB_ST_STALL;
else
usbBulkInStatus=USB_ST_STALL;
usbREG_WRITE8(USB_REG_TXCSR1, 0);
return;
}
if (usbEP[ep].LastPacket)
{
if (ep==0x3)
usbIntInStatus=USB_ST_NOERROR;
else
usbBulkInStatus=USB_ST_NOERROR;
break;
}
if (usbEP[ep].Halted)
{
usbREG_WRITE8(USB_REG_TXCSR1, M_TXCSR1_P_SENDSTALL);
break;
}
#ifdef DMA
//printf("\r\n ER=%x",usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed);
if((usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed)>0x0)
{
//printf("\r\n ER=%x",usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed);
usbBulkInStatus=USB_ST_NOERROR;
usbBulkInStatus2=USB_ST_NOERROR;
break;
}
if(usbSet_DMAINT(ep, DMA_TX_ZERO_IRQ) < 0)
{
#endif
usbDRC_Fifo_Write_INT((__u8 *)usbEP[ep].transfer_buffer,ep);
usbREG_WRITE8(USB_REG_TXCSR1, M_TXCSR1_TXPKTRDY);
#ifdef DMA
}
else
{
if (ep==0x3)
usbIntInStatus=0xff;
else
usbBulkInStatus=0xff;
}
#endif
}
}
while (0);
#if 0
if ( usbIntStatus != 0xff)
{
usbEP[ep].IOState = 0;
if (usbEP[ep].FifoRemain)
usbDRC_Fifo_Read_INT((__u8 *)usbEP[ep].transfer_buffer,ep);
}
#endif
return;
}
__s32 usbParse_Received_Setup(void)
{
__s32 retstatus;
__s32 bytesrem;
__s32 length;
__u8 *scanP;
__u8 i, descindex;
__u8 desctype;
__s32 endpoint, direction;
pipe_t pipe;
void *sp;
char version[2]={0x01,0x00};
#if 1
/*if (usbSpeed==FULL_SPEED)
{
usbMsdfn_Dscr[40]=0x40;
usbMsdfn_Dscr[41]=0x00;
usbMsdfn_Dscr[47]=0x40;
usbMsdfn_Dscr[48]=0x00;
usbMsdfn_Dscr[54]=0x40;
usbMsdfn_Dscr[55]=0x00;
}*/
if(usbSpeed==HIGH_SPEED)
{
//printf("\r\n Acheck!!",0);
usbMsdfn_Dscr[2]=0x0;
usbMsdfn_Dscr[3]=0x02;
usbMsdfn_Dscr[40]=0x0;
usbMsdfn_Dscr[41]=0x02;
usbMsdfn_Dscr[47]=0x0;
usbMsdfn_Dscr[48]=0x02;
}
#else
if (usbSpeed==FULL_SPEED)
{
usbMsdfn_Dscr[92]=0x40;
usbMsdfn_Dscr[93]=0x00;
usbMsdfn_Dscr[99]=0x40;
usbMsdfn_Dscr[100]=0x00;
usbMsdfn_Dscr[106]=0x40;
usbMsdfn_Dscr[107]=0x00;
}else if (usbSpeed==HIGH_SPEED)
{
usbMsdfn_Dscr[50]=0x40;
usbMsdfn_Dscr[51]=0x00;
usbMsdfn_Dscr[57]=0x40;
usbMsdfn_Dscr[58]=0x00;
usbMsdfn_Dscr[64]=0x40;
usbMsdfn_Dscr[65]=0x00;
}
#endif
retstatus = USB_PID_STALL;
if ((usbEP0Setup.bmRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD)
{
if ((usbEP0Setup.bmRequestType & USB_TYPE_MASK) == USB_TYPE_CLASS)
{
if(OtgDeviceType==Device_PictureBridge)
{
switch (usbEP0Setup.bRequest)
{
case STILL_IMAGE_RESET:
retstatus = USB_PID_ACK;
break;
case STILL_IMAGE_GET_DEVSTS:
#ifdef BIG_ENDIAN
//usbStillImageSts=(STILL_STSTUS_OK<<16)|0x00000004;
usbStillImageSts=0x04000120;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -