📄 msdrc.c
字号:
*dstP++ = *((__u8 *)fifo);
readcount--;
}
}
else
{
/* word access if aligned */
while ((readcount > 3)&& !((__u32) dstP & 3))
{
*((__u32 *)dstP) = *((__u32 *)fifo);
dstP = dstP + 4;
readcount = readcount - 4;
}
/* byte access for unaligned */
while (readcount > 0)
{
*dstP++ = *((__u8 *)fifo);
readcount--;
}
}
}
void usbDRC_Fifo_Write_INT(__u8 *srcP,__u8 ep)
{
__s32 writecount;
__u32 fifo;
if (usbEP[ep].MaxEPSize!=0)
writecount = MIN(usbEP[ep].MaxEPSize, (usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed));
else
writecount = usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed;
if (!writecount)
{
usbEP[ep].LastPacket = 1;
return;
}
srcP += usbEP[ep].BytesProcessed;
usbEP[ep].BytesProcessed += writecount;
if (usbEP[ep].BytesProcessed == usbEP[ep].BytesRequested)
usbEP[ep].LastPacket = 1;
fifo=FIFO_ADDRESS(usbEP[ep].BltEP);
/* byte access for unaligned */
if ((writecount > 0) && ((__u32) srcP & 3))
{
while(writecount)
{
*((__u8 *)fifo) = *srcP++;
writecount--;
}
}
else /* word access if aligned */
{
while ((writecount > 3) && !((__u32) srcP & 3) )
{
*((__u32 *)fifo) = *((__u32 *)srcP);
srcP = srcP + 4;
writecount = writecount - 4;
}
while (writecount > 0)
{
*((__u8 *)fifo) = *srcP++;
writecount--;
}
}
}
#endif
void usbParse_DRC_Int(drcintitem_t *dP)
{
usbRefresh_DRC_Registers();
if (dP->ICause == IRC_INTRUSB)
{
usbParse_DRC_INTRUSB(dP->IReg);
}
else if DRCPERIPHERAL(usbRegDevCtl)
{
usbParse_DRC_Int_Peripheral(dP);
}
#ifdef Enable_OTG_Host
else
usbParse_DRC_Int_Host(dP);
#endif
}
void usbDRC_Interrupt(void)
{
drcintitem_t d;
__u8 index_save;
__u8 epnum;
__u16 reg = 0;
__u16 i;
__u16 intreg[2] = {0, 0};
#ifdef DMA
__u8 dma_intr;
#endif
index_save = usbREG_READ8(USB_REG_INDEX); /* we have local copy */
#ifdef USB_DEBUG
//printf("\r\n",0);
//printf("\r\nUSBDeviceAddress = %x ",usbREG_READ8(USB_REG_FADDR));
#endif
#ifdef DMA
dma_intr = usbREG_READ8(REG_DMA_INTR);
if (dma_intr)
{
for (i = 0; i < MAX_DMA_CHANNEL; i++)
{
if (dma_intr & (1 << i))
{
d.IEP = i + 1;
d.IDMA = 1;
USB_DMA_IRQ_Handler(d.IEP);
d.IDMA = 0;
d.IEP = 0;
#ifdef USB_DEBUG
//printf("\r\ndmaint",0);
#endif
}
}
}
#endif
reg = usbREG_READ8(USB_REG_INTRUSB);
if (reg)
{
#ifdef USB_DEBUG
//printf("\r\nusb = %x ",reg);
//printf("\r\nREG_DEVCTL = %x ",usbREG_READ8(REG_DEVCTL));
#endif
d.IReg = reg;
d.ICause = IRC_INTRUSB;
usbParse_DRC_Int(&d);
}
#ifdef BIG_ENDIAN
intreg[0] = usbREG_READ8(USB_REG_INTRTX);
intreg[1] = usbREG_READ8(USB_REG_INTRRX);
//intreg[1] = Swap16(usbREG_READ16(REG_INTRRX));
#else
intreg[0] = usbREG_READ16(USB_REG_INTRTX);
intreg[1] = usbREG_READ16(USB_REG_INTRRX);
#endif
if (intreg[0] & 0x0001) /* EP0 interrupt ,EP_TX*/
{
usbREG_WRITE8(USB_REG_INDEX, 0);
d.IReg = usbREG_READ8(USB_REG_CSR0);
//if (d.IReg==0)
//msWriteByte(0x1504,0xfc);
d.IIntSrc = EP_TX;
d.IEP = 0;
d.ICause = IRC_EP;
if (d.IReg & M_CSR0_RXPKTRDY)
{
#ifdef BIG_ENDIAN
d.ICount = usbREG_READ8(USB_REG_RXCOUNT);
#else
d.ICount = usbREG_READ16(USB_REG_RXCOUNT);
#endif
}
#ifdef USB_DEBUG
//d.ICount = usbREG_READ8(REG_RXCOUNT);
//printf("\r\ncsr = %x ",d.IReg);
//printf("\r\ncnt1 = %x ",d.ICount);
#endif
usbParse_DRC_Int(&d);
#ifdef USB_DEBUG
//printf("\r\ncnt = %x ",usbREG_READ8(REG_RXCOUNT));
#endif
intreg[0] &= ~0x0001;
}
d.ICause = IRC_EP;
epnum = 1; i = 2;
while (intreg[0])/*While Looping_Free:<Exit counter added>*/
{
if (intreg[0] & i)
{
usbREG_WRITE8(USB_REG_INDEX, epnum);
d.IReg = usbREG_READ8(USB_REG_TXCSR1);
d.IIntSrc = EP_TX;
d.IEP = epnum;
usbParse_DRC_Int(&d);
intreg[0] &= ~i;
#ifdef USB_DEBUG
//printf("\r\nintTXep = %x ",epnum);
#endif
}
epnum ++;
i = i << 1;
}
epnum = 1; i = 2;
while (intreg[1])/*While Looping_Free:<Exit counter added>*/
{
if (intreg[1] & i)
{
usbREG_WRITE8(USB_REG_INDEX, epnum);
d.IReg = usbREG_READ8(USB_REG_RXCSR1);
d.IIntSrc = EP_RX;
d.IEP = epnum;
#ifdef BIG_ENDIAN
d.ICount = usbREG_READ8(USB_REG_RXCOUNT);
#else
d.ICount = usbREG_READ16(USB_REG_RXCOUNT);
#endif
usbParse_DRC_Int(&d);
intreg[1] &= ~i;
#ifdef USB_DEBUG
//printf("\r\nintRXep = %x ",epnum);
#endif
}
epnum ++;
i = i << 1;
}
usbREG_WRITE8(USB_REG_INDEX, index_save);
}
__s32 usbVBus_Status(void)
{
__u8 devctl;
devctl = usbREG_READ8(REG_DEVCTL);
switch ((devctl & VBUS_MASK) >> 3)
{
case 0:
return VBUS_BELOW_SESSION_END;
case 1:
return VBUS_ABOVE_SESSION_END;
case 2:
return VBUS_ABOVE_AVALID;
case 3:
return VBUS_ABOVE_VBUS_VALID;
}
return FAILURE;
}
void usbDRC_Index_Select(__u8 epnum)
{
__u8 reg;
reg = usbREG_READ8(USB_REG_INDEX);
if (reg != epnum)
usbREG_WRITE8(USB_REG_INDEX, epnum);
}
#ifdef Enable_OTG_Host
void usbReset_EP_DRC_Regs(__s8 ep)
{
usbDRC_Index_Select(usbEP[ep].BltEP);
usbREG_WRITE16(USB_REG_TXCSR,( M_TXCSR_FLUSHFIFO | M_TXCSR_CLRDATATOG ));
usbREG_WRITE16(USB_REG_TXMAXP, usbEP[ep].MaxEPSize);
usbREG_WRITE16(USB_REG_RXCSR,( M_RXCSR_FLUSHFIFO | M_RXCSR_CLRDATATOG ));
usbREG_WRITE16(USB_REG_RXMAXP, usbEP[ep].MaxEPSize);
}
#endif
#if 1
void usbDRC_Fifo_Read(__u8 *dstP,__u8 ep)
{
__s32 readcount;
__u32 volatile fifo;
#ifdef _Indirect
__u8 volatile tmp;
#endif
readcount = MIN((usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed),usbEP[ep].FifoRemain);
if (readcount <= 0)
return;
dstP += usbEP[ep].BytesProcessed;
usbEP[ep].BytesProcessed += readcount;
usbEP[ep].FifoRemain -= readcount;
//printf("ckk1=%lx\n",usbEP[ep].BytesProcessed);
//printf("ckk2=%x\n",usbEP[ep].FifoRemain);
if (ep==0)
usbEP[ep].BltEP=0;
if(EPConfig&0x10)
fifo = FIFO_ADDRESS(usbEP[ep].BltEP2);
else
fifo = FIFO_ADDRESS(usbEP[ep].BltEP);
#ifdef USB_DEBUG
//printf("\r\nrfifo = %x ",fifo);
//if (ep!=0)
//{
//printf("\r\ndstP = %x ",(__u16)dstP);
//printf("\r\n",0);
//}
//*((__u8 volatile xdata *)dstP)=*((__u8 volatile xdata *)fifo);
#endif
#ifndef _Indirect
if (readcount > 0)
{
//printf("\r\n");
while (readcount > 0)/*While Looping_Free:<Exit counter added>*/
{
*((__u8 volatile xdata *)dstP)=*((__u8 volatile xdata *)fifo);
//printf("%2bx ",*((__u8 volatile xdata *)dstP));
dstP++;
readcount--;
}
}
#else
if (readcount > 0)
{
while (readcount > 0)/*While Looping_Free:<Unused codes>*/
{
tmp=*((__u8 volatile xdata *)fifo);
while (!(usbEXTREG_READ8(0x02)&0x01));/*While Looping_Free:<Unused codes>*/
#ifdef USB_DEBUG
//printf("\r\n1502 = %x ",usbEXTREG_READ8(0x02));
#endif
usbEXTREG_WRITE8(0x02,0);
*((__u8 volatile xdata *)dstP)=usbEXTREG_READ8(0x98);
#ifdef USB_DEBUG
//if (ep!=0)
//printf("%x ",*((__u8 volatile xdata *)dstP));
#endif
dstP++;
readcount--;
}
}
#ifdef USB_DEBUG
//if (ep!=0)
//{
//pbDPSSetGCS();
//printf("\r\nLength = %x ",pbDPSGCS.Length);
//printf("\r\nType = %x ",pbDPSGCS.Type);
//printf("\r\nOPCode = %x ",pbDPSGCS.OPCode);
//printf("\r\nTransactionID = %x ",pbDPSGCS.TransactionID);
//printf("\r\nLength = %x ",pbDPSGCS.Length);
//}
#endif
#endif
#ifdef USB_DEBUG
//printf("\r\nrfifo = %x ",fifo);
#endif
}
void usbDRC_Fifo_Write(__u8 *srcP,__u8 ep)
{
__s32 writecount;
__u32 volatile fifo;
if (usbEP[ep].MaxEPSize!=0)
writecount = MIN(usbEP[ep].MaxEPSize, (usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed));
else
writecount = usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed;
if (!writecount)
{
usbEP[ep].LastPacket = 1;
return;
}
srcP += usbEP[ep].BytesProcessed;
usbEP[ep].BytesProcessed += writecount;
if (usbEP[ep].BytesProcessed == usbEP[ep].BytesRequested)
usbEP[ep].LastPacket = 1;
if (ep==0)
usbEP[ep].BltEP=0;
if(EPConfig&0x10)
fifo=FIFO_ADDRESS(usbEP[ep].BltEP2);
else
fifo=FIFO_ADDRESS(usbEP[ep].BltEP);
#ifdef USB_DEBUG
//printf("\r\nwfifo = %x ",fifo);
//if (ep!=0)
//{
//printf("\r\nsrcP = %x ",(__u16)srcP);
//printf("\r\n",0);
//}
#endif
/* byte access for unaligned */
if (writecount > 0)
{
while(writecount)/*While Looping_Free:<Exit counter added>*/
{
//*((__u8 volatile xdata *)fifo) = *srcP++;
*((__u8 volatile xdata *)fifo) = *((__u8 volatile xdata *)srcP);
#ifdef USB_DEBUG
//if (ep!=0)
//printf("%x ",*((__u8 volatile xdata *)srcP));
#endif
srcP++;
writecount--;
}
}
#ifdef USB_DEBUG
//printf("\r\nwfifo = %x ",fifo);
#endif
}
#else
void usbDRC_Fifo_Read(__u8 *dstP,__u8 ep)
{
__s32 readcount;
__u32 fifo;
readcount = MIN((usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed),usbEP[ep].FifoRemain);
if (readcount <= 0)
return;
dstP += usbEP[ep].BytesProcessed;
usbEP[ep].BytesProcessed += readcount;
usbEP[ep].FifoRemain -= readcount;
fifo = FIFO_ADDRESS(usbEP[ep].BltEP);
if ((readcount > 0)&& ((__u32) dstP & 3))
{
while (readcount > 0)
{
*dstP++ = *((__u8 *)fifo);
readcount--;
}
}
else
{
/* word access if aligned */
while ((readcount > 3)&& !((__u32) dstP & 3))
{
*((__u32 *)dstP) = *((__u32 *)fifo);
dstP = dstP + 4;
readcount = readcount - 4;
}
/* byte access for unaligned */
while (readcount > 0)
{
*dstP++ = *((__u8 *)fifo);
readcount--;
}
}
}
void usbDRC_Fifo_Write(__u8 *srcP,__u8 ep)
{
__s32 writecount;
__u32 fifo;
if (usbEP[ep].MaxEPSize!=0)
writecount = MIN(usbEP[ep].MaxEPSize, (usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed));
else
writecount = usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed;
if (!writecount)
{
usbEP[ep].LastPacket = 1;
return;
}
srcP += usbEP[ep].BytesProcessed;
usbEP[ep].BytesProcessed += writecount;
if (usbEP[ep].BytesProcessed == usbEP[ep].BytesRequested)
usbEP[ep].LastPacket = 1;
fifo=FIFO_ADDRESS(usbEP[ep].BltEP);
/* byte access for unaligned */
if ((writecount > 0) && ((__u32) srcP & 3))
{
while(writecount)
{
*((__u8 *)fifo) = *srcP++;
writecount--;
}
}
else /* word access if aligned */
{
while ((writecount > 3) && !((__u32) srcP & 3) )
{
*((__u32 *)fifo) = *((__u32 *)srcP);
srcP = srcP + 4;
writecount = writecount - 4;
}
while (writecount > 0)
{
*((__u8 *)fifo) = *srcP++;
writecount--;
}
}
}
#endif
__u8 SDRAM2USB_Bulk(__u32 txaddr,__u32 txsize)
{
__u8 inreg,outreg=0,ck=0;
__u32 u32Cnt=0;
IntCheck=2;
//usbBulkInStatus=0xff;
if(txsize<usbEP[1].MaxEPSize/*0x40*/)
{
usbBulkInStatus2=0x0;
usbBulkInStatus=0xff;
}
else
{
usbBulkInStatus2=0xff;
usbBulkInStatus=0x0;
}
usbEP[1].IOState = EP_TX;
usbEP[1].BytesRequested = txsize;
usbEP[1].BytesProcessed = 0;
usbEP[1].LastPacket = 0;
usbEP[1].transfer_buffer=txaddr;
usbDataPhaseDir=usb_sndbulkpipe(usbEP[1].BltEP); //PIPE_OUT
//printf("txsize=%lx\n", txsize);
//printf("\r\n txaddr=%x",(__u16)(usbEP[1].transfer_buffer>>16));
//printf(" %x",(__u16)(usbEP[1].transfer_buffer));
usbDRC_Index_Select(usbEP[1].BltEP);
// Derek modify
//putchar('1');
while( true)/*While Looping_Free:<Exit counter added>*/
{
if(!(usbREG_READ8(USB_REG_TXCSR1) & M_TXCSR1_FIFONOTEMPTY))
break;
if(!usbConnectFlag)
break;
if(++u32Cnt>0x3FFFF)
break;
}
inreg = usbREG_READ8(USB_REG_TXCSR1);
if (inreg & M_TXCSR1_P_SENTSTALL)
outreg |= M_TXCSR1_CLRDATATOG;
if (!(inreg & M_TXCSR1_FIFONOTEMPTY)||(outreg & M_TXCSR1_CLRDATATOG))
{
#ifdef DMA
ck=1;
if(usbSet_DMA(1, DMA_TX_ONE_IRQ) < 0)
{
//printf("\r\n D3",0);
usbDRC_Fifo_Write((__u8 *)usbEP[1].transfer_buffer, 1);
outreg |= M_TXCSR1_TXPKTRDY;
//usbBulkInStatus2=0;
}
else
outreg = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -