winusb2.0_hid_template.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. /*
  2. * Copyright (c) 2024, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "usbd_core.h"
  7. #include "usbd_hid.h"
  8. #define WINUSB_IN_EP 0x81
  9. #define WINUSB_OUT_EP 0x02
  10. /*!< endpoint address */
  11. #define HID_INT_EP 0x83
  12. #define HID_INT_EP_SIZE 4
  13. #define HID_INT_EP_INTERVAL 10
  14. #define USBD_VID 0xFFFE
  15. #define USBD_PID 0xFFFF
  16. #define USBD_MAX_POWER 500
  17. #define USBD_LANGID_STRING 1033
  18. #define USB_CONFIG_SIZE (9 + 9 + 7 + 7 + 9 + 9 + 7)
  19. #define INTF_NUM 2
  20. /*!< config descriptor size */
  21. #define USB_HID_CONFIG_DESC_SIZ 34
  22. /*!< report descriptor size */
  23. #define HID_MOUSE_REPORT_DESC_SIZE 74
  24. #ifdef CONFIG_USB_HS
  25. #define WINUSB_EP_MPS 512
  26. #else
  27. #define WINUSB_EP_MPS 64
  28. #endif
  29. #define USBD_WINUSB_VENDOR_CODE 0x20
  30. #define USBD_WEBUSB_ENABLE 0
  31. #define USBD_BULK_ENABLE 1
  32. #define USBD_WINUSB_ENABLE 1
  33. /* WinUSB Microsoft OS 2.0 descriptor sizes */
  34. #define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10
  35. #define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8
  36. #define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20
  37. #define FUNCTION_SUBSET_LEN 160
  38. #define DEVICE_INTERFACE_GUIDS_FEATURE_LEN 132
  39. #define USBD_WINUSB_DESC_SET_LEN (WINUSB_DESCRIPTOR_SET_HEADER_SIZE + USBD_WEBUSB_ENABLE * FUNCTION_SUBSET_LEN + USBD_BULK_ENABLE * FUNCTION_SUBSET_LEN)
  40. __ALIGN_BEGIN const uint8_t USBD_WinUSBDescriptorSetDescriptor[] = {
  41. WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */
  42. WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */
  43. 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/
  44. WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */
  45. #if (USBD_WEBUSB_ENABLE)
  46. WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), // wLength
  47. WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), // wDescriptorType
  48. 0, // bFirstInterface USBD_WINUSB_IF_NUM
  49. 0, // bReserved
  50. WBVAL(FUNCTION_SUBSET_LEN), // wSubsetLength
  51. WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), // wLength
  52. WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), // wDescriptorType
  53. 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // CompatibleId
  54. 0, 0, 0, 0, 0, 0, 0, 0, // SubCompatibleId
  55. WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), // wLength
  56. WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), // wDescriptorType
  57. WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), // wPropertyDataType
  58. WBVAL(42), // wPropertyNameLength
  59. 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0,
  60. 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
  61. 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0,
  62. WBVAL(80), // wPropertyDataLength
  63. '{', 0,
  64. '9', 0, '2', 0, 'C', 0, 'E', 0, '6', 0, '4', 0, '6', 0, '2', 0, '-', 0,
  65. '9', 0, 'C', 0, '7', 0, '7', 0, '-', 0,
  66. '4', 0, '6', 0, 'F', 0, 'E', 0, '-', 0,
  67. '9', 0, '3', 0, '3', 0, 'B', 0, '-',
  68. 0, '3', 0, '1', 0, 'C', 0, 'B', 0, '9', 0, 'C', 0, '5', 0, 'A', 0, 'A', 0, '3', 0, 'B', 0, '9', 0,
  69. '}', 0, 0, 0, 0, 0
  70. #endif
  71. #if USBD_BULK_ENABLE
  72. WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), /* wLength */
  73. WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), /* wDescriptorType */
  74. 0, /* bFirstInterface USBD_BULK_IF_NUM*/
  75. 0, /* bReserved */
  76. WBVAL(FUNCTION_SUBSET_LEN), /* wSubsetLength */
  77. WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */
  78. WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */
  79. 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/
  80. 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/
  81. WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), /* wLength */
  82. WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */
  83. WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */
  84. WBVAL(42), /* wPropertyNameLength */
  85. 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0,
  86. 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
  87. 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0,
  88. WBVAL(80), /* wPropertyDataLength */
  89. '{', 0,
  90. 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0,
  91. '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0,
  92. '4', 0, '6', 0, '6', 0, '3', 0, '-', 0,
  93. 'A', 0, 'A', 0, '3', 0, '6', 0, '-',
  94. 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0,
  95. '}', 0, 0, 0, 0, 0
  96. #endif
  97. };
  98. #define USBD_NUM_DEV_CAPABILITIES (USBD_WEBUSB_ENABLE + USBD_WINUSB_ENABLE)
  99. #define USBD_WEBUSB_DESC_LEN 24
  100. #define USBD_WINUSB_DESC_LEN 28
  101. #define USBD_BOS_WTOTALLENGTH (0x05 + \
  102. USBD_WEBUSB_DESC_LEN * USBD_WEBUSB_ENABLE + \
  103. USBD_WINUSB_DESC_LEN * USBD_WINUSB_ENABLE)
  104. __ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = {
  105. 0x05, /* bLength */
  106. 0x0f, /* bDescriptorType */
  107. WBVAL(USBD_BOS_WTOTALLENGTH), /* wTotalLength */
  108. USBD_NUM_DEV_CAPABILITIES, /* bNumDeviceCaps */
  109. #if (USBD_WEBUSB_ENABLE)
  110. USBD_WEBUSB_DESC_LEN, /* bLength */
  111. 0x10, /* bDescriptorType */
  112. USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */
  113. 0x00, /* bReserved */
  114. 0x38, 0xB6, 0x08, 0x34, /* PlatformCapabilityUUID */
  115. 0xA9, 0x09, 0xA0, 0x47,
  116. 0x8B, 0xFD, 0xA0, 0x76,
  117. 0x88, 0x15, 0xB6, 0x65,
  118. WBVAL(0x0100), /* 1.00 */ /* bcdVersion */
  119. USBD_WINUSB_VENDOR_CODE, /* bVendorCode */
  120. 0, /* iLandingPage */
  121. #endif
  122. #if (USBD_WINUSB_ENABLE)
  123. USBD_WINUSB_DESC_LEN, /* bLength */
  124. 0x10, /* bDescriptorType */
  125. USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */
  126. 0x00, /* bReserved */
  127. 0xDF, 0x60, 0xDD, 0xD8, /* PlatformCapabilityUUID */
  128. 0x89, 0x45, 0xC7, 0x4C,
  129. 0x9C, 0xD2, 0x65, 0x9D,
  130. 0x9E, 0x64, 0x8A, 0x9F,
  131. 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/
  132. WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */
  133. USBD_WINUSB_VENDOR_CODE, /* bVendorCode */
  134. 0, /* bAltEnumCode */
  135. #endif
  136. };
  137. struct usb_msosv2_descriptor msosv2_desc = {
  138. .vendor_code = USBD_WINUSB_VENDOR_CODE,
  139. .compat_id = USBD_WinUSBDescriptorSetDescriptor,
  140. .compat_id_len = USBD_WINUSB_DESC_SET_LEN,
  141. };
  142. struct usb_bos_descriptor bos_desc = {
  143. .string = USBD_BinaryObjectStoreDescriptor,
  144. .string_len = USBD_BOS_WTOTALLENGTH
  145. };
  146. #ifdef CONFIG_USBDEV_ADVANCE_DESC
  147. static const uint8_t device_descriptor[] = {
  148. USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01)
  149. };
  150. static const uint8_t config_descriptor[] = {
  151. /* Configuration 0 */
  152. USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER),
  153. /* Interface 0 */
  154. USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02),
  155. /* Endpoint OUT 2 */
  156. USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00),
  157. /* Endpoint IN 1 */
  158. USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00),
  159. /************** Descriptor of Joystick Mouse interface ****************/
  160. /* 09 */
  161. 0x09, /* bLength: Interface Descriptor size */
  162. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */
  163. 0x01, /* bInterfaceNumber: Number of Interface */
  164. 0x00, /* bAlternateSetting: Alternate setting */
  165. 0x01, /* bNumEndpoints */
  166. 0x03, /* bInterfaceClass: HID */
  167. 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */
  168. 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
  169. 0, /* iInterface: Index of string descriptor */
  170. /******************** Descriptor of Joystick Mouse HID ********************/
  171. /* 18 */
  172. 0x09, /* bLength: HID Descriptor size */
  173. HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */
  174. 0x11, /* bcdHID: HID Class Spec release number */
  175. 0x01,
  176. 0x00, /* bCountryCode: Hardware target country */
  177. 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
  178. 0x22, /* bDescriptorType */
  179. HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
  180. 0x00,
  181. /******************** Descriptor of Mouse endpoint ********************/
  182. /* 27 */
  183. 0x07, /* bLength: Endpoint Descriptor size */
  184. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */
  185. HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */
  186. 0x03, /* bmAttributes: Interrupt endpoint */
  187. HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */
  188. 0x00,
  189. HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */
  190. };
  191. static const uint8_t device_quality_descriptor[] = {
  192. ///////////////////////////////////////
  193. /// device qualifier descriptor
  194. ///////////////////////////////////////
  195. 0x0a,
  196. USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER,
  197. 0x10,
  198. 0x02,
  199. 0x00,
  200. 0x00,
  201. 0x00,
  202. 0x40,
  203. 0x00,
  204. 0x00,
  205. };
  206. static const char *string_descriptors[] = {
  207. (const char[]){ 0x09, 0x04 }, /* Langid */
  208. "CherryUSB", /* Manufacturer */
  209. "CherryUSB WINUSB DEMO", /* Product */
  210. "2022123456", /* Serial Number */
  211. };
  212. static const uint8_t *device_descriptor_callback(uint8_t speed)
  213. {
  214. return device_descriptor;
  215. }
  216. static const uint8_t *config_descriptor_callback(uint8_t speed)
  217. {
  218. return config_descriptor;
  219. }
  220. static const uint8_t *device_quality_descriptor_callback(uint8_t speed)
  221. {
  222. return device_quality_descriptor;
  223. }
  224. static const char *string_descriptor_callback(uint8_t speed, uint8_t index)
  225. {
  226. if (index > 3) {
  227. return NULL;
  228. }
  229. return string_descriptors[index];
  230. }
  231. const struct usb_descriptor winusbv2_descriptor = {
  232. .device_descriptor_callback = device_descriptor_callback,
  233. .config_descriptor_callback = config_descriptor_callback,
  234. .device_quality_descriptor_callback = device_quality_descriptor_callback,
  235. .string_descriptor_callback = string_descriptor_callback,
  236. .msosv2_descriptor = &msosv2_desc,
  237. .bos_descriptor = &bos_desc
  238. };
  239. #else
  240. const uint8_t winusbv2_descriptor[] = {
  241. USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01),
  242. /* Configuration 0 */
  243. USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER),
  244. /* Interface 0 */
  245. USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02),
  246. /* Endpoint OUT 2 */
  247. USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00),
  248. /* Endpoint IN 1 */
  249. USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00),
  250. /************** Descriptor of Joystick Mouse interface ****************/
  251. /* 09 */
  252. 0x09, /* bLength: Interface Descriptor size */
  253. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */
  254. 0x01, /* bInterfaceNumber: Number of Interface */
  255. 0x00, /* bAlternateSetting: Alternate setting */
  256. 0x01, /* bNumEndpoints */
  257. 0x03, /* bInterfaceClass: HID */
  258. 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */
  259. 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
  260. 0, /* iInterface: Index of string descriptor */
  261. /******************** Descriptor of Joystick Mouse HID ********************/
  262. /* 18 */
  263. 0x09, /* bLength: HID Descriptor size */
  264. HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */
  265. 0x11, /* bcdHID: HID Class Spec release number */
  266. 0x01,
  267. 0x00, /* bCountryCode: Hardware target country */
  268. 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
  269. 0x22, /* bDescriptorType */
  270. HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
  271. 0x00,
  272. /******************** Descriptor of Mouse endpoint ********************/
  273. /* 27 */
  274. 0x07, /* bLength: Endpoint Descriptor size */
  275. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */
  276. HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */
  277. 0x03, /* bmAttributes: Interrupt endpoint */
  278. HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */
  279. 0x00,
  280. HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */
  281. /* String 0 (LANGID) */
  282. USB_LANGID_INIT(USBD_LANGID_STRING),
  283. /* String 1 (Manufacturer) */
  284. 0x14, /* bLength */
  285. USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
  286. 'C', 0x00, /* wcChar0 */
  287. 'h', 0x00, /* wcChar1 */
  288. 'e', 0x00, /* wcChar2 */
  289. 'r', 0x00, /* wcChar3 */
  290. 'r', 0x00, /* wcChar4 */
  291. 'y', 0x00, /* wcChar5 */
  292. 'U', 0x00, /* wcChar6 */
  293. 'S', 0x00, /* wcChar7 */
  294. 'B', 0x00, /* wcChar8 */
  295. ///////////////////////////////////////
  296. /// string2 descriptor
  297. ///////////////////////////////////////
  298. 0x2C, /* bLength */
  299. USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
  300. 'C', 0x00, /* wcChar0 */
  301. 'h', 0x00, /* wcChar1 */
  302. 'e', 0x00, /* wcChar2 */
  303. 'r', 0x00, /* wcChar3 */
  304. 'r', 0x00, /* wcChar4 */
  305. 'y', 0x00, /* wcChar5 */
  306. 'U', 0x00, /* wcChar6 */
  307. 'S', 0x00, /* wcChar7 */
  308. 'B', 0x00, /* wcChar8 */
  309. ' ', 0x00, /* wcChar9 */
  310. 'W', 0x00, /* wcChar10 */
  311. 'I', 0x00, /* wcChar11 */
  312. 'N', 0x00, /* wcChar12 */
  313. 'U', 0x00, /* wcChar13 */
  314. 'S', 0x00, /* wcChar14 */
  315. 'B', 0x00, /* wcChar15 */
  316. ' ', 0x00, /* wcChar16 */
  317. 'D', 0x00, /* wcChar17 */
  318. 'E', 0x00, /* wcChar18 */
  319. 'M', 0x00, /* wcChar19 */
  320. 'O', 0x00, /* wcChar20 */
  321. ///////////////////////////////////////
  322. /// string3 descriptor
  323. ///////////////////////////////////////
  324. 0x16, /* bLength */
  325. USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
  326. '2', 0x00, /* wcChar0 */
  327. '0', 0x00, /* wcChar1 */
  328. '2', 0x00, /* wcChar2 */
  329. '2', 0x00, /* wcChar3 */
  330. '1', 0x00, /* wcChar4 */
  331. '2', 0x00, /* wcChar5 */
  332. '3', 0x00, /* wcChar6 */
  333. '4', 0x00, /* wcChar7 */
  334. '5', 0x00, /* wcChar8 */
  335. '6', 0x00, /* wcChar9 */
  336. #ifdef CONFIG_USB_HS
  337. /* Device Qualifier */
  338. 0x0a,
  339. USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER,
  340. 0x10,
  341. 0x02,
  342. 0x00,
  343. 0x00,
  344. 0x00,
  345. 0x40,
  346. 0x00,
  347. 0x00,
  348. #endif
  349. /* End */
  350. 0x00
  351. };
  352. #endif
  353. USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048];
  354. USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048];
  355. volatile bool ep_tx_busy_flag = false;
  356. static void usbd_event_handler(uint8_t busid, uint8_t event)
  357. {
  358. switch (event) {
  359. case USBD_EVENT_RESET:
  360. break;
  361. case USBD_EVENT_CONNECTED:
  362. break;
  363. case USBD_EVENT_DISCONNECTED:
  364. break;
  365. case USBD_EVENT_RESUME:
  366. break;
  367. case USBD_EVENT_SUSPEND:
  368. break;
  369. case USBD_EVENT_CONFIGURED:
  370. ep_tx_busy_flag = false;
  371. /* setup first out ep read transfer */
  372. usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048);
  373. break;
  374. case USBD_EVENT_SET_REMOTE_WAKEUP:
  375. break;
  376. case USBD_EVENT_CLR_REMOTE_WAKEUP:
  377. break;
  378. default:
  379. break;
  380. }
  381. }
  382. void usbd_winusb_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
  383. {
  384. USB_LOG_RAW("actual out len:%d\r\n", nbytes);
  385. // for (int i = 0; i < 100; i++) {
  386. // printf("%02x ", read_buffer[i]);
  387. // }
  388. // printf("\r\n");
  389. usbd_ep_start_write(busid, WINUSB_IN_EP, read_buffer, nbytes);
  390. /* setup next out ep read transfer */
  391. usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048);
  392. }
  393. void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
  394. {
  395. USB_LOG_RAW("actual in len:%d\r\n", nbytes);
  396. if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) {
  397. /* send zlp */
  398. usbd_ep_start_write(busid, WINUSB_IN_EP, NULL, 0);
  399. } else {
  400. ep_tx_busy_flag = false;
  401. }
  402. }
  403. struct usbd_endpoint winusb_out_ep1 = {
  404. .ep_addr = WINUSB_OUT_EP,
  405. .ep_cb = usbd_winusb_out
  406. };
  407. struct usbd_endpoint winusb_in_ep1 = {
  408. .ep_addr = WINUSB_IN_EP,
  409. .ep_cb = usbd_winusb_in
  410. };
  411. /*!< hid mouse report descriptor */
  412. static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = {
  413. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  414. 0x09, 0x02, // USAGE (Mouse)
  415. 0xA1, 0x01, // COLLECTION (Application)
  416. 0x09, 0x01, // USAGE (Pointer)
  417. 0xA1, 0x00, // COLLECTION (Physical)
  418. 0x05, 0x09, // USAGE_PAGE (Button)
  419. 0x19, 0x01, // USAGE_MINIMUM (Button 1)
  420. 0x29, 0x03, // USAGE_MAXIMUM (Button 3)
  421. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  422. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
  423. 0x95, 0x03, // REPORT_COUNT (3)
  424. 0x75, 0x01, // REPORT_SIZE (1)
  425. 0x81, 0x02, // INPUT (Data,Var,Abs)
  426. 0x95, 0x01, // REPORT_COUNT (1)
  427. 0x75, 0x05, // REPORT_SIZE (5)
  428. 0x81, 0x01, // INPUT (Cnst,Var,Abs)
  429. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  430. 0x09, 0x30, // USAGE (X)
  431. 0x09, 0x31, // USAGE (Y)
  432. 0x09, 0x38,
  433. 0x15, 0x81, // LOGICAL_MINIMUM (-127)
  434. 0x25, 0x7F, // LOGICAL_MAXIMUM (127)
  435. 0x75, 0x08, // REPORT_SIZE (8)
  436. 0x95, 0x03, // REPORT_COUNT (2)
  437. 0x81, 0x06, // INPUT (Data,Var,Rel)
  438. 0xC0, 0x09,
  439. 0x3c, 0x05,
  440. 0xff, 0x09,
  441. 0x01, 0x15,
  442. 0x00, 0x25,
  443. 0x01, 0x75,
  444. 0x01, 0x95,
  445. 0x02, 0xb1,
  446. 0x22, 0x75,
  447. 0x06, 0x95,
  448. 0x01, 0xb1,
  449. 0x01, 0xc0 // END_COLLECTION
  450. };
  451. /*!< mouse report struct */
  452. struct hid_mouse {
  453. uint8_t buttons;
  454. int8_t x;
  455. int8_t y;
  456. int8_t wheel;
  457. };
  458. /*!< mouse report */
  459. static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct hid_mouse mouse_cfg;
  460. #define HID_STATE_IDLE 0
  461. #define HID_STATE_BUSY 1
  462. /*!< hid state ! Data can be sent only when state is idle */
  463. static volatile uint8_t hid_state = HID_STATE_IDLE;
  464. /* function ------------------------------------------------------------------*/
  465. static void usbd_hid_int_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
  466. {
  467. hid_state = HID_STATE_IDLE;
  468. }
  469. /*!< endpoint call back */
  470. static struct usbd_endpoint hid_in_ep = {
  471. .ep_cb = usbd_hid_int_callback,
  472. .ep_addr = HID_INT_EP
  473. };
  474. struct usbd_interface winusb_intf;
  475. struct usbd_interface intf1;
  476. void winusbv2_init(uint8_t busid, uintptr_t reg_base)
  477. {
  478. #ifdef CONFIG_USBDEV_ADVANCE_DESC
  479. usbd_desc_register(busid, &winusbv2_descriptor);
  480. #else
  481. usbd_desc_register(busid, winusbv2_descriptor);
  482. #endif
  483. #ifndef CONFIG_USBDEV_ADVANCE_DESC
  484. usbd_bos_desc_register(busid, &bos_desc);
  485. usbd_msosv2_desc_register(busid, &msosv2_desc);
  486. #endif
  487. /*!< winusb */
  488. usbd_add_interface(busid, &winusb_intf);
  489. usbd_add_endpoint(busid, &winusb_out_ep1);
  490. usbd_add_endpoint(busid, &winusb_in_ep1);
  491. usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf1, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE));
  492. usbd_add_endpoint(busid, &hid_in_ep);
  493. usbd_initialize(busid, reg_base, usbd_event_handler);
  494. }