drv_tinyusb.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-10-20 tfx2001 first version
  9. */
  10. #include <tusb.h>
  11. #include <drv_config.h>
  12. #define to_hex_digit(x) ((x) < 10 ? '0' + (x) : 'A' + (x) - 10)
  13. extern void tud_descriptor_set_serial(char *serial_number, uint8_t length);
  14. static void write_hex_chars(char *dest, uint32_t val)
  15. {
  16. for (int i = 8; i > 0; i--)
  17. {
  18. uint8_t x = val >> 28u;
  19. *dest++ = to_hex_digit(x);
  20. val <<= 4u;
  21. }
  22. }
  23. static void generate_serial_number(void)
  24. {
  25. char serial_number[32];
  26. write_hex_chars(serial_number, HAL_GetUIDw0());
  27. write_hex_chars(serial_number + 8, HAL_GetUIDw1());
  28. write_hex_chars(serial_number + 16, HAL_GetUIDw2());
  29. tud_descriptor_set_serial(serial_number, 24);
  30. }
  31. int tusb_board_init(void)
  32. {
  33. PCD_HandleTypeDef hpcd;
  34. memset(&hpcd, 0, sizeof(hpcd));
  35. /* Set LL Driver parameters */
  36. hpcd.Instance = USBD_INSTANCE;
  37. hpcd.Init.dev_endpoints = 8;
  38. hpcd.Init.speed = USBD_PCD_SPEED;
  39. hpcd.Init.ep0_mps = EP_MPS_64;
  40. #if !defined(SOC_SERIES_STM32F1)
  41. hpcd.Init.phy_itface = USBD_PCD_PHY_MODULE;
  42. #endif
  43. /* Initialize LL Driver */
  44. HAL_PCD_Init(&hpcd);
  45. /* USB interrupt Init */
  46. HAL_NVIC_SetPriority(USBD_IRQ_TYPE, 2, 0);
  47. HAL_NVIC_EnableIRQ(USBD_IRQ_TYPE);
  48. generate_serial_number();
  49. return 0;
  50. }
  51. void USBD_IRQ_HANDLER(void)
  52. {
  53. rt_interrupt_enter();
  54. tud_int_handler(0);
  55. rt_interrupt_leave();
  56. }