usbd_core.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /* This file is the part of the Lightweight USB device Stack for STM32 microcontrollers
  2. *
  3. * Copyright ©2016 Dmitry Filimonchuk <dmitrystu[at]gmail[dot]com>
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #include <stdint.h>
  16. #include <stdbool.h>
  17. #include "usb.h"
  18. #define _MIN(a, b) ((a) < (b)) ? (a) : (b)
  19. static void usbd_process_ep0 (usbd_device *dev, uint8_t event, uint8_t ep);
  20. /** \brief Resets USB device state
  21. * \param dev pointer to usb device
  22. * \return none
  23. */
  24. static void usbd_process_reset(usbd_device *dev) {
  25. dev->status.device_state = usbd_state_default;
  26. dev->status.control_state = usbd_ctl_idle;
  27. dev->status.device_cfg = 0;
  28. dev->driver->ep_config(0, USB_EPTYPE_CONTROL, dev->status.ep0size);
  29. dev->endpoint[0] = usbd_process_ep0;
  30. dev->driver->setaddr(0);
  31. }
  32. /** \brief Callback that sets USB device address
  33. * \param dev pointer to usb device
  34. * \param req pointer to usb control request data
  35. * \return none
  36. */
  37. static void usbd_set_address (usbd_device *dev, usbd_ctlreq *req) {
  38. dev->driver->setaddr(req->wValue);
  39. dev->status.device_state = (req->wValue) ? usbd_state_addressed : usbd_state_default;
  40. }
  41. /** \brief Control transfer completion callback processing
  42. * \param dev pointer to the usb device
  43. * \return none
  44. */
  45. static void usbd_process_callback (usbd_device *dev) {
  46. if (dev->complete_callback) {
  47. dev->complete_callback(dev, dev->status.data_buf);
  48. dev->complete_callback = 0;
  49. }
  50. }
  51. /** \brief SET_CONFIG request processing
  52. * \param dev usbd_device
  53. * \param config config number from request
  54. * \return usbd_ack if success
  55. */
  56. static usbd_respond usbd_configure(usbd_device *dev, uint8_t config) {
  57. if (dev->config_callback) {
  58. if (dev->config_callback(dev, config) == usbd_ack) {
  59. dev->status.device_cfg = config;
  60. dev->status.device_state = (config) ? usbd_state_configured : usbd_state_addressed;
  61. return usbd_ack;
  62. }
  63. }
  64. return usbd_fail;
  65. }
  66. /** \brief Standard control request processing for device
  67. * \param dev pointer to usb device
  68. * \param req pointer to control request
  69. * \return TRUE if request is handled
  70. */
  71. static usbd_respond usbd_process_devrq (usbd_device *dev, usbd_ctlreq *req) {
  72. switch (req->bRequest) {
  73. case USB_STD_CLEAR_FEATURE:
  74. /* not yet supported */
  75. break;
  76. case USB_STD_GET_CONFIG:
  77. req->data[0] = dev->status.device_cfg;
  78. return usbd_ack;
  79. case USB_STD_GET_DESCRIPTOR:
  80. if (req->wValue == ((USB_DTYPE_STRING << 8) | INTSERIALNO_DESCRIPTOR )) {
  81. dev->status.data_count = dev->driver->get_serialno_desc(req->data);
  82. return usbd_ack;
  83. } else {
  84. if (dev->descriptor_callback) {
  85. return dev->descriptor_callback(req, &(dev->status.data_ptr), &(dev->status.data_count));
  86. }
  87. }
  88. break;
  89. case USB_STD_GET_STATUS:
  90. req->data[0] = 0;
  91. req->data[1] = 0;
  92. return usbd_ack;
  93. case USB_STD_SET_ADDRESS:
  94. if (usbd_getinfo(dev) & USBD_HW_ADDRFST) {
  95. usbd_set_address(dev, req);
  96. } else {
  97. dev->complete_callback = usbd_set_address;
  98. }
  99. return usbd_ack;
  100. case USB_STD_SET_CONFIG:
  101. return usbd_configure(dev, req->wValue);
  102. case USB_STD_SET_DESCRIPTOR:
  103. /* should be externally handled */
  104. break;
  105. case USB_STD_SET_FEATURE:
  106. /* not yet supported */
  107. break;
  108. default:
  109. break;
  110. }
  111. return usbd_fail;
  112. }
  113. /** \brief Standard control request processing for interface
  114. * \param dev pointer to usb device
  115. * \param req pointer to control request
  116. * \return TRUE if request is handled
  117. */
  118. static usbd_respond usbd_process_intrq(usbd_device *dev, usbd_ctlreq *req) {
  119. (void)dev;
  120. switch (req->bRequest) {
  121. case USB_STD_GET_STATUS:
  122. req->data[0] = 0;
  123. req->data[1] = 0;
  124. return usbd_ack;
  125. default:
  126. break;
  127. }
  128. return usbd_fail;
  129. }
  130. /** \brief Standard control request processing for endpoint
  131. * \param dev pointer to usb device
  132. * \param req pointer to control request
  133. * \return TRUE if request is handled
  134. */
  135. static usbd_respond usbd_process_eptrq(usbd_device *dev, usbd_ctlreq *req) {
  136. switch (req->bRequest) {
  137. case USB_STD_SET_FEATURE:
  138. dev->driver->ep_setstall(req->wIndex, 1);
  139. return usbd_ack;
  140. case USB_STD_CLEAR_FEATURE:
  141. dev->driver->ep_setstall(req->wIndex, 0);
  142. return usbd_ack;
  143. case USB_STD_GET_STATUS:
  144. req->data[0] = dev->driver->ep_isstalled(req->wIndex) ? 1 : 0;
  145. req->data[1] = 0;
  146. return usbd_ack;
  147. default:
  148. break;
  149. }
  150. return usbd_fail;
  151. }
  152. /** \brief Processing control request
  153. * \param dev pointer to usb device
  154. * \param req pointer to usb control request
  155. * \return TRUE if request is handled
  156. */
  157. static usbd_respond usbd_process_request(usbd_device *dev, usbd_ctlreq *req) {
  158. /* processing control request by callback */
  159. if (dev->control_callback) {
  160. usbd_respond r = dev->control_callback(dev, req, &(dev->complete_callback));
  161. if (r != usbd_fail) return r;
  162. }
  163. /* continuing standard USB requests */
  164. switch (req->bmRequestType & (USB_REQ_TYPE | USB_REQ_RECIPIENT)) {
  165. case USB_REQ_STANDARD | USB_REQ_DEVICE:
  166. return usbd_process_devrq(dev, req);
  167. case USB_REQ_STANDARD | USB_REQ_INTERFACE:
  168. return usbd_process_intrq(dev, req);
  169. case USB_REQ_STANDARD | USB_REQ_ENDPOINT:
  170. return usbd_process_eptrq(dev, req);
  171. default:
  172. break;
  173. }
  174. return usbd_fail;
  175. }
  176. /** \brief Control endpoint stall (STALL PID)
  177. * \param dev pointer to usb device
  178. * \param ep endpoint number
  179. */
  180. static void usbd_stall_pid(usbd_device *dev, uint8_t ep) {
  181. dev->driver->ep_setstall(ep & 0x7F, 1);
  182. dev->driver->ep_setstall(ep | 0x80, 1);
  183. dev->status.control_state = usbd_ctl_idle;
  184. }
  185. /** \brief Control endpoint TX event processing
  186. * \param dev pointer to usb device
  187. * \param ep endpoint number
  188. */
  189. static void usbd_process_eptx(usbd_device *dev, uint8_t ep) {
  190. int32_t _t;
  191. switch (dev->status.control_state) {
  192. case usbd_ctl_ztxdata:
  193. case usbd_ctl_txdata:
  194. _t = _MIN(dev->status.data_count, dev->status.ep0size);
  195. dev->driver->ep_write(ep, dev->status.data_ptr, _t);
  196. dev->status.data_ptr += _t;
  197. dev->status.data_count -= _t;
  198. /* if all data is not sent */
  199. if (0 != dev->status.data_count) break;
  200. /* if last packet has a EP0 size and host awaiting for the more data ZLP should be sent*/
  201. /* if ZLP required, control state will be unchanged, therefore next TX event sends ZLP */
  202. if ( usbd_ctl_txdata == dev->status.control_state || _t != dev->status.ep0size ) {
  203. dev->status.control_state = usbd_ctl_lastdata; /* no ZLP required */
  204. }
  205. break;
  206. case usbd_ctl_lastdata:
  207. dev->status.control_state = usbd_ctl_statusout;
  208. break;
  209. case usbd_ctl_statusin:
  210. dev->status.control_state = usbd_ctl_idle;
  211. return usbd_process_callback(dev);
  212. default:
  213. /* unexpected TX completion */
  214. /* just skipping it */
  215. break;
  216. }
  217. }
  218. /** \brief Control endpoint RX event processing
  219. * \param dev pointer to usb device
  220. * \param ep endpoint number
  221. */
  222. static void usbd_process_eprx(usbd_device *dev, uint8_t ep) {
  223. uint16_t _t;
  224. usbd_ctlreq *const req = dev->status.data_buf;
  225. switch (dev->status.control_state) {
  226. case usbd_ctl_idle:
  227. /* read SETUP packet, send STALL_PID if incorrect packet length */
  228. if (0x08 != dev->driver->ep_read(ep, req, dev->status.data_maxsize)) {
  229. return usbd_stall_pid(dev, ep);
  230. }
  231. dev->status.data_ptr = req->data;
  232. dev->status.data_count = req->wLength;
  233. /* processing request with no payload data*/
  234. if ((req->bmRequestType & USB_REQ_DEVTOHOST) || (0 == req->wLength)) break;
  235. /* checking available memory for DATA OUT stage */
  236. if (req->wLength > dev->status.data_maxsize) {
  237. return usbd_stall_pid(dev, ep);
  238. }
  239. /* continue DATA OUT stage */
  240. dev->status.control_state = usbd_ctl_rxdata;
  241. return;
  242. case usbd_ctl_rxdata:
  243. /*receive DATA OUT packet(s) */
  244. _t = dev->driver->ep_read(ep, dev->status.data_ptr, dev->status.data_count);
  245. if (dev->status.data_count < _t) {
  246. /* if received packet is large than expected */
  247. /* Must be error. Let's drop this request */
  248. return usbd_stall_pid(dev, ep);
  249. } else if (dev->status.data_count != _t) {
  250. /* if all data payload was not received yet */
  251. dev->status.data_count -= _t;
  252. dev->status.data_ptr += _t;
  253. return;
  254. }
  255. break;
  256. case usbd_ctl_statusout:
  257. /* fake reading STATUS OUT */
  258. dev->driver->ep_read(ep, 0, 0);
  259. dev->status.control_state = usbd_ctl_idle;
  260. return usbd_process_callback(dev);
  261. default:
  262. /* unexpected RX packet */
  263. return usbd_stall_pid(dev, ep);
  264. }
  265. /* usb request received. let's handle it */
  266. dev->status.data_ptr = req->data;
  267. dev->status.data_count = /*req->wLength;*/dev->status.data_maxsize;
  268. switch (usbd_process_request(dev, req)) {
  269. case usbd_ack:
  270. if (req->bmRequestType & USB_REQ_DEVTOHOST) {
  271. /* return data from function */
  272. if (dev->status.data_count >= req->wLength) {
  273. dev->status.data_count = req->wLength;
  274. dev->status.control_state = usbd_ctl_txdata;
  275. } else {
  276. /* DATA IN packet smaller than requested */
  277. /* ZLP maybe wanted */
  278. dev->status.control_state = usbd_ctl_ztxdata;
  279. }
  280. return usbd_process_eptx(dev, ep | 0x80);
  281. } else {
  282. /* confirming by ZLP in STATUS_IN stage */
  283. dev->driver->ep_write(ep | 0x80, 0, 0);
  284. dev->status.control_state = usbd_ctl_statusin;
  285. }
  286. break;
  287. case usbd_nak:
  288. dev->status.control_state = usbd_ctl_statusin;
  289. break;
  290. default:
  291. return usbd_stall_pid(dev, ep);
  292. }
  293. }
  294. /** \brief Control endpoint 0 event processing callback
  295. * \param dev usb device
  296. * \param event endpoint event
  297. */
  298. static void usbd_process_ep0 (usbd_device *dev, uint8_t event, uint8_t ep) {
  299. switch (event) {
  300. case usbd_evt_epsetup:
  301. /* force switch to setup state */
  302. dev->status.control_state = usbd_ctl_idle;
  303. dev->complete_callback = 0;
  304. case usbd_evt_eprx:
  305. return usbd_process_eprx(dev, ep);
  306. case usbd_evt_eptx:
  307. return usbd_process_eptx(dev, ep);
  308. default:
  309. break;
  310. }
  311. }
  312. /** \brief General event processing callback
  313. * \param dev usb device
  314. * \param evt usb event
  315. * \param ep active endpoint
  316. */
  317. static void usbd_process_evt(usbd_device *dev, uint8_t evt, uint8_t ep) {
  318. switch (evt) {
  319. case usbd_evt_reset:
  320. usbd_process_reset(dev);
  321. break;
  322. case usbd_evt_eprx:
  323. case usbd_evt_eptx:
  324. case usbd_evt_epsetup:
  325. if (dev->endpoint[ep & 0x07]) dev->endpoint[ep & 0x07](dev, evt, ep);
  326. break;
  327. default:
  328. break;
  329. }
  330. if (dev->events[evt]) dev->events[evt](dev, evt, ep);
  331. }
  332. __attribute__((externally_visible)) void usbd_poll(usbd_device *dev) {
  333. return dev->driver->poll(dev, usbd_process_evt);
  334. }