📄 usbh_usbds_api.c
字号:
if(ret != USBH_USBD_STATUS_SUCCESS) {
connect_status = 1;
break;
}
USBH_USBD_Mode = USBH_USBD_MODE_SADDR; /* SET ADDRESS */
UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
}
break;
case USBH_USBD_MODE_SADDR: /* SET ADDRESS */
if(UsbDevInfo == &RootHubDev) {
USBH_USBD_Mode = USBH_USBD_MODE_SCFG; /* SET CONFIGURATION DESCRIPTOR */
USBH_USBDS_DelListURB(psURB);
} else {
psCurUSBDev = psURB->psDev;
USBH_USBDS_DelListURB(psURB);
/* Throw notification of device recognition finish ( USBH_USBD_MSG_CONNECT_OK ) */
// Message is returned in call back function.
add_flg = 0;
/* Post-process of SET ADDRESS */
UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev );
if(UsbDevListWK->sUsbDes.Dev.bDeviceClass != USBH_HSBD_HUB_CLASS_CODE){
/* Notify of connecting besides HUB class */
for( i = 0; i < USBH_USBD_CLASSDRIVERNUM; i++ ){
USBH_USBDS_ExecCallback(ClassINFO[i].pfnEntryClassCallback, USBH_USBD_MSG_CONNECT_OK, psCurUSBDev->devNum, UsbDevListWK);
}
}
/* In case of parent is hub, carry out connecting if there is un-connect device in the port of parent hub */
UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev->psParent );
UsbDevListWK->statRESET &= ~(UsbDevListWK->statusChange);
if(UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE) {
for(i=0; i<8; i++) {
if(UsbDevListWK->hubStat & (1<<i)) {
add_flg = 1;
SavhubStat = (1<<i);
UsbDevInfo = USBH_USBDS_AddListDev();
UsbDevInfo->sUsbDev.psParent = (USBH_USBD_USBDEV *)psCurUSBDev->psParent;
UsbDevInfo->sUsbDev.port = i;
ret = USBH_HCD_AllocDev((USBH_HCD_USBDEV *)&UsbDevInfo->sUsbDev);
if(ret != USBH_USBD_STATUS_SUCCESS) {
return;
}
/* MaxPacketsize of FS is set until Device Descriptor can be acquired. */
UsbDevInfo->sUsbDev.epMaxPacketIn[0] = ENUM_MAXPKTSIZE_FULL;
UsbDevInfo->sUsbDev.epMaxPacketOut[0] = ENUM_MAXPKTSIZE_FULL;
USBH_USBD_Mode = USBH_USBD_MODE_COMP;
/* SetPortFeature(PORT_RESET) */
wURB = USBH_USBDS_AddURBList();
if(wURB == (USBH_USBD_URB *)USBH_USBD_STATUS_UNSUCCESSFUL) {
continue;
}
wURB->psDev = (USBH_USBD_USBDEV *)psCurUSBDev->psParent;
wURB->pipe = USBH_USBD_SetPipeType(USBH_HCD_PIPE_CONTROL, ENUM_EP0, wURB->psDev->devNum, USBH_HCD_DIR_OUT);
USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)wURB->pSetupPacket, BREQ_SETFEATURE_PORT, 0, i, USBH_USBD_PORT_RESET);
USBH_USBDS_SetTranPara(wURB, 0, 0, 0, USBH_USBDS_GetStatusCallbackProc);
ret = USBH_HCD_SubmitURB((USBH_HCD_URB *)wURB);
if(ret != USBH_USBD_STATUS_SUCCESS) {
USBH_USBDS_DelListURB(wURB);
}
break;
}
}
if(add_flg==0) {
/* Carry out configuration of hub devices connected to same hub. */
UsbDevListWK = (USBH_USBD_DEVLIST_HEAD *)DeviceCtlTbl.DevInfo;
while( UsbDevListWK ) {
if( (UsbDevListWK->sUsbDev.psParent == psCurUSBDev->psParent) && (UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE) ) {
if(UsbDevListWK->sUsbDev.eState != USBH_USBD_USB_STATE_CONFIGURED) {
UsbDevListWK->ClassID = USBH_HSBD_HUB_CLASS_ID;
USBH_USBD_Mode = USBH_USBD_MODE_SCFG; /* SET CONFIGURATION */
hubStart = 10;
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 1 );
return;
}
}
UsbDevListWK = UsbDevListWK->psNext;
}
}
}
/* Post-process of SET ADDRESS */
UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev );
if(UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE){
/* In case of connecting device is hub, don't notify connect call back. */
if(UsbDevListWK->sUsbDev.eState != USBH_USBD_USB_STATE_CONFIGURED) {
UsbDevListWK->ClassID = USBH_HSBD_HUB_CLASS_ID;
if(add_flg) {
break;
}
/* It will be proceessed internally incase of hub class ( for configuration use of hub directly under root hub ) */
USBH_USBD_Mode = USBH_USBD_MODE_SCFG; /* SET CONFIGURATION */
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
}
#if 0
} else {
/* Notify of connecting besides HUB class */
for( i = 0; i < USBH_USBD_CLASSDRIVERNUM; i++ ){
USBH_USBDS_ExecCallback(ClassINFO[i].pfnEntryClassCallback, USBH_USBD_MSG_CONNECT_OK, psCurUSBDev->devNum, UsbDevListWK);
}
#endif
}
if(add_flg==0) {
/* Carry out configuration of hub device which is not configured with SET CONFIGURATION. */
UsbDevListWK = (USBH_USBD_DEVLIST_HEAD *)DeviceCtlTbl.DevInfo;
while( UsbDevListWK ) {
if((psCurUSBDev != &UsbDevListWK->sUsbDev) && (UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE) ) {
if(UsbDevListWK->sUsbDev.eState != USBH_USBD_USB_STATE_CONFIGURED) {
UsbDevListWK->ClassID = USBH_HSBD_HUB_CLASS_ID;
USBH_USBD_Mode = USBH_USBD_MODE_SCFG; /* SET CONFIGURATION */
hubStart = 10;
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 1 );
break;
}
}
UsbDevListWK = UsbDevListWK->psNext;
}
}
}
break;
case USBH_USBD_MODE_CPORTCON: /* At the device cut off */
/* Detect cuting off parent HUB of device to cut off, search and delete port number connected to HUB */
psCurUSBDev = psURB->psDev;
USBH_USBDS_DelListURB(psURB);
USBH_USBDS_DelALLDev(psCurUSBDev);
break;
case USBH_USBD_MODE_SCFG: /* SET CONFIGURATION DESCRIPTOR */
if(UsbDevInfo == &RootHubDev) {
USBH_USBD_Mode = USBH_USBD_MODE_GHUBDES; /* GET HUBDESCRIPTOR */
USBH_USBDS_DelListURB(psURB);
} else {
USBH_USBDS_DelListURB(psURB);
USBH_USBD_Mode = USBH_USBD_MODE_GHUBDES; /* GET HUBDESCRIPTOR */
UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
}
break;
case USBH_USBD_MODE_GHUBDES: /* GET HUBDESCRIPTOR */
if(UsbDevInfo == &RootHubDev) {
ret = AnalizeDescriptor(USBH_USBD_DTYPE_HUBVAL, psURB->pTransBuf, &RootHubDev.sUsbDes, USBH_USBD_OFF);
if(ret == USBH_USBD_STATUS_SUCCESS) {
USBH_USBD_Mode = USBH_USBD_MODE_INTRIN;
}
USBH_USBDS_DelListURB(psURB);
} else {
psCurUSBDev = psURB->psDev;
UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
ret = AnalizeDescriptor(USBH_USBD_DTYPE_HUBVAL, psURB->pTransBuf, &UsbDevListWK->sUsbDes, USBH_USBD_OFF);
USBH_USBDS_DelListURB(psURB);
if(ret != USBH_USBD_STATUS_SUCCESS) {
connect_status = 1;
break;
}
portPowerNum = 1;
/* At the time of connecting of plura HUBs to same HUB */
if(hubStart == 0) {
portPowerDo = 1;
}
UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
USBH_USBD_Mode = USBH_USBD_MODE_INTRIN;
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
}
break;
case USBH_USBD_MODE_SPORTPWR:
if(UsbDevInfo == &RootHubDev) {
// Message is returned in call back function
USBH_USBDS_ExecCallback(pfnInit.Callback, USBH_USBD_MSG_INIT_CMP, pfnInit.retValue, NULL);
usbdInitialize = 0;
USBH_USBDS_DelListURB(psURB);
} else {
psCurUSBDev = psURB->psDev;
USBH_USBDS_DelListURB(psURB);
portPowerNum++;
UsbDevListWK = USBH_USBDS_SearchDevList( psURB->psDev );
if( portPowerNum <= UsbDevListWK->sUsbDes.Hub.bNbrPorts ){
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
} else {
/* Carry out configuration of hub device which is not configured with SET CONFIGURATION. */
UsbDevListWK = (USBH_USBD_DEVLIST_HEAD *)DeviceCtlTbl.DevInfo;
while( UsbDevListWK ) {
if((psCurUSBDev != &UsbDevListWK->sUsbDev) && (UsbDevListWK->sUsbDes.Dev.bDeviceClass == USBH_HSBD_HUB_CLASS_CODE) ) {
if(UsbDevListWK->sUsbDev.eState != USBH_USBD_USB_STATE_CONFIGURED) {
UsbDevListWK->ClassID = USBH_HSBD_HUB_CLASS_ID;
USBH_USBD_Mode = USBH_USBD_MODE_SCFG; /* SET CONFIGURATION */
hubStart = 10;
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 1 );
return;
}
}
UsbDevListWK = UsbDevListWK->psNext;
}
portPowerDo = 0;
/* Joint bit is initialized. */
UsbDevListWK->statRESET = 0;
USBH_USBD_Mode = USBH_USBD_MODE_COMP;
}
}
break;
}
} else {
/*
When it fails the request that uses it with the enumeration I do retransmission.
*/
psCurUSBDev = psURB->psDev;
USBH_USBDS_DelListURB(psURB);
if(psCurUSBDev->devNum != 0) {
UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev );
switch(USBH_USBD_Mode) {
case USBH_USBD_MODE_DEVDES8: /* GET DEVICE DESCRIPTOR(Get TotalLength only) */
USBH_USBDS_DeviceEnumeration(USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0);
break;
case USBH_USBD_MODE_DEVDES: /* GET DEVICE DESCRIPTOR */
UsbDevInfo->sUsbDev.epMaxPacketIn[0] = UsbDevInfo->sUsbDes.Dev.bMaxPacketSize0;
UsbDevInfo->sUsbDev.epMaxPacketOut[0] = UsbDevInfo->sUsbDes.Dev.bMaxPacketSize0;
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
break;
case USBH_USBD_MODE_CFGDES8: /* CONFIGURATION DESCRIPTOR( Get TotalLength only ) */
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
break;
case USBH_USBD_MODE_CFGDES: /* CONFIGURATION DESCRIPTOR */
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
break;
case USBH_USBD_MODE_SADDR: /* SET ADDRESS */
USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_DEVICE, UsbDevListWK, 0 );
break;
case USBH_USBD_MODE_CPORTCON: /* DEVICE DISCONNECT */
break;
case USBH_USBD_MODE_SCFG: /* SET CONFIGURATION DESCRIPTOR */
break;
case USBH_USBD_MODE_GHUBDES: /* GET HUBDESCRIPTOR */
break;
case USBH_USBD_MODE_SPORTPWR:
portPowerNum--;
break;
}
} else {
UsbDevListWK = USBH_USBDS_SearchDevList( psCurUSBDev->psParent );
UsbDevListWK->statRESET &= ~(1<<psCurUSBDev->port);
}
}
}
/*=============================================================================================
// Function_Name: USBH_USBDS_DeviceEnumeration
//
// description : Carry out device emulation.
//
// argument : type Object type ( USBH_USBD_ENUME_ROOTHUB: root hub, USBH_USBD_ENUME_DEVICE: device )( in )
// : *wUsbDev USB device structure ( in )
//
// return : USBH_USBD_STATUS_SUCCESS Process finish normally
===============================================================================================*/
STATIC_T long USBH_USBDS_DeviceEnumeration( UCHAR type, USBH_USBD_DEVLIST_HEAD *wUsbDev, UCHAR hub )
{
USBH_USBD_URB *TmpUrb=0, turb;
long retValue=USBH_USBD_STATUS_UNSUCCESSFUL;
USHORT wTotalLength;
UCHAR deviceaddress=0;
turb.pfnComplete = USBH_USBDS_DeviceCallbackProc;
switch(USBH_USBD_Mode) {
case USBH_USBD_MODE_DEVDES8: /* GET DEVICE DESCRIPTOR ( TotalLength acquisition only ) */
case USBH_USBD_MODE_DEVDES: /* GET DEVICE DESCRIPTOR */
case USBH_USBD_MODE_DEVQDES: /* DEVICE QUALIFIER DESCRIPTOR */
case USBH_USBD_MODE_CFGDES8: /* CONFIGURATION DESCRIPTOR ( TotalLength acquisition only ) */
case USBH_USBD_MODE_CFGDES: /* CONFIGURATION DESCRIPTOR */
memset(GDdata, 0, GETDESCRIPTER_DEFSIZE);
TmpUrb = USBH_USBDS_AddURBList();
if(TmpUrb == (USBH_USBD_URB *)USBH_USBD_STATUS_UNSUCCESSFUL) {
return USBH_USBD_STATUS_UNSUCCESSFUL;
}
TmpUrb->psDev = (USBH_USBD_USBDEV *)&wUsbDev->sUsbDev ; /* (in ) */
TmpUrb->pipe = USBH_USBD_SetPipeType(USBH_HCD_PIPE_CONTROL, ENUM_EP0, DEF_DEVAD0, USBH_HCD_DIR_IN);
switch(USBH_USBD_Mode) {
case USBH_USBD_MODE_DEVDES8: /* Read 8 bytes only for getting data size to get */
USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, 0x08, 0, USBH_USBD_DTYPE_DEVICE);
break;
case USBH_USBD_MODE_DEVDES:
if(type == USBH_USBD_ENUME_ROOTHUB) {
wTotalLength = RootHubDev.sUsbDes.Dev.bLength;
} else {
wTotalLength = UsbDevInfo->sUsbDes.Dev.bLength;
}
wTotalLength = MIN(sizeof(GDdata), wTotalLength);
USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, wTotalLength, 0, USBH_USBD_DTYPE_DEVICE);
break;
case USBH_USBD_MODE_DEVQDES:
USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, USBH_USBD_MAXPACKETSIZE, 0, USBH_USBD_DTYPE_QUALIF);
break;
case USBH_USBD_MODE_CFGDES8: /* Read 8 bytes only for getting data size to get */
USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, 0x08, 0, USBH_USBD_DTYPE_CONFIG);
break;
case USBH_USBD_MODE_CFGDES:
if(type == USBH_USBD_ENUME_ROOTHUB) {
wTotalLength = MAKEWORD(RootHubDev.sUsbDes.Config.wTotalLength[0], RootHubDev.sUsbDes.Config.wTotalLength[1]);
} else {
wTotalLength = MAKEWORD(UsbDevInfo->sUsbDes.Config.wTotalLength[0], UsbDevInfo->sUsbDes.Config.wTotalLength[1]);
}
wTotalLength = MIN(sizeof(GDdata), wTotalLength);
USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_GETDESCRIPTOR, wTotalLength, 0, USBH_USBD_DTYPE_CONFIG);
break;
}
USBH_USBDS_SetTranPara(TmpUrb, 0, GDdata, (ULONG)MAKEWORD(((SETUP_REQUEST *)TmpUrb->pSetupPacket)->wLengthL, ((SETUP_REQUEST *)TmpUrb->pSetupPacket)->wLengthH), turb.pfnComplete);
retValue = USBH_HCD_SubmitURB((USBH_HCD_URB *)TmpUrb);
if( retValue != USBH_USBD_STATUS_SUCCESS ) {
USBH_USBDS_DelListURB(TmpUrb);
}
break;
case USBH_USBD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -