usbd_desc.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #include "usbd_core.h"
  2. #include "usbd_desc.h"
  3. #include "usbd_conf.h"
  4. #include "furi-hal-version.h"
  5. #define USBD_VID 1155
  6. #define USBD_LANGID_STRING 1033
  7. #define USBD_MANUFACTURER_STRING "Flipper Devices Inc."
  8. #define USBD_PID 22336
  9. #define USBD_CONFIGURATION_STRING "CDC Config"
  10. #define USBD_INTERFACE_STRING "CDC Interface"
  11. static void Get_SerialNum(void);
  12. static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len);
  13. uint8_t* USBD_CDC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  14. uint8_t* USBD_CDC_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  15. uint8_t* USBD_CDC_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  16. uint8_t* USBD_CDC_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  17. uint8_t* USBD_CDC_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  18. uint8_t* USBD_CDC_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  19. uint8_t* USBD_CDC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  20. USBD_DescriptorsTypeDef CDC_Desc = {
  21. USBD_CDC_DeviceDescriptor,
  22. USBD_CDC_LangIDStrDescriptor,
  23. USBD_CDC_ManufacturerStrDescriptor,
  24. USBD_CDC_ProductStrDescriptor,
  25. USBD_CDC_SerialStrDescriptor,
  26. USBD_CDC_ConfigStrDescriptor,
  27. USBD_CDC_InterfaceStrDescriptor
  28. };
  29. /** USB standard device descriptor. */
  30. __ALIGN_BEGIN uint8_t USBD_CDC_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = {
  31. 0x12, /*bLength */
  32. USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
  33. 0x00, /*bcdUSB */
  34. 0x02,
  35. 0x02, /*bDeviceClass*/
  36. 0x02, /*bDeviceSubClass*/
  37. 0x00, /*bDeviceProtocol*/
  38. USB_MAX_EP0_SIZE, /*bMaxPacketSize*/
  39. LOBYTE(USBD_VID), /*idVendor*/
  40. HIBYTE(USBD_VID), /*idVendor*/
  41. LOBYTE(USBD_PID), /*idProduct*/
  42. HIBYTE(USBD_PID), /*idProduct*/
  43. 0x00, /*bcdDevice rel. 2.00*/
  44. 0x02,
  45. USBD_IDX_MFC_STR, /*Index of manufacturer string*/
  46. USBD_IDX_PRODUCT_STR, /*Index of product string*/
  47. USBD_IDX_SERIAL_STR, /*Index of serial number string*/
  48. USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/
  49. };
  50. /* USB_DeviceDescriptor */
  51. /** USB lang indentifier descriptor. */
  52. __ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = {
  53. USB_LEN_LANGID_STR_DESC,
  54. USB_DESC_TYPE_STRING,
  55. LOBYTE(USBD_LANGID_STRING),
  56. HIBYTE(USBD_LANGID_STRING)
  57. };
  58. /* Internal string descriptor. */
  59. __ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
  60. __ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = {
  61. USB_SIZ_STRING_SERIAL,
  62. USB_DESC_TYPE_STRING,
  63. };
  64. /** Return the device descriptor
  65. * @param speed : Current device speed
  66. * @param length : Pointer to data length variable
  67. * @retval Pointer to descriptor buffer
  68. */
  69. uint8_t * USBD_CDC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) {
  70. UNUSED(speed);
  71. *length = sizeof(USBD_CDC_DeviceDesc);
  72. return USBD_CDC_DeviceDesc;
  73. }
  74. /** Return the LangID string descriptor
  75. * @param speed : Current device speed
  76. * @param length : Pointer to data length variable
  77. * @retval Pointer to descriptor buffer
  78. */
  79. uint8_t * USBD_CDC_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) {
  80. UNUSED(speed);
  81. *length = sizeof(USBD_LangIDDesc);
  82. return USBD_LangIDDesc;
  83. }
  84. /** Return the product string descriptor
  85. * @param speed : Current device speed
  86. * @param length : Pointer to data length variable
  87. * @retval Pointer to descriptor buffer
  88. */
  89. uint8_t * USBD_CDC_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) {
  90. USBD_GetString((uint8_t*)furi_hal_version_get_device_name_ptr(), USBD_StrDesc, length);
  91. return USBD_StrDesc;
  92. }
  93. /** Return the manufacturer string descriptor
  94. * @param speed : Current device speed
  95. * @param length : Pointer to data length variable
  96. * @retval Pointer to descriptor buffer
  97. */
  98. uint8_t * USBD_CDC_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) {
  99. UNUSED(speed);
  100. USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
  101. return USBD_StrDesc;
  102. }
  103. /** Return the serial number string descriptor
  104. * @param speed : Current device speed
  105. * @param length : Pointer to data length variable
  106. * @retval Pointer to descriptor buffer
  107. */
  108. uint8_t * USBD_CDC_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) {
  109. UNUSED(speed);
  110. *length = USB_SIZ_STRING_SERIAL;
  111. /* Update the serial number string descriptor with the data from the unique
  112. * ID */
  113. if(furi_hal_version_get_name_ptr()){
  114. char buffer[14] = "flip_";
  115. strncat(buffer, furi_hal_version_get_name_ptr(), 8);
  116. USBD_GetString((uint8_t*) buffer, USBD_StringSerial, length);
  117. } else {
  118. Get_SerialNum();
  119. }
  120. return (uint8_t *) USBD_StringSerial;
  121. }
  122. /** Return the configuration string descriptor
  123. * @param speed : Current device speed
  124. * @param length : Pointer to data length variable
  125. * @retval Pointer to descriptor buffer
  126. */
  127. uint8_t * USBD_CDC_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) {
  128. if(speed == USBD_SPEED_HIGH) {
  129. USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING, USBD_StrDesc, length);
  130. } else {
  131. USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING, USBD_StrDesc, length);
  132. }
  133. return USBD_StrDesc;
  134. }
  135. /** Return the interface string descriptor
  136. * @param speed : Current device speed
  137. * @param length : Pointer to data length variable
  138. * @retval Pointer to descriptor buffer
  139. */
  140. uint8_t * USBD_CDC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) {
  141. if(speed == 0) {
  142. USBD_GetString((uint8_t *)USBD_INTERFACE_STRING, USBD_StrDesc, length);
  143. } else {
  144. USBD_GetString((uint8_t *)USBD_INTERFACE_STRING, USBD_StrDesc, length);
  145. }
  146. return USBD_StrDesc;
  147. }
  148. /** Create the serial number string descriptor
  149. * @param None
  150. * @retval None
  151. */
  152. static void Get_SerialNum(void) {
  153. uint32_t deviceserial0, deviceserial1, deviceserial2;
  154. deviceserial0 = *(uint32_t *) DEVICE_ID1;
  155. deviceserial1 = *(uint32_t *) DEVICE_ID2;
  156. deviceserial2 = *(uint32_t *) DEVICE_ID3;
  157. deviceserial0 += deviceserial2;
  158. if (deviceserial0 != 0) {
  159. IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8);
  160. IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4);
  161. }
  162. }
  163. /** Convert Hex 32Bits value into char
  164. * @param value: value to convert
  165. * @param pbuf: pointer to the buffer
  166. * @param len: buffer length
  167. * @retval None
  168. */
  169. static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len) {
  170. uint8_t idx = 0;
  171. for (idx = 0; idx < len; idx++) {
  172. if (((value >> 28)) < 0xA) {
  173. pbuf[2 * idx] = (value >> 28) + '0';
  174. } else {
  175. pbuf[2 * idx] = (value >> 28) + 'A' - 10;
  176. }
  177. value = value << 4;
  178. pbuf[2 * idx + 1] = 0;
  179. }
  180. }