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

📄 msfunction.c

📁 MSTAR03的数码相框的代码
💻 C
📖 第 1 页 / 共 3 页
字号:
       {
         int i;
         __u32 volatile fifo;

         if (usbTestMode == M_FTR_TESTJ)
           usbREG_WRITE8(USB_REG_TESTMODE,M_TEST_J);
         if (usbTestMode == M_FTR_TESTK)
           usbREG_WRITE8(USB_REG_TESTMODE,M_TEST_K);
         if (usbTestMode == M_FTR_TESTSE0)
           usbREG_WRITE8(USB_REG_TESTMODE,M_TEST_SE0_NAK);
         if (usbTestMode == M_FTR_TESTPKT)
         {
           fifo=FIFO_ADDRESS(usbEP[0].BltEP);
           for (i=0; i < 53; i++)
			*((__u8 volatile xdata *)fifo) = test_packet[i];
            usbREG_WRITE8(USB_REG_CSR0, M_CSR0_INPKTRDY);  //tx
            usbREG_WRITE8(USB_REG_TESTMODE,M_TEST_PACKET);
         }
         usbTestMode = 0;   /* reset */
       }
	   #endif
	   if  (dP->IReg & M_CSR0_P_SENTSTALL)
	   {
	     usbEP[0].IOState = EP_IDLE;
		 usbREG_WRITE8(USB_REG_CSR0, 0);
	   }
	   if  (dP->IReg & M_CSR0_P_SETUPEND)
	   {
	     outreg =  M_CSR0_P_SVDSETUPEND;
		 usbEP[0].IOState = EP_IDLE;
         #ifdef USB_DEBUG
         //printf("\r\nSETUPEND=%x ",outreg);
         #endif
		 usbREG_WRITE8(USB_REG_CSR0, outreg);
	   }

	   if (usbEP[0].IOState == EP_IDLE)
	   {
	     if  (dP->IReg & M_CSR0_RXPKTRDY)
		 {
		   outreg = M_CSR0_P_SVDRXPKTRDY;
		   usbEP[0].FifoRemain = dP->ICount;
		   usbEP[0].BytesRequested = 8;
		   usbEP[0].BytesProcessed = 0;

		   usbDRC_Fifo_Read_INT((__u8 *)&usbEP0Setup, 0);
		   usbSWOP_Setup(&usbEP0Setup);
           #ifdef USB_DEBUG
           //printf("\r\nbmRequestType = %x ",usbEP0Setup.bmRequestType);
           //printf("\r\nbRequest = %x ",usbEP0Setup.bRequest);
           //printf("\r\nwValue = %x ",usbEP0Setup.wValue);
           //printf("\r\nwIndex = %x ",usbEP0Setup.wIndex);
           //printf("\r\nwLength = %x ",usbEP0Setup.wLength);
           printf("\r\n%x ",usbEP0Setup.bRequest);
           #endif
		   parsestatus = usbParse_Received_Setup();
		   usbREG_WRITE8(USB_REG_INDEX, 0);
           #ifdef USB_DEBUG
           //printf("\r\nparsestatus = %x ",parsestatus);
           //printf("\r\nREG_FADDR = %x ",usbREG_READ8(REG_FADDR));
           #endif
		   if  (parsestatus == USB_PID_ACK)
		   {
		     outreg |= M_CSR0_P_DATAEND;
			 if  ((!usbSetFaddr) && (usbFaddr) && (usbUSBState < USB_ADDRESS))
			 {
			   usbChange_USB_State(USB_ADDRESS);
			   usbSetFaddr = 1;
               #ifdef USB_DEBUG
               //printf("\r\nusbSetFaddr = %x ",usbSetFaddr);
               #endif
			 }
		   }
		   else if (parsestatus == USB_PID_OUT)
		   {
			 usbREG_WRITE8(USB_REG_CSR0, outreg);
             #ifdef USB_DEBUG
             //printf("\r\nPID_OUT = %x ",outreg);
             #endif
			 outreg = 0;
			 usbEP[0].IOState = EP_RX;
			 usbEP[0].BytesProcessed = 0;
			 usbEP[0].BytesRequested = usbEP0Setup.wLength;
             break;
		   }
		   else if (parsestatus == USB_PID_IN)
		   {
		     usbREG_WRITE8(USB_REG_CSR0, outreg);
             #ifdef USB_DEBUG
             //printf("\r\nPID_IN = %x ",outreg);
             #endif
			 outreg = 0;
			 usbEP[0].IOState = EP_TX;
			 usbEP[0].LastPacket = 0;
			 usbEP[0].BytesProcessed = 0;
			 usbEP[0].BytesRequested = usbEP[0].transfer_buffer_length;
		   }
		   else
		   {
			 outreg = M_CSR0_P_SENDSTALL | M_CSR0_P_SVDRXPKTRDY;
		   }
		 }
		 else
		 {
		   if  (usbSetFaddr)
		     usbREG_WRITE8(USB_REG_FADDR, usbFaddr);
           #ifdef USB_DEBUG
           //printf("\r\nusbSetFaddr = %x ",usbSetFaddr);
           //printf("\r\nFADDR = %x ",usbREG_READ8(REG_FADDR));
           #endif
		   usbSetFaddr = 0;
		   if  (usbClearedEP)
		   {
		     usbClearedEP = 0;
		   }
		 }
	   }
	   if (usbEP[0].IOState == EP_TX)
	     outreg = usbFunction_Load_Fifo(0);
       if (usbEP[0].IOState == EP_RX)
	   {
	     if  (dP->IReg & M_CSR0_RXPKTRDY)
		 {
           #if 1
           //outreg = M_CSR0_P_SVDRXPKTRDY;
		   usbEP[0].FifoRemain = dP->ICount;
		   usbDRC_Fifo_Read_INT((__u8 *)usbEP[0].transfer_buffer,0);
           //usbREG_WRITE8(USB_REG_CSR0, outreg);
           //printf("\r\nRXurg = %x ",outreg);
           #endif
		   outreg = 0;
		   if (usbEP[0].BytesProcessed >= usbEP[0].BytesRequested)
		   {
		     outreg |= M_CSR0_P_DATAEND;
			 usbEP[0].IOState = EP_IDLE;
			 usbREG_WRITE8(USB_REG_INDEX, 0);
		     usbREG_WRITE8(USB_REG_CSR0, outreg);
		   }
           #if 1
		   outreg = M_CSR0_P_SVDRXPKTRDY;
           //usbEP[0].FifoRemain = dP->ICount;
           //usbDRC_Fifo_Read_INT((__u8 *)usbEP[0].transfer_buffer,0);
		   usbREG_WRITE8(USB_REG_CSR0, outreg);
           //printf("\r\nRXurg = %x ",outreg);
		   outreg = 0;
           #endif
		 }
	   }

	   if  (outreg)
	   {
         #ifdef USB_DEBUG
         //printf("\r\noureg = %x ",outreg);
         #endif
		 usbREG_WRITE8(USB_REG_CSR0, outreg);
		 if  (usbHNPEnabled)
		 {
		   usbSet_DRC_Devctl((M_DEVCTL_HR + M_DEVCTL_SESSION));
		 }

	   }
	   break;
     }

     if  (dP->IIntSrc == EP_RX)
     {
       if  ((dP->IReg & M_RXCSR1_P_SENTSTALL)||!(dP->IReg & M_RXCSR1_RXPKTRDY))
       {
         usbBulkOutStatus = USB_ST_STALL;
         outreg = 0;
         usbREG_WRITE8(USB_REG_RXCSR1, outreg);
         break;
       }
       else if (usbEP[ep].Halted)
       {
         usbBulkOutStatus = USB_ST_STALL;
         outreg = M_RXCSR1_P_SENDSTALL;
         usbREG_WRITE8(USB_REG_RXCSR1, outreg);
         break;
       }
       else
       {
         usbEP[ep].FifoRemain = dP->ICount;
		 //printf("\r\n s=%x",	usbEP[ep].FifoRemain);
		 //printf(",%x",OtgDeviceType);
         switch(OtgDeviceType)
         {
           case Device_PictureBridge:
                if (usbEP[ep].FifoRemain>0)
                  usbPictRxDataReceived=1;
		        //printf("\r\n s=%x",	usbPictRxDataReceived);
		        break;
           case Device_MassStorage:
                if (usbEP[ep].FifoRemain==31)
                {
                  usbEP[ep].BytesProcessed=0;
                  usbEP[ep].BytesRequested=dP->ICount;
                  usbEP[ep].transfer_buffer=usbCBW_Addr;
                  usbEP[ep].transfer_buffer_length=0;
                  if (usbEP[ep].FifoRemain < usbEP[ep].MaxEPSize)
                    usbEP[ep].LastPacket = 1;
                  else
                  {
                    if ((usbEP[ep].BytesProcessed + usbEP[ep].FifoRemain) >= usbEP[ep].BytesRequested)
                      usbEP[ep].LastPacket = 1;
                    else
                      usbEP[ep].LastPacket = 0;
                  }
                  #ifdef DMA
		          if (usbSet_DMAINT(ep, DMA_RX_ONE_IRQ) < 0)
		          {
                  #endif
		            usbDRC_Fifo_Read_INT((__u8 *)(usbEP[ep].transfer_buffer), ep);
		            if  (((!usbEP[ep].FifoRemain) && (usbEP[ep].LastPacket)) || (usbEP[ep].BytesProcessed >= usbEP[ep].BytesRequested))
		            {
			          usbBulkOutStatus = USB_ST_NOERROR;
			        }
		            usbEP[ep].FifoRemain = usbRead_RxCount();
		            if  (!usbEP[ep].FifoRemain)
                    #ifdef DMA
                      if (((__u8*)usbEP[ep].transfer_buffer)[15]!=0x2a)
                      {
                        //printf("cmd=%bx\n",((__u8*)usbEP[ep].transfer_buffer)[15]);
                        //printf("0x8B=%bx\n",XBYTE[0x268B]);
                        //usbSet_ClrRXMode1();
                    #endif
			            usbREG_WRITE8(USB_REG_RXCSR1, 0);
                  #ifdef DMA
                      }
		          }
                  #endif
                  usbMassCmdRevFlag=1;

                }
		        else
                {
                  if (usbEP[ep].FifoRemain>0)
                  {
                    usbMassRxDataReceived=1;
                  }
                  usbMassCmdRevFlag=0;
                }
		        break;
		   default:
		        break;
         }

		 break;
	   }
     }
     else
     {
       if (dP->IReg & M_TXCSR1_P_SENTSTALL)
       {
         if (ep==0x3)
	       usbIntInStatus=USB_ST_STALL;
         else
           usbBulkInStatus=USB_ST_STALL;
         usbREG_WRITE8(USB_REG_TXCSR1, 0);
         return;
       }

       if  (usbEP[ep].LastPacket)
       {
         if (ep==0x3)
		   usbIntInStatus=USB_ST_NOERROR;
         else
           usbBulkInStatus=USB_ST_NOERROR;
         break;
       }
       if  (usbEP[ep].Halted)
       {
         usbREG_WRITE8(USB_REG_TXCSR1, M_TXCSR1_P_SENDSTALL);
         break;
       }
       #ifdef DMA
       //printf("\r\n ER=%x",usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed);
	   if((usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed)>0x0)
	   {
	     //printf("\r\n ER=%x",usbEP[ep].BytesRequested - usbEP[ep].BytesProcessed);
	     usbBulkInStatus=USB_ST_NOERROR;
	     usbBulkInStatus2=USB_ST_NOERROR;
 		 break;
	   }
       if(usbSet_DMAINT(ep, DMA_TX_ZERO_IRQ) < 0)
       {
       #endif
         usbDRC_Fifo_Write_INT((__u8 *)usbEP[ep].transfer_buffer,ep);
         usbREG_WRITE8(USB_REG_TXCSR1, M_TXCSR1_TXPKTRDY);
       #ifdef DMA
       }
       else
	   {
         if (ep==0x3)
		   usbIntInStatus=0xff;
         else
           usbBulkInStatus=0xff;
	   }
       #endif
     }
   }
   while   (0);
   #if 0
   if  ( usbIntStatus != 0xff)
   {
     usbEP[ep].IOState = 0;
     if (usbEP[ep].FifoRemain)
       usbDRC_Fifo_Read_INT((__u8 *)usbEP[ep].transfer_buffer,ep);
   }
   #endif
   return;
}

__s32 usbParse_Received_Setup(void)
{
    __s32     retstatus;
    __s32     bytesrem;
    __s32     length;
    __u8    *scanP;
    __u8    i, descindex;
    __u8    desctype;
    __s32    endpoint, direction;
    pipe_t  pipe;
    void *sp;
    char version[2]={0x01,0x00};

#if 1
    /*if (usbSpeed==FULL_SPEED)
	  {
        usbMsdfn_Dscr[40]=0x40;
        usbMsdfn_Dscr[41]=0x00;
        usbMsdfn_Dscr[47]=0x40;
        usbMsdfn_Dscr[48]=0x00;
        usbMsdfn_Dscr[54]=0x40;
        usbMsdfn_Dscr[55]=0x00;
	  }*/
	  if(usbSpeed==HIGH_SPEED)
      {
	    //printf("\r\n Acheck!!",0);
        usbMsdfn_Dscr[2]=0x0;
        usbMsdfn_Dscr[3]=0x02;
        usbMsdfn_Dscr[40]=0x0;
        usbMsdfn_Dscr[41]=0x02;
        usbMsdfn_Dscr[47]=0x0;
        usbMsdfn_Dscr[48]=0x02;
      }
#else
    if (usbSpeed==FULL_SPEED)
	  {
        usbMsdfn_Dscr[92]=0x40;
        usbMsdfn_Dscr[93]=0x00;
        usbMsdfn_Dscr[99]=0x40;
        usbMsdfn_Dscr[100]=0x00;
        usbMsdfn_Dscr[106]=0x40;
        usbMsdfn_Dscr[107]=0x00;
	  }else if (usbSpeed==HIGH_SPEED)
	  {
        usbMsdfn_Dscr[50]=0x40;
        usbMsdfn_Dscr[51]=0x00;
        usbMsdfn_Dscr[57]=0x40;
        usbMsdfn_Dscr[58]=0x00;
        usbMsdfn_Dscr[64]=0x40;
        usbMsdfn_Dscr[65]=0x00;
	  }
#endif
    retstatus = USB_PID_STALL;
    if  ((usbEP0Setup.bmRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD)
    {
        if ((usbEP0Setup.bmRequestType & USB_TYPE_MASK) == USB_TYPE_CLASS)
        {
            if(OtgDeviceType==Device_PictureBridge)
            {
             switch (usbEP0Setup.bRequest)
             {
                case    STILL_IMAGE_RESET:
                        retstatus = USB_PID_ACK;
            	          break;
                case    STILL_IMAGE_GET_DEVSTS:
#ifdef BIG_ENDIAN
				        //usbStillImageSts=(STILL_STSTUS_OK<<16)|0x00000004;
						usbStillImageSts=0x04000120;

⌨️ 快捷键说明

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