core_usb_stack.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260
  1. /*
  2. * Copyright (c) 2022 OpenLuat & AirM2M
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  5. * this software and associated documentation files (the "Software"), to deal in
  6. * the Software without restriction, including without limitation the rights to
  7. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  8. * the Software, and to permit persons to whom the Software is furnished to do so,
  9. * subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  16. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  17. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #include "user.h"
  22. typedef struct
  23. {
  24. USB_SetupInfoStruct Setup;
  25. USB_HWCapsStruct HWCaps;
  26. usb_device_request_t LastRequest;
  27. Buffer_Struct FullConfigDataBuf;
  28. Buffer_Struct FullOtherSpeedConfigDataBuf;
  29. USB_EndpointCtrlStruct *pEpCtrl;
  30. Timer_t *WaitDataTimer;
  31. HANDLE pHWCtrl;
  32. union
  33. {
  34. uint16_t DeviceStatus;
  35. struct
  36. {
  37. uint16_t SelfPower:1;
  38. uint16_t RemoteWakeupEnable:1;
  39. uint16_t U1Enable:1;
  40. uint16_t U2Enable:1;
  41. uint16_t LTMEnable:1;
  42. uint16_t Zero:11;
  43. }DEVSTATUS_b;
  44. };
  45. union
  46. {
  47. uint16_t InterfaceStatus;
  48. struct
  49. {
  50. uint16_t RemoteWakeCapable:1;
  51. uint16_t RemoteWakeupEnable:1;
  52. uint16_t Zero:14;
  53. }INFSTATUS_b;
  54. };
  55. uint8_t DeviceState;
  56. uint8_t Ep0Stage;
  57. uint8_t IsRequestError;
  58. uint8_t BusPowered;
  59. uint8_t SelfID;
  60. uint8_t ConfigNo;
  61. uint8_t DefaultConfigNo;
  62. }USB_StackCtrlStruct;
  63. #define USB_DBG(x, y...)
  64. //#define USB_DBG DBG
  65. #define USB_ERR DBG
  66. static USB_StackCtrlStruct prvUSBCore[USB_MAX];
  67. static int32_t prvUSB_StackDummyEpCB(void *pData, void *pParam)
  68. {
  69. USB_EndpointDataStruct *EpData = (USB_EndpointDataStruct *)pData;
  70. USB_ERR("USB%d EP%d no work!", EpData->USB_ID, EpData->EpIndex);
  71. return -ERROR_OPERATION_FAILED;
  72. }
  73. static int32_t prvUSB_StackDummyStateCB(void *pData, void *pParam)
  74. {
  75. return -ERROR_OPERATION_FAILED;
  76. }
  77. static void prvUSB_ResetEpCtrl(uint8_t USB_ID, uint8_t Index)
  78. {
  79. OS_DeInitBuffer(&prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf);
  80. memset(&prvUSBCore[USB_ID].pEpCtrl[Index], 0, sizeof(USB_EndpointCtrlStruct));
  81. prvUSBCore[USB_ID].pEpCtrl[Index].CB = prvUSB_StackDummyEpCB;
  82. prvUSBCore[USB_ID].pEpCtrl[Index].ForceZeroPacket = 0;
  83. }
  84. static int32_t prvUSB_SetupRxTimeout(void *pData, void *pParam)
  85. {
  86. USB_SetDeviceEPStatus(pParam, 0, 1, USB_EP_STATE_STALL);
  87. USB_ERR("!");
  88. }
  89. static void prvUSB_StackEpInit(uint8_t USB_ID)
  90. {
  91. usb_full_config_t *pConfig = prvUSBCore[USB_ID].Setup.pCurConfigInfo->pFullConfig[prvUSBCore[USB_ID].Setup.CurSpeed];
  92. uint32_t i, Index;
  93. usb_full_interface_t *pFullInterface;
  94. uint8_t EpID, ToHost, EpNum;
  95. for(Index = 0; Index < pConfig->InterfaceNum; Index++)
  96. {
  97. pFullInterface = &pConfig->pInterfaceFullDesc[Index];
  98. EpNum = pFullInterface->EndpointNum;
  99. for(i = 0; i < EpNum; i++)
  100. {
  101. ToHost = UE_GET_DIR(pFullInterface->pEndpointDesc[i].bEndpointAddress);
  102. EpID = UE_GET_ADDR(pFullInterface->pEndpointDesc[i].bEndpointAddress);
  103. prvUSBCore[USB_ID].pEpCtrl[EpID].XferType = UE_GET_XFERTYPE(pFullInterface->pEndpointDesc[i].bmAttributes);
  104. prvUSBCore[USB_ID].pEpCtrl[EpID].MaxPacketLen = BytesGetLe16(pFullInterface->pEndpointDesc[i].wMaxPacketSize);
  105. if (ToHost)
  106. {
  107. prvUSBCore[USB_ID].pEpCtrl[EpID].ToHostEnable = 1;
  108. }
  109. else
  110. {
  111. prvUSBCore[USB_ID].pEpCtrl[EpID].ToDeviceEnable = 1;
  112. OS_ReInitBuffer(&prvUSBCore[USB_ID].pEpCtrl[EpID].RxBuf, prvUSBCore[USB_ID].pEpCtrl[EpID].MaxPacketLen * 2);
  113. }
  114. USB_DBG("interface %d, Ep %x address %x fifo %d type %d", Index, i,
  115. pFullInterface->pEndpointDesc[i].bEndpointAddress,
  116. prvUSBCore[USB_ID].pEpCtrl[EpID].MaxPacketLen, prvUSBCore[USB_ID].pEpCtrl[EpID].XferType);
  117. }
  118. }
  119. }
  120. static void prvUSB_StackMakeFullConfigData(uint8_t USB_ID)
  121. {
  122. usb_full_config_t *pConfig;
  123. usb_config_descriptor_t TempConfigDesc;
  124. uint32_t i, Index;
  125. volatile uint16_t TotalLen;
  126. pConfig = prvUSBCore[USB_ID].Setup.pCurConfigInfo->pFullConfig[prvUSBCore[USB_ID].Setup.CurSpeed];
  127. memcpy(&TempConfigDesc, pConfig->pConfigDesc, sizeof(usb_config_descriptor_t));
  128. if (!prvUSBCore[USB_ID].BusPowered)
  129. {
  130. TempConfigDesc.bmAttributes &= ~UC_BUS_POWERED;
  131. TempConfigDesc.bmAttributes |= UC_SELF_POWERED;
  132. }
  133. else
  134. {
  135. TempConfigDesc.bmAttributes |= UC_BUS_POWERED;
  136. }
  137. TotalLen = sizeof(usb_config_descriptor_t);
  138. if (pConfig->pInterfaceAssocDesc)
  139. {
  140. TotalLen += sizeof(usb_interface_assoc_descriptor_t);
  141. }
  142. for(Index = 0; Index < pConfig->InterfaceNum; Index++)
  143. {
  144. TotalLen += sizeof(usb_interface_descriptor_t);
  145. if (pConfig->pInterfaceFullDesc[Index].GetOtherDesc)
  146. {
  147. TotalLen += pConfig->pInterfaceFullDesc[Index].GetOtherDesc(NULL, NULL);
  148. }
  149. if (USB_DEVICE_SPEED_SUPER_SPEED == prvUSBCore[USB_ID].Setup.CurSpeed)
  150. {
  151. for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
  152. {
  153. TotalLen += sizeof(usb_endpoint_descriptor_t);
  154. TotalLen += sizeof(usb_endpoint_ss_comp_descriptor_t);
  155. }
  156. }
  157. else
  158. {
  159. for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
  160. {
  161. TotalLen += sizeof(usb_endpoint_descriptor_t);
  162. }
  163. }
  164. }
  165. OS_ReInitBuffer(&prvUSBCore[USB_ID].FullConfigDataBuf, TotalLen);
  166. BytesPutLe16(TempConfigDesc.wTotalLength, TotalLen);
  167. TempConfigDesc.bConfigurationValue = prvUSBCore[USB_ID].ConfigNo;
  168. OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, &TempConfigDesc, sizeof(usb_config_descriptor_t));
  169. if (pConfig->pInterfaceAssocDesc)
  170. {
  171. OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, pConfig->pInterfaceAssocDesc, sizeof(usb_interface_assoc_descriptor_t));
  172. }
  173. for(Index = 0; Index < pConfig->InterfaceNum; Index++)
  174. {
  175. OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, pConfig->pInterfaceFullDesc[Index].pInterfaceDesc, sizeof(usb_interface_descriptor_t));
  176. if (pConfig->pInterfaceFullDesc[Index].GetOtherDesc)
  177. {
  178. prvUSBCore[USB_ID].FullConfigDataBuf.Pos += pConfig->pInterfaceFullDesc[Index].GetOtherDesc(prvUSBCore[USB_ID].FullConfigDataBuf.Data + prvUSBCore[USB_ID].FullConfigDataBuf.Pos, NULL);
  179. }
  180. if (USB_DEVICE_SPEED_SUPER_SPEED == prvUSBCore[USB_ID].Setup.CurSpeed)
  181. {
  182. for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
  183. {
  184. OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, &pConfig->pInterfaceFullDesc[Index].pEndpointDesc[i], sizeof(usb_endpoint_descriptor_t));
  185. OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, &pConfig->pInterfaceFullDesc[Index].pEndpointSSCompDesc[i], sizeof(usb_endpoint_ss_comp_descriptor_t));
  186. }
  187. }
  188. else
  189. {
  190. for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
  191. {
  192. OS_BufferWrite(&prvUSBCore[USB_ID].FullConfigDataBuf, &pConfig->pInterfaceFullDesc[Index].pEndpointDesc[i], sizeof(usb_endpoint_descriptor_t));
  193. }
  194. }
  195. }
  196. OS_DeInitBuffer(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf);
  197. switch(prvUSBCore[USB_ID].Setup.CurSpeed)
  198. {
  199. case USB_DEVICE_SPEED_FULL_SPEED:
  200. pConfig = prvUSBCore[USB_ID].Setup.pCurConfigInfo->pFullConfig[USB_DEVICE_SPEED_HIGH_SPEED];
  201. if (pConfig)
  202. {
  203. goto MAKE_OTHER_SPEED;
  204. }
  205. break;
  206. case USB_DEVICE_SPEED_HIGH_SPEED:
  207. pConfig = prvUSBCore[USB_ID].Setup.pCurConfigInfo->pFullConfig[USB_DEVICE_SPEED_FULL_SPEED];
  208. if (pConfig)
  209. {
  210. goto MAKE_OTHER_SPEED;
  211. }
  212. break;
  213. default:
  214. return;
  215. }
  216. return;
  217. MAKE_OTHER_SPEED:
  218. OS_ReInitBuffer(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, TotalLen);
  219. memcpy(&TempConfigDesc, pConfig->pConfigDesc, sizeof(usb_config_descriptor_t));
  220. BytesPutLe16(TempConfigDesc.wTotalLength, TotalLen);
  221. TempConfigDesc.bDescriptorType = UDESC_OTHER_SPEED_CONFIGURATION;
  222. TempConfigDesc.bConfigurationValue = prvUSBCore[USB_ID].ConfigNo;
  223. if (!prvUSBCore[USB_ID].BusPowered)
  224. {
  225. TempConfigDesc.bmAttributes &= ~UC_BUS_POWERED;
  226. TempConfigDesc.bmAttributes |= UC_SELF_POWERED;
  227. }
  228. else
  229. {
  230. TempConfigDesc.bmAttributes |= UC_BUS_POWERED;
  231. }
  232. OS_BufferWrite(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, &TempConfigDesc, sizeof(usb_config_descriptor_t));
  233. if (pConfig->pInterfaceAssocDesc)
  234. {
  235. OS_BufferWrite(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, pConfig->pInterfaceAssocDesc, sizeof(usb_interface_assoc_descriptor_t));
  236. }
  237. for(Index = 0; Index < pConfig->InterfaceNum; Index++)
  238. {
  239. OS_BufferWrite(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, pConfig->pInterfaceFullDesc[Index].pInterfaceDesc, sizeof(usb_interface_descriptor_t));
  240. if (pConfig->pInterfaceFullDesc[Index].GetOtherDesc)
  241. {
  242. prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf.Pos += pConfig->pInterfaceFullDesc[Index].GetOtherDesc(prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf.Data + prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf.Pos, NULL);
  243. }
  244. for(i = 0; i < pConfig->pInterfaceFullDesc[Index].EndpointNum; i++)
  245. {
  246. OS_BufferWrite(&prvUSBCore[USB_ID].FullOtherSpeedConfigDataBuf, &pConfig->pInterfaceFullDesc[Index].pEndpointDesc[i], sizeof(usb_endpoint_descriptor_t));
  247. }
  248. }
  249. }
  250. void USB_StackResetEpBuffer(uint8_t USB_ID, uint8_t Index)
  251. {
  252. if (prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf.MaxLen > prvUSBCore[USB_ID].HWCaps.EpBufMaxLen)
  253. {
  254. OS_DeInitBuffer(&prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf);
  255. OS_InitBuffer(&prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf, prvUSBCore[USB_ID].pEpCtrl[Index].MaxPacketLen * 2);
  256. }
  257. else
  258. {
  259. prvUSBCore[USB_ID].pEpCtrl[Index].RxBuf.Pos = 0;
  260. }
  261. memset(&prvUSBCore[USB_ID].pEpCtrl[Index].TxBuf, 0, sizeof(Buffer_Struct));
  262. }
  263. void USB_StackSetControl(uint8_t USB_ID, HANDLE pHWCtrl,USB_EndpointCtrlStruct *pEpCtrl, USB_HWCapsStruct *Caps)
  264. {
  265. uint32_t i;
  266. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  267. USBCore->pHWCtrl = pHWCtrl;
  268. memcpy(&USBCore->HWCaps, Caps, sizeof(USB_HWCapsStruct));
  269. for(i = 0; i < USB_EP_MAX; i++)
  270. {
  271. USBCore->pEpCtrl[i].CB = prvUSB_StackDummyEpCB;
  272. }
  273. USBCore->SelfID = USB_ID;
  274. USBCore->pEpCtrl = pEpCtrl;
  275. prvUSBCore[USB_ID].WaitDataTimer = Timer_Create(prvUSB_SetupRxTimeout, pHWCtrl, NULL);
  276. }
  277. void USB_StackClearSetup(uint8_t USB_ID)
  278. {
  279. USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
  280. uint32_t i, j;
  281. if (pSetup->pString)
  282. {
  283. for(i = 0;i < pSetup->StringNum; i++)
  284. {
  285. OS_DeInitBuffer(&pSetup->pString[i]);
  286. }
  287. }
  288. free(pSetup->pString);
  289. memset(&prvUSBCore[USB_ID].Setup, 0, sizeof(USB_SetupInfoStruct));
  290. for(i = 0; i < USB_EP_MAX; i++)
  291. {
  292. prvUSB_ResetEpCtrl(USB_ID, i);
  293. // prvUSBCore[USB_ID].pEpCtrl[i].CB = prvUSB_StackDummyEpCB;
  294. }
  295. prvUSBCore[USB_ID].Ep0Stage = USB_EP0_STAGE_SETUP;
  296. prvUSBCore[USB_ID].pEpCtrl[0].ForceZeroPacket = 1;
  297. prvUSBCore[USB_ID].Setup.CB = prvUSB_StackDummyStateCB;
  298. }
  299. void USB_StackDeviceAfterDisconnect(uint8_t USB_ID)
  300. {
  301. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  302. PV_Union uPV;
  303. uint8_t i;
  304. uPV.u8[0] = USB_ID;
  305. uPV.u8[1] = USBD_BUS_TYPE_ENABLE_CONNECT;
  306. USBCore->Setup.CB(uPV.u32, USBCore->Setup.pUserData);
  307. }
  308. 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)
  309. {
  310. USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
  311. uint32_t i;
  312. if (pSetup->pDeviceDesc)
  313. {
  314. USB_ERR("clear device info first");
  315. return;
  316. }
  317. pSetup->pDeviceDesc = pDeviceDesc;
  318. if (CB)
  319. {
  320. pSetup->CB = CB;
  321. }
  322. else
  323. {
  324. pSetup->CB = prvUSB_StackDummyStateCB;
  325. }
  326. pSetup->pUserData = pUserData;
  327. pSetup->pConfigInfo = pConfigInfo;
  328. pSetup->ConfigNum = ConfigNum;
  329. pSetup->pString = zalloc(sizeof(Buffer_Struct) * StringNum);
  330. pSetup->StringNum = StringNum;
  331. prvUSBCore[USB_ID].pEpCtrl[0].ToDeviceEnable = 1;
  332. prvUSBCore[USB_ID].pEpCtrl[0].ToHostEnable = 1;
  333. prvUSBCore[USB_ID].DefaultConfigNo = 0;
  334. prvUSBCore[USB_ID].ConfigNo = 0;
  335. OS_ReInitBuffer(&prvUSBCore[USB_ID].pEpCtrl[0].RxBuf, pSetup->pDeviceDesc->bMaxPacketSize * 2);
  336. }
  337. void USB_StackSetDeviceSpeed(uint8_t USB_ID, uint8_t Speed)
  338. {
  339. prvUSBCore[USB_ID].Setup.CurSpeed = Speed;
  340. }
  341. void USB_StackSetEpCB(uint8_t USB_ID, uint8_t Index, CBFuncEx_t CB, void *pUserData)
  342. {
  343. USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
  344. if (!CB)
  345. {
  346. prvUSBCore[USB_ID].pEpCtrl[Index].CB = prvUSB_StackDummyEpCB;
  347. }
  348. else
  349. {
  350. prvUSBCore[USB_ID].pEpCtrl[Index].CB = CB;
  351. }
  352. prvUSBCore[USB_ID].pEpCtrl[Index].pData = pUserData;
  353. }
  354. void USB_StackSetString(uint8_t USB_ID, uint8_t Index, const uint8_t *Data, uint16_t Len)
  355. {
  356. USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
  357. if (Index >= pSetup->StringNum)
  358. {
  359. USB_ERR("over index %d,%d", Index, pSetup->StringNum);
  360. return;
  361. }
  362. OS_ReInitBuffer(&pSetup->pString[Index], Len + 2);
  363. pSetup->pString[Index].Data[0] = Len + 2;
  364. pSetup->pString[Index].Data[1] = UDESC_STRING;
  365. memcpy(pSetup->pString[Index].Data, Data, Len);
  366. }
  367. void USB_StackSetCharString(uint8_t USB_ID, uint8_t Index, const char *Data, uint16_t Len)
  368. {
  369. uint16_t i;
  370. USB_SetupInfoStruct *pSetup = &prvUSBCore[USB_ID].Setup;
  371. if (Index >= pSetup->StringNum)
  372. {
  373. USB_ERR("over index %d,%d", Index, pSetup->StringNum);
  374. return;
  375. }
  376. OS_ReInitBuffer(&pSetup->pString[Index], (Len * 2) + 2);
  377. pSetup->pString[Index].Data[0] = (Len * 2) + 2;
  378. pSetup->pString[Index].Data[1] = UDESC_STRING;
  379. pSetup->pString[Index].Pos = 2;
  380. for(i = 0; i < Len; i++)
  381. {
  382. pSetup->pString[Index].Data[pSetup->pString[Index].Pos] = Data[i];
  383. pSetup->pString[Index].Pos+=2;
  384. }
  385. }
  386. int32_t USB_StackStop(uint8_t USB_ID)
  387. {
  388. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  389. USB_Stop(USBCore->pHWCtrl);
  390. USB_ResetStart(USBCore->pHWCtrl);
  391. USBCore->DeviceState = USB_STATE_DETACHED;
  392. return ERROR_NONE;
  393. }
  394. void USB_StackPowerOnOff(uint8_t USB_ID, uint8_t OnOff)
  395. {
  396. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  397. USB_PowerOnOff(USBCore->pHWCtrl, OnOff);
  398. }
  399. void USB_StackPutRxData(uint8_t USB_ID, uint8_t EpIndex, const uint8_t *Data, uint32_t Len)
  400. {
  401. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  402. OS_BufferWrite(&USBCore->pEpCtrl[EpIndex].RxBuf, Data, Len);
  403. }
  404. int32_t USB_StackStartDevice(uint8_t USB_ID)
  405. {
  406. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  407. USB_ResetEnd(USBCore->pHWCtrl);
  408. USB_SetWorkMode(USBCore->pHWCtrl, USB_MODE_DEVICE);
  409. USBCore->ConfigNo = 0;
  410. USBCore->DefaultConfigNo = 0;
  411. USBCore->Setup.pCurConfigInfo = &USBCore->Setup.pConfigInfo[USBCore->ConfigNo];
  412. prvUSB_StackEpInit(USB_ID);
  413. USB_InitEpCfg(USBCore->pHWCtrl);
  414. prvUSB_StackMakeFullConfigData(USBCore->SelfID);
  415. USB_Start(USBCore->pHWCtrl);
  416. USBCore->DeviceState = USB_STATE_DETACHED;
  417. return ERROR_NONE;
  418. }
  419. int32_t USB_StackStartHost(uint8_t USB_ID)
  420. {
  421. return -1;
  422. }
  423. int32_t USB_StackStartOTG(uint8_t USB_ID)
  424. {
  425. return -1;
  426. }
  427. int32_t USB_StackTxEpData(uint8_t USB_ID, uint8_t EpIndex, void *pData, uint16_t Len, uint16_t MaxLen, uint8_t ForceZeroPacket)
  428. {
  429. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  430. USB_SetDeviceEPStatus(USBCore->pHWCtrl, EpIndex, 0, USB_EP_STATE_ACK);
  431. if (USBCore->pEpCtrl[EpIndex].TxBuf.Data)
  432. {
  433. USB_FlushFifo(USBCore->pHWCtrl, EpIndex, 0);
  434. }
  435. Buffer_StaticInit(&USBCore->pEpCtrl[EpIndex].TxBuf, pData, Len);
  436. USBCore->pEpCtrl[EpIndex].XferMaxLen = MaxLen;
  437. if (!EpIndex)
  438. {
  439. USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
  440. }
  441. else
  442. {
  443. USBCore->pEpCtrl[EpIndex].ForceZeroPacket = ForceZeroPacket;
  444. if (USBCore->pEpCtrl[EpIndex].TxBuf.Data)
  445. {
  446. USB_DeviceXfer(USBCore->pHWCtrl, EpIndex);
  447. }
  448. else
  449. {
  450. DBG("!");
  451. USB_SendZeroPacket(USBCore->pHWCtrl, EpIndex);
  452. }
  453. }
  454. return ERROR_NONE;
  455. }
  456. void USB_StackStopDeviceTx(uint8_t USB_ID, uint8_t EpIndex, uint8_t IsNeedNotify)
  457. {
  458. if (EpIndex)
  459. {
  460. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  461. USB_EndpointCtrlStruct *pEpCtrl = &USBCore->pEpCtrl[EpIndex];
  462. USB_EndpointDataStruct EpData;
  463. EpData.USB_ID = USB_ID;
  464. EpData.EpIndex = EpIndex;
  465. EpData.IsToDevice = 0;
  466. EpData.Len = 0xffffffff;
  467. USB_DeviceXferStop(USBCore->pHWCtrl, EpIndex);
  468. memset(&pEpCtrl->TxBuf, 0, sizeof(Buffer_Struct));
  469. if (IsNeedNotify)
  470. {
  471. pEpCtrl->CB(&EpData, pEpCtrl->pData);
  472. }
  473. }
  474. }
  475. void USB_StackEpIntOnOff(uint8_t USB_ID, uint8_t EpIndex, uint8_t IsToDevice, uint8_t OnOff)
  476. {
  477. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  478. USB_EpIntOnOff(USB_ID, EpIndex, IsToDevice, OnOff);
  479. }
  480. void USB_StackSetEp0Stage(uint8_t USB_ID, uint8_t Stage)
  481. {
  482. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  483. if (USBCore->Ep0Stage != USB_EP0_STAGE_SETUP)
  484. {
  485. USBCore->Ep0Stage = Stage;
  486. }
  487. }
  488. void USB_StackSetRxEpDataLen(uint8_t USB_ID, uint8_t EpIndex, uint32_t Len)
  489. {
  490. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  491. USBCore->pEpCtrl[EpIndex].XferMaxLen = Len;
  492. }
  493. void USB_StackSetEpStatus(uint8_t USB_ID, uint8_t EpIndex, uint8_t IsToDevice, uint8_t Status)
  494. {
  495. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  496. // DBG("%d,%d,%d", EpIndex, IsToDevice, Status);
  497. USB_SetDeviceEPStatus(USBCore->pHWCtrl, EpIndex, IsToDevice, Status);
  498. }
  499. void USB_StackDeviceBusChange(uint8_t USB_ID, uint8_t Type)
  500. {
  501. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  502. PV_Union uPV;
  503. uint8_t i;
  504. uPV.u8[0] = USB_ID;
  505. uPV.u8[1] = Type;
  506. switch (Type)
  507. {
  508. case USBD_BUS_TYPE_SUSPEND:
  509. Core_USBAction(USB_ID, SERV_USB_SUSPEND, USBCore->pHWCtrl);
  510. USBCore->Setup.CB(uPV.u32, USBCore->Setup.pUserData);
  511. break;
  512. case USBD_BUS_TYPE_RESUME:
  513. Core_USBAction(USB_ID, SERV_USB_RESUME, USBCore->pHWCtrl);
  514. USBCore->Setup.CB(uPV.u32, USBCore->Setup.pUserData);
  515. break;
  516. case USBD_BUS_TYPE_RESET:
  517. for(i = 0; i < USB_EP_MAX; i++)
  518. {
  519. USB_StackResetEpBuffer(USB_ID, i);
  520. }
  521. USBCore->DeviceState = USB_STATE_ATTACHED;
  522. USBCore->Setup.CB(uPV.u32, USBCore->Setup.pUserData);
  523. break;
  524. case USBD_BUS_TYPE_NEW_SOF:
  525. break;
  526. case USBD_BUS_TYPE_DISCONNECT:
  527. if (USBCore->DeviceState != USB_STATE_DETACHED)
  528. {
  529. USB_Stop(USBCore->pHWCtrl);
  530. USB_ResetStart(USBCore->pHWCtrl);
  531. USBCore->DeviceState = USB_STATE_DETACHED;
  532. //交给用户层决定是继续保持device,还是变成OTG
  533. Core_USBAction(USB_ID, SERV_USB_RESET_END, USBCore->pHWCtrl);
  534. }
  535. break;
  536. }
  537. }
  538. static int32_t prvUSB_DeviceNoSupport(void *pData, void *pParam)
  539. {
  540. return -1;
  541. }
  542. static int32_t prvUSB_DeviceGetStatus(void *pData, void *pParam)
  543. {
  544. USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
  545. usb_device_request_t *Request = (usb_device_request_t *)pParam;
  546. uint8_t EpID, ToHost;
  547. switch(Request->bmRequestType & UT_RECIP_MASK)
  548. {
  549. case UT_RECIP_DEVICE:
  550. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->DeviceStatus, 2);
  551. break;
  552. case UT_RECIP_INTERFACE:
  553. if (Request->wIndex[0] >= USBCore->Setup.pCurConfigInfo->pFullConfig[USBCore->Setup.CurSpeed]->InterfaceNum)
  554. {
  555. return -1;
  556. }
  557. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->InterfaceStatus, 2);
  558. break;
  559. case UT_RECIP_ENDPOINT:
  560. ToHost = UE_GET_DIR(Request->wIndex[0]);
  561. EpID = UE_GET_ADDR(Request->wIndex[0]);
  562. if (EpID >= USB_EP_MAX)
  563. {
  564. return -1;
  565. }
  566. if (ToHost)
  567. {
  568. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->pEpCtrl[EpID].ToHostStatus, 2);
  569. }
  570. else
  571. {
  572. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->pEpCtrl[EpID].ToDeviceStatus, 2);
  573. }
  574. break;
  575. default:
  576. return -1;
  577. break;
  578. }
  579. USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
  580. return 0;
  581. }
  582. static int32_t prvUSB_DeviceClearFeature(void *pData, void *pParam)
  583. {
  584. USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
  585. usb_device_request_t *Request = (usb_device_request_t *)pParam;
  586. uint16_t wValue = BytesGetLe16(Request->wValue);
  587. uint8_t EpID, ToHost;
  588. USBCore->Ep0Stage = USB_EP0_STAGE_SETUP;
  589. switch(Request->bmRequestType & UT_RECIP_MASK)
  590. {
  591. case UT_RECIP_DEVICE:
  592. switch(wValue)
  593. {
  594. case UF_DEVICE_REMOTE_WAKEUP:
  595. if (USBCore->HWCaps.FEATURE_b.RemoteWakeup)
  596. {
  597. USBCore->DEVSTATUS_b.RemoteWakeupEnable = 0;
  598. USBCore->INFSTATUS_b.RemoteWakeupEnable = 0;
  599. }
  600. else
  601. {
  602. return -1;
  603. }
  604. break;
  605. case UF_U1_ENABLE:
  606. if (USBCore->HWCaps.FEATURE_b.U1)
  607. {
  608. USBCore->DEVSTATUS_b.U1Enable = 0;
  609. }
  610. else
  611. {
  612. return -1;
  613. }
  614. break;
  615. case UF_U2_ENABLE:
  616. if (USBCore->HWCaps.FEATURE_b.U2)
  617. {
  618. USBCore->DEVSTATUS_b.U2Enable = 0;
  619. }
  620. else
  621. {
  622. return -1;
  623. }
  624. break;
  625. case UF_LTM_ENABLE:
  626. if (USBCore->HWCaps.FEATURE_b.LTM)
  627. {
  628. USBCore->DEVSTATUS_b.LTMEnable = 0;
  629. }
  630. else
  631. {
  632. return -1;
  633. }
  634. break;
  635. default:
  636. return -1;
  637. break;
  638. }
  639. break;
  640. case UT_RECIP_INTERFACE:
  641. if (Request->wIndex[0] >= USBCore->Setup.pCurConfigInfo->pFullConfig[USBCore->Setup.CurSpeed]->InterfaceNum)
  642. {
  643. return -1;
  644. }
  645. switch(wValue)
  646. {
  647. case UF_DEVICE_SUSPEND:
  648. break;
  649. default:
  650. return -1;
  651. break;
  652. }
  653. break;
  654. case UT_RECIP_ENDPOINT:
  655. Request->wIndex[0] &= 0x00ff;
  656. ToHost = UE_GET_DIR(Request->wIndex[0]);
  657. EpID = UE_GET_ADDR(Request->wIndex[0]);
  658. if (EpID >= USB_EP_MAX)
  659. {
  660. return -1;
  661. }
  662. if (ToHost)
  663. {
  664. switch(wValue)
  665. {
  666. case UF_ENDPOINT_HALT:
  667. USBCore->pEpCtrl[EpID].INSTATUS_b.Halt = 0;
  668. break;
  669. default:
  670. break;
  671. }
  672. }
  673. else
  674. {
  675. switch(wValue)
  676. {
  677. case UF_ENDPOINT_HALT:
  678. USBCore->pEpCtrl[EpID].OUTSTATUS_b.Halt = 0;
  679. break;
  680. default:
  681. break;
  682. }
  683. }
  684. break;
  685. default:
  686. return -1;
  687. break;
  688. }
  689. return 0;
  690. }
  691. static int32_t prvUSB_DeviceSetFeature(void *pData, void *pParam)
  692. {
  693. USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
  694. usb_device_request_t *Request = (usb_device_request_t *)pParam;
  695. uint8_t EpID, ToHost;
  696. USBCore->Ep0Stage = USB_EP0_STAGE_SETUP;
  697. if (USBCore->DeviceState < USB_STATE_ADDRESSED)
  698. {
  699. return -1;
  700. }
  701. switch(Request->bmRequestType & UT_RECIP_MASK)
  702. {
  703. case UT_RECIP_DEVICE:
  704. switch(Request->wValue[0])
  705. {
  706. case UF_DEVICE_REMOTE_WAKEUP:
  707. if (USBCore->HWCaps.FEATURE_b.RemoteWakeup)
  708. {
  709. USBCore->DEVSTATUS_b.RemoteWakeupEnable = 1;
  710. USBCore->INFSTATUS_b.RemoteWakeupEnable = 1;
  711. }
  712. else
  713. {
  714. return -1;
  715. }
  716. break;
  717. case UF_U1_ENABLE:
  718. if (USBCore->HWCaps.FEATURE_b.U1)
  719. {
  720. USBCore->DEVSTATUS_b.U1Enable = 1;
  721. }
  722. else
  723. {
  724. return -1;
  725. }
  726. break;
  727. case UF_U2_ENABLE:
  728. if (USBCore->HWCaps.FEATURE_b.U2)
  729. {
  730. USBCore->DEVSTATUS_b.U2Enable = 1;
  731. }
  732. else
  733. {
  734. return -1;
  735. }
  736. break;
  737. case UF_LTM_ENABLE:
  738. if (USBCore->HWCaps.FEATURE_b.LTM)
  739. {
  740. USBCore->DEVSTATUS_b.LTMEnable = 1;
  741. }
  742. else
  743. {
  744. return -1;
  745. }
  746. break;
  747. default:
  748. return -1;
  749. break;
  750. }
  751. break;
  752. case UT_RECIP_INTERFACE:
  753. if (Request->wIndex[0] >= USBCore->Setup.pCurConfigInfo->pFullConfig[USBCore->Setup.CurSpeed]->InterfaceNum)
  754. {
  755. return -1;
  756. }
  757. switch(Request->wValue[0])
  758. {
  759. case UF_DEVICE_SUSPEND:
  760. if (Request->wIndex[1] & 0x01)
  761. {
  762. //设备准备休眠
  763. Core_USBAction(USBCore->SelfID, SERV_USB_SUSPEND, USBCore->pHWCtrl);
  764. }
  765. else
  766. {
  767. //设备唤醒
  768. USB_ResumeStart(USBCore->pHWCtrl);
  769. Core_USBAction(USBCore->SelfID, SERV_USB_RESUME, USBCore->pHWCtrl);
  770. }
  771. if (Request->wIndex[1] & 0x02)
  772. {
  773. USBCore->DEVSTATUS_b.RemoteWakeupEnable = 1;
  774. USBCore->INFSTATUS_b.RemoteWakeupEnable = 1;
  775. }
  776. else
  777. {
  778. USBCore->DEVSTATUS_b.RemoteWakeupEnable = 0;
  779. USBCore->INFSTATUS_b.RemoteWakeupEnable = 0;
  780. }
  781. break;
  782. default:
  783. break;
  784. }
  785. break;
  786. case UT_RECIP_ENDPOINT:
  787. Request->wIndex[0] &= 0x00ff;
  788. ToHost = UE_GET_DIR(Request->wIndex[0]);
  789. EpID = UE_GET_ADDR(Request->wIndex[0]);
  790. if (EpID >= USB_EP_MAX)
  791. {
  792. return -1;
  793. }
  794. if (ToHost)
  795. {
  796. switch(Request->wValue[0])
  797. {
  798. case UF_ENDPOINT_HALT:
  799. USBCore->pEpCtrl[EpID].INSTATUS_b.Halt = 1;
  800. break;
  801. default:
  802. break;
  803. }
  804. }
  805. else
  806. {
  807. switch(Request->wValue[0])
  808. {
  809. case UF_ENDPOINT_HALT:
  810. USBCore->pEpCtrl[EpID].OUTSTATUS_b.Halt = 1;
  811. break;
  812. default:
  813. break;
  814. }
  815. }
  816. break;
  817. default:
  818. return -1;
  819. break;
  820. }
  821. return 0;
  822. }
  823. static int32_t prvUSB_DeviceSetAddress(void *pData, void *pParam)
  824. {
  825. USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
  826. usb_device_request_t *Request = (usb_device_request_t *)pParam;
  827. USB_SetDeviceAddress(USBCore->pHWCtrl, Request->wValue[0]);
  828. if (!USBCore->ConfigNo)
  829. {
  830. USBCore->ConfigNo = 0;
  831. USBCore->DefaultConfigNo = 0;
  832. USBCore->DeviceState = USB_STATE_ADDRESSED;
  833. USBCore->Setup.pCurConfigInfo = &USBCore->Setup.pConfigInfo[USBCore->ConfigNo];
  834. prvUSB_StackEpInit(USBCore->SelfID);
  835. USB_ReInitEpCfg(USBCore->pHWCtrl);
  836. prvUSB_StackMakeFullConfigData(USBCore->SelfID);
  837. }
  838. return 0;
  839. }
  840. static int32_t prvUSB_DeviceGetDescriptor(void *pData, void *pParam)
  841. {
  842. USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
  843. usb_device_request_t *Request = (usb_device_request_t *)pParam;
  844. uint16_t TxLen;
  845. uint8_t CurSpeed = USBCore->Setup.CurSpeed;
  846. USBCore->pEpCtrl[0].XferMaxLen = BytesGetLe16(Request->wLength);
  847. USB_EndpointDataStruct EpData;
  848. switch (Request->wValue[1])
  849. {
  850. case UDESC_DEVICE:
  851. TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, sizeof(usb_device_descriptor_t));
  852. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->Setup.pDeviceDesc, TxLen);
  853. break;
  854. case UDESC_CONFIG:
  855. TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, USBCore->FullConfigDataBuf.Pos);
  856. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->FullConfigDataBuf.Data, TxLen);
  857. break;
  858. case UDESC_STRING:
  859. if (Request->wValue[0] < USBCore->Setup.StringNum)
  860. {
  861. TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, USBCore->Setup.pString[Request->wValue[0]].MaxLen);
  862. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->Setup.pString[Request->wValue[0]].Data, TxLen);
  863. break;
  864. }
  865. else
  866. {
  867. return -1;
  868. }
  869. case UDESC_DEVICE_QUALIFIER:
  870. if (USBCore->HWCaps.FEATURE_b.HighSpeed && USBCore->HWCaps.FEATURE_b.FullSpeed && !USBCore->HWCaps.FEATURE_b.SuperSpeed)
  871. {
  872. if (USBCore->Setup.pCurConfigInfo->pQualifierDesc)
  873. {
  874. TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, sizeof(usb_device_qualifier_t));
  875. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->Setup.pCurConfigInfo->pQualifierDesc, TxLen);
  876. }
  877. else
  878. {
  879. return -1;
  880. }
  881. }
  882. else
  883. {
  884. return -1;
  885. }
  886. break;
  887. case UDESC_OTHER_SPEED_CONFIGURATION:
  888. if (USBCore->HWCaps.FEATURE_b.HighSpeed && USBCore->HWCaps.FEATURE_b.FullSpeed)
  889. {
  890. if (USBCore->FullOtherSpeedConfigDataBuf.Data && USBCore->FullOtherSpeedConfigDataBuf.Pos)
  891. {
  892. TxLen = MIN(USBCore->pEpCtrl[0].XferMaxLen, USBCore->FullOtherSpeedConfigDataBuf.Pos);
  893. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, USBCore->FullOtherSpeedConfigDataBuf.Data, TxLen);
  894. }
  895. else
  896. {
  897. return -1;
  898. }
  899. }
  900. else
  901. {
  902. return -1;
  903. }
  904. break;
  905. case UDESC_BOS:
  906. case UDESC_OTG:
  907. case UDESC_DEBUG:
  908. return -1;
  909. break;
  910. default:
  911. memset(&EpData, 0, sizeof(EpData));
  912. EpData.USB_ID = USBCore->SelfID;
  913. EpData.IsToDevice = 1;
  914. EpData.Data = USBCore->pEpCtrl[0].RxBuf.Data;
  915. EpData.Len = USBCore->pEpCtrl[0].RxBuf.Pos;
  916. EpData.pLastRequest = Request;
  917. return USBCore->pEpCtrl[0].CB(&EpData, USBCore->pEpCtrl[0].pData);
  918. break;
  919. }
  920. USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
  921. return 0;
  922. }
  923. static int32_t prvUSB_DeviceSetDescriptor(void *pData, void *pParam)
  924. {
  925. return -1;
  926. }
  927. static int32_t prvUSB_DeviceGetConfiguration(void *pData, void *pParam)
  928. {
  929. USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
  930. usb_device_request_t *Request = (usb_device_request_t *)pParam;
  931. if (Request->wLength[0] != 1)
  932. {
  933. return -1;
  934. }
  935. switch(USBCore->DeviceState)
  936. {
  937. case USB_STATE_CONFIGURED:
  938. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->ConfigNo, 1);
  939. USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
  940. break;
  941. case USB_STATE_ADDRESSED:
  942. Buffer_StaticInit(&USBCore->pEpCtrl[0].TxBuf, &USBCore->DefaultConfigNo, 1);
  943. USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_HOST;
  944. break;
  945. default:
  946. return -1;
  947. break;
  948. }
  949. return 0;
  950. }
  951. static int32_t prvUSB_DeviceSetConfiguration(void *pData, void *pParam)
  952. {
  953. USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
  954. usb_device_request_t *Request = (usb_device_request_t *)pParam;
  955. if (Request->wValue[0] >= USBCore->Setup.ConfigNum)
  956. {
  957. return -1;
  958. }
  959. USBCore->ConfigNo = Request->wValue[0];
  960. USBCore->Setup.pCurConfigInfo = &USBCore->Setup.pConfigInfo[USBCore->ConfigNo];
  961. if (!USBCore->ConfigNo)
  962. {
  963. USBCore->DeviceState = USB_STATE_ADDRESSED;
  964. }
  965. else
  966. {
  967. USBCore->DeviceState = USB_STATE_CONFIGURED;
  968. }
  969. prvUSB_StackEpInit(USBCore->SelfID);
  970. USB_ReInitEpCfg(USBCore->pHWCtrl);
  971. prvUSB_StackMakeFullConfigData(USBCore->SelfID);
  972. return 0;
  973. }
  974. static int32_t prvUSB_DeviceGetInterface(void *pData, void *pParam)
  975. {
  976. return -1;
  977. }
  978. static int32_t prvUSB_DeviceSetInterface(void *pData, void *pParam)
  979. {
  980. return -1;
  981. }
  982. static int32_t prvUSB_DeviceSynchFrame(void *pData, void *pParam)
  983. {
  984. USB_StackCtrlStruct *USBCore = (USB_StackCtrlStruct *)pData;
  985. usb_device_request_t *Request = (usb_device_request_t *)pParam;
  986. uint8_t EpID, ToHost;
  987. USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_DEVICE;
  988. USBCore->pEpCtrl[0].XferMaxLen = 2;
  989. return 0;
  990. }
  991. static CBFuncEx_t prvUSB_StandardRequestTable[UR_SYNCH_FRAME + 1] =
  992. {
  993. prvUSB_DeviceGetStatus,
  994. prvUSB_DeviceClearFeature,
  995. prvUSB_DeviceNoSupport,
  996. prvUSB_DeviceSetFeature,
  997. prvUSB_DeviceNoSupport,
  998. prvUSB_DeviceSetAddress,
  999. prvUSB_DeviceGetDescriptor,
  1000. prvUSB_DeviceSetDescriptor,
  1001. prvUSB_DeviceGetConfiguration,
  1002. prvUSB_DeviceSetConfiguration,
  1003. prvUSB_DeviceGetInterface,
  1004. prvUSB_DeviceSetInterface,
  1005. prvUSB_DeviceSynchFrame,
  1006. };
  1007. void USB_StackDeviceEp0TxDone(uint8_t USB_ID)
  1008. {
  1009. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  1010. USBCore->Ep0Stage = USB_EP0_STAGE_SETUP;
  1011. USB_SetDeviceNoDataSetup(USBCore->pHWCtrl);
  1012. }
  1013. void USB_StackAnalyzeDeviceEpRx(uint8_t USB_ID, uint8_t EpIndex)
  1014. {
  1015. USB_EndpointDataStruct EpData;
  1016. USB_StackCtrlStruct *USBCore = &prvUSBCore[USB_ID];
  1017. USB_EndpointCtrlStruct *pEpCtrl;
  1018. uint16_t wTemp;
  1019. memset(&EpData, 0, sizeof(EpData));
  1020. EpData.USB_ID = USB_ID;
  1021. EpData.EpIndex = EpIndex;
  1022. EpData.IsToDevice = 1;
  1023. EpData.Data = USBCore->pEpCtrl[EpIndex].RxBuf.Data;
  1024. EpData.Len = USBCore->pEpCtrl[EpIndex].RxBuf.Pos;
  1025. EpData.pLastRequest = &USBCore->LastRequest;
  1026. if (EpIndex)
  1027. {
  1028. USBCore->pEpCtrl[EpIndex].RxBuf.Pos = 0;
  1029. EpData.IsDataStage = (EpData.Len < USBCore->pEpCtrl[EpIndex].MaxPacketLen)?0:1;
  1030. if (USBCore->pEpCtrl[EpIndex].CB(&EpData, USBCore->pEpCtrl[EpIndex].pData))
  1031. {
  1032. USB_SetDeviceEPStatus(USBCore->pHWCtrl, EpIndex, 1, USB_EP_STATE_STALL);
  1033. }
  1034. }
  1035. else
  1036. {
  1037. switch(USBCore->Ep0Stage)
  1038. {
  1039. case USB_EP0_STAGE_SETUP:
  1040. pEpCtrl = &USBCore->pEpCtrl[0];
  1041. if (pEpCtrl->RxBuf.Pos != sizeof(usb_device_request_t))
  1042. {
  1043. USBCore->IsRequestError = 1;
  1044. DBG_ERR("USB%d EP%d Request size %d error", USB_ID, EpIndex, pEpCtrl->RxBuf.Pos);
  1045. }
  1046. memcpy(&USBCore->LastRequest, pEpCtrl->RxBuf.Data, pEpCtrl->RxBuf.Pos);
  1047. if ( !(USBCore->LastRequest.bmRequestType & UT_MASK) )
  1048. {
  1049. if (USBCore->LastRequest.bRequest <= UR_SYNCH_FRAME)
  1050. {
  1051. if (prvUSB_StandardRequestTable[USBCore->LastRequest.bRequest](USBCore, &USBCore->LastRequest))
  1052. {
  1053. USBCore->IsRequestError = 1;
  1054. }
  1055. }
  1056. else
  1057. {
  1058. switch(USBCore->LastRequest.bRequest)
  1059. {
  1060. case UR_SET_SEL:
  1061. if (USBCore->HWCaps.FEATURE_b.U1 && USBCore->HWCaps.FEATURE_b.U2)
  1062. {
  1063. wTemp = BytesGetLe16(USBCore->LastRequest.wValue);
  1064. if (USB_SetISOCHDelay(USBCore->pHWCtrl, wTemp))
  1065. {
  1066. USBCore->IsRequestError = 1;
  1067. }
  1068. }
  1069. else
  1070. {
  1071. USBCore->IsRequestError = 1;
  1072. }
  1073. break;
  1074. case UR_ISOCH_DELAY:
  1075. if (USBCore->HWCaps.FEATURE_b.U1 && USBCore->HWCaps.FEATURE_b.U2)
  1076. {
  1077. pEpCtrl->XferMaxLen = BytesGetLe16(USBCore->LastRequest.wLength);
  1078. USBCore->Ep0Stage = USB_EP0_STAGE_DATA_TO_DEVICE;
  1079. }
  1080. else
  1081. {
  1082. USBCore->IsRequestError = 1;
  1083. }
  1084. break;
  1085. default:
  1086. if (USBCore->pEpCtrl[EpIndex].CB(&EpData, USBCore->pEpCtrl[EpIndex].pData))
  1087. {
  1088. USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
  1089. USBCore->IsRequestError = 1;
  1090. }
  1091. break;
  1092. }
  1093. }
  1094. }
  1095. else
  1096. {
  1097. if (USBCore->pEpCtrl[EpIndex].CB(&EpData, USBCore->pEpCtrl[EpIndex].pData))
  1098. {
  1099. USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
  1100. USBCore->IsRequestError = 1;
  1101. }
  1102. }
  1103. if (USBCore->IsRequestError)
  1104. {
  1105. if (USBCore->LastRequest.bRequest != UR_GET_DESCRIPTOR && USBCore->LastRequest.wValue[1] != UDESC_DEVICE_QUALIFIER)
  1106. {
  1107. DBG_ERR("USB%d EP%d Request %x error", USB_ID, EpIndex, USBCore->LastRequest.bRequest);
  1108. DBG_HexPrintf(USBCore->pEpCtrl[0].RxBuf.Data, USBCore->pEpCtrl[0].RxBuf.Pos);
  1109. }
  1110. USBCore->IsRequestError = 0;
  1111. USBCore->Ep0Stage = USB_EP0_STAGE_SETUP;
  1112. USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
  1113. }
  1114. USBCore->pEpCtrl[0].RxBuf.Pos = 0;
  1115. switch(USBCore->Ep0Stage)
  1116. {
  1117. case USB_EP0_STAGE_SETUP:
  1118. USB_SetDeviceNoDataSetup(USBCore->pHWCtrl);
  1119. break;
  1120. case USB_EP0_STAGE_DATA_TO_HOST:
  1121. USB_DeviceXfer(USBCore->pHWCtrl, 0);
  1122. break;
  1123. case USB_EP0_STAGE_DATA_TO_DEVICE:
  1124. Timer_StartMS(USBCore->WaitDataTimer, 100, 0);
  1125. break;
  1126. }
  1127. pEpCtrl->RxBuf.Pos = 0;
  1128. break;
  1129. case USB_EP0_STAGE_DATA_TO_HOST:
  1130. USB_ERR("!!!");
  1131. USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
  1132. break;
  1133. case USB_EP0_STAGE_DATA_TO_DEVICE:
  1134. if (USBCore->pEpCtrl[0].RxBuf.Pos >= USBCore->pEpCtrl[0].XferMaxLen)
  1135. {
  1136. Timer_Stop(USBCore->WaitDataTimer);
  1137. EpData.IsDataStage = 1;
  1138. USB_DBG("setup data out done!");
  1139. if (USBCore->LastRequest.bRequest & UT_MASK)
  1140. {
  1141. switch(USBCore->LastRequest.bRequest)
  1142. {
  1143. case UR_SYNCH_FRAME:
  1144. USB_DBG("frame sn %u", BytesGetLe16(USBCore->pEpCtrl[0].RxBuf.Data));
  1145. break;
  1146. default:
  1147. if (USBCore->pEpCtrl[0].CB(&EpData, USBCore->pEpCtrl[0].pData))
  1148. {
  1149. USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
  1150. }
  1151. break;
  1152. }
  1153. }
  1154. else
  1155. {
  1156. if (USBCore->pEpCtrl[0].CB(&EpData, USBCore->pEpCtrl[0].pData))
  1157. {
  1158. USB_SetDeviceEPStatus(USBCore->pHWCtrl, 0, 1, USB_EP_STATE_STALL);
  1159. }
  1160. }
  1161. USBCore->pEpCtrl[0].RxBuf.Pos = 0;
  1162. }
  1163. break;
  1164. }
  1165. }
  1166. }
  1167. void USB_StackSetDeviceSelfPower(uint8_t USB_ID, uint8_t OnOff)
  1168. {
  1169. prvUSBCore[USB_ID].DEVSTATUS_b.SelfPower = OnOff;
  1170. }
  1171. void USB_StackSetDeviceBusPower(uint8_t USB_ID, uint8_t OnOff)
  1172. {
  1173. prvUSBCore[USB_ID].BusPowered = OnOff;
  1174. }
  1175. void USB_StackSetDeviceRemoteWakeupCapable(uint8_t USB_ID, uint8_t OnOff)
  1176. {
  1177. if (prvUSBCore[USB_ID].HWCaps.FEATURE_b.RemoteWakeup)
  1178. {
  1179. prvUSBCore[USB_ID].INFSTATUS_b.RemoteWakeCapable = OnOff;
  1180. }
  1181. else
  1182. {
  1183. prvUSBCore[USB_ID].INFSTATUS_b.RemoteWakeCapable = 0;
  1184. }
  1185. }