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

📄 msdrc.c

📁 MSTAR03的数码相框的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "sysinfo.h"
#include "DrvOTGMain.h"
#include "mcu.h"
#include <stdlib.h>
#include <string.h>
//#include "uart.h"
//#include "MsMcu.h"

struct devrequest volatile usbEP0Setup;
endpoint_t volatile usbEP[usbNumEPDefs];
extern U8 u8varOTG_FORCE_FS;
__s8 volatile usbResetting;
__s8 volatile usbRegPower;
__u8 volatile usbIntStatus;
__u8 volatile usbDataPhaseDir;
__u8 volatile usbIntInStatus;
__u8 volatile usbBulkInStatus;
__u8 volatile usbBulkOutStatus;
__u8 volatile GetPartHeaderTransfer;

__u8 volatile usbBulkInStatus2;

//__u8 volatile usbPictCmdRevFlag;
__u8 volatile usbPictRxDataReceived;

__u32 volatile USB_TTX_FIX_XDATA_ADDR;
__u8 gu8LunMapping[TOTAL_LUN];
void InitUSBVar(__u8 Device_Mode_Type)
{
   //usbPictCmdRevFlag=0;
   usbPictRxDataReceived=0;
   usbStillImageSts=0;
   usbSetFaddr=0;
   usbClearedEP=0;
   usbMyDeviceHNPSupport=1;

   usbReqOTGState=0;
   usbCurOTGState=AB_IDLE;

   usbSessRequest=0;
   usbResuming=0;
   usbSuspended=0;
   usbRemoteWakeup=0;
   usbHNPEnabled=0;
   usbHNPSupport=0;
   usbSRPSupport=0;
   usbSelfPower=1;
   usbEP0State=0;
   usbConfig=0;
   usbInterface=0;
   usbUSBState=0;
   usbcid=0;
   usbFaddr=0;
   usbRegDevCtl=0;
   usbSpeed=0;
   usbDescFoundOTG=0;
   usbConnectFlag=0;
   NotifyusbConnect=0;

   pbGetImageFlag=0;

   usbResetComplete=0;
   ProcessCount=1;
   DetCount=0;
   NotifyusbConnect2=0;
   HostMassmax_Lun=0;
   HostMassValid_Lun=0;
   EPConfig=0;

   IntCheck=0; // for test

    DviceMassmax_Lun=0;
#ifndef Only_NAND_Exist
    #if ENABLE_SD_MS_XD_MULTISLOT
    gu8LunMapping[DviceMassmax_Lun] = eSD_MS_XD;
    DviceMassmax_Lun++;
    #else
        #if (ENABLE_SD_MMC)
        gu8LunMapping[DviceMassmax_Lun] = eSDMMC;
        DviceMassmax_Lun++;
        #endif
        #if (ENABLE_MS||ENABLE_MSPRO)
        gu8LunMapping[DviceMassmax_Lun] = eMSMSP;
        DviceMassmax_Lun++;
        #endif
        #if (ENABLE_SM||ENABLE_XD)
        gu8LunMapping[DviceMassmax_Lun] = eSMXD;
        DviceMassmax_Lun++;
        #endif
    #endif

    #if ENABLE_CF
    gu8LunMapping[DviceMassmax_Lun] = eCF;
    DviceMassmax_Lun++;
    #endif

    #ifdef SUPPORT_NAND_DISK    // NAND use one LUN
    gu8LunMapping[DviceMassmax_Lun] = eNAND;
    DviceMassmax_Lun++;
    #endif

    #if ENABLE_NOR_DEBUG     // NOR use one LUN
    gu8LunMapping[DviceMassmax_Lun] = eNOR;
    DviceMassmax_Lun++;
    #endif

#else   // Only_NAND_Exist
    gu8LunMapping[DviceMassmax_Lun] = eNAND;
    DviceMassmax_Lun++;  // Only NAND LUN
#endif
    DviceMassmax_Lun -= 1;  // MaxLUN = TotalLUN - 1;
    /*
   #ifdef SUPPORT_NAND_DISK
     #ifdef Only_NAND_Exist
     DviceMassmax_Lun=0;
     #else // card reader and NAND exist at same time
     DviceMassmax_Lun=1;
     #endif
   #else
   DviceMassmax_Lun=0;
   #endif
    */
   usbMassRxDataReceived=0;
   usbMassCmdRevFlag=0;

   OtgDeviceType=Device_Mode_Type;

}

void LopezUSBInit(void)
{
   usbREG_WRITE8(0x80,0x00); // setting Srst_n
   usbREG_WRITE8(0x80,0x01); // close Srst_n
   usbREG_WRITE8(0x83,0x00); // setting reg_usbotg, clear VBUSDET_PDN
   usbREG_WRITE8(0x84,0x04); // clear reg_suspend, set otg_clk_en = 1

   XBYTE[0x1EA1]=0x06; //switch pad_GPIOT0  to otg_drvvbus

}

void usbDRCInit(void)
{
   usbResetting=0;

   usbRegPower=0;
   usbIntStatus=0;
   usbIntInStatus=0;
   usbBulkInStatus=0;
   usbBulkOutStatus=0;
   usbDataPhaseDir=0;

   usbBulkInStatus2=0;

}

void usbEnable_EP_DRC(__u8 ep);
void usbEnable_EP_DRC2(__u8 ep);
void usbParse_DRC_Int(drcintitem_t *dP);

void usbRead_DRC_Power(void)
{
   usbRegPower = usbREG_READ8(USB_REG_POWER);/* and refresh */
}

void usbRead_DRC_Devctl(void)
{
   usbRegDevCtl = usbREG_READ8(REG_DEVCTL);/* and refresh */
}

void usbRefresh_DRC_Registers(void)
{
   usbRead_DRC_Power();
   usbRead_DRC_Devctl();
}

#ifdef Enable_OTG_Host
void usbReset_DRC_Core(void)
{
   __u8   i;
   __s8 SRPEnabled=0;

   printf("\r\n Reset_DRC",0);
   usbResetting = 1;
   usbCurOTGState = 0;
   //////////////    USB_Disable_USB_Ints();
   //MsOS_DisableInterrupt (E_INT_USB);
   usbREG_WRITE8(USB_REG_FADDR, 0);
   //usbREG_WRITE8(USB_REG_POWER, M_POWER_SOFTCONN | M_POWER_HSENAB);
   usbREG_WRITE8(USB_REG_POWER, M_POWER_SOFTCONN | M_POWER_ENSUSPEND);
   usbREG_WRITE8(REG_DEVCTL,0);
   for ( i=0; i < usbNumEPDefs; i++)
     usbReset_EP_DRC_Regs(i);
   usbReset_All_EP_IO_Vars();
   usbREG_WRITE8(USB_REG_INTRUSBE, ((__u8)(~0) ^ M_INTR_SOF));/* no sof int*/
   usbSet_DRC_Interrupts();
   usbClear_DRC_Interrupts();
   ///////////////////////    USB_Enable_USB_Ints();
   //MsOS_EnableInterrupt(E_INT_USB);
   usbResetting = 0;
   usbRefresh_DRC_Registers();
   usbEP0State = 0;
   usbUSBState = 0;
   SRPEnabled = NO;
   if(!usbFaddr)
     usbFaddr = 2;          /* use 2 for all ADDRESS function */
   usbChange_OTG_State(AB_IDLE);
}
#endif

void usbSet_DRC_Power(__u8  regupdate)
{
   usbRegPower |= regupdate;
   usbREG_WRITE8(USB_REG_POWER,usbRegPower);
   usbRegPower = usbREG_READ8(USB_REG_POWER);
}


void usbClear_DRC_Power( __u8 regupdate)
{
   if  (!regupdate)
   {
     if (u8varOTG_FORCE_FS||(CHIP_VERSION<=CHIP_VER_U02))
     usbRegPower = M_POWER_SOFTCONN;
   else
       usbRegPower = M_POWER_SOFTCONN | M_POWER_HSENAB;

   }
   else
     usbRegPower &= ~regupdate;

   usbREG_WRITE8(USB_REG_POWER,usbRegPower);
   usbRegPower = usbREG_READ8(USB_REG_POWER);
}

void usbSet_DRC_Devctl(__u8 regupdate)
{
   usbRegDevCtl |= regupdate;
   usbREG_WRITE8(REG_DEVCTL,usbRegDevCtl);
   usbRegDevCtl = usbREG_READ8(REG_DEVCTL);
}

void usbClear_DRC_Devctl(__u8 regupdate)
{
   if(!regupdate)
     usbRegDevCtl = 0;
   else
     usbRegDevCtl &= ~regupdate;
   usbREG_WRITE8(REG_DEVCTL,usbRegDevCtl);
   usbRegDevCtl = usbREG_READ8(REG_DEVCTL);
}

///////////////////
void USB_Setup_Endpoint(__s8 epnum,__s8 epdir,__s8 eptype,__s8 epinf ,__s16 epmaxps)
{
   usbEP[epnum].MaxEPSize = epmaxps;
   usbEP[epnum].DRCDir = epdir;
   usbEP[epnum].FifoRemain = 0;
   usbEP[epnum].BytesRequested = 0;
   usbEP[epnum].BytesProcessed = 0;
   usbEP[epnum].pipe = eptype;
   usbEP[epnum].BltEP = epnum;
   usbEP[epnum].LastPacket = 0;
   usbEP[epnum].transfer_buffer = 0;
   usbEP[epnum].transfer_buffer_length = 0;
   usbEP[epnum].IOState = EP_IDLE;
   usbEP[epnum].Halted = 0;
   usbEP[epnum].Infnum = epinf;
   if (epnum!=0)
     usbEnable_EP_DRC(epnum);
}

void usbDRC_Index_Select_INT(__u8 epnum)
{
   __u8    reg;

   reg = usbREG_READ8(USB_REG_INDEX);
   if  (reg != epnum)
     usbREG_WRITE8(USB_REG_INDEX, epnum);
}


void usbEnable_EP_DRC(__u8 ep)
{
   __u8 reg;
   __u16 csr;


   usbDRC_Index_Select_INT(usbEP[ep].BltEP);
   reg = (usbEP[ep].BltEP2 & 0x0f) | ((usbEP[ep].pipe & 0x03) << 4);

   #ifdef  BIG_ENDIAN
   csr = usbREG_READ8(USB_REG_RXCSR);
   #else
   csr = usbREG_READ16(USB_REG_RXCSR);
   #endif
   if(usbEP[ep].DRCDir == FIFO_RX)
   {
     usbREG_WRITE8(USB_REG_RXTYPE, reg);
     #ifdef  BIG_ENDIAN
     usbREG_WRITE16(USB_REG_RXMAXP, Swap16(usbEP[ep].MaxEPSize));
     #else
     usbREG_WRITE16(USB_REG_RXMAXP, usbEP[ep].MaxEPSize);
     #endif
	 if (csr & M_RXCSR_RXPKTRDY)
	 {
	   usbEP[ep].FifoRemain = usbRead_RxCount();
	 }
	 else
	 {
	   csr = M_RXCSR_CLRDATATOG;
	 }

	 if (usbEP[ep].pipe == USB_ENDPOINT_XFER_INT)
	   csr |= M_RXCSR_DISNYET;
     #ifdef  BIG_ENDIAN
     usbREG_WRITE16(USB_REG_RXCSR, Swap16(csr));
     #else
     usbREG_WRITE16(USB_REG_RXCSR, csr);
     #endif
     usbREG_WRITE16(USB_REG_TXCSR, 0);

     if(usbIsHOST())
	 {
       //printf("\r\n ar1=%x",usbREG_READ8(USB_REG_RXINTERVAL));
	   usbREG_WRITE8(USB_REG_RXINTERVAL,0x0);
	   //printf("\r\n ar2=%x",usbREG_READ8(USB_REG_RXINTERVAL));
	 }

   }
   else
   {
     usbREG_WRITE8(USB_REG_TXTYPE, reg);
     #ifdef  BIG_ENDIAN
     usbREG_WRITE16(USB_REG_TXMAXP, Swap16(usbEP[ep].MaxEPSize));
     usbREG_WRITE16(USB_REG_TXCSR, Swap16(M_TXCSR_FLUSHFIFO));
     #else
     usbREG_WRITE16(USB_REG_TXMAXP, usbEP[ep].MaxEPSize);
     usbREG_WRITE16(USB_REG_TXCSR, M_TXCSR_FLUSHFIFO);
     #endif
     csr = M_TXCSR_MODE | M_TXCSR_CLRDATATOG;
     #ifdef  BIG_ENDIAN
     usbREG_WRITE16(USB_REG_TXCSR, Swap16(csr));
     #else
     usbREG_WRITE16(USB_REG_TXCSR, csr);
     #endif
     if(usbIsHOST())
	 {
       //printf("\r\n at1=%x",usbREG_READ8(USB_REG_TXINTERVAL));
	   usbREG_WRITE8(USB_REG_TXINTERVAL,0x0);
	   //printf("\r\n at2=%x",usbREG_READ8(USB_REG_TXINTERVAL));
	 }
   }
}

#ifdef Enable_OTG_Host
void usbEnable_EP_DRC2(__u8 ep)
{
   __u8 reg;
   __u16 csr;


   usbDRC_Index_Select_INT(usbEP[ep].BltEP2);
   reg = (usbEP[ep].BltEP2 & 0x0f) | ((usbEP[ep].pipe & 0x03) << 4);

   #ifdef  BIG_ENDIAN
   csr = usbREG_READ8(USB_REG_RXCSR);
   #else
   csr = usbREG_READ16(USB_REG_RXCSR);
   #endif
   if(usbEP[ep].DRCDir == FIFO_RX)
   {
     usbREG_WRITE8(USB_REG_RXTYPE, reg);
     #ifdef  BIG_ENDIAN
     usbREG_WRITE16(USB_REG_RXMAXP, Swap16(usbEP[ep].MaxEPSize));
     #else
     usbREG_WRITE16(REG_RXMAXP, usbEP[ep].MaxEPSize);
     #endif
	 if (csr & M_RXCSR_RXPKTRDY)
	 {
	   usbEP[ep].FifoRemain = usbRead_RxCount();
	 }
	 else
	 {
	   //csr = M_RXCSR_CLRDATATOG;
	 }

	 if (usbEP[ep].pipe == USB_ENDPOINT_XFER_INT)
	   csr |= M_RXCSR_DISNYET;
     #ifdef  BIG_ENDIAN
     usbREG_WRITE16(USB_REG_RXCSR, Swap16(csr));
     #else
     usbREG_WRITE16(USB_REG_RXCSR, csr);
     #endif
     usbREG_WRITE16(USB_REG_TXCSR, 0);
   }
   else
   {
     usbREG_WRITE8(USB_REG_TXTYPE, reg);
     #ifdef  BIG_ENDIAN
     usbREG_WRITE16(USB_REG_TXMAXP, Swap16(usbEP[ep].MaxEPSize));
     usbREG_WRITE16(USB_REG_TXCSR, Swap16(M_TXCSR_FLUSHFIFO));
     #else
     usbREG_WRITE16(USB_REG_TXMAXP, usbEP[ep].MaxEPSize);
     usbREG_WRITE16(USB_REG_TXCSR, M_TXCSR_FLUSHFIFO);
     #endif
     csr = M_TXCSR_MODE;// | M_TXCSR_CLRDATATOG;
     #ifdef  BIG_ENDIAN
     usbREG_WRITE16(USB_REG_TXCSR, Swap16(csr));
     #else
     usbREG_WRITE16(USB_REG_TXCSR, csr);
     #endif
   }
}
#endif
#if 1
void usbDRC_Fifo_Read_INT(__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;
   if (ep==0)
     usbEP[ep].BltEP=0;
   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)
   {
     while (readcount > 0)/*While Looping_Free:<Exit counter added>*/
	 {
       *((__u8 volatile xdata *)dstP)=*((__u8 volatile xdata *)fifo);
	   //if (ep!=0)
	       //printf("%x ",*((__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--;
	 }
   }
   #endif
}

void usbDRC_Fifo_Write_INT(__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;
   fifo=FIFO_ADDRESS(usbEP[ep].BltEP);
   #ifdef USB_DEBUG
   //printf("\r\nwfifo = %x ",fifo);
   //printf("\r\nwritecount = %x ",nwritecount);
   //printf("\r\nsrcP = %x ",(__u16)srcP);
   #endif
   /* byte access for unaligned */
   if (writecount > 0)
   {
     while(writecount)/*While Looping_Free:<Exit counter added>*/
	 {
       //#ifdef USB_DEBUG
       //printf("   srcP = %x ",(__u8 )*((__u8 volatile xdata *)srcP));
       //#endif
	   *((__u8 volatile xdata *)fifo) = *((__u8 volatile xdata *)srcP);
	   srcP++;
	   writecount--;
	 }
   }
}
#else
void usbDRC_Fifo_Read_INT(__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);
   *dstP = *((__u8 *)fifo);
   if ((readcount > 0)&& ((__u32) dstP & 3))
   {
     while (readcount > 0)
	 {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -