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

📄 mshost.c

📁 MSTAR03的数码相框的代码
💻 C
📖 第 1 页 / 共 3 页
字号:
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
   usbEP0State = EP0C_SET_ADDRESS;
   //printf("\r\n usbIntStatus=%x", usbIntStatus);
   //printf("\r\n DCTL=%x", usbREG_READ8(REG_DEVCTL));
}

void usbHost_Get_Short_Desc(void)
{
   FILL_SETUP(usbEP0Setup, USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
       USB_REQ_GET_DESCRIPTOR, (USB_DT_DEVICE << 8), 0, DEV_DESC_EP0_SIZE_OFFSET);
   usbEP[0].transfer_buffer=(__u32)&USBDev->descriptor;
   usbEP[0].transfer_buffer_length=DEV_DESC_EP0_SIZE_OFFSET;
   usbDataPhaseDir=usb_rcvctrlpipe(0);   //PIPE_IN
   usbSWOP_Setup(&usbEP0Setup);
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
   usbEP0State = EP0C_GET_MAX_EP0;
}

void usbTerminate_Host_Session(void)
{
   if (A_DEVICE())   /* A_DEVICE HOST */
   {
     if  (usbHNPSupport)
       usbEP0_Set_Feature(b_hnp_enable);  /* give b a shot */
     else
       usbChange_OTG_State(A_SUSPEND);    /* app done */
   }
   else    /* B_DEVICE HOST */
     usbSet_DRC_Power(M_POWER_SUSPENDM);
}

void USB_Hub_Handle(void)
{
   // set feature port_power
   FILL_SETUP(usbEP0Setup, 0x23,
   0x03, 0x08, 0x01, 0);
   usbEP[0].transfer_buffer_length=0;
   usbDataPhaseDir=usb_sndctrlpipe(0);  //PIPE_OUT
   usbSWOP_Setup(&usbEP0Setup);
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);

   //clear feature c_port_connection
   FILL_SETUP(usbEP0Setup, 0x23,
   0x01, 0x10, 0x01, 0);
   usbEP[0].transfer_buffer_length=0;
   usbDataPhaseDir=usb_sndctrlpipe(0);  //PIPE_OUT
   usbSWOP_Setup(&usbEP0Setup);
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);

   //set feature port_reset
   FILL_SETUP(usbEP0Setup, 0x23,
   0x03, 0x04, 0x01, 0);
   usbEP[0].transfer_buffer_length=0;
   usbDataPhaseDir=usb_sndctrlpipe(0);  //PIPE_OUT
   usbSWOP_Setup(&usbEP0Setup);
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);

   //clear feature c_port_reset
   FILL_SETUP(usbEP0Setup, 0x23,
   0x01, 0x14, 0x01, 0);
   usbEP[0].transfer_buffer_length=0;
   usbDataPhaseDir=usb_sndctrlpipe(0);  //PIPE_OUT
   usbSWOP_Setup(&usbEP0Setup);
   usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);

}

void USB_EP0_Manager(void)
{
   __u8 configno = 0;
   __u8 MassSCSIBOT=0;
   __u8 HubClass=0;
   USBDev=&USBDevP;
   if  (usbUSBState < USB_DEFAULT)
   {
     //printf("\r\n s12",0);
     usbReset_DRC_Core();//CRST_UNDER_DEFAULT
     return;
   }
   if  (!usbEP0State)     /* 0 is first enumeration request */
   {

     //printf("\r\n sadr",0);
     //Delay1MS(2);
     usbHost_Set_Address();
     //printf("\r\n endsadr",0);
     //return;
   }
   if  (usbEP0State == EP0C_SET_ADDRESS)
   {
     #if 0
     if  (otgIntStatus != USB_ST_NOERROR)///////////////////////
     {
       usbReset_DRC_Core();//            CRST_ENUM_FAILED
       return;
     }
     #endif
     //printf("\r\n s15",0);
     usbChange_USB_State(USB_ADDRESS);
     usbREG_WRITE8(USB_REG_FADDR, usbFaddr);

     //Delay1MS(2);
     usbHost_Get_Short_Desc();
     //return;
   }
   if  (usbEP0State == EP0C_GET_MAX_EP0)
   {
     #if 0
     if  (otgIntStatus != USB_ST_NOERROR)/////////////////
     {
       usbReset_DRC_Core();//            CRST_ENUM_FAILED
       return;
     }
     #endif
     usbSWOP_Setup(&usbEP0Setup);
     USB_Setup_Endpoint(0,FIFO_DUAL,PIPE_CONTROL,0,USBDev->descriptor.bMaxPacketSize0);
     usbEP[0].BltEP2 = 0;
     if (USBDev->descriptor.bDeviceClass == 0x09)
       HubClass=1;
     else
       HubClass=0;
     usbEP0Setup.wLength = sizeof(struct usb_device_descriptor);
     usbEP[0].transfer_buffer=(__u32)&USBDev->descriptor;
     usbEP[0].transfer_buffer_length=USB_DT_DEVICE_SIZE;
     usbDataPhaseDir=usb_rcvctrlpipe(0);
     usbSWOP_Setup(&usbEP0Setup);
     usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
     usbEP0State = EP0C_GET_STD_DEV_DESC;
     //return;
   }
   if  (usbEP0State == EP0C_GET_STD_DEV_DESC)
   {
     #if 0
     if  (otgIntStatus != USB_ST_NOERROR)//////////////////////
     {
       usbReset_DRC_Core(); //            CRST_ENUM_FAILED
       return;
     }
     #endif
     usbSWOP_Setup(&usbEP0Setup);
     usbSWOP_Device_Descriptor((void *)&USBDev->descriptor);
     USBDev->config =usbMalloc(USBDev->descriptor.bNumConfigurations * sizeof(usb_config_descriptor));
     //USBDev->rawdescriptors = usbMalloc(USBDev->descriptor.bNumConfigurations * sizeof(usb_config_descriptor));//USBDev->rawdescriptors));
	 //printf("\r\n adr1=%x", (__u16)((__u32)USBDev->config &0xffff));
	 //printf("\r\n adr2=%x", (__u16)((__u32)USBDev->rawdescriptors &0xffff));
     //printf("\r\n adr1=%x", USBDev->config);
	 //printf("\r\n adr2=%x", USBDev->rawdescriptors);
     if  (!(USBDev->config)) //|| !(USBDev->rawdescriptors))
     {
       usbReset_DRC_Core();//            CRST_BAD_MALLOC
       return;
     }
     configno = 0;
     SETMSB(usbEP0Setup.wValue, USB_DT_CONFIG);
     SETLSB(usbEP0Setup.wValue, configno);
     usbEP0Setup.wLength = USB_DT_CONFIG_SIZE;
     usbEP[0].transfer_buffer=(__u32)&USBDev->config[configno];
     usbEP[0].transfer_buffer_length=USB_DT_CONFIG_SIZE;
     usbDataPhaseDir=usb_rcvctrlpipe(0);
     usbSWOP_Setup(&usbEP0Setup);
     usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
     usbEP0State = EP0C_GET_CONFIG;
	 //printf("\r\n adr1=%x", USBDev->config);
	 //printf("\r\n ob1=%x", USBDev->config[configno].bLength);
	 //printf("\r\n ob2=%x", USBDev->config[configno].bDescriptorType);
	 //printf("\r\nob3=%x", USBDev->config[configno].wTotalLength);
	 //printf("\r\nob4=%x", USBDev->config[configno].bNumInterfaces);
	 //printf("\r\nob5=%x", USBDev->config[configno].bConfigurationValue);

	 USBDev->rawdescriptors=usbMalloc(USBDev->config[configno].wTotalLength>>8);
	 //printf("\r\n adr2=%x", (__u16)((__u32)USBDev->rawdescriptors &0xffff));
     //return;
   }
   if  (usbEP0State == EP0C_GET_CONFIG)
   {
     #if 0
     if  (otgIntStatus != USB_ST_NOERROR)//////////////////
     {
       usbReset_DRC_Core();//            CRST_ENUM_FAILED
       return;
     }
     #endif
     usbSWOP_Setup(&usbEP0Setup);
     usbSWOP_Config_Descriptor((void *)&USBDev->config[configno]);
     configno = GETLSB(usbEP0Setup.wValue);
     configno++;
     if  ( configno < USBDev->descriptor.bNumConfigurations )
     {
       SETLSB(usbEP0Setup.wValue, configno);
       usbEP[0].transfer_buffer=(__u32)&USBDev->config[configno];
       usbEP[0].transfer_buffer_length=USB_DT_CONFIG_SIZE;
       usbDataPhaseDir=usb_rcvctrlpipe(0);
       usbSWOP_Setup(&usbEP0Setup);
       usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
       usbEP0State = EP0C_GET_CONFIG;
       //return;
     }
     for (configno=0;configno < USBDev->descriptor.bNumConfigurations;configno++)
     {
       USBDev->rawdescriptors[configno] = usbMalloc(USBDev->config[configno].wTotalLength);
       if  (!USBDev->rawdescriptors[configno])
       {
         usbReset_DRC_Core();//                CRST_BAD_MALLOC
         return;
       }
     }
     configno = 0;
     #if 1
     usbMem_Set(USBDev->rawdescriptors[configno],0,USBDev->config[configno].wTotalLength);
     #else
     for (i=0; i< USBDev->config[configno].wTotalLength; i++)
       *(USBDev->rawdescriptors[configno]+i)=0;
     #endif
     usbEP0Setup.wLength = USBDev->config[configno].wTotalLength;
     SETLSB(usbEP0Setup.wValue, configno);
     usbEP[0].transfer_buffer=(__u32)&USBDev->rawdescriptors[configno];
     usbEP[0].transfer_buffer_length=USBDev->config[configno].wTotalLength;
     usbDataPhaseDir=usb_rcvctrlpipe(0);
     usbSWOP_Setup(&usbEP0Setup);
     usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
     usbEP0State = EP0C_GET_FULL_CONFIG;
	 //printf("\r\n 1b1=%x", USBDev->config[configno].bLength);
	 //printf("\r\n 1b2=%x", USBDev->config[configno].bDescriptorType);
	 //printf("\r\n 1b3=%x", USBDev->config[configno].wTotalLength);
	 //printf("\r\n 1b4=%x", USBDev->config[configno].bNumInterfaces);
	 //printf("\r\n 1b5=%x", USBDev->config[configno].bConfigurationValue);
	 //printf("\r\n addr3=%x", (__u16)( ((__u32)&USBDev->rawdescriptors[configno]) &0xffff));
     //return;
   }
   if  (usbEP0State==EP0C_GET_FULL_CONFIG)
   {
     #if 0
     if  (otgIntStatus != USB_ST_NOERROR)////////////////
     {
       usbReset_DRC_Core();//            CRST_ENUM_FAILED
       return;
     }
     #endif
     usbSWOP_Setup(&usbEP0Setup);
     configno = usbEP0Setup.wIndex & 0xff;
     EPConfig=EPConfig&0x80;
     usbParse_Config(configno,&MassSCSIBOT);
     if(usbEP[1].BltEP2==usbEP[2].BltEP2)
     {
       EPConfig=EPConfig|0x10;
     }
     configno++;
     if  ( configno < USBDev->descriptor.bNumConfigurations )
     {
       usbEP0Setup.wLength = USBDev->config[configno].wTotalLength;
       SETLSB(usbEP0Setup.wValue, configno);
       usbEP[0].transfer_buffer=(__u32)&USBDev->rawdescriptors[configno];
       usbEP[0].transfer_buffer_length=USBDev->config[configno].wTotalLength;
       usbDataPhaseDir=usb_rcvctrlpipe(0);
       usbSWOP_Setup(&usbEP0Setup);
       usbHost_Send_EP0Setup((__u8 *)&usbEP0Setup);
       usbEP0State = EP0C_GET_FULL_CONFIG;
       //return;
     }
     if  (A_DEVICE() && (usbHNPSupport))
     {
       usbEP0_Set_Feature(a_hnp_support);
     }
     else
     {
       usbEP0_Select_Config_0();
     }
     //return;
   }
   if  (usbEP0State == EP0C_SET_FEATURE)
   {
     //printf("\r\n t1", 0);
     usbSWOP_Setup(&usbEP0Setup);
     if  (GETLSB(usbEP0Setup.wValue) == a_hnp_support)
     {
       if  (usbIntStatus != USB_ST_NOERROR)
         usbHNPSupport = 0;
       usbEP0_Select_Config_0();
       //return;
     }
     if  (GETLSB(usbEP0Setup.wValue) == b_hnp_enable)
     {
       if  (usbIntStatus != USB_ST_NOERROR)
         usbHNPSupport = 0;
       else
         usbChange_OTG_State(A_SUSPEND);
       //return;
     }
     //return;
   }
   if  (usbEP0State==EP0C_SET_CONFIG)
   {
     //printf("\r\n t2", 0);
     usbEP0State = 0;
     #if 0
     if  (otgIntStatus != USB_ST_NOERROR)///////////////////
     {
       usbReset_DRC_Core();//            CRST_ENUM_FAILED
       return;
     }
     #endif
     usbChange_USB_State(USB_CONFIGURED);
     //enable flag, star to notify mass storage is connected
     usbConnectFlag=1;
     NotifyusbConnect2=1;
     //printf("\r\n conif",0);
     //printf("\r\n result=%x",USB_Driver_Probe(MassSCSIBOT,HubClass));
     if  (USB_Driver_Probe(MassSCSIBOT,HubClass))
     {
       #ifdef Artemis_DEBUG
       printf("\r\n mass=%x",MassSCSIBOT );
	   //printf("\r\n hub=%x",HubClass );
       #endif
	   if(EPConfig & 0x20)
	   {
	     USB_Hub_Handle();
	     USB_EP0_Manager();
	     return;
	   }
       usbTerminate_Host_Session();  //err
     }
     else
     {
       usbMSD_BOT_Get_Max_LUN();
	   Init_MassStorage(); //artemis add at 03/09/2007

⌨️ 快捷键说明

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