📄 mshost.c
字号:
#include "DrvOTGMain.h"
//#include "uart.h"
//#include "common.h"
#include "drvtimer.h"
//#pragma NOAREGS
//#pragma REGISTERBANK(3)
static code const char msHost_dummy_constant=0;
#if (ENABLE_OTG_HOST == ENABLE)
struct usb_device *USBDev, USBDevP;
extern __s8 usbMSD_BOT_Get_Max_LUN(void);
void usbParse_Config(__u8 configno,__u8* SCSIBOT);
void usbEP0_Set_Feature(__u16 feature);
void usbEP0_Select_Config(__u16 config);
int USB_Driver_Probe(__u8 scsibotflag,__u8 hubclassflag);
void usbParse_DRC_Int_Host(drcintitem_t *dP)
{
__u8 outreg;
__s8 ep;
//__u32 temp;
outreg = 0;
//artemis modify at 11.29.2006
//ep = usb_Ret_Blt_EP_Object(dP->IIntSrc);//artemis modify at 11.29.2006
ep=dP->IEP;
//end modify
////// ep = usb_Ret_Blt_EP_Object(d.IEP);
usbEP[ep].FifoRemain = dP->ICount;
usbIntStatus = 0xff;
usbDRC_Index_Select(dP->IEP);
//printf("\r\n s3=%x",ep);
do
{
if (!dP->IEP) /* EP0,reg=csr0*/
{
//printf("\r\n s4=%x",dP->IReg);
if (dP->IReg & M_CSR0_H_ERROR)
usbIntStatus = USB_ST_NORESPONSE;
if (dP->IReg & M_CSR0_H_RXSTALL)
usbIntStatus = USB_ST_STALL;
if (usbIntStatus != 0xff) ///////ERR
{
usbREG_WRITE8(USB_REG_CSR0, 0);
break;
}
if (usb_pipein(usbDataPhaseDir)) //next -->control IN
{
//printf("\r\n s4=%2bx\n",usbEP[ep].IOState);
if (EP_EQ_TX(usbEP[ep].IOState)) //cur state -->TX(if true then setup or status)
{
//printf("\r\n s4_1",0);
if (EP_EQ_ST(usbEP[ep].IOState)) //host TX status
usbIntStatus = USB_ST_NOERROR;
else
{
//printf("sts0=%2bx\n",usbEP[ep].IOState);
usbEP[ep].IOState = EP_RX; //set next state -->host RX data after setup
usbEP[ep].BytesProcessed = 0;
//temp=usbEP[ep].transfer_buffer_length;
//usbEP[ep].BytesRequested =temp;
/*
*((U8*)(&usbEP[ep].BytesRequested)+0) = *((U8*)(&temp)+0);
*((U8*)(&usbEP[ep].BytesRequested)+1) = *((U8*)(&temp)+1);
*((U8*)(&usbEP[ep].BytesRequested)+2) = *((U8*)(&temp)+2);
*((U8*)(&usbEP[ep].BytesRequested)+3) = *((U8*)(&temp)+3);
*/
usbEP[ep].BytesRequested = usbEP[ep].transfer_buffer_length;
//printf("temp=%lx\n",temp);
//printf("sts=%2bx\n",usbEP[ep].IOState);
//printf("ep=%bx\n",ep);
//printf("s40=%lu\n", (__u32)usbEP[ep].BytesRequested);
//printf("s41=%lu\n", (__u32)usbEP[ep].transfer_buffer_length);
outreg = M_CSR0_H_REQPKT;
}
}
else
{
//printf("\r\n s4_2",0);
if (dP->IReg & M_CSR0_RXPKTRDY) //cur state -->host RX data
{
usbEP[ep].FifoRemain = dP->ICount;
usbDRC_Fifo_Read((__u8 *)usbEP[ep].transfer_buffer,ep);
if ( usbEP[ep].BytesProcessed < usbEP[ep].BytesRequested )
outreg = M_CSR0_H_REQPKT;
else
{
usbEP[ep].IOState = EP_TXST; //finish -->host send status
outreg = M_CSR0_TXPKTRDY | M_CSR0_H_STATUSPKT;
}
}
}
}
else //next ctrl OUT
{
//printf("\r\n s5",0);
if (EP_EQ_RX(usbEP[ep].IOState)) /* host RX status after periphearal tx data*/
{
//printf("\r\n s6",0);
usbIntStatus = USB_ST_NOERROR;
}
else //host TX data after TX setup
{
//printf("\r\n s7",0);
if ((dP->IReg&M_CSR0_H_SETUPPKT)&&(usbEP[ep].transfer_buffer_length))
{
//printf("\r\n s8",0);
usbEP[ep].IOState = EP_TX;
usbEP[ep].BytesProcessed = 0;
usbEP[ep].BytesRequested = usbEP[ep].transfer_buffer_length;
}
if (usbEP[ep].BytesProcessed < usbEP[ep].BytesRequested)
{
//printf("\r\n s9",0);
usbDRC_Fifo_Write((__u8 *)usbEP[ep].transfer_buffer,ep);
outreg = M_CSR0_TXPKTRDY;
}
else
{
//printf("\r\n s10",0);
usbEP[ep].IOState = EP_RXST; //next --> host RX status
outreg = M_CSR0_H_REQPKT | M_CSR0_H_STATUSPKT; //req status pa
//usbIntStatus = USB_ST_NOERROR;
}
}
}
if (outreg)
{
//printf("\r\n s11",0);
usbREG_WRITE8(USB_REG_CSR0, outreg);
}
break;
}
if (dP->IIntSrc) //RX
{
if(EPConfig&0x10)
{
//ep=2;
ep = usb_Ret_Blt_EP_Object(EP_RX);
//printf("\r\n Rp=%x",ep);
}
//check error status
if ((dP->IReg & M_RXCSR1_H_ERROR))
usbBulkOutStatus = USB_ST_NORESPONSE;
if ((dP->IReg & M_RXCSR1_H_RXSTALL))
usbBulkOutStatus = USB_ST_STALL;
if ((usbBulkOutStatus != 0xff))
{
//printf("\r\n A1=%x",dP->ICount);
usbEP[ep].FifoRemain = dP->ICount;
if(*((__u8 *)usbCBWCB_Addr+0) == SCSI_CMD_READ10)
{
usbEP[ep].IOState = EP_RX;
usbEP[ep].BytesRequested = usbEP[ep].FifoRemain;
usbEP[ep].BytesProcessed = 0;
usbEP[ep].LastPacket = 0;
usbEP[ep].transfer_buffer=(__u16)usbCSW_Addr;
}
usbDRC_Fifo_Read((__u8 *)usbEP[ep].transfer_buffer, ep);
usbEP[ep].FifoRemain = usbRead_RxCount();
//printf("\r\n 1A2=%x", usbEP[ep].FifoRemain);
usbEP[ep].LastPacket = 1; //be a last packet
usbREG_WRITE8(USB_REG_RXCSR1, 0);
break;
}
if (!(dP->IReg & M_RXCSR1_RXPKTRDY))
{
//printf("\r\n A2",0);
break;
}
usbEP[ep].FifoRemain = dP->ICount;
//artemis mark it at 1/8/2007
//if (usbEP[ep].FifoRemain < usbEP[ep].MaxEPSize)
//usbEP[ep].LastPacket = 1;
//else
//usbEP[ep].LastPacket = 0;
//end mark
#ifdef DMA
if (usbSet_DMA(ep, DMA_RX_ZERO_IRQ) < 0)
{
#endif
/*
if(usbEP[ep].LastPacket==1)
{
usbEP[ep].FifoRemain = usbRead_RxCount();
printf("\r\n AA=%x", usbEP[ep].FifoRemain);
usbIntStatus = USB_ST_NOERROR;
break;
}*/
//printf("\r\n A4",0);
//artemis modify 02/15/2007
if(*((__u8 *)usbCBWCB_Addr+0) == SCSI_CMD_READ10)
{
//printf("\r\n AA=%x", usbEP[ep].FifoRemain);
usbEP[ep].IOState = EP_RX;
usbEP[ep].BytesRequested = usbEP[ep].FifoRemain;
usbEP[ep].BytesProcessed = 0;
usbEP[ep].LastPacket = 0;
usbEP[ep].transfer_buffer=(__u32)usbCSW_Addr;
}
usbDRC_Fifo_Read((__u8 *)usbEP[ep].transfer_buffer, ep);
usbEP[ep].FifoRemain = usbRead_RxCount();
if ((usbEP[ep].FifoRemain + usbEP[ep].BytesProcessed) < usbEP[ep].BytesRequested)
{
usbEP[ep].LastPacket = 0; // not last packet
usbREG_WRITE8(USB_REG_RXCSR1, M_RXCSR1_H_REQPKT);
}
else
{
usbEP[ep].LastPacket = 1; //be a last packet
//usbREG_WRITE8(USB_REG_RXCSR1, usbREG_READ8(USB_REG_RXCSR1)&0xFE);
usbREG_WRITE8(USB_REG_RXCSR1,0);//artemis modify 02/15/2007
}
if (((!usbEP[ep].FifoRemain) && (usbEP[ep].LastPacket)) || (usbEP[ep].BytesProcessed >= usbEP[ep].BytesRequested))
usbBulkOutStatus = USB_ST_NOERROR;
#ifdef DMA
}
else
usbBulkOutStatus = 0xff;
#endif
break;
}
else //TX
{
if(EPConfig&0x10)
{
//ep=2;
ep = usb_Ret_Blt_EP_Object(EP_TX);
//printf("\r\n Tp=%x",ep);
}
// check error status
if((dP->IReg & M_TXCSR1_H_ERROR))
{
usbBulkInStatus= USB_ST_NORESPONSE;
}
if((dP->IReg & M_TXCSR1_H_RXSTALL))
{
usbBulkInStatus = USB_ST_STALL;
}
if ((usbBulkInStatus != 0xff))
{
usbREG_WRITE8(USB_REG_TXCSR1, 0);
break;
}
if (usbEP[ep].LastPacket)
{
usbBulkInStatus = USB_ST_NOERROR;
break;
}
#ifdef DMA
if(usbSet_DMA(ep,DMA_TX_ZERO_IRQ) < 0)
{
#endif
usbDRC_Fifo_Write((__u8 *)usbEP[ep].transfer_buffer,ep);
usbREG_WRITE8(USB_REG_TXCSR1, M_TXCSR1_TXPKTRDY);
#ifdef DMA
}
#endif
}
}
while (0);
#if 0
if ( otgIntStatus != 0xff)//////////////////////
{
if (!(usb_pipeisoc(otgDataPhaseDir)))
{
otgUSB_EP[ep].IOState = EP_TX;
if (usb_pipein(otgDataPhaseDir))
otgUSB_EP[ep].actual_length = otgUSB_EP[ep].BytesProcessed;
if (otgUSB_EP[ep].FifoRemain)
usbDRC_Fifo_Read((__u8 *)otgUSB_EP[ep].transfer_buffer,ep);
}
}
#endif
}
void usbEP0_Select_Config_0(void)
{
//artemis modify at 11.29.2006
//USBDev->actconfig = &USBDev->config[0];
//usbEP0_Select_Config(USBDev->actconfig->bConfigurationValue);
//printf("\r\nconfigV=%x", USBDev->config[0].bConfigurationValue);
usbEP0_Select_Config(USBDev->config[0].bConfigurationValue);
//usbEP0_Select_Config(1);
//end modify
}
void usbHost_Set_Address(void)
{
//__u32 i;
if (usbFaddr == 0)
usbFaddr = 2;
else if (usbFaddr == 2)
{
usbREG_WRITE8(USB_REG_FADDR, 0);
usbFaddr = 3;
}
//for(i=0;i<1000;i++);//delay for some device
Delay1msOtg(5);
FILL_SETUP(usbEP0Setup, USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
USB_REQ_SET_ADDRESS, usbFaddr, 0, 0);
usbEP[0].transfer_buffer_length=0;
usbDataPhaseDir=usb_sndctrlpipe(0); //PIPE_OUT
usbSWOP_Setup(&usbEP0Setup);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -