usb_core.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:25k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : usb_core.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 27/10/2003
  5. * Description        : standard protocol processing (USB v1.1)
  6. *
  7. ********************************************************************************/
  8. #include "USB_lib.h"
  9. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  10. #define ValBit(VAR,Place)    (VAR & (1<<Place))
  11. #define SetBit(VAR,Place)    ( VAR |= (1<<Place) )
  12. #define ClrBit(VAR,Place)    ( VAR &= ((1<<Place)^255) )
  13. BYTE *Standard_GetStatus(WORD Length);
  14. RESULT Standard_ClearFeature(void);
  15. RESULT Standard_SetFeature(void);
  16. #define Send0LengthData() {
  17. _SetEPTxCount(ENDP0, 0);
  18. vSetEPTxStatus(EP_TX_VALID);
  19. }
  20. /* cells saving status during interrupt servicing */
  21. WORD SaveRState;
  22. WORD SaveTState;
  23. #define vSetEPRxStatus(st) (SaveRState = st)
  24. #define vSetEPTxStatus(st) (SaveTState = st)
  25. #define USB_StatusIn() Send0LengthData()
  26. #define USB_StatusOut() vSetEPRxStatus(EP_RX_VALID)
  27. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  28. NAME: Standard_GetConfiguration
  29. INPUT: Length - How many bytes are needed
  30. OUTPUT: If "Length" is 0, return the length of configuration value
  31. If "Length" is not 0, return the data buffer address
  32. RETURN: Return 0, if the request is invalid when "Length" is 0
  33. Return "Buffer" if the "Length" is not 0
  34. DESCRIPTION:
  35. Return the current configuration variable address
  36. NOTICE:
  37. This routine is used for devices with only one configuration,
  38. User should write their own routine to process GET_CONFIGURATION
  39. if their device has more than one configuration.
  40.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  41. BYTE *Standard_GetConfiguration(WORD Length)
  42. {
  43. if (Length == 0)
  44. return (BYTE *)sizeof(pInformation->Current_Configuration);
  45. return (BYTE *)&pInformation->Current_Configuration;
  46. } /* Standard_GetConfiguration */
  47. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  48. NAME: Standard_SetConfiguration
  49. INPUT:
  50. OUTPUT:
  51. RETURN: Return SUCCESS, if the request is performed
  52. Return UNSUPPORT, if the request is invalid
  53. DESCRIPTION:
  54. The class calls this routine to get the configuration value
  55. Then each class should configure device themself
  56. NOTICE:
  57. This routine is used for devices with only one configuration.
  58. User should write their own routine to process SET_CONFIGURATION
  59. if their device has more than one configuration.
  60.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  61. RESULT Standard_SetConfiguration(void)
  62. {
  63. BYTE wValue0 = pInformation->USBwValue0;
  64. if (wValue0 <= Device_Table.Total_Configuration) {
  65. /* If the number of configuration is within the range */
  66. pInformation->Current_Configuration = wValue0;
  67. return SUCCESS;
  68. }
  69. else
  70. return UNSUPPORT;
  71. } /* Standard_SetConfiguration */
  72. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  73. NAME: Standard_GetInterface
  74. INPUT: Length - How many bytes are needed
  75. OUTPUT: If "Length" is 0, return the length of interface value
  76. If "Length" is not 0, return the data buffer address
  77. RETURN: Return 0, if the request is invalid when "Length" is 0
  78. Return "Buffer" if the "Length" is not 0
  79. DESCRIPTION:
  80. Return the current interface variable address
  81. NOTICE:
  82. This routine is used for devices with only one configuration and one interface,
  83. User should write their own routine to process GET_INTERFACE
  84. if their device has more than one configuration or one interface
  85. or one alternative setting.
  86.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  87. BYTE *Standard_GetInterface(WORD Length)
  88. {
  89. if (Length == 0)
  90. return (BYTE *)sizeof(pInformation->Current_Interface);
  91. return (BYTE *)&pInformation->Current_Interface;
  92. } /* Standard_GetInterface */
  93. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  94. NAME: Standard_SetInterface
  95. INPUT:
  96. OUTPUT:
  97. RETURN: Return SUCCESS, if the request is performed
  98. Return UNSUPPORT, if the request is invalid
  99. DESCRIPTION:
  100. The class calls this routine to get the interface value
  101. Then each class should configure the interface themself
  102. NOTICE:
  103. This routine is used for devices with only one configuration and
  104. one interface with one alternative setting.
  105. User should write their own routine to process SET_INTERFACE
  106. if their device has more than one configuration or one interface
  107. or one alternative setting.
  108.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  109. RESULT Standard_SetInterface(void)
  110. {
  111. DEVICE_INFO *pInfo = pInformation;
  112. if (pInfo->USBwValue0 != 0 || pInfo->USBwIndex0 != 0)
  113. return UNSUPPORT;
  114. /* I have only one interface & one alternative setting */
  115. pInfo->Current_Interface = 0;
  116. return SUCCESS;
  117. } /* Standard_SetInterface */
  118. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  119. NAME: Standard_GetStatus
  120. INPUT: Length - How many bytes are needed
  121. OUTPUT: If "Length" is 0, return the length of status data
  122. If "Length" is not 0, return number of bytes have been copied
  123. RETURN: Return 0, if the request is at end of data block,
  124. or is invalid when "Length" is 0
  125. DESCRIPTION:
  126.   Copy the device request data to "StatusInfo buffer"
  127.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  128. WORD_BYTE StatusInfo;
  129. #define StatusInfo0 StatusInfo.bw.bb1 /* Reverse bb0 & bb1 */
  130. #define StatusInfo1 StatusInfo.bw.bb0
  131. BYTE *Standard_GetStatus(WORD Length)
  132. {
  133. DEVICE_INFO *pInfo = pInformation;
  134. BYTE Type_Rec;
  135. if (Length == 0)
  136. return (BYTE *)2;
  137. StatusInfo.w = 0; /* Reset Status Information */
  138. Type_Rec = Type_Recipient;
  139. if (Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
  140. BYTE Feature = pInfo->Current_Feature;
  141. if (ValBit(Feature, 5))
  142. SetBit(StatusInfo0, 1); /* Remote Wakeup enabled */
  143. if (ValBit(Feature, 7))
  144. ; /* ClrBit(StatusInfo0, 0); */ /* Bus-powered */
  145. else if (ValBit(Feature, 6))
  146. SetBit(StatusInfo0, 0);  /* Self-powered */
  147. }
  148. else if (Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
  149. BYTE Related_Endpoint;
  150. BYTE wIndex0 = pInfo->USBwIndex0;
  151. Related_Endpoint = ENDP0 + (wIndex0 & 0x0f);
  152. if (ValBit(wIndex0, 7)) {
  153. /* IN endpoint */
  154. if (_GetTxStallStatus( Related_Endpoint ))
  155. SetBit(StatusInfo0, 0); /* IN Endpoint stalled */
  156. }
  157. else {
  158. /* OUT endpoint */
  159. if (_GetRxStallStatus( Related_Endpoint ))
  160. SetBit(StatusInfo0, 0); /* OUT Endpoint stalled */
  161. }
  162. }
  163. else
  164. return NULL;
  165. return (BYTE *)&StatusInfo;
  166. } /* Standard_GetStatus */
  167. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  168. NAME: Standard_ClearFeature
  169. INPUT:
  170. OUTPUT: none
  171. DESCRIPTION:
  172. Clear or disable a specific feature
  173.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  174. RESULT Standard_ClearFeature(void)
  175. {
  176. DEVICE_INFO *pInfo = pInformation;
  177. BYTE Type_Rec = Type_Recipient;
  178. BYTE wValue0 = pInfo->USBwValue0;
  179. if ( Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT) ) {
  180. if (wValue0 != DEVICE_REMOTE_WAKEUP)
  181. return UNSUPPORT;
  182. ClrBit(pInfo->Current_Feature, 5);
  183. return SUCCESS;
  184. }
  185. else if ( Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT) ) {
  186. DEVICE* pDev;
  187. BYTE Related_Endpoint;
  188. BYTE wIndex0;
  189. BYTE rEP;
  190. if (wValue0 != ENDPOINT_STALL)
  191. return UNSUPPORT;
  192. pDev = &Device_Table;
  193. wIndex0 = pInfo->USBwIndex0;
  194. rEP = wIndex0 & ~0x80;
  195. if (rEP >= pDev->Total_Endpoint)
  196. return UNSUPPORT;
  197. /* EPindex should be equal to Device_Table.EP0 */
  198. Related_Endpoint = ENDP0 + rEP;
  199. if (wIndex0 & 0x80) { /* IN endpoint */
  200. if (_GetTxStallStatus(Related_Endpoint ))
  201. _SetEPTxStatus(Related_Endpoint, EP_TX_NAK);
  202. }
  203. else { /* OUT endpoint */
  204. if (_GetRxStallStatus(Related_Endpoint)){
  205. if (Related_Endpoint == ENDP0) {
  206. /* After clear the STALL, enable the default endpoint receiver */
  207. SetEPRxCount(Related_Endpoint, STD_MAXPACKETSIZE);
  208. _SetEPRxStatus(Related_Endpoint, EP_RX_VALID);
  209. }
  210. else
  211. _SetEPRxStatus(Related_Endpoint, EP_RX_NAK);
  212. }
  213. }
  214. return SUCCESS;
  215. }
  216. return UNSUPPORT;
  217. } /* Standard_ClearFeature */
  218. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  219. NAME: Standard_SetFeature
  220. INPUT:
  221. OUTPUT: none
  222. DESCRIPTION:
  223. Set or enable a specific feature
  224.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  225. RESULT Standard_SetFeature(void)
  226. {
  227. DEVICE_INFO *pInfo = pInformation;
  228. BYTE Type_Rec = Type_Recipient;
  229. BYTE wValue0 = pInfo->USBwValue0;
  230. if ( Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT) ) {
  231. if (wValue0 != DEVICE_REMOTE_WAKEUP)
  232. return UNSUPPORT;
  233. SetBit(pInfo->Current_Feature, 5);
  234. /****************************************/
  235. return SUCCESS;
  236. }
  237. else if ( Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT) ) {
  238. DEVICE* pDev;
  239. BYTE Related_Endpoint;
  240. BYTE wIndex0;
  241. BYTE rEP;
  242. if (wValue0 != ENDPOINT_STALL)
  243. return UNSUPPORT;
  244. pDev = &Device_Table;
  245. wIndex0 = pInfo->USBwIndex0;
  246. rEP = wIndex0 & ~0x80;
  247. if (rEP >= pDev->Total_Endpoint)
  248. return UNSUPPORT;
  249. Related_Endpoint = ENDP0 + rEP;
  250. if (wIndex0 & 0x80) { /* IN endpoint */
  251. _SetEPTxStatus(Related_Endpoint, EP_TX_STALL);
  252. }
  253. else { /* OUT endpoint */
  254. _SetEPRxStatus(Related_Endpoint, EP_RX_STALL);
  255. }
  256. return SUCCESS;
  257. }
  258. return UNSUPPORT;
  259. } /* Standard_SetFeature */
  260. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  261. NAME: Standard_GetDescriptorData
  262. Standard_GetStringDescriptor
  263. INPUT: Length - Length of the data in this transfer
  264. pDesc - A pointer points to descriptor struct
  265. The structure gives the initial address
  266. of the descriptor and its original size
  267. OUTPUT: Address of a part of the descriptor pointed by the Usb_wOffset
  268. The buffer pointed by this address contains at least Length bytes
  269. DESCRIPTION:
  270. These 2 routines only used for the descriptors resident in ROM or RAM
  271. pDesc can be in either ROM or RAM
  272. Standard_GetStringDescriptor is used for transfer string descriptor
  273. The purpose of these 2 routines is to have a versatile way to response
  274. descriptors request. It allows user to generate certain descriptors
  275. with software or read descriptors from external storage part by part.
  276.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  277. BYTE *Standard_GetStringDescriptor(WORD Length, ONE_DESCRIPTOR *pDesc)
  278. {
  279. int len, offset, wOffset;
  280. wOffset = pInformation->Ctrl_Info.Usb_wOffset;
  281. if (Length == 0) {
  282. offset = 0;
  283. do {
  284. len = (int)*(pDesc->Descriptor + offset);
  285. if (wOffset >= 0 && wOffset < len) {
  286. len -= wOffset;
  287. if (len > 0)
  288. return (BYTE*)len;
  289. break;
  290. }
  291. wOffset -= len;
  292. offset += len;
  293. } while (offset < pDesc->Descriptor_Size);
  294. return 0;
  295. }
  296. return pDesc->Descriptor + wOffset;
  297. }/* Standard_GetStringDescriptor */
  298. /*============================================================================*/
  299. /*============================================================================*/
  300. BYTE *Standard_GetDescriptorData(WORD Length, ONE_DESCRIPTOR *pDesc)
  301. {
  302. int len, wOffset;
  303. wOffset = pInformation->Ctrl_Info.Usb_wOffset;
  304. if (Length == 0) {
  305. len = pDesc->Descriptor_Size - wOffset;
  306. if (len <= 0)
  307. return 0;
  308. return (BYTE *)len;
  309. }
  310. return pDesc->Descriptor + wOffset;
  311. } /* Standard_GetDescriptorData */
  312. /*-----------------------------------------------------------------------------
  313. ROUTINE NAME : DataStageOut
  314. INPUT/OUTPUT : None
  315. DESCRIPTION  : Data stage of a Control Write Transfer
  316. -----------------------------------------------------------------------------*/
  317. void DataStageOut()
  318. {
  319. ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info;
  320. WORD save_rLength;
  321. save_rLength = pEPinfo->Usb_rLength;
  322. if (pEPinfo->CopyData && save_rLength) {
  323. BYTE *Buffer;
  324. WORD Length;
  325. BYTE *Source;
  326. Length = pEPinfo->PacketSize;
  327. if (Length > save_rLength)
  328. Length = save_rLength;
  329. Buffer = (*pEPinfo->CopyData)(Length);
  330. pEPinfo->Usb_rLength -= Length;
  331. pEPinfo->Usb_rOffset += Length;
  332. /*sb Source = pProperty->RxEP_buffer; */
  333. Source = PMAAddr + (BYTE *)(_GetEPRxAddr(ENDP0)*2); /* *2 for 32 bits addr */
  334. while (Length) {
  335. *Buffer++ = *Source++;
  336. Length--;
  337. if(Length == 0) break; /* odd counter */
  338. *Buffer++ = *Source++;
  339. Length--;
  340. Source++;Source++; /* skip 2 bytes for 32 bit addressing */
  341. }
  342. }
  343. if (pEPinfo->Usb_rLength == 0) {
  344. /* this OUT Transaction is the last one */
  345. pInformation->ControlState =
  346. (save_rLength == pEPinfo->PacketSize) ?
  347. /* If the previous read length is same as MaxPacketSize
  348. This is the multiple MaxPacketSize package
  349. Wait for another OUT token and send 0 length data
  350. */
  351. WAIT_OUT_ZERO :
  352. /* If the previous read length is NOT same as MaxPacketSize
  353. Wait for the IN token to finish the status stage
  354. */
  355. LAST_OUT_DATA;
  356. }
  357. } /* DataStageOut */
  358. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  359. NAME: DataStageIn
  360. INPUT: none
  361. OUTPUT:
  362. DESCRIPTION:
  363. Data stage of a Control Read Transfer
  364.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  365. void DataStageIn(void)
  366. {
  367. ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info;
  368. WORD save_wLength = pEPinfo->Usb_wLength;
  369. BYTE ControlState;
  370. BYTE *DataBuffer;
  371. WORD Length;
  372. int i;
  373.     DWORD *pTxBuff;
  374.     WORD wTra;
  375.   union {
  376. BYTE *bTra;
  377.      WORD *wTra;
  378. }pBuf;
  379. if (save_wLength == 0) {
  380. /* if the number of byte to be sent is */
  381. /* multiple of MaxPacketSize: send a 0 length data packet */
  382. ControlState = WAIT_IN_ZERO;
  383. Send0LengthData();
  384. goto Expect_Status_Out;
  385. }
  386. Length = pEPinfo->PacketSize;
  387. ControlState = (save_wLength < Length) ? LAST_IN_DATA : IN_DATA;
  388. /* Same as UsbWrite */
  389. if (Length > save_wLength)
  390. Length = save_wLength;
  391. DataBuffer = (*pEPinfo->CopyData)(Length);
  392.     /* transfer data from buffer to PMA */
  393.     pTxBuff = (DWORD *)(PMAAddr + (BYTE *)(_GetEPTxAddr(ENDP0)*2));
  394.     pBuf.wTra = &wTra;
  395.     for(i=0;i < Length;)
  396.     {
  397.      *(pBuf.bTra  ) = *DataBuffer++;
  398.      i++;
  399.      *(pBuf.bTra+1) = *DataBuffer++;
  400.      i++;
  401.      *pTxBuff = wTra;
  402.      pTxBuff++;
  403.     }
  404. _SetEPTxCount(ENDP0, Length);
  405. pEPinfo->Usb_wLength -= Length;
  406. pEPinfo->Usb_wOffset += Length;
  407. vSetEPTxStatus(EP_TX_VALID);
  408. Expect_Status_Out:
  409. USB_StatusOut(); /* Expect the host to abort the data IN stage */
  410. pInformation->ControlState = ControlState;
  411. }/* DataStageIn */
  412. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  413. NAME: NoData_Setup0
  414. INPUT:
  415. OUTPUT: none
  416. DESCRIPTION:
  417. Proceed the processing of setup request without data stage
  418.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  419. void NoData_Setup0()
  420. {
  421. DEVICE_INFO *pInfo = pInformation;
  422. RESULT Result;
  423. BYTE RequestNo = pInfo->USBbRequest;
  424. BYTE ControlState;
  425. if (RequestNo == CLEAR_FEATURE)
  426. Result = Standard_ClearFeature();
  427. else if (RequestNo == SET_FEATURE)
  428. Result = Standard_SetFeature();
  429. else if (RequestNo == SET_ADDRESS && Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT) )
  430. Result = SUCCESS;
  431. else
  432. Result = UNSUPPORT;
  433. if (Result != SUCCESS) {
  434. Result = (*pProperty->Class_NoData_Setup)(RequestNo);
  435. if (Result == NOT_READY) {
  436. ControlState = PAUSE;
  437. goto exit_NoData_Setup0;
  438. }
  439. }
  440. if (Result != SUCCESS) {
  441. ControlState = STALLED;
  442. goto exit_NoData_Setup0;
  443. }
  444. ControlState = WAIT_STATUS_IN; /* After no data stage SETUP */
  445. USB_StatusIn();
  446. exit_NoData_Setup0:
  447. pInformation->ControlState = ControlState;
  448. return;
  449. } /* NoData_Setup0 */
  450. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  451. NAME: Data_Setup0
  452. INPUT:
  453. OUTPUT: none
  454. DESCRIPTION:
  455. Proceed the processing of setup request with data stage
  456.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  457. void Data_Setup0()
  458. {
  459. DEVICE_INFO *pInfo = pInformation;
  460. DEVICE_PROP *pProp = pProperty;
  461. BYTE *(*CopyRoutine)(WORD);
  462. WORD wOffset;
  463. RESULT Result;
  464. BYTE Request_No = pInfo->USBbRequest;
  465. BYTE *pbLen;
  466. WORD wLen;
  467. CopyRoutine = NULL;
  468. wOffset = 0;
  469. if (Request_No == GET_DESCRIPTOR) {
  470. if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
  471. BYTE wValue1 = pInfo->USBwValue1;
  472. if (wValue1 == DEVICE_DESCRIPTOR)
  473. CopyRoutine = pProp->GetDeviceDescriptor;
  474. else if (wValue1 == CONFIG_DESCRIPTOR)
  475. CopyRoutine = pProp->GetConfigDescriptor;
  476. else if (wValue1 == STRING_DESCRIPTOR) {
  477. wOffset = pInfo->USBwValue0;
  478. CopyRoutine = pProp->GetStringDescriptor;
  479. } /* End of GET_DESCRIPTOR */
  480. }
  481. }
  482. else if (Request_No == GET_STATUS) {
  483. if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)
  484. || Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
  485. CopyRoutine = Standard_GetStatus;
  486. }
  487. }
  488. /***************************************************************************
  489. else if (Request_No == GET_CONFIGURATION) {
  490. if ( Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT) )
  491. CopyRoutine = Standard_GetConfiguration;
  492. }
  493. else if (Request_No == GET_INTERFACE) {
  494. if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
  495. CopyRoutine = Standard_GetInterface;
  496. }
  497. else if (Request_No == SET_DESCRIPTOR:) {
  498. if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
  499. BYTE *SetDeviceDescriptor(WORD Length);
  500. BYTE wValue1 = pInfo->USBwValue1;
  501. if ( wValue1 == DEVICE_DESCRIPTOR)
  502. CopyRoutine = SetDeviceDescriptor;
  503. else if (wValue1 == CONFIG_DESCRIPTOR)
  504. CopyRoutine = SetConfigDescriptor;
  505. else if (wValue1 == STRING_DESCRIPTOR) {
  506. CopyRoutine = SetStringDescriptor;
  507. wOffset = pInfo->USBwValue0;
  508. }
  509. }
  510. }
  511. ***************************************************************************/
  512. if (CopyRoutine) {
  513. pInfo->Ctrl_Info.Usb_wOffset = wOffset;
  514. pInfo->Ctrl_Info.CopyData = CopyRoutine;
  515. /* sb in the original the cast to word was directly */
  516. /* now the cast is made step by step */
  517. pbLen = (*CopyRoutine)(0);
  518. wLen = (WORD)((DWORD)pbLen);
  519. pInfo->Ctrl_Info.Usb_wLength = wLen;
  520. Result = SUCCESS;
  521. }
  522. else {
  523. Result = (*pProp->Class_Data_Setup)(pInfo->USBbRequest);
  524. if (Result == NOT_READY) {
  525. pInfo->ControlState = PAUSE;
  526. return;
  527. }
  528. }
  529. if (pInfo->Ctrl_Info.Usb_wLength == 0xffff) { /* Data is not ready, wait it */
  530. pInfo->ControlState = PAUSE;
  531. return;
  532. }
  533. if (Result == UNSUPPORT || pInfo->Ctrl_Info.Usb_wLength == 0) {
  534. /* Unsupported request */
  535. pInfo->ControlState = STALLED;
  536. return;
  537. }
  538. if (ValBit(pInfo->USBbmRequestType, 7)) {
  539. /* Device ==> Host */
  540. WORD wLength = pInfo->USBwLength;
  541. /* Restrict the data length to be the one host asks */
  542. if (pInfo->Ctrl_Info.Usb_wLength > wLength)
  543. pInfo->Ctrl_Info.Usb_wLength = wLength;
  544. pInfo->Ctrl_Info.PacketSize = pProp->MaxPacketSize;
  545. DataStageIn();
  546. }
  547. else {
  548. pInfo->ControlState = OUT_DATA;
  549. /* SetEPRxCount(EPindex, STD_MAXPACKETSIZE); */
  550. vSetEPRxStatus(EP_RX_VALID);
  551. /* reenable for next data reception */
  552. }
  553. return;
  554. } /* Data_Setup0 */
  555. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  556. NAME: Setup0_Process
  557. INPUT:
  558. OUTPUT: none
  559. DESCRIPTION:
  560. Get the device request data and dispatch to individual process
  561.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  562. BYTE Setup0_Process()
  563. {
  564. DEVICE_INFO *pInfo = pInformation;
  565. union {
  566. BYTE* b;
  567. WORD* w;
  568. } pBuf;
  569. /* sb pBuf.b = pProperty->RxEP_buffer; */
  570. pBuf.b = PMAAddr + (BYTE *)(_GetEPRxAddr(ENDP0)*2); /* *2 for 32 bits addr */
  571. if (pInfo->ControlState != PAUSE) {
  572. pInfo->USBbmRequestType = *pBuf.b++; /* bmRequestType */
  573. pInfo->USBbRequest = *pBuf.b++; /* bRequest */
  574. pBuf.w++;  /* sb word not accessed because of 32 bits addressing */
  575. pInfo->USBwValue = ByteSwap(*pBuf.w++); /* wValue */
  576. pBuf.w++;  /* word not accessed because of 32 bits addressing */
  577. pInfo->USBwIndex = ByteSwap(*pBuf.w++); /* wIndex */
  578. pBuf.w++;  /* word not accessed because of 32 bits addressing */
  579. /* sb pInfo->USBwLength = ByteSwap(*pBuf.w);*/ /* wLength */
  580. pInfo->USBwLength = *pBuf.w; /* wLength */
  581. }
  582. pInfo->ControlState = SETTING_UP;
  583. if (pInfo->USBwLength == 0)
  584. { /* No data statge processing */
  585. NoData_Setup0();
  586. }
  587. else { /* Setup with data stage */
  588. Data_Setup0();
  589. }
  590. return Post0_Process();
  591. } /* Setup0_Process */
  592. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  593. NAME: In0_Process
  594. INPUT:
  595. OUTPUT: none
  596. DESCRIPTION:
  597. Process the IN token on all default endpoint
  598.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  599. BYTE In0_Process()
  600. {
  601. DEVICE_INFO *pInfo = pInformation;
  602. BYTE ControlState = pInfo->ControlState;
  603. if (ControlState == IN_DATA)
  604. {
  605. DataStageIn();
  606. /* sb questo e' un baco della libreria st9 */
  607. ControlState = pInfo->ControlState; /* may be changed outside the function */
  608. /* sb */
  609. }
  610. else if (ControlState == LAST_IN_DATA || ControlState == WAIT_IN_ZERO) {
  611. ControlState = WAIT_STATUS_OUT;
  612. USB_StatusOut();
  613. }
  614. else if (ControlState == WAIT_OUT_ZERO || ControlState == WAIT_STATUS_IN) {
  615. if (pInfo->USBbRequest == SET_ADDRESS &&
  616. Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT) ) {
  617. /* Device address must be written */
  618. /* after completion of Status Stage (ACK from Host) */
  619. SetDeviceAddress(pInfo->USBwValue0);
  620. }
  621. (*pProperty->Process_Status_IN)();
  622. ControlState = WAIT_SETUP;
  623. }
  624. else
  625. ControlState = STALLED;
  626. pInfo->ControlState = ControlState;
  627. return Post0_Process();
  628. } /* In0_Process */
  629. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  630. NAME: Out0_Process
  631. INPUT:
  632. OUTPUT: none
  633. DESCRIPTION:
  634. Process the OUT token on all default endpoint
  635.  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  636. BYTE Out0_Process()
  637. {
  638. DEVICE_INFO *pInfo = pInformation;
  639. BYTE ControlState = pInfo->ControlState;
  640. if (ControlState == OUT_DATA) {
  641. DataStageOut();
  642. if (pInfo->ControlState == LAST_OUT_DATA) {
  643. ControlState = WAIT_STATUS_IN;
  644. USB_StatusIn();
  645. }
  646. else {
  647. /* Expecting another OUT token with 0 length data */
  648. SetEPRxCount(ENDP0, 0);
  649. vSetEPRxStatus(EP_RX_VALID);
  650. /* Also expecting an IN token to finish the transaction */
  651. USB_StatusIn();
  652. }
  653. }
  654. else if (ControlState == WAIT_STATUS_OUT || ControlState == IN_DATA) {
  655. /* host aborts the xfer before finish */
  656. /* Clear_Status_Out(EPindex);*/ /* Clear ST_OUT bit of this EP */
  657. vSetEPTxStatus(EP_TX_NAK);
  658. /* This is to ensure that when the xfer is aborted,
  659. close down the transmitter, in case the next IN
  660. token comes in before I config the transmitter */
  661. (*pProperty->Process_Status_OUT)();
  662. ControlState = WAIT_SETUP;
  663. }
  664. else if (ControlState == WAIT_OUT_ZERO) {
  665. ControlState = WAIT_STATUS_IN;
  666. USB_StatusIn();
  667. }
  668. else {
  669. /* Unexpect state, STALL the endpoint */
  670. ControlState = STALLED;
  671. }
  672. pInfo->ControlState = ControlState;
  673. return Post0_Process();
  674. } /* Out0_Process */
  675. /*============================================================================*/
  676. /*============================================================================*/
  677. BYTE Post0_Process()
  678. {
  679. SetEPRxCount(ENDP0, STD_MAXPACKETSIZE);
  680. if (pInformation->ControlState == STALLED) {
  681. vSetEPRxStatus(EP_RX_STALL);
  682. vSetEPTxStatus(EP_TX_STALL);
  683. }
  684. /*
  685.  * Since the SIE will receive SETUP even in NAK state
  686.  * There is no need to enable the receiver again
  687. */
  688. return (pInformation->ControlState == PAUSE);
  689. } /* Post0_Process */
  690. /***************************************************************************
  691. BYTE DescriptorBuffer[128];
  692. BYTE *SetDeviceDescriptor(WORD Length)
  693. {
  694. if (Length == 0)
  695. return (BYTE*)sizeof(DescriptorBuffer);
  696. return DescriptorBuffer + pInfomation->Ctrl_Info.Usb_rOffset;
  697. }
  698. ***************************************************************************/
  699. /*-----------------------------------------------------------------*/
  700. /*-----------------------------------------------------------------*/
  701. void SetDeviceAddress(BYTE Val)
  702. {
  703.   int i;
  704.   DEVICE *pDevice = &Device_Table;
  705. /*  BYTE EP0 = pDevice->EP0; */
  706.   int nEP = pDevice->Total_Endpoint;
  707. /* set address in every used endpoint */
  708. for(i=0;i<nEP;i++)
  709. {
  710. _SetEPAddress((BYTE)i, (BYTE)i);
  711. } /* for */
  712. _SetDADDR(Val|DADDR_EF); /* set device address and enable function */
  713. } /* SetDeviceAddress */
  714. /*-----------------------------------------------------------------*/
  715. /*-----------------------------------------------------------------*/
  716. void NOP_Process(void)
  717. {
  718. }