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

📄 msdrc.c

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