📄 msusb.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 + -