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