| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262 |
- /*
- * Copyright (c) 2022 OpenLuat & AirM2M
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- #include "user.h"
- typedef struct
- {
- USB_SetupInfoStruct Setup;
- USB_HWCapsStruct HWCaps;
- usb_device_request_t LastRequest;
- Buffer_Struct FullConfigDataBuf;
- Buffer_Struct FullOtherSpeedConfigDataBuf;
- USB_EndpointCtrlStruct *pEpCtrl;
- Timer_t *WaitDataTimer;
- HANDLE pHWCtrl;
- union
- {
- uint16_t DeviceStatus;
- struct
- {
- uint16_t SelfPower:1;
- uint16_t RemoteWakeupEnable:1;
- uint16_t U1Enable:1;
- uint16_t U2Enable:1;
- uint16_t LTMEnable:1;
- uint16_t Zero:11;
- }DEVSTATUS_b;
- };
- union
- {
- uint16_t InterfaceStatus;
- struct
- {
- uint16_t RemoteWakeCapable:1;
- uint16_t RemoteWakeupEnable:1;
- uint16_t Zero:14;
- }INFSTATUS_b;
- };
- uint8_t DeviceState;
- uint8_t Ep0Stage;
- uint8_t IsRequestError;
- uint8_t BusPowered;
- uint8_t SelfID;
- uint8_t ConfigNo;
- uint8_t DefaultConfigNo;
- }USB_StackCtrlStruct;
- #define USB_DBG(x, y...)
- //#define USB_DBG DBG
- #define USB_ERR DBG
- static USB_StackCtrlStruct prvUSBCore[USB_MAX];
- static int32_t prvUSB_StackDummyEpCB(void *pData, void *pParam)
- {
- USB_EndpointDataStruct *EpData = (USB_EndpointDataStruct *)pData;
- USB_ERR("USB%d EP%d no work!", EpData->USB_ID, EpData->EpIndex);
- return -ERROR_OPERATION_FAILED;
- }
- static int32_t prvUSB_StackDummyStateCB(void *pData, void *pParam)
- {
- return -ERROR_OPERATION_FAILED;
- }
- static void prvUSB_ResetEpCtrl(uint8_t USB_ID, uint8_t Index)
- {
- OS_DeInitBuffer(&prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf);
- memset(&prvUSBCore[USB_ID].pEpCtrl[Index], 0, sizeof(USB_EndpointCtrlStruct));
- prvUSBCore[USB_ID].pEpCtrl[Index].CB = prvUSB_StackDummyEpCB;
- prvUSBCore[USB_ID].pEpCtrl[Index].ForceZeroPacket = 0;
- }
- static int32_t prvUSB_SetupRxTimeout(void *pData, void *pParam)
- {
- USB_SetDeviceEPStatus(pParam, 0, 1, USB_EP_STATE_STALL);
- USB_ERR("!");
- }
- static void prvUSB_StackEpInit(uint8_t USB_ID)
- {
- usb_full_config_t *pConfig = prvUSBCore[USB_ID].Setup.pCurConfigInfo->pFullConfig[prvUSBCore[USB_ID].Setup.CurSpeed];
- uint32_t i, Index;
- usb_full_interface_t *pFullInterface;
- uint8_t EpID, ToHost, EpNum;
- for(Index = 0; Index < pConfig->InterfaceNum; Index++)
- {
- pFullInterface = &pConfig->pInterfaceFullDesc[Index];
- EpNum = pFullInterface->EndpointNum;
- for(i = 0; i < EpNum; i++)
- {
- ToHost = UE_GET_DIR(pFullInterface->pEndpointDesc[i].bEndpointAddress);
- EpID = UE_GET_ADDR(pFullInterface->pEndpointDesc[i].bEndpointAddress);
- prvUSBCore[USB_ID].pEpCtrl[EpID].XferType = UE_GET_XFERTYPE(pFullInterface->pEndpointDesc[i].bmAttributes);
- prvUSBCore[USB_ID].pEpCtrl[EpID].MaxPacketLen = BytesGetLe16(pFullInterface->pEndpointDesc[i].wMaxPacketSize);
- if (ToHost)
- {
- prvUSBCore[USB_ID].pEpCtrl[EpID].ToHostEnable = 1;
- }
- else
- {
- prvUSBCore[USB_ID].pEpCtrl[EpID].ToDeviceEnable = 1;
- OS_ReInitBuffer(&prvUSBCore[USB_ID].pEpCtrl[EpID].RxBuf, prvUSBCore[USB_ID].pEpCtrl[EpID].MaxPacketLen * 2);
- }
- USB_DBG("interface %d, Ep %x address %x fifo %d type %d", Index, i,
- pFullInterface->pEndpointDesc[i].bEndpointAddress,
- prvUSBCore[USB_ID].pEpCtrl[EpID].MaxPacketLen, prvUSBCore[USB_ID].pEpCtrl[EpID].XferType);
- }
- }
- }
- static void prvUSB_StackMakeFullConfigData(uint8_t USB_ID)
- {
- usb_full_config_t *pConfig;
- usb_config_descriptor_t TempConfigDesc;
- uint32_t i, Index;
- volatile uint16_t TotalLen;
- pConfig = prvUSBCore[USB_ID].Setup.pCurConfigInfo->pFullConfig[prvUSBCore[USB_ID].Setup.CurSpeed];
- memcpy(&TempConfigDesc, pConfig->pConfigDesc, sizeof(usb_config_descriptor_t));
- if (!prvUSBCore[USB_ID].BusPowered)
- {
- TempConfigDesc.bmAttributes &= ~UC_BUS_POWERED;
- TempConfigDesc.bmAttributes |= UC_SELF_POWERED;
- }
- else
- {
- TempConfigDesc.bmAttributes |= UC_BUS_POWERED;
- }
- TotalLen = sizeof(usb_config_descriptor_t);
- if (pConfig->pInterfaceAssocDesc)
- {
- TotalLen += sizeof(usb_interface_assoc_descriptor_t);
- }
- for(Index = 0; Index < pConfig->InterfaceNum; Index++)
- {
- TotalLen += sizeof(usb_interface_descriptor_t);
- if (pConfig->pInterfaceFullDesc[Index].GetOtherDesc)
- {
- TotalLen += pConfig->pInterfaceFullDesc[Index].GetOtherDesc(NULL, NULL);
- }
- if (USB_DEVICE_SPEED_SUPER_SPEED == prvUSBCore[USB_ID].Setup.CurSpeed)
- {
- for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
- {
- TotalLen += sizeof(usb_endpoint_descriptor_t);
- TotalLen += sizeof(usb_endpoint_ss_comp_descriptor_t);
- }
- }
- else
- {
- for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
- {
- TotalLen += sizeof(usb_endpoint_descriptor_t);
- }
- }
- }
- OS_ReInitBuffer(&prvUSBCore[USB_ID].FullConfigDataBuf, TotalLen);
- BytesPutLe16(TempConfigDesc.wTotalLength, TotalLen);
- TempConfigDesc.bConfigurationValue = prvUSBCore[USB_ID].ConfigNo;
- OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, &TempConfigDesc, sizeof(usb_config_descriptor_t));
- if (pConfig->pInterfaceAssocDesc)
- {
- OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, pConfig->pInterfaceAssocDesc, sizeof(usb_interface_assoc_descriptor_t));
- }
- for(Index = 0; Index < pConfig->InterfaceNum; Index++)
- {
- OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, pConfig->pInterfaceFullDesc[Index].pInterfaceDesc, sizeof(usb_interface_descriptor_t));
- if (pConfig->pInterfaceFullDesc[Index].GetOtherDesc)
- {
- prvUSBCore[USB_ID].FullConfigDataBuf.Pos += pConfig->pInterfaceFullDesc[Index].GetOtherDesc(prvUSBCore[USB_ID].FullConfigDataBuf.Data + prvUSBCore[USB_ID].FullConfigDataBuf.Pos, NULL);
- }
- if (USB_DEVICE_SPEED_SUPER_SPEED == prvUSBCore[USB_ID].Setup.CurSpeed)
- {
- for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
- {
- OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, &pConfig->pInterfaceFullDesc[Index].pEndpointDesc[i], sizeof(usb_endpoint_descriptor_t));
- OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, &pConfig->pInterfaceFullDesc[Index].pEndpointSSCompDesc[i], sizeof(usb_endpoint_ss_comp_descriptor_t));
- }
- }
- else
- {
- for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
- {
- OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, &pConfig->pInterfaceFullDesc[Index].pEndpointDesc[i], sizeof(usb_endpoint_descriptor_t));
- }
- }
- }
- OS_DeInitBuffer(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf);
- switch(prvUSBCore[USB_ID].Setup.CurSpeed)
- {
- case USB_DEVICE_SPEED_FULL_SPEED:
- pConfig = prvUSBCore[USB_ID].Setup.pCurConfigInfo->pFullConfig[USB_DEVICE_SPEED_HIGH_SPEED];
- if (pConfig)
- {
- goto MAKE_OTHER_SPEED;
- }
- break;
- case USB_DEVICE_SPEED_HIGH_SPEED:
- pConfig = prvUSBCore[USB_ID].Setup.pCurConfigInfo->pFullConfig[USB_DEVICE_SPEED_FULL_SPEED];
- if (pConfig)
- {
- goto MAKE_OTHER_SPEED;
- }
- break;
- default:
- return;
- }
- return;
- MAKE_OTHER_SPEED:
- OS_ReInitBuffer(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, TotalLen);
- memcpy(&TempConfigDesc, pConfig->pConfigDesc, sizeof(usb_config_descriptor_t));
- BytesPutLe16(TempConfigDesc.wTotalLength, TotalLen);
- TempConfigDesc.bDescriptorType = UDESC_OTHER_SPEED_CONFIGURATION;
- TempConfigDesc.bConfigurationValue = prvUSBCore[USB_ID].ConfigNo;
- if (!prvUSBCore[USB_ID].BusPowered)
- {
- TempConfigDesc.bmAttributes &= ~UC_BUS_POWERED;
- TempConfigDesc.bmAttributes |= UC_SELF_POWERED;
- }
- else
- {
- TempConfigDesc.bmAttributes |= UC_BUS_POWERED;
- }
- OS_BufferWrite(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, &TempConfigDesc, sizeof(usb_config_descriptor_t));
- if (pConfig->pInterfaceAssocDesc)
- {
- OS_BufferWrite(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, pConfig->pInterfaceAssocDesc, sizeof(usb_interface_assoc_descriptor_t));
- }
- for(Index = 0; Index < pConfig->InterfaceNum; Index++)
- {
- OS_BufferWrite(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, pConfig->pInterfaceFullDesc[Index].pInterfaceDesc, sizeof(usb_interface_descriptor_t));
- if (pConfig->pInterfaceFullDesc[Index].GetOtherDesc)
- {
- prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf.Pos += pConfig->pInterfaceFullDesc[Index].GetOtherDesc(prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf.Data + prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf.Pos, NULL);
- }
- for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
- {
- OS_BufferWrite(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, &pConfig->pInterfaceFullDesc[Index].pEndpointDesc[i], sizeof(usb_endpoint_descriptor_t));
- }
- }
- }
- void USB_StackResetEpBuffer(uint8_t USB_ID, uint8_t Index)
- {
- if (prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf.MaxLen > prvUSBCore[USB_ID].HWCaps.EpBufMaxLen)
- {
- OS_DeInitBuffer(&prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf);
- OS_InitBuffer(&prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf, prvUSBCore[USB_ID].pEpCtrl[Index].MaxPacketLen * 2);
- }
- else
- {
- prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf.Pos = 0;
- }
- memset(&prvUSBCore[USB_ID].pEpCtrl[Index].TxBuf, 0, sizeof(Buffer_Struct));
- }
- void USB_StackSetControl(uint8_t USB_ID, HANDLE pHWCtrl,USB_EndpointCtrlStruct *pEpCtrl, USB_HWCapsStruct *Caps)
- {
- uint32_t i;
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USBCore->pHWCtrl = pHWCtrl;
- memcpy(&USBCore->HWCaps, Caps, sizeof(USB_HWCapsStruct));
- for(i = 0; i < USB_EP_MAX; i++)
- {
- USBCore->pEpCtrl[i].CB = prvUSB_StackDummyEpCB;
- }
- USBCore->SelfID = USB_ID;
- USBCore->pEpCtrl = pEpCtrl;
- prvUSBCore[USB_ID].WaitDataTimer = Timer_Create(prvUSB_SetupRxTimeout, pHWCtrl, NULL);
- }
- void USB_StackClearSetup(uint8_t USB_ID)
- {
- USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
- uint32_t i, j;
- if (pSetup->pString)
- {
- for(i = 0;i < pSetup->StringNum; i++)
- {
- OS_DeInitBuffer(&pSetup->pString[i]);
- }
- }
- free(pSetup->pString);
- memset(&prvUSBCore[USB_ID].Setup, 0, sizeof(USB_SetupInfoStruct));
- for(i = 0; i < USB_EP_MAX; i++)
- {
- prvUSB_ResetEpCtrl(USB_ID, i);
- // prvUSBCore[USB_ID].pEpCtrl[i].CB = prvUSB_StackDummyEpCB;
- }
- prvUSBCore[USB_ID].Ep0Stage = USB_EP0_STAGE_SETUP;
- prvUSBCore[USB_ID].pEpCtrl[0].ForceZeroPacket = 1;
- prvUSBCore[USB_ID].Setup.CB = prvUSB_StackDummyStateCB;
- }
- void USB_StackDeviceAfterDisconnect(uint8_t USB_ID)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- PV_Union uPV;
- uint8_t i;
- uPV.u8[0] = USB_ID;
- uPV.u8[1] = USBD_BUS_TYPE_ENABLE_CONNECT;
- USBCore->Setup.CB(uPV.u32, USBCore->Setup.pUserData);
- }
- void USB_StackSetDeviceConfig(uint8_t USB_ID, usb_device_descriptor_t *pDeviceDesc, USB_FullConfigStruct *pConfigInfo, uint8_t ConfigNum, uint8_t StringNum, CBFuncEx_t CB, void *pUserData)
- {
- USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
- uint32_t i;
- if (pSetup->pDeviceDesc)
- {
- USB_ERR("clear device info first");
- return;
- }
- pSetup->pDeviceDesc = pDeviceDesc;
- if (CB)
- {
- pSetup->CB = CB;
- }
- else
- {
- pSetup->CB = prvUSB_StackDummyStateCB;
- }
- pSetup->pUserData = pUserData;
- pSetup->pConfigInfo = pConfigInfo;
- pSetup->ConfigNum = ConfigNum;
- pSetup->pString = zalloc(sizeof(Buffer_Struct) * StringNum);
- pSetup->StringNum = StringNum;
- prvUSBCore[USB_ID].pEpCtrl[0].ToDeviceEnable = 1;
- prvUSBCore[USB_ID].pEpCtrl[0].ToHostEnable = 1;
- prvUSBCore[USB_ID].DefaultConfigNo = 0;
- prvUSBCore[USB_ID].ConfigNo = 0;
- OS_ReInitBuffer(&prvUSBCore[USB_ID].pEpCtrl[0].RxBuf, pSetup->pDeviceDesc->bMaxPacketSize * 2);
- }
- void USB_StackSetDeviceSpeed(uint8_t USB_ID, uint8_t Speed)
- {
- prvUSBCore[USB_ID].Setup.CurSpeed = Speed;
- }
- void USB_StackSetEpCB(uint8_t USB_ID, uint8_t Index, CBFuncEx_t CB, void *pUserData)
- {
- USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
- if (!CB)
- {
- prvUSBCore[USB_ID].pEpCtrl[Index].CB = prvUSB_StackDummyEpCB;
- }
- else
- {
- prvUSBCore[USB_ID].pEpCtrl[Index].CB = CB;
- }
- prvUSBCore[USB_ID].pEpCtrl[Index].pData = pUserData;
- }
- void USB_StackSetString(uint8_t USB_ID, uint8_t Index, const uint8_t *Data, uint16_t Len)
- {
- USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
- if (Index >= pSetup->StringNum)
- {
- USB_ERR("over index %d,%d", Index, pSetup->StringNum);
- return;
- }
- OS_ReInitBuffer(&pSetup->pString[Index], Len + 2);
- pSetup->pString[Index].Data[0] = Len + 2;
- pSetup->pString[Index].Data[1] = UDESC_STRING;
- memcpy(pSetup->pString[Index].Data, Data, Len);
- }
- void USB_StackSetCharString(uint8_t USB_ID, uint8_t Index, const char *Data, uint16_t Len)
- {
- uint16_t i;
- USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
- if (Index >= pSetup->StringNum)
- {
- USB_ERR("over index %d,%d", Index, pSetup->StringNum);
- return;
- }
- OS_ReInitBuffer(&pSetup->pString[Index], (Len * 2) + 2);
- pSetup->pString[Index].Data[0] = (Len * 2) + 2;
- pSetup->pString[Index].Data[1] = UDESC_STRING;
- pSetup->pString[Index].Pos = 2;
- for(i = 0; i < Len; i++)
- {
- pSetup->pString[Index].Data[pSetup->pString[Index].Pos] = Data[i];
- pSetup->pString[Index].Pos+=2;
- }
- }
- int32_t USB_StackStop(uint8_t USB_ID)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USB_Stop(USBCore->pHWCtrl);
- USB_ResetStart(USBCore->pHWCtrl);
- USBCore->DeviceState = USB_STATE_DETACHED;
- return ERROR_NONE;
- }
- void USB_StackPowerOnOff(uint8_t USB_ID, uint8_t OnOff)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USB_PowerOnOff(USBCore->pHWCtrl, OnOff);
- }
- void USB_StackPutRxData(uint8_t USB_ID, uint8_t EpIndex, const uint8_t *Data, uint32_t Len)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- OS_BufferWrite(&USBCore->pEpCtrl[EpIndex].RxBuf, Data, Len);
- }
- int32_t USB_StackStartDevice(uint8_t USB_ID)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USB_ResetEnd(USBCore->pHWCtrl);
- USB_SetWorkMode(USBCore->pHWCtrl, USB_MODE_DEVICE);
- USBCore->ConfigNo = 0;
- USBCore->DefaultConfigNo = 0;
- USBCore->Setup.pCurConfigInfo = &USBCore->Setup.pConfigInfo[USBCore->ConfigNo];
- prvUSB_StackEpInit(USB_ID);
- USB_InitEpCfg(USBCore->pHWCtrl);
- prvUSB_StackMakeFullConfigData(USBCore->SelfID);
- USB_Start(USBCore->pHWCtrl);
- USBCore->DeviceState = USB_STATE_DETACHED;
- return ERROR_NONE;
- }
- int32_t USB_StackStartHost(uint8_t USB_ID)
- {
- return -1;
- }
- int32_t USB_StackStartOTG(uint8_t USB_ID)
- {
- return -1;
- }
- int32_t USB_StackTxEpData(uint8_t USB_ID, uint8_t EpIndex, void *pData, uint32_t Len, uint32_t MaxLen, uint8_t ForceZeroPacket)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, EpIndex, 0, USB_EP_STATE_ACK);
- if (USBCore->pEpCtrl[EpIndex].TxBuf.Data)
- {
- USB_FlushFifo(USBCore->pHWCtrl, EpIndex, 0);
- }
- Buffer_StaticInit(&USBCore->pEpCtrl[EpIndex].TxBuf, pData, Len);
- USBCore->pEpCtrl[EpIndex].XferMaxLen = MaxLen;
- if (!EpIndex)
- {
- USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
- }
- else
- {
- USBCore->pEpCtrl[EpIndex].ForceZeroPacket = ForceZeroPacket;
- if (USBCore->pEpCtrl[EpIndex].TxBuf.Data)
- {
- USB_DeviceXfer(USBCore->pHWCtrl, EpIndex);
- }
- else
- {
- DBG("!");
- USB_SendZeroPacket(USBCore->pHWCtrl, EpIndex);
- }
- }
- return ERROR_NONE;
- }
- void USB_StackStopDeviceTx(uint8_t USB_ID, uint8_t EpIndex, uint8_t IsNeedNotify)
- {
- if (EpIndex)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USB_EndpointCtrlStruct *pEpCtrl = &USBCore->pEpCtrl[EpIndex];
- USB_EndpointDataStruct EpData;
- EpData.USB_ID = USB_ID;
- EpData.EpIndex = EpIndex;
- EpData.IsToDevice = 0;
- EpData.Len = 0xffffffff;
- USB_DeviceXferStop(USBCore->pHWCtrl, EpIndex);
- memset(&pEpCtrl->TxBuf, 0, sizeof(Buffer_Struct));
- if (IsNeedNotify)
- {
- pEpCtrl->CB(&EpData, pEpCtrl->pData);
- }
- }
- }
- void USB_StackEpIntOnOff(uint8_t USB_ID, uint8_t EpIndex, uint8_t IsToDevice, uint8_t OnOff)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USB_EpIntOnOff(USB_ID, EpIndex, IsToDevice, OnOff);
- }
- void USB_StackSetEp0Stage(uint8_t USB_ID, uint8_t Stage)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- if (USBCore->Ep0Stage != USB_EP0_STAGE_SETUP)
- {
- USBCore->Ep0Stage = Stage;
- }
- }
- void USB_StackSetRxEpDataLen(uint8_t USB_ID, uint8_t EpIndex, uint32_t Len)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USBCore->pEpCtrl[EpIndex].XferMaxLen = Len;
- }
- void USB_StackSetEpStatus(uint8_t USB_ID, uint8_t EpIndex, uint8_t IsToDevice, uint8_t Status)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- // DBG("%d,%d,%d", EpIndex, IsToDevice, Status);
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, EpIndex, IsToDevice, Status);
- }
- void USB_StackDeviceBusChange(uint8_t USB_ID, uint8_t Type)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- PV_Union uPV;
- uint8_t i;
- uPV.u8[0] = USB_ID;
- uPV.u8[1] = Type;
- switch (Type)
- {
- case USBD_BUS_TYPE_SUSPEND:
- PM_SetDriverRunFlag(PM_DRV_USB, 0);
- Core_USBAction(USB_ID, SERV_USB_SUSPEND, USBCore->pHWCtrl);
- USBCore->Setup.CB(uPV.u32, USBCore->Setup.pUserData);
- break;
- case USBD_BUS_TYPE_RESUME:
- Core_USBAction(USB_ID, SERV_USB_RESUME, USBCore->pHWCtrl);
- USBCore->Setup.CB(uPV.u32, USBCore->Setup.pUserData);
- break;
- case USBD_BUS_TYPE_RESET:
- PM_SetDriverRunFlag(PM_DRV_USB, 1);
- for(i = 0; i < USB_EP_MAX; i++)
- {
- USB_StackResetEpBuffer(USB_ID, i);
- }
- USBCore->DeviceState = USB_STATE_ATTACHED;
- USBCore->Setup.CB(uPV.u32, USBCore->Setup.pUserData);
- break;
- case USBD_BUS_TYPE_NEW_SOF:
- break;
- case USBD_BUS_TYPE_DISCONNECT:
- PM_SetDriverRunFlag(PM_DRV_USB, 0);
- if (USBCore->DeviceState != USB_STATE_DETACHED)
- {
- USB_Stop(USBCore->pHWCtrl);
- USB_ResetStart(USBCore->pHWCtrl);
- USBCore->DeviceState = USB_STATE_DETACHED;
- //交给用户层决定是继续保持device,还是变成OTG
- Core_USBAction(USB_ID, SERV_USB_RESET_END, USBCore->pHWCtrl);
- }
- break;
- }
- }
- static int32_t prvUSB_DeviceNoSupport(void *pData, void *pParam)
- {
- return -1;
- }
- static int32_t prvUSB_DeviceGetStatus(void *pData, void *pParam)
- {
- USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
- usb_device_request_t *Request = (usb_device_request_t *)pParam;
- uint8_t EpID, ToHost;
- switch(Request->bmRequestType & UT_RECIP_MASK)
- {
- case UT_RECIP_DEVICE:
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->DeviceStatus, 2);
- break;
- case UT_RECIP_INTERFACE:
- if (Request->wIndex[0] >= USBCore->Setup.pCurConfigInfo->pFullConfig[USBCore->Setup.CurSpeed]->InterfaceNum)
- {
- return -1;
- }
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->InterfaceStatus, 2);
- break;
- case UT_RECIP_ENDPOINT:
- ToHost = UE_GET_DIR(Request->wIndex[0]);
- EpID = UE_GET_ADDR(Request->wIndex[0]);
- if (EpID >= USB_EP_MAX)
- {
- return -1;
- }
- if (ToHost)
- {
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->pEpCtrl[EpID].ToHostStatus, 2);
- }
- else
- {
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->pEpCtrl[EpID].ToDeviceStatus, 2);
- }
- break;
- default:
- return -1;
- break;
- }
- USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
- return 0;
- }
- static int32_t prvUSB_DeviceClearFeature(void *pData, void *pParam)
- {
- USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
- usb_device_request_t *Request = (usb_device_request_t *)pParam;
- uint16_t wValue = BytesGetLe16(Request->wValue);
- uint8_t EpID, ToHost;
- USBCore->Ep0Stage = USB_EP0_STAGE_SETUP;
- switch(Request->bmRequestType & UT_RECIP_MASK)
- {
- case UT_RECIP_DEVICE:
- switch(wValue)
- {
- case UF_DEVICE_REMOTE_WAKEUP:
- if (USBCore->HWCaps.FEATURE_b.RemoteWakeup)
- {
- USBCore->DEVSTATUS_b.RemoteWakeupEnable = 0;
- USBCore->INFSTATUS_b.RemoteWakeupEnable = 0;
- }
- else
- {
- return -1;
- }
- break;
- case UF_U1_ENABLE:
- if (USBCore->HWCaps.FEATURE_b.U1)
- {
- USBCore->DEVSTATUS_b.U1Enable = 0;
- }
- else
- {
- return -1;
- }
- break;
- case UF_U2_ENABLE:
- if (USBCore->HWCaps.FEATURE_b.U2)
- {
- USBCore->DEVSTATUS_b.U2Enable = 0;
- }
- else
- {
- return -1;
- }
- break;
- case UF_LTM_ENABLE:
- if (USBCore->HWCaps.FEATURE_b.LTM)
- {
- USBCore->DEVSTATUS_b.LTMEnable = 0;
- }
- else
- {
- return -1;
- }
- break;
- default:
- return -1;
- break;
- }
- break;
- case UT_RECIP_INTERFACE:
- if (Request->wIndex[0] >= USBCore->Setup.pCurConfigInfo->pFullConfig[USBCore->Setup.CurSpeed]->InterfaceNum)
- {
- return -1;
- }
- switch(wValue)
- {
- case UF_DEVICE_SUSPEND:
- break;
- default:
- return -1;
- break;
- }
- break;
- case UT_RECIP_ENDPOINT:
- Request->wIndex[0] &= 0x00ff;
- ToHost = UE_GET_DIR(Request->wIndex[0]);
- EpID = UE_GET_ADDR(Request->wIndex[0]);
- if (EpID >= USB_EP_MAX)
- {
- return -1;
- }
- if (ToHost)
- {
- switch(wValue)
- {
- case UF_ENDPOINT_HALT:
- USBCore->pEpCtrl[EpID].INSTATUS_b.Halt = 0;
- break;
- default:
- break;
- }
- }
- else
- {
- switch(wValue)
- {
- case UF_ENDPOINT_HALT:
- USBCore->pEpCtrl[EpID].OUTSTATUS_b.Halt = 0;
- break;
- default:
- break;
- }
- }
- break;
- default:
- return -1;
- break;
- }
- return 0;
- }
- static int32_t prvUSB_DeviceSetFeature(void *pData, void *pParam)
- {
- USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
- usb_device_request_t *Request = (usb_device_request_t *)pParam;
- uint8_t EpID, ToHost;
- USBCore->Ep0Stage = USB_EP0_STAGE_SETUP;
- if (USBCore->DeviceState < USB_STATE_ADDRESSED)
- {
- return -1;
- }
- switch(Request->bmRequestType & UT_RECIP_MASK)
- {
- case UT_RECIP_DEVICE:
- switch(Request->wValue[0])
- {
- case UF_DEVICE_REMOTE_WAKEUP:
- if (USBCore->HWCaps.FEATURE_b.RemoteWakeup)
- {
- USBCore->DEVSTATUS_b.RemoteWakeupEnable = 1;
- USBCore->INFSTATUS_b.RemoteWakeupEnable = 1;
- }
- else
- {
- return -1;
- }
- break;
- case UF_U1_ENABLE:
- if (USBCore->HWCaps.FEATURE_b.U1)
- {
- USBCore->DEVSTATUS_b.U1Enable = 1;
- }
- else
- {
- return -1;
- }
- break;
- case UF_U2_ENABLE:
- if (USBCore->HWCaps.FEATURE_b.U2)
- {
- USBCore->DEVSTATUS_b.U2Enable = 1;
- }
- else
- {
- return -1;
- }
- break;
- case UF_LTM_ENABLE:
- if (USBCore->HWCaps.FEATURE_b.LTM)
- {
- USBCore->DEVSTATUS_b.LTMEnable = 1;
- }
- else
- {
- return -1;
- }
- break;
- default:
- return -1;
- break;
- }
- break;
- case UT_RECIP_INTERFACE:
- if (Request->wIndex[0] >= USBCore->Setup.pCurConfigInfo->pFullConfig[USBCore->Setup.CurSpeed]->InterfaceNum)
- {
- return -1;
- }
- switch(Request->wValue[0])
- {
- case UF_DEVICE_SUSPEND:
- if (Request->wIndex[1] & 0x01)
- {
- //设备准备休眠
- Core_USBAction(USBCore->SelfID, SERV_USB_SUSPEND, USBCore->pHWCtrl);
- }
- else
- {
- //设备唤醒
- USB_ResumeStart(USBCore->pHWCtrl);
- Core_USBAction(USBCore->SelfID, SERV_USB_RESUME, USBCore->pHWCtrl);
- }
- if (Request->wIndex[1] & 0x02)
- {
- USBCore->DEVSTATUS_b.RemoteWakeupEnable = 1;
- USBCore->INFSTATUS_b.RemoteWakeupEnable = 1;
- }
- else
- {
- USBCore->DEVSTATUS_b.RemoteWakeupEnable = 0;
- USBCore->INFSTATUS_b.RemoteWakeupEnable = 0;
- }
- break;
- default:
- break;
- }
- break;
- case UT_RECIP_ENDPOINT:
- Request->wIndex[0] &= 0x00ff;
- ToHost = UE_GET_DIR(Request->wIndex[0]);
- EpID = UE_GET_ADDR(Request->wIndex[0]);
- if (EpID >= USB_EP_MAX)
- {
- return -1;
- }
- if (ToHost)
- {
- switch(Request->wValue[0])
- {
- case UF_ENDPOINT_HALT:
- USBCore->pEpCtrl[EpID].INSTATUS_b.Halt = 1;
- break;
- default:
- break;
- }
- }
- else
- {
- switch(Request->wValue[0])
- {
- case UF_ENDPOINT_HALT:
- USBCore->pEpCtrl[EpID].OUTSTATUS_b.Halt = 1;
- break;
- default:
- break;
- }
- }
- break;
- default:
- return -1;
- break;
- }
- return 0;
- }
- static int32_t prvUSB_DeviceSetAddress(void *pData, void *pParam)
- {
- USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
- usb_device_request_t *Request = (usb_device_request_t *)pParam;
- USB_SetDeviceAddress(USBCore->pHWCtrl, Request->wValue[0]);
- if (!USBCore->ConfigNo)
- {
- USBCore->ConfigNo = 0;
- USBCore->DefaultConfigNo = 0;
- USBCore->DeviceState = USB_STATE_ADDRESSED;
- USBCore->Setup.pCurConfigInfo = &USBCore->Setup.pConfigInfo[USBCore->ConfigNo];
- prvUSB_StackEpInit(USBCore->SelfID);
- USB_ReInitEpCfg(USBCore->pHWCtrl);
- prvUSB_StackMakeFullConfigData(USBCore->SelfID);
- }
- return 0;
- }
- static int32_t prvUSB_DeviceGetDescriptor(void *pData, void *pParam)
- {
- USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
- usb_device_request_t *Request = (usb_device_request_t *)pParam;
- uint16_t TxLen;
- uint8_t CurSpeed = USBCore->Setup.CurSpeed;
- USBCore->pEpCtrl[0].XferMaxLen = BytesGetLe16(Request->wLength);
- USB_EndpointDataStruct EpData;
- switch (Request->wValue[1])
- {
- case UDESC_DEVICE:
- TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, sizeof(usb_device_descriptor_t));
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->Setup.pDeviceDesc, TxLen);
- break;
- case UDESC_CONFIG:
- TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, USBCore->FullConfigDataBuf.Pos);
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->FullConfigDataBuf.Data, TxLen);
- break;
- case UDESC_STRING:
- if (Request->wValue[0] < USBCore->Setup.StringNum)
- {
- TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, USBCore->Setup.pString[Request->wValue[0]].MaxLen);
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->Setup.pString[Request->wValue[0]].Data, TxLen);
- break;
- }
- else
- {
- return -1;
- }
- case UDESC_DEVICE_QUALIFIER:
- if (USBCore->HWCaps.FEATURE_b.HighSpeed && USBCore->HWCaps.FEATURE_b.FullSpeed && !USBCore->HWCaps.FEATURE_b.SuperSpeed)
- {
- if (USBCore->Setup.pCurConfigInfo->pQualifierDesc)
- {
- TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, sizeof(usb_device_qualifier_t));
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->Setup.pCurConfigInfo->pQualifierDesc, TxLen);
- }
- else
- {
- return -1;
- }
- }
- else
- {
- return -1;
- }
- break;
- case UDESC_OTHER_SPEED_CONFIGURATION:
- if (USBCore->HWCaps.FEATURE_b.HighSpeed && USBCore->HWCaps.FEATURE_b.FullSpeed)
- {
- if (USBCore->FullOtherSpeedConfigDataBuf.Data && USBCore->FullOtherSpeedConfigDataBuf.Pos)
- {
- TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, USBCore->FullOtherSpeedConfigDataBuf.Pos);
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->FullOtherSpeedConfigDataBuf.Data, TxLen);
- }
- else
- {
- return -1;
- }
- }
- else
- {
- return -1;
- }
- break;
- case UDESC_BOS:
- case UDESC_OTG:
- case UDESC_DEBUG:
- return -1;
- break;
- default:
- memset(&EpData, 0, sizeof(EpData));
- EpData.USB_ID = USBCore->SelfID;
- EpData.IsToDevice = 1;
- EpData.Data = USBCore->pEpCtrl[0].RxBuf.Data;
- EpData.Len = USBCore->pEpCtrl[0].RxBuf.Pos;
- EpData.pLastRequest = Request;
- return USBCore->pEpCtrl[0].CB(&EpData, USBCore->pEpCtrl[0].pData);
- break;
- }
- USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
- return 0;
- }
- static int32_t prvUSB_DeviceSetDescriptor(void *pData, void *pParam)
- {
- return -1;
- }
- static int32_t prvUSB_DeviceGetConfiguration(void *pData, void *pParam)
- {
- USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
- usb_device_request_t *Request = (usb_device_request_t *)pParam;
- if (Request->wLength[0] != 1)
- {
- return -1;
- }
- switch(USBCore->DeviceState)
- {
- case USB_STATE_CONFIGURED:
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->ConfigNo, 1);
- USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
- break;
- case USB_STATE_ADDRESSED:
- Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->DefaultConfigNo, 1);
- USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
- break;
- default:
- return -1;
- break;
- }
- return 0;
- }
- static int32_t prvUSB_DeviceSetConfiguration(void *pData, void *pParam)
- {
- USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
- usb_device_request_t *Request = (usb_device_request_t *)pParam;
- if (Request->wValue[0] >= USBCore->Setup.ConfigNum)
- {
- return -1;
- }
- USBCore->ConfigNo = Request->wValue[0];
- USBCore->Setup.pCurConfigInfo = &USBCore->Setup.pConfigInfo[USBCore->ConfigNo];
- if (!USBCore->ConfigNo)
- {
- USBCore->DeviceState = USB_STATE_ADDRESSED;
- }
- else
- {
- USBCore->DeviceState = USB_STATE_CONFIGURED;
- }
- prvUSB_StackEpInit(USBCore->SelfID);
- USB_ReInitEpCfg(USBCore->pHWCtrl);
- prvUSB_StackMakeFullConfigData(USBCore->SelfID);
- return 0;
- }
- static int32_t prvUSB_DeviceGetInterface(void *pData, void *pParam)
- {
- return -1;
- }
- static int32_t prvUSB_DeviceSetInterface(void *pData, void *pParam)
- {
- return -1;
- }
- static int32_t prvUSB_DeviceSynchFrame(void *pData, void *pParam)
- {
- USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
- usb_device_request_t *Request = (usb_device_request_t *)pParam;
- uint8_t EpID, ToHost;
- USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_DEVICE;
- USBCore->pEpCtrl[0].XferMaxLen = 2;
- return 0;
- }
- static CBFuncEx_t prvUSB_StandardRequestTable[UR_SYNCH_FRAME + 1] =
- {
- prvUSB_DeviceGetStatus,
- prvUSB_DeviceClearFeature,
- prvUSB_DeviceNoSupport,
- prvUSB_DeviceSetFeature,
- prvUSB_DeviceNoSupport,
- prvUSB_DeviceSetAddress,
- prvUSB_DeviceGetDescriptor,
- prvUSB_DeviceSetDescriptor,
- prvUSB_DeviceGetConfiguration,
- prvUSB_DeviceSetConfiguration,
- prvUSB_DeviceGetInterface,
- prvUSB_DeviceSetInterface,
- prvUSB_DeviceSynchFrame,
- };
- void USB_StackDeviceEp0TxDone(uint8_t USB_ID)
- {
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USBCore->Ep0Stage = USB_EP0_STAGE_SETUP;
- USB_SetDeviceNoDataSetup(USBCore->pHWCtrl);
- }
- void USB_StackAnalyzeDeviceEpRx(uint8_t USB_ID, uint8_t EpIndex)
- {
- USB_EndpointDataStruct EpData;
- USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
- USB_EndpointCtrlStruct *pEpCtrl;
- uint16_t wTemp;
- memset(&EpData, 0, sizeof(EpData));
- EpData.USB_ID = USB_ID;
- EpData.EpIndex = EpIndex;
- EpData.IsToDevice = 1;
- EpData.Data = USBCore->pEpCtrl[EpIndex].RxBuf.Data;
- EpData.Len = USBCore->pEpCtrl[EpIndex].RxBuf.Pos;
- EpData.pLastRequest = &USBCore->LastRequest;
- if (EpIndex)
- {
- USBCore->pEpCtrl[EpIndex].RxBuf.Pos = 0;
- EpData.IsDataStage = (EpData.Len < USBCore->pEpCtrl[EpIndex].MaxPacketLen)?0:1;
- if (USBCore->pEpCtrl[EpIndex].CB(&EpData, USBCore->pEpCtrl[EpIndex].pData))
- {
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, EpIndex, 1, USB_EP_STATE_STALL);
- }
- }
- else
- {
- switch(USBCore->Ep0Stage)
- {
- case USB_EP0_STAGE_SETUP:
- pEpCtrl = &USBCore->pEpCtrl[0];
- if (pEpCtrl->RxBuf.Pos != sizeof(usb_device_request_t))
- {
- USBCore->IsRequestError = 1;
- DBG_ERR("USB%d EP%d Request size %d error", USB_ID, EpIndex, pEpCtrl->RxBuf.Pos);
- }
- memcpy(&USBCore->LastRequest, pEpCtrl->RxBuf.Data, pEpCtrl->RxBuf.Pos);
- if ( !(USBCore->LastRequest.bmRequestType & UT_MASK) )
- {
- if (USBCore->LastRequest.bRequest <= UR_SYNCH_FRAME)
- {
- if (prvUSB_StandardRequestTable[USBCore->LastRequest.bRequest](USBCore, &USBCore->LastRequest))
- {
- USBCore->IsRequestError = 1;
- }
- }
- else
- {
- switch(USBCore->LastRequest.bRequest)
- {
- case UR_SET_SEL:
- if (USBCore->HWCaps.FEATURE_b.U1 && USBCore->HWCaps.FEATURE_b.U2)
- {
- wTemp = BytesGetLe16(USBCore->LastRequest.wValue);
- if (USB_SetISOCHDelay(USBCore->pHWCtrl, wTemp))
- {
- USBCore->IsRequestError = 1;
- }
- }
- else
- {
- USBCore->IsRequestError = 1;
- }
- break;
- case UR_ISOCH_DELAY:
- if (USBCore->HWCaps.FEATURE_b.U1 && USBCore->HWCaps.FEATURE_b.U2)
- {
- pEpCtrl->XferMaxLen = BytesGetLe16(USBCore->LastRequest.wLength);
- USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_DEVICE;
- }
- else
- {
- USBCore->IsRequestError = 1;
- }
- break;
- default:
- if (USBCore->pEpCtrl[EpIndex].CB(&EpData, USBCore->pEpCtrl[EpIndex].pData))
- {
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
- USBCore->IsRequestError = 1;
- }
- break;
- }
- }
- }
- else
- {
- if (USBCore->pEpCtrl[EpIndex].CB(&EpData, USBCore->pEpCtrl[EpIndex].pData))
- {
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
- USBCore->IsRequestError = 1;
- }
- }
- if (USBCore->IsRequestError)
- {
- if (USBCore->LastRequest.bRequest != UR_GET_DESCRIPTOR && USBCore->LastRequest.wValue[1] != UDESC_DEVICE_QUALIFIER)
- {
- DBG_ERR("USB%d EP%d Request %x error", USB_ID, EpIndex, USBCore->LastRequest.bRequest);
- DBG_HexPrintf(USBCore->pEpCtrl[0].RxBuf.Data, USBCore->pEpCtrl[0].RxBuf.Pos);
- }
- USBCore->IsRequestError = 0;
- USBCore->Ep0Stage = USB_EP0_STAGE_SETUP;
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
- }
- USBCore->pEpCtrl[0].RxBuf.Pos = 0;
- switch(USBCore->Ep0Stage)
- {
- case USB_EP0_STAGE_SETUP:
- USB_SetDeviceNoDataSetup(USBCore->pHWCtrl);
- break;
- case USB_EP0_STAGE_DATA_TO_HOST:
- USB_DeviceXfer(USBCore->pHWCtrl, 0);
- break;
- case USB_EP0_STAGE_DATA_TO_DEVICE:
- Timer_StartMS(USBCore->WaitDataTimer, 100, 0);
- break;
- }
- pEpCtrl->RxBuf.Pos = 0;
- break;
- case USB_EP0_STAGE_DATA_TO_HOST:
- USB_ERR("!!!");
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
- break;
- case USB_EP0_STAGE_DATA_TO_DEVICE:
- if (USBCore->pEpCtrl[0].RxBuf.Pos >= USBCore->pEpCtrl[0].XferMaxLen)
- {
- Timer_Stop(USBCore->WaitDataTimer);
- EpData.IsDataStage = 1;
- USB_DBG("setup data out done!");
- if (USBCore->LastRequest.bRequest & UT_MASK)
- {
- switch(USBCore->LastRequest.bRequest)
- {
- case UR_SYNCH_FRAME:
- USB_DBG("frame sn %u", BytesGetLe16(USBCore->pEpCtrl[0].RxBuf.Data));
- break;
- default:
- if (USBCore->pEpCtrl[0].CB(&EpData, USBCore->pEpCtrl[0].pData))
- {
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
- }
- break;
- }
- }
- else
- {
- if (USBCore->pEpCtrl[0].CB(&EpData, USBCore->pEpCtrl[0].pData))
- {
- USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
- }
- }
- USBCore->pEpCtrl[0].RxBuf.Pos = 0;
- }
- break;
- }
- }
- }
- void USB_StackSetDeviceSelfPower(uint8_t USB_ID, uint8_t OnOff)
- {
- prvUSBCore[USB_ID].DEVSTATUS_b.SelfPower = OnOff;
- }
- void USB_StackSetDeviceBusPower(uint8_t USB_ID, uint8_t OnOff)
- {
- prvUSBCore[USB_ID].BusPowered = OnOff;
- }
- void USB_StackSetDeviceRemoteWakeupCapable(uint8_t USB_ID, uint8_t OnOff)
- {
- if (prvUSBCore[USB_ID].HWCaps.FEATURE_b.RemoteWakeup)
- {
- prvUSBCore[USB_ID].INFSTATUS_b.RemoteWakeCapable = OnOff;
- }
- else
- {
- prvUSBCore[USB_ID].INFSTATUS_b.RemoteWakeCapable = 0;
- }
- }
|