📄 msdrc.c
字号:
__u32 XDATAAddr;
__u8 volatile buff[1024];
__u8 srcflag =0x00,dstflag=0x00;
__u16 offset=0;
if((u32src >= (__u32)USB_TTX_FIX_XDATA_ADDR) && (u32src < (__u32)USB_TTX_FIX_XDATA_ADDR + 0x10000))
{
srcflag = 0xAA;
//offset=(u32dst - (__u32)USB_TTX_FIX_XDATA_ADDR)%1024;
offset=u32dst%1024;
}
if((u32dst >= (__u32)USB_TTX_FIX_XDATA_ADDR) && (u32dst < (__u32)USB_TTX_FIX_XDATA_ADDR + 0x10000))
{
dstflag = 0xAA;
//offset=(u32src - (__u32)USB_TTX_FIX_XDATA_ADDR)%1024;
offset=u32src%1024;
}
#ifdef USB_DEBUG
//printf("\r\n",0);
//printf("\r\nsrcflag=%x ",srcflag);
//printf("\r\ndstflag=%x ",dstflag);
//printf("\r\noffset=%x ",offset);
#endif
if(srcflag == 0xAA) //for XDATA
{
//printf("\r\n check1", 0);
for(j = 0 ; j <1024 ; j++)
buff[j]= XBYTE[u32src - (__u32)USB_TTX_FIX_XDATA_ADDR + j];
}
else //for DRAM
{
//printf("\r\n check2", 0);
XBYTE[0x1E07]=(__u8)((((__u32)u32src >> 10)) ); //SDRAM_XD_MAP_L: XXh * 1k
XBYTE[0x1E08]=(__u8)((((__u32)u32src >> 10)) >> 8 ); //SDRAM_XD_MAP_H: XXh * 256 * 1k
XDATAAddr = u32dst - (__u32)USB_TTX_FIX_XDATA_ADDR;
//printf("\r\n offset1=%x", offset);
for(j = offset ; j <1024 ; j++)
{
//buff[j]= XBYTE[0xF800 + j];
XBYTE[XDATAAddr++]= XBYTE[0xF800 + j];
dCount++;
if(dCount>=u32len)
break;
}
offset=j;
//printf("\r\n offset2=%x", offset);
//printf("\r\n u32len=%x", u32len);
//printf("\r\n dCount1=%x", dCount);
}
#ifdef USB_DEBUG
//printf("\r\nsrc=%x",XBYTE[0x1E08]);
//printf("%x ",XBYTE[0x1E07]);
#endif
//printf("\r\n 1E07=%x",XBYTE[0x1E07] );
//printf("\r\n 1E08=%x",XBYTE[0x1E08] );
if(dstflag == 0xAA) //for XDATA
{
//printf("\r\n check3=%x", offset);
//XDATAAddr = u32dst - (__u32)USB_TTX_FIX_XDATA_ADDR;
while(dCount != u32len)
{
if((XDATAAddr >= 0x2C00) && (XDATAAddr <= 0xD400))
{
if (offset>1023)
{
if (XBYTE[0x1E07]!=0xff)
XBYTE[0x1E07]=XBYTE[0x1E07]+1;
else
{
XBYTE[0x1E07]=0;
XBYTE[0x1E08]=XBYTE[0x1E08]+1;
}
offset=0;
for(j = 0 ; j <1024 ; j++)
{
XBYTE[XDATAAddr++]= XBYTE[0xF800 + j];
dCount++;
offset++;
if(dCount>=u32len)
break;
}
//printf("\r\n offset3=%x", offset);
//printf("\r\n dCount2=%x", dCount);
//offset=0;
#ifdef USB_DEBUG
//printf("\r\nXDATAAddr=%x \r\n",XDATAAddr);
#endif
}
//XBYTE[XDATAAddr++] = buff[offset++];
#ifdef USB_DEBUG
//printf("%x ",buff[offset]);
#endif
//dCount++;
}
}
#ifdef USB_DEBUG
//printf("\r\ndCount=%x ",dCount);
//printf("\r\noffset=%x ",offset);
#endif
}
else //for DRAM
{
//printf("\r\n check4", 0);
XDATAAddr = u32src - (__u32)USB_TTX_FIX_XDATA_ADDR +1024;
XBYTE[0x1E07]=(__u8)((((__u32)u32dst >> 10)) ); //SDRAM_XD_MAP_L: XXh * 1k
XBYTE[0x1E08]=(__u8)((((__u32)u32dst >> 10)) >> 8); //SDRAM_XD_MAP_H: XXh * 256 * 1k
i=0;
while(dCount != u32len)
{
if (offset>1023)
{
if (XBYTE[0x1E07]!=0xff)
XBYTE[0x1E07]=XBYTE[0x1E07]+1;
else
{
XBYTE[0x1E07]=0;
XBYTE[0x1E08]=XBYTE[0x1E08]+1;
}
for(j = 0 ; j <1024 ; j++)
buff[j]= XBYTE[XDATAAddr++];
offset=0;
i=0;
#ifdef USB_DEBUG
//printf("\r\nDDATAAddr=%x \r\n",XDATAAddr);
#endif
}
XBYTE[0xF800 + offset] = buff[i++];
#ifdef USB_DEBUG
//printf("%x ",buff[i]);
#endif
offset++;
dCount++;
}
#ifdef USB_DEBUG
//printf("\r\ndCount=%x ",dCount);
//printf("\r\noffset=%x ",offset);
#endif
}
}
void usbSDRAMCSDRAM(__u32 u32src, __u32 u32dst, __u32 u32len)
{
__u32 i,j;
__u32 dCount=0;
__u32 XDATAAddr;
__u8 volatile buff[1024];
__u8 srcflag =0x00,dstflag=0x00;
__u16 offset=0;
__u8 temp1, temp2;
if((u32src >= (__u32)USB_TTX_FIX_XDATA_ADDR) && (u32src < (__u32)USB_TTX_FIX_XDATA_ADDR + 0x10000))
{
srcflag = 0xAA;
//offset=(u32dst - (__u32)USB_TTX_FIX_XDATA_ADDR)%1024;
offset=u32dst%1024;
}
if((u32dst >= (__u32)USB_TTX_FIX_XDATA_ADDR) && (u32dst < (__u32)USB_TTX_FIX_XDATA_ADDR + 0x10000))
{
dstflag = 0xAA;
//offset=(u32src - (__u32)USB_TTX_FIX_XDATA_ADDR)%1024;
offset=u32src%1024;
}
#ifdef USB_DEBUG
//printf("\r\n",0);
//printf("\r\nsrcflag=%x ",srcflag);
//printf("\r\ndstflag=%x ",dstflag);
//printf("\r\noffset=%x ",offset);
#endif
if(srcflag == 0xAA) //for XDATA
{
//printf("\r\n check1", 0);
for(j = 0 ; j <1024 ; j++)
buff[j]= XBYTE[u32src - (__u32)USB_TTX_FIX_XDATA_ADDR + j];
}
else //for DRAM
{
//printf("\r\n check2", 0);
XBYTE[0x1E07]=(__u8)((((__u32)u32src >> 10)) ); //SDRAM_XD_MAP_L: XXh * 1k
XBYTE[0x1E08]=(__u8)((((__u32)u32src >> 10)) >> 8 ); //SDRAM_XD_MAP_H: XXh * 256 * 1k
for(j = 0 ; j <1024 ; j++)
buff[j]= XBYTE[0xF800 + j];
}
#ifdef USB_DEBUG
//printf("\r\nsrc=%x",XBYTE[0x1E08]);
//printf("%x ",XBYTE[0x1E07]);
#endif
if(dstflag == 0xAA) //for XDATA
{
//printf("\r\n check3=%x", offset);
XDATAAddr = u32dst - (__u32)USB_TTX_FIX_XDATA_ADDR;
while(dCount != u32len)
{
if((XDATAAddr >= 0x2C00) && (XDATAAddr <= 0xD400))
{
if (offset>1023)
{
if (XBYTE[0x1E07]!=0xff)
XBYTE[0x1E07]=XBYTE[0x1E07]+1;
else
{
XBYTE[0x1E07]=0;
XBYTE[0x1E08]=XBYTE[0x1E08]+1;
}
for(j = 0 ; j <1024 ; j++)
buff[j]= XBYTE[0xF800 + j];
offset=0;
#ifdef USB_DEBUG
//printf("\r\nXDATAAddr=%x \r\n",XDATAAddr);
#endif
}
temp1=XBYTE[XDATAAddr++];
temp2=buff[offset++];
//if(XBYTE[XDATAAddr++] != buff[offset++])
if(temp1!=temp2)
{
printf("\r\n Error ",0);
printf("\r\n 1E07=%x",XBYTE[0x1E07] );
printf("\r\n 1E08=%x",XBYTE[0x1E08] );
printf("\r\n offset=%x", offset-1);
printf("\r\n scr=%x", temp2);
printf("\r\n dst=%x", temp1);
temp1=XBYTE[XDATAAddr-1];
temp2=buff[offset-1];
if(temp1==temp2)
{
printf("\r\n ReadCmpSame ",0);
printf("\r\n scr=%x", temp2);
printf("\r\n dst=%x", temp1);
}
else
{
printf("\r\n ErrorAgain ",0);
printf("\r\n scr=%x", temp2);
printf("\r\n dst=%x", temp1);
}
}
#ifdef USB_DEBUG
//printf("%x ",buff[offset]);
#endif
dCount++;
}
}
#ifdef USB_DEBUG
//printf("\r\ndCount=%x ",dCount);
//printf("\r\noffset=%x ",offset);
#endif
}
else //for DRAM
{
//printf("\r\n check4", 0);
XDATAAddr = u32src - (__u32)USB_TTX_FIX_XDATA_ADDR +1024;
XBYTE[0x1E07]=(__u8)((((__u32)u32dst >> 10)) ); //SDRAM_XD_MAP_L: XXh * 1k
XBYTE[0x1E08]=(__u8)((((__u32)u32dst >> 10)) >> 8); //SDRAM_XD_MAP_H: XXh * 256 * 1k
i=0;
while(dCount != u32len)
{
if (offset>1023)
{
if (XBYTE[0x1E07]!=0xff)
XBYTE[0x1E07]=XBYTE[0x1E07]+1;
else
{
XBYTE[0x1E07]=0;
XBYTE[0x1E08]=XBYTE[0x1E08]+1;
}
for(j = 0 ; j <1024 ; j++)
buff[j]= XBYTE[XDATAAddr++];
offset=0;
i=0;
#ifdef USB_DEBUG
//printf("\r\nDDATAAddr=%x \r\n",XDATAAddr);
#endif
}
XBYTE[0xF800 + offset] = buff[i++];
#ifdef USB_DEBUG
//printf("%x ",buff[i]);
#endif
offset++;
dCount++;
}
#ifdef USB_DEBUG
//printf("\r\ndCount=%x ",dCount);
//printf("\r\noffset=%x ",offset);
#endif
}
}
#endif
#ifdef Enable_OTG_Host
__u8 usbHost_Send_EP0Setup(__u8 *buffer)
{
usbIntStatus=0xff;
usbDRC_Index_Select(0);
usbEP[0].IOState = EP_TX;
usbEP[0].BytesRequested = sizeof(struct devrequest);
usbEP[0].BytesProcessed = 0;
usbEP[0].LastPacket = 0;
//printf("\r\n s14_1", 0);
#ifdef Artemis_DEBUG3
printf ("\r\nb1=%x", *buffer);
printf ("\r\nb2=%x", *(buffer+1));
printf ("\r\nb3=%x", *(buffer+2));
printf ("\r\nb4=%x", *(buffer+3));
printf ("\r\nb5=%x", *(buffer+4));
printf ("\r\nb6=%x", *(buffer+5));
printf ("\r\nb7=%x", *(buffer+6));
printf ("\r\nb8=%x", *(buffer+7));
#endif
usbDRC_Fifo_Write(buffer, 0);
usbREG_WRITE8(USB_REG_TXCSR1, M_CSR0_TXPKTRDY | M_CSR0_H_SETUPPKT);
while(usbIntStatus==0xff);/*While Looping_Free:<Unused codes>*/
//while(usbREG_READ8(USB_REG_TXCSR1)&M_CSR0_TXPKTRDY);
//printf("\r\n CK1=%x", usbIntStatus);
#if 0
if (otgIntStatus!=USB_ST_NOERROR)
usbReset_DRC_Core();
#endif
//printf("\r\n s14_2", 0);
return usbIntStatus;
}
#endif
//artemis add at 03/08/2007
__u8 usb_Ret_Blt_EP_Object(__u8 drcdir)
{
__u8 i;
for(i=0;i<usbNumEPDefs;i++)
{
if((usbEP[i].pipe==PIPE_BULK) && (usbEP[i].DRCDir==drcdir))
return i;
}
}//end add
#ifdef Enable_OTG_Host
__u8 usbSend_TXDATA(__u32 txaddr,__u32 txsize)
{
//__u8 i,TogCount=0;
__u8 inreg,outreg=0,ep;
//usbIntStatus=0xff;
usbBulkInStatus=0xff;
ep = usb_Ret_Blt_EP_Object(EP_TX); //artemis add at 03/08/2007
usbEP[ep].IOState = EP_TX;
usbEP[ep].BytesRequested = txsize;
usbEP[ep].BytesProcessed = 0;
usbEP[ep].LastPacket = 0;
usbEP[ep].transfer_buffer=txaddr;
//printf("\r\n BltEP=%x", usbEP[ep].BltEP);
//usbEP[ep].BltEP=1;//artemis force this value
usbDataPhaseDir=usb_sndbulkpipe(usbEP[ep].BltEP); //PIPE_OUT
//printf("\r\n Dir=%x",usbDataPhaseDir);
if(EPConfig&0x10)
{
//printf("\r\n tx=%x",usbEP[ep].BltEP2);
usbEnable_EP_DRC2(usbEP[ep].BltEP);
usbDRC_Index_Select(usbEP[ep].BltEP2);
//recoder togle status
/*
if(txsize%64)
TogCount=((txsize-(txsize%64))/64)+1;
else
TogCount=txsize/64;
for(i=0;i<TogCount;i++)
{
EPConfig= EPConfig^0x05; //togle Tx and TRx
}*/
//end recoder
}
else
{
usbDRC_Index_Select(usbEP[ep].BltEP);
}
//while( ((usbREG_READ8(USB_REG_TXCSR1))& M_TXCSR1_FIFONOTEMPTY)&&(usbConnectFlag));
inreg = usbREG_READ8(USB_REG_TXCSR1);
if(inreg&0x80)
printf("\r\n Tinreg=%x", inreg);
if DRCHOST(usbRegDevCtl)
usbEP[ep].IOState = EP_TX;
else
{
if (inreg & M_TXCSR1_P_SENTSTALL)
outreg |= M_TXCSR1_CLRDATATOG;
}
if (!(inreg & M_TXCSR1_FIFONOTEMPTY)||(outreg & M_TXCSR1_CLRDATATOG))
{
#ifdef DMA
#ifdef Artemis_DEBUG5
printf("\r\n txadr1=%x",(__u16)(txaddr>>16));
printf(" %x",(__u16)(txaddr));
printf("\r\n txadr2=%x",(__u16)(usbEP[ep].transfer_buffer>>16));
printf(" %x",(__u16)(usbEP[ep].transfer_buffer));
#endif
if(!usbConnectFlag)
return(usbBulkInStatus);//0);
if(usbSet_DMA(ep, DMA_TX_ONE_IRQ) < 0)
{
if(!usbConnectFlag)
return(usbBulkInStatus);//0);
usbDRC_Fifo_Write((__u8 *)usbEP[ep].transfer_buffer, ep);
outreg |= M_TXCSR1_TXPKTRDY;
}
else
outreg = 0;
#else
//printf("\r\n achk11=%x",usbEP[ep].MaxEPSize);
//printf("\r\n achk12=%x",usbEP[ep].BytesProcessed);
//printf("\r\n achk13=%x",usbEP[ep].BytesRequested);
if(!usbConnectFlag)
return(usbBulkInStatus);//0);
usbDRC_Fifo_Write((__u8 *)usbEP[ep].transfer_buffer, ep);
outreg |= M_TXCSR1_TXPKTRDY;
//printf("\r\n achk1=%x",usbREG_READ8(USB_REG_TXCSR1));
#endif
}
if (outreg)
{
if(!usbConnectFlag)
return(usbBulkInStatus);//0);
usbREG_WRITE8(USB_REG_TXCSR1, outreg);
//printf("\r\n achk2=%x",outreg);
}
while((usbBulkInStatus)==0xff && (usbConnectFlag));/*While Looping_Free:<Unused codes>*/
#if 0
//printf("\r\n achk3=%x",usbIntStatus);
if (DRCHOST(usbRegDevCtl))
{
if (usbBulkInStatus!=USB_ST_NOERROR)
usbReset_DRC_Core();
}
#endif
return (usbBulkInStatus);
}
__u8 usbReceive_RXDATA(__u32 rxaddr,__u32 rxsize)
{
//__u8 i,TogCount=0;
__u8 inreg,outreg=0,ep;
//usbIntStatus=0xff;
usbBulkOutStatus=0xff;
ep = usb_Ret_Blt_EP_Object(EP_RX); //artemis add at 03/08/2007
usbEP[ep].IOState = EP_RX;
usbEP[ep].BytesRequested = rxsize;
usbEP[ep].BytesProcessed = 0;
usbEP[ep].LastPacket = 0;
usbEP[ep].transfer_buffer=rxaddr;
usbDataPhaseDir=usb_rcvbulkpipe(usbEP[ep].BltEP); //PIPE_IN
if(EPConfig&0x10)
{
//printf("\r\n rx=%x",usbEP[ep].BltEP2);
usbEnable_EP_DRC2(ep);
usbDRC_Index_Select(usbEP[ep].BltEP2);
//recoder togle
/*
if(rxsize%64)
TogCount=((rxsize-(rxsize%64))/64)+1;
else
TogCount=rxsize/64;
for(i=0;i<TogCount;i++)
{
EPConfig= EPConfig^0x03;//togle Rx and TRx
}*/
//end recoder
}
else
{
usbDRC_Index_Select(usbEP[ep].BltEP);
}
inreg = usbREG_READ8(USB_REG_RXCSR1);
if(inreg & 0x04)
printf("\r\n Rinreg=%x", inreg);
if (DRCHOST(usbRegDevCtl)) //in host mode
{
#ifdef DMA
//printf("\r\n Brq0=%x", (__u16)usbEP[ep].BytesRequested); //artemis modify 02/15/2007
//printf("\r\n Brq1=%x", (__u16)(usbEP[ep].BytesRequested >>16)); //artemis modify 02/15/2007
//printf("\r\n Max=%x", usbEP[ep].MaxEPSize); //artemis modify 02/15/2007
//printf("\r\n Dir=%x", usb_pipebulk(usbDataPhaseDir)); //artemis modify 02/15/2007
if (usb_pipebulk(usbDataPhaseDir)&&(usbEP[ep].BytesRequested >= usbEP[ep].MaxEPSize))
{
//#ifdef Artemis_DEBUG
//printf("\r\n rxsize=%lx", rxsize); //artemis modify 02/15/2007
//#endif
//usbEP[ep].BytesRequested=usbEP[ep].BytesRequested+13;
//usbREG_WRITE8(USB_REG_RXCSR1, inreg|~M_RXCSR1_RXPKTRDY);
if(!usbConnectFlag)
return(usbBulkInStatus);//0);
usbSet_DMA(ep, DMA_RX_ONE_IRQ);
//usbREG_WRITE8(USB_REG_RXCSR2,(usbREG_READ8(USB_REG_RXCSR2)| M_RXCSR2_H_AUTOREQ ));
if(!usbConnectFlag)
return(usbBulkInStatus);//0);
usbREG_WRITE8(USB_REG_RXCSR1, M_RXCSR1_H_REQPKT);
if(!usbConnectFlag)
{
//usbReset_DRC_Core();
return(usbBulkInStatus);//0);
}
}
else
#endif
{
if(!usbConnectFlag)
return(usbBulkInStatus);//0);
usbREG_WRITE8(USB_REG_RXCSR1, M_RXCSR1_H_REQPKT);
if(!usbConnectFlag)
{
//usbReset_DRC_Core();
return(usbBulkInStatus);//0);
}
}
}
while((usbBulkOutStatus==0xff)&&(usbConnectFlag));/*While Looping_Free:<Unused codes>*/
return (0);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -