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

📄 msusb.c

📁 MSTAR03的数码相框的代码
💻 C
字号:
#include "DrvOTGMain.h"
#include "drvtimer.h"
#include "drvUTMI.h"
__u32 * usbMass_Data_Buffer_Addr;
__u32 * usbCSW_Addr ;
__u32 * usbCBW_Addr;
__u32 * usbCBWCB_Addr;

#ifdef Enable_OTG_Host_MassStorage_Share
__u8 usbCBW[MSD_BOT_CBW_LENGTH]  _at_ Host_XDATA_START_ADDR;
__u8 usbCSW[MSD_BOT_CSW_LENGTH] _at_ Host_XDATA_START_ADDR+0x30;
#ifdef No_use_usbMass_Data_Buffer
__u8 usbMass_Data_Buffer[64]  _at_ Host_XDATA_START_ADDR+0x40;
#else
__u8 usbMass_Data_Buffer[MASS_BUFFER_SIZE]  _at_ Host_XDATA_START_ADDR+0x40;
#endif

extern U8 u8varOTG_FORCE_FS;

void otgInitMassBuffer(void)
{
   usbMass_Data_Buffer_Addr = (__u32)&usbMass_Data_Buffer[0];
   usbCSW_Addr = (__u32)&usbCSW[0];
   usbCBW_Addr = (__u32)&usbCBW[0];
   usbCBWCB_Addr = (__u32)&usbCBW[15];
}
#endif

void OTGUSBInitial(__u32 xdataaddr,__u8 Device_Mode_Type)
{
   USB_TTX_FIX_XDATA_ADDR=xdataaddr;
   //LopezUSBInit();
   InitUSBVar(Device_Mode_Type);
   usbDRCInit();
   usbDesInit();
   usbREG_WRITE8(USB_REG_FADDR, 0);
   //usbREG_WRITE8(USB_REG_POWER, M_POWER_SOFTCONN|M_POWER_ENSUSPEND);
   usbSet_DRC_Interrupts();
   #if (CERAMAL_STEPPING>=2)

   //XBYTE[0x2680]|=0x01; //clear OTG reset
   // Derek Modify
   XBYTE[REG_UTMI_REG0] |= (reg_dp_puen+reg_term_override); //Enable term_over and dp_puen
   MDrv_Timer_Delayms(30);
   XBYTE[0x1F07] |= 0x04;                    // Test for U02 change clock
   if (u8varOTG_FORCE_FS||(CHIP_VERSION<=CHIP_VER_U02))
   {
        usbREG_WRITE8(USB_REG_TESTMODE, M_TEST_FORCEFS);   //force FS
        usbREG_WRITE8(USB_REG_POWER, M_POWER_SOFTCONN);
    }
   else
        usbREG_WRITE8(USB_REG_POWER, M_POWER_SOFTCONN|M_POWER_HSENAB);

   //for test use
   //XBYTE[0x1E83]&=0xFE; // set GPIOA8 as 0
   //XBYTE[0x1E81]&=0xFE; // GPIOA8 output enable
   //printf("\r\n set GPIOA8",0);
   XBYTE[REG_UTMI_REG0] &= ~(reg_dp_puen+reg_term_override); //disable term_over and dp_puen

   //XBYTE[0x1F15]|=0x02; //enable make over write mode
   //end for test use

   #else
   usbREG_WRITE8(USB_REG_POWER, M_POWER_SOFTCONN|M_POWER_HSENAB);
   #endif
   usbREG_WRITE8(REG_DEVCTL,0);

}

void usbChange_USB_State(__u8 toUSB)
{
   switch  (toUSB)
   {
     case USB_POWERED:	/* HOST:CONNECT DRC INT;PER:exit active mode*/
          usbSuspended = 0;
	      usbResuming = 0;
          break;
     case USB_DEFAULT:	/* HOST:Reset complete;PER: RESET DRC INT */
          usbHNPEnabled = 0;
          usbHNPSupport = 0;
	      usbSRPSupport = 0;
          usbRemoteWakeup = 0;
	      usbDescFoundOTG=0;
	      usbEP0State = 0;
          usbSuspended = 0;
          break;
     case USB_ADDRESS:
          usbConfig = 0;
          break;
     case USB_CONFIGURED:
          break;
     default:
          break;
   }
   usbUSBState = toUSB;
}

__u8 usbIsUSBConfiged(void)
{
   if (usbUSBState==USB_CONFIGURED)
     return 1;
   else
	 return 0;
}

#ifdef Enable_Device_MassStorage
void USB_Send_Stall(__u8 ep)
{
   __u8 csr, tbit;
   __u16 reg;
   __u32 u32Cnt=0;

   if (usbEP[ep].BltEP == 0)
   {
     reg = USB_REG_CSR0;
	 tbit = M_CSR0_P_SENDSTALL;
	 csr = usbREG_READ8(reg);
     usbREG_WRITE8(reg, (csr | tbit));
   }
   else
   {
     usbDRC_Index_Select(usbEP[ep].BltEP);

     if (usbEP[ep].DRCDir)   /* RX */
	 {
	   reg = USB_REG_RXCSR1;
	   tbit = M_RXCSR1_P_SENDSTALL;
	   csr = usbREG_READ8(reg);
       usbREG_WRITE8(reg, (csr | tbit));
	 }
	 else             /* TX */
	 {
	   reg = USB_REG_TXCSR1;
	   tbit = M_TXCSR1_P_SENDSTALL;
	   csr = usbREG_READ8(reg);
	   usbREG_WRITE8(USB_REG_TXCSR1, (csr | tbit));
	 }
   }

   //csr = usbREG_READ8(reg);
   //usbREG_WRITE8(reg, (csr | tbit));
   if (usbEP[ep].DRCDir)   /* RX */
   {
     while((usbREG_READ8(USB_REG_RXCSR1)&M_RXCSR1_P_SENDSTALL)&&usbConnectFlag)/*While Looping_Free:<Exit counter added>*/
     {
       if(++u32Cnt>0x3FFFF)
        break;
     }
   }
   else             /* TX */
   {
     while((usbREG_READ8(USB_REG_TXCSR1)&M_TXCSR1_P_SENDSTALL)&&usbConnectFlag)/*While Looping_Free:<Exit counter added>*/
     {
       if(++u32Cnt>0x3FFFF)
        break;
     }
   }


}
#endif

void usbSWOP_Setup(struct devrequest *sP)
{
   SWOP(sP->wValue);
   SWOP(sP->wIndex);
   SWOP(sP->wLength);
}

#ifdef Enable_OTG_Host
void usbSWOP_Device_Descriptor(void *vP)
{
   struct usb_device_descriptor *sP = (struct usb_device_descriptor *)vP;

   SWOP(sP->bcdUSB);
   SWOP(sP->idVendor);
   SWOP(sP->idProduct);
   SWOP(sP->bcdDevice);
}

void usbSWOP_Endpoint_Descriptor(void *vP)
{
   usb_endpoint_descriptor *sP = (usb_endpoint_descriptor *)vP;

   SWOP(sP->wMaxPacketSize);
}

void usbSWOP_Config_Descriptor(void *vP)
{
   usb_config_descriptor *sP = (usb_config_descriptor *)vP;

   SWOP(sP->wTotalLength);
}
#endif



⌨️ 快捷键说明

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