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

📄 msdrc.c

📁 MSTAR03的数码相框的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
   __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 + -