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

📄 mshost.c

📁 MSTAR03的数码相框的代码
💻 C
📖 第 1 页 / 共 3 页
字号:

     }

     return;
   }
   usbEP0State = 0;   /* cancel enumeration phase */
}

void usbEP0_Set_Feature(__u16   feature)
{
   FILL_SETUP(usbEP0Setup,USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
       USB_REQ_SET_FEATURE, feature, 0, 0);
   usbEP[0].transfer_buffer_length=0;
   usbEP0State = EP0C_SET_FEATURE;
   usbDataPhaseDir=usb_sndctrlpipe(0);
   usbSWOP_Setup(&usbEP0Setup);
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
}

void usbEP0_Clear_Feature(__u16   feature)
{
   FILL_SETUP(usbEP0Setup,USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_ENDPOINT,
       USB_REQ_CLEAR_FEATURE, feature, 0, 0);
   usbEP[0].transfer_buffer_length=0;
   usbEP0State = EP0C_CLEAR_FEATURE;
   usbDataPhaseDir=usb_sndctrlpipe(0);
   usbSWOP_Setup(&usbEP0Setup);
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
}

void usbEP0_Select_Config(__u16 config)
{
   FILL_SETUP(usbEP0Setup, USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
       USB_REQ_SET_CONFIGURATION, config, 0, 0);
   usbEP[0].transfer_buffer_length=0;
   usbEP0State = EP0C_SET_CONFIG;
   usbDataPhaseDir=usb_sndctrlpipe(0);
   usbSWOP_Setup(&usbEP0Setup);
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
}

void usbParse_Config(__u8 configno,__u8* SCSIBOT)
{
   __s8    *scanP;
   usb_interface   *ifP;
   usb_interface_descriptor    *ifdP;
   __u8    numalts;
   __u8    scannum;
   __s16   bytesrem;
   __u8    numifs;
   __u8    curif;
   __u8    altif;
   __u8    epnum;
   __u8    abort;
   __u8    bulkepnum=1;

   abort = 0;
   numifs = 0;
   //printf("\r\n t0=%x", configno);
   for (scannum = 1; scannum <= 4; scannum++)
   {
     if  (abort)
     {
       usbReset_DRC_Core();//            CRST_ENUM_FAILED
       return;
     }

     scanP = (__s8 *)&USBDev->rawdescriptors[configno];
	 //printf("\r\n scaP0=%x", scanP[0]);
	 //printf("\r\n scaP1=%x", scanP[1]);
	 //printf("\r\n scaP2=%x", scanP[2]);
	 //printf("\r\n scaP3=%x", scanP[3]);
     #if 1
        usbMemcpy(&bytesrem, scanP+2,2);
     #else
     scanP[2] = (__u8)(bytesrem >> 8);
     scanP[3] = (__u8) bytesrem;
     #endif
     if  (scannum == 1)
       SWOP(bytesrem);
     switch(scannum)
     {
       case 1:
            while(bytesrem > 0)
            {
              if  (*(scanP+1) == USB_DT_CONFIG)
                usbSWOP_Config_Descriptor((void *)(usb_config_descriptor *)(scanP));
              else if (*(scanP+1) == USB_DT_ENDPOINT)
                usbSWOP_Endpoint_Descriptor((void *)(usb_endpoint_descriptor *)(scanP));
              else if ((*(scanP+1) == USB_DT_OTG)&&(!usbDescFoundOTG))
              {
                usbDescFoundOTG = 1;
                if  (A_DEVICE())
                {
                  if  (*(scanP+2) & USB_OTG_SRP)
                    usbSRPSupport = 1;
                  if  (*(scanP+2) & USB_OTG_HNP)
                    usbHNPSupport = 1;
                }
              }
              bytesrem -= *scanP;
              scanP += *scanP;
            }
            break;
       case 2:
            while   (bytesrem > 0)
            {
              if  (*(scanP+1)==USB_DT_INTERFACE)
              {
                if (!(*(scanP+3)))
                  numifs++;
              }
              bytesrem -= *scanP;
              scanP += *scanP;
            }
            #if 1
            USBDev->config[configno].interface = usbMalloc(numifs * sizeof(usb_interface));
            #else
            USBDev->config[configno].interface = (__u8 *)&;
            #endif
            if  (!USBDev->config[configno].interface)
              abort++;
            break;
       case 3:
            for (curif = 0; curif < numifs; curif++)
            {
              numalts = 0;
              scanP = (__s8 *)&USBDev->rawdescriptors[configno];
              #if 1
              usbMemcpy(&bytesrem, scanP+2,2);
              #else
              scanP[2] = (__u8)(bytesrem >> 8);
              scanP[3] = (__u8) bytesrem;
              #endif
              while (bytesrem > 0)
              {
                if  (*(scanP+1) == USB_DT_INTERFACE)
                {
                  if  (curif == *(scanP+2))
                    numalts++;
                }
                bytesrem -= *scanP;
                scanP += *scanP;
              }
              USBDev->config[configno].interface[curif].altsetting =
                     usbMalloc(numalts * sizeof(usb_interface_descriptor));
              if  (!USBDev->config[configno].interface[curif].altsetting)
              {
                abort++;
                break;
              }
              USBDev->config[configno].interface[curif].act_altsetting=0;
              USBDev->config[configno].interface[curif].num_altsetting=numalts;
              USBDev->config[configno].interface[curif].max_altsetting=numalts;
            }
            break;
       case 4:
            while (bytesrem > 0)
            {
              if  (*(scanP+1) == USB_DT_INTERFACE)
              {
                curif = *(scanP+2);
                altif = *(scanP+3);
                ifP = &USBDev->config[configno].interface[curif];
                ifdP = &ifP->altsetting[altif];
                #if 1
                usbMemcpy((void *)ifdP, scanP, USB_DT_INTERFACE_SIZE);
                #else
                for (i=0; i< USB_DT_INTERFACE_SIZE; i++)
                  *((__u8 *)(ifdP+i))=*(scanP+i);
                #endif
                if(ifdP->bNumEndpoints)
                {
                  ifdP->endpoint=usbMalloc(ifdP->bNumEndpoints * sizeof(usb_endpoint_descriptor));
                  if  (!ifdP->endpoint)
                  {
                    abort++;
                    break;
                  }
                }
                else
                  ifdP->endpoint = 0;
                if ((ifdP->bInterfaceClass==0x08)&&((ifdP->bInterfaceSubClass==0x06)||(ifdP->bInterfaceSubClass==0x05))&&(ifdP->bInterfaceProtocol==0x50))
                  *SCSIBOT=1;
                else
                  *SCSIBOT=0;
                bytesrem -= *scanP;
                scanP += *scanP;
                epnum = 0;
                #ifdef Artemis_DEBUG
			    printf("\r\n nep=%x", ifdP->bNumEndpoints);
			    printf("\r\n bytesrem=%x", bytesrem);
                #endif
                while ((epnum < ifdP->bNumEndpoints)&&(bytesrem>0))
                {
                  if  (*(scanP+1) == USB_DT_ENDPOINT)
                  {
                    #if 1
                    usbMemcpy((void *)&ifdP->endpoint[epnum],scanP,USB_DT_ENDPOINT_SIZE);
                    #else
                    for (i=0; i< USB_DT_ENDPOINT_SIZE; i++)
                      *((__u8 *)(&ifdP->endpoint[epnum]+i))=*(scanP+i);
                    #endif
                    //////////////////////////
                    if ((ifdP->endpoint[epnum].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==  USB_ENDPOINT_XFER_BULK )
                    {
                      if ((ifdP->endpoint[epnum].bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)
                      {
                        printf("\r\n enpRx1_1=%bx", bulkepnum);
                        printf("\r\n enpRx1_2=%bx", epnum);
                        printf("\r\n enpRx1_3=%bx",(ifdP->endpoint[epnum].bEndpointAddress&0x0F));
 		                usbEP[bulkepnum].BltEP2=(ifdP->endpoint[epnum].bEndpointAddress&0x0F);
                        USB_Setup_Endpoint(bulkepnum,PIPE_IN,PIPE_BULK,ifdP->bInterfaceNumber,ifdP->endpoint[epnum].wMaxPacketSize);
		                //USB_Setup_Endpoint((ifdP->endpoint[epnum].bEndpointAddress&0x0F),PIPE_IN,PIPE_BULK,ifdP->bInterfaceNumber,ifdP->endpoint[epnum].wMaxPacketSize);
                      }
                      else
                      {
                        printf("\r\n enpTx2_1=%bx", bulkepnum);
                        printf("\r\n enpTx2_2=%bx", epnum);
                        printf("\r\n enpTx2_3=%bx",(ifdP->endpoint[epnum].bEndpointAddress&0x0F));
 		                usbEP[bulkepnum].BltEP2=(ifdP->endpoint[epnum].bEndpointAddress&0x0F);
                        USB_Setup_Endpoint(bulkepnum,PIPE_OUT,PIPE_BULK,ifdP->bInterfaceNumber,ifdP->endpoint[epnum].wMaxPacketSize);
                        //USB_Setup_Endpoint((ifdP->endpoint[epnum].bEndpointAddress&0x0F),PIPE_OUT,PIPE_BULK,ifdP->bInterfaceNumber,ifdP->endpoint[epnum].wMaxPacketSize);
                      }
                      bulkepnum++;
                    }
                    else if ((ifdP->endpoint[epnum].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==  USB_ENDPOINT_XFER_INT )
                    {
                      EPConfig=EPConfig | 0x20;
                      printf("\r\n Artemis1=%bx",EPConfig);
                    }
                    /////////////////////////
                    epnum++;
                  }
                  bytesrem -= *scanP;
                  scanP += *scanP;
                }
              }
              else
              {
                bytesrem -= *scanP;
                scanP += *scanP;
              }
            }
            break;
       default:
            break;
     }
   }
}

void usbRelease_Config(void)
{
   __u8    curif;
   __u8    altif;
   __u8    configno;

   if(!USBDev->config)
   {
     return;
   }
   for(configno=0; configno < USBDev->descriptor.bNumConfigurations; configno++)
   {
     for(curif=0; curif < USBDev->config[configno].bNumInterfaces; curif++)
     {
       for(altif=0; altif < USBDev->config[configno].
                interface[curif].num_altsetting; altif++)
       {
         if( USBDev->config[configno].interface[curif].altsetting &&
             USBDev->config[configno].interface[curif].altsetting[altif].endpoint)
           usbFree((void *)USBDev->config[configno].interface[curif].altsetting[altif].endpoint);    /* 6 */
       }
       if( USBDev->config[configno].interface &&
                USBDev->config[configno].interface[curif].altsetting )
         usbFree((void *)USBDev->config[configno].interface[curif].altsetting);
     }
     if( USBDev->config[configno].interface)
       usbFree((void *)USBDev->config[configno].interface);
     if( USBDev->rawdescriptors && USBDev->rawdescriptors[configno])
       usbFree(USBDev->rawdescriptors[configno]);
   }
   if( USBDev->rawdescriptors)
     usbFree(USBDev->rawdescriptors);
   usbFree((void *)USBDev->config);
   USBDev->config = 0;
}

int USB_Driver_Probe(__u8 scsibotflag,__u8 hubclassflag)
{
   if ((scsibotflag)&&(hubclassflag==0))
     return(0); //success
   else
     return(1); // fail
}

#if 0
void HostUSBInitial(__u32 xdataaddr,__u8 Device_Mode_Type)
{
   USB_TTX_FIX_XDATA_ADDR=xdataaddr;
   LopezUSBInit();
   InitUSBVar(Device_Mode_Type);
   usbDesInit();
   usbREG_WRITE8(USB_REG_FADDR, 0);
   usbREG_WRITE8(USB_REG_POWER, M_POWER_SOFTCONN | M_POWER_ENSUSPEND);
   usbREG_WRITE8(REG_DEVCTL,0);
   usbSet_DRC_Interrupts();
}
#endif

#if 1 //artemis for test use
void Delay1msOtg(__u16 msec)
{

  MDrv_Timer_Delayms(msec);
  /*
  U32 i,TotalTime;
  TotalTime=msec*1000;
  for(i=0;i<TotalTime;i++);
  */
}
#endif

#endif //#if (ENABLE_OTG_HOST == ENABLE)

⌨️ 快捷键说明

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