You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

usb.c 4.1 KiB

1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /** @defgroup usb_drivers_file Generic USB Drivers
  2. @ingroup USB
  3. @brief <b>Generic USB Drivers</b>
  4. @version 1.0.0
  5. @author @htmlonly &copy; @endhtmlonly 2010
  6. Gareth McMullin <gareth@blacksphere.co.nz>
  7. @date 10 March 2013
  8. LGPL License Terms @ref lgpl_license
  9. */
  10. /*
  11. * This file is part of the libopencm3 project.
  12. *
  13. * Copyright (C) 2010 Gareth McMullin <gareth@blacksphere.co.nz>
  14. *
  15. * This library is free software: you can redistribute it and/or modify
  16. * it under the terms of the GNU Lesser General Public License as published by
  17. * the Free Software Foundation, either version 3 of the License, or
  18. * (at your option) any later version.
  19. *
  20. * This library is distributed in the hope that it will be useful,
  21. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. * GNU Lesser General Public License for more details.
  24. *
  25. * You should have received a copy of the GNU Lesser General Public License
  26. * along with this library. If not, see <http://www.gnu.org/licenses/>.
  27. */
  28. /**@{*/
  29. #include <string.h>
  30. #include <libopencm3/usb/usbd.h>
  31. #include "usb_private.h"
  32. usbd_device *usbd_init(const usbd_driver *driver,
  33. const struct usb_device_descriptor *dev,
  34. const struct usb_config_descriptor *conf,
  35. const char * const *strings, int num_strings,
  36. uint8_t *control_buffer, uint16_t control_buffer_size)
  37. {
  38. usbd_device *usbd_dev;
  39. usbd_dev = driver->init();
  40. usbd_dev->driver = driver;
  41. usbd_dev->desc = dev;
  42. usbd_dev->config = conf;
  43. usbd_dev->strings = strings;
  44. usbd_dev->num_strings = num_strings;
  45. usbd_dev->ctrl_buf = control_buffer;
  46. usbd_dev->ctrl_buf_len = control_buffer_size;
  47. usbd_dev->user_callback_ctr[0][USB_TRANSACTION_SETUP] =
  48. _usbd_control_setup;
  49. usbd_dev->user_callback_ctr[0][USB_TRANSACTION_OUT] =
  50. _usbd_control_out;
  51. usbd_dev->user_callback_ctr[0][USB_TRANSACTION_IN] =
  52. _usbd_control_in;
  53. int i;
  54. for (i = 0; i < MAX_USER_SET_CONFIG_CALLBACK; i++) {
  55. usbd_dev->user_callback_set_config[i] = NULL;
  56. }
  57. return usbd_dev;
  58. }
  59. void usbd_register_reset_callback(usbd_device *usbd_dev, void (*callback)(void))
  60. {
  61. usbd_dev->user_callback_reset = callback;
  62. }
  63. void usbd_register_suspend_callback(usbd_device *usbd_dev,
  64. void (*callback)(void))
  65. {
  66. usbd_dev->user_callback_suspend = callback;
  67. }
  68. void usbd_register_resume_callback(usbd_device *usbd_dev,
  69. void (*callback)(void))
  70. {
  71. usbd_dev->user_callback_resume = callback;
  72. }
  73. void usbd_register_sof_callback(usbd_device *usbd_dev, void (*callback)(void))
  74. {
  75. usbd_dev->user_callback_sof = callback;
  76. }
  77. void _usbd_reset(usbd_device *usbd_dev)
  78. {
  79. usbd_dev->current_address = 0;
  80. usbd_dev->current_config = 0;
  81. usbd_ep_setup(usbd_dev, 0, USB_ENDPOINT_ATTR_CONTROL, usbd_dev->desc->bMaxPacketSize0, NULL);
  82. usbd_dev->driver->set_address(usbd_dev, 0);
  83. if (usbd_dev->user_callback_reset) {
  84. usbd_dev->user_callback_reset();
  85. }
  86. }
  87. /* Functions to wrap the low-level driver */
  88. void usbd_poll(usbd_device *usbd_dev)
  89. {
  90. usbd_dev->driver->poll(usbd_dev);
  91. }
  92. __attribute__((weak)) void usbd_disconnect(usbd_device *usbd_dev,
  93. bool disconnected)
  94. {
  95. /* not all drivers support disconnection */
  96. if (usbd_dev->driver->disconnect) {
  97. usbd_dev->driver->disconnect(usbd_dev, disconnected);
  98. }
  99. }
  100. void usbd_ep_setup(usbd_device *usbd_dev, uint8_t addr, uint8_t type,
  101. uint16_t max_size, usbd_endpoint_callback callback)
  102. {
  103. usbd_dev->driver->ep_setup(usbd_dev, addr, type, max_size, callback);
  104. }
  105. uint16_t usbd_ep_write_packet(usbd_device *usbd_dev, uint8_t addr,
  106. const void *buf, uint16_t len)
  107. {
  108. return usbd_dev->driver->ep_write_packet(usbd_dev, addr, buf, len);
  109. }
  110. uint16_t usbd_ep_read_packet(usbd_device *usbd_dev, uint8_t addr, void *buf,
  111. uint16_t len)
  112. {
  113. return usbd_dev->driver->ep_read_packet(usbd_dev, addr, buf, len);
  114. }
  115. void usbd_ep_stall_set(usbd_device *usbd_dev, uint8_t addr, uint8_t stall)
  116. {
  117. usbd_dev->driver->ep_stall_set(usbd_dev, addr, stall);
  118. }
  119. uint8_t usbd_ep_stall_get(usbd_device *usbd_dev, uint8_t addr)
  120. {
  121. return usbd_dev->driver->ep_stall_get(usbd_dev, addr);
  122. }
  123. void usbd_ep_nak_set(usbd_device *usbd_dev, uint8_t addr, uint8_t nak)
  124. {
  125. usbd_dev->driver->ep_nak_set(usbd_dev, addr, nak);
  126. }
  127. /**@}*/