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

📄 mshost.c

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