📄 mshost.c
字号:
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 + -