flipperzero-firmware_official_dev 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. commit 6089e9210f67712284e14c147123938cd7be9bd9
  2. Author: Sam Edwards <CFSworks@gmail.com>
  3. Date: Tue Mar 21 08:53:07 2023 -0600
  4. BadUSB: implement boot protocol (#2496)
  5. * BadUSB: remove unused out EP
  6. * BadUSB: do not use iad for a single interface
  7. * BadUSB: implement the boot protocol
  8. * BadUSB: implement SET_PROTOCOL
  9. * Improve HID report descriptor readability
  10. * CODEOWNERS update
  11. Co-authored-by: nminaylov <nm29719@gmail.com>
  12. Co-authored-by: あく <alleteam@gmail.com>
  13. diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
  14. index 0bc130243..c1684aa99 100644
  15. --- a/.github/CODEOWNERS
  16. +++ b/.github/CODEOWNERS
  17. @@ -44,6 +44,9 @@
  18. /applications/examples/example_thermo/ @skotopes @DrZlo13 @hedger @gsurkov
  19. +# Firmware targets
  20. +/firmware/ @skotopes @DrZlo13 @hedger @nminaylov
  21. +
  22. # Assets
  23. /assets/resources/infrared/ @skotopes @DrZlo13 @hedger @gsurkov
  24. diff --git a/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c b/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c
  25. index 5cb7fd298..d27613410 100644
  26. --- a/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c
  27. +++ b/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c
  28. @@ -8,7 +8,6 @@
  29. #include "usb_hid.h"
  30. #define HID_EP_IN 0x81
  31. -#define HID_EP_OUT 0x01
  32. #define HID_EP_SZ 0x10
  33. #define HID_INTERVAL 2
  34. @@ -16,17 +15,15 @@
  35. #define HID_VID_DEFAULT 0x046D
  36. #define HID_PID_DEFAULT 0xC529
  37. -struct HidIadDescriptor {
  38. - struct usb_iad_descriptor hid_iad;
  39. +struct HidIntfDescriptor {
  40. struct usb_interface_descriptor hid;
  41. struct usb_hid_descriptor hid_desc;
  42. struct usb_endpoint_descriptor hid_ep_in;
  43. - struct usb_endpoint_descriptor hid_ep_out;
  44. };
  45. struct HidConfigDescriptor {
  46. struct usb_config_descriptor config;
  47. - struct HidIadDescriptor iad_0;
  48. + struct HidIntfDescriptor intf_0;
  49. } __attribute__((packed));
  50. enum HidReportId {
  51. @@ -35,78 +32,98 @@ enum HidReportId {
  52. ReportIdConsumer = 3,
  53. };
  54. -/* HID report: keyboard+mouse */
  55. +/* HID report descriptor: keyboard + mouse + consumer control */
  56. static const uint8_t hid_report_desc[] = {
  57. + // clang-format off
  58. HID_USAGE_PAGE(HID_PAGE_DESKTOP),
  59. HID_USAGE(HID_DESKTOP_KEYBOARD),
  60. HID_COLLECTION(HID_APPLICATION_COLLECTION),
  61. - HID_REPORT_ID(ReportIdKeyboard),
  62. - HID_USAGE_PAGE(HID_DESKTOP_KEYPAD),
  63. - HID_USAGE_MINIMUM(HID_KEYBOARD_L_CTRL),
  64. - HID_USAGE_MAXIMUM(HID_KEYBOARD_R_GUI),
  65. - HID_LOGICAL_MINIMUM(0),
  66. - HID_LOGICAL_MAXIMUM(1),
  67. - HID_REPORT_SIZE(1),
  68. - HID_REPORT_COUNT(8),
  69. - HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  70. - HID_REPORT_COUNT(1),
  71. - HID_REPORT_SIZE(8),
  72. - HID_INPUT(HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  73. - HID_USAGE_PAGE(HID_PAGE_LED),
  74. - HID_REPORT_COUNT(8),
  75. - HID_REPORT_SIZE(1),
  76. - HID_USAGE_MINIMUM(1),
  77. - HID_USAGE_MAXIMUM(8),
  78. - HID_OUTPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  79. - HID_REPORT_COUNT(HID_KB_MAX_KEYS),
  80. - HID_REPORT_SIZE(8),
  81. - HID_LOGICAL_MINIMUM(0),
  82. - HID_LOGICAL_MAXIMUM(101),
  83. - HID_USAGE_PAGE(HID_DESKTOP_KEYPAD),
  84. - HID_USAGE_MINIMUM(0),
  85. - HID_USAGE_MAXIMUM(101),
  86. - HID_INPUT(HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
  87. + HID_REPORT_ID(ReportIdKeyboard),
  88. + // Keyboard report
  89. + HID_USAGE_PAGE(HID_DESKTOP_KEYPAD),
  90. + HID_USAGE_MINIMUM(HID_KEYBOARD_L_CTRL),
  91. + HID_USAGE_MAXIMUM(HID_KEYBOARD_R_GUI),
  92. + HID_LOGICAL_MINIMUM(0),
  93. + HID_LOGICAL_MAXIMUM(1),
  94. + HID_REPORT_SIZE(1),
  95. + HID_REPORT_COUNT(8),
  96. + // Input - Modifier keys byte
  97. + HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  98. +
  99. + HID_REPORT_COUNT(1),
  100. + HID_REPORT_SIZE(8),
  101. + // Input - Reserved byte
  102. + HID_INPUT(HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  103. +
  104. + HID_USAGE_PAGE(HID_PAGE_LED),
  105. + HID_REPORT_COUNT(8),
  106. + HID_REPORT_SIZE(1),
  107. + HID_USAGE_MINIMUM(1),
  108. + HID_USAGE_MAXIMUM(8),
  109. + // Output - LEDs
  110. + HID_OUTPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  111. +
  112. + HID_REPORT_COUNT(HID_KB_MAX_KEYS),
  113. + HID_REPORT_SIZE(8),
  114. + HID_LOGICAL_MINIMUM(0),
  115. + HID_LOGICAL_MAXIMUM(101),
  116. + HID_USAGE_PAGE(HID_DESKTOP_KEYPAD),
  117. + HID_USAGE_MINIMUM(0),
  118. + HID_USAGE_MAXIMUM(101),
  119. + // Input - Key codes
  120. + HID_INPUT(HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
  121. HID_END_COLLECTION,
  122. +
  123. HID_USAGE_PAGE(HID_PAGE_DESKTOP),
  124. HID_USAGE(HID_DESKTOP_MOUSE),
  125. HID_COLLECTION(HID_APPLICATION_COLLECTION),
  126. - HID_USAGE(HID_DESKTOP_POINTER),
  127. - HID_COLLECTION(HID_PHYSICAL_COLLECTION),
  128. - HID_REPORT_ID(ReportIdMouse),
  129. - HID_USAGE_PAGE(HID_PAGE_BUTTON),
  130. - HID_USAGE_MINIMUM(1),
  131. - HID_USAGE_MAXIMUM(3),
  132. - HID_LOGICAL_MINIMUM(0),
  133. - HID_LOGICAL_MAXIMUM(1),
  134. - HID_REPORT_COUNT(3),
  135. - HID_REPORT_SIZE(1),
  136. - HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  137. - HID_REPORT_SIZE(1),
  138. - HID_REPORT_COUNT(5),
  139. - HID_INPUT(HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  140. - HID_USAGE_PAGE(HID_PAGE_DESKTOP),
  141. - HID_USAGE(HID_DESKTOP_X),
  142. - HID_USAGE(HID_DESKTOP_Y),
  143. - HID_USAGE(HID_DESKTOP_WHEEL),
  144. - HID_LOGICAL_MINIMUM(-127),
  145. - HID_LOGICAL_MAXIMUM(127),
  146. - HID_REPORT_SIZE(8),
  147. - HID_REPORT_COUNT(3),
  148. - HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
  149. - HID_END_COLLECTION,
  150. + HID_USAGE(HID_DESKTOP_POINTER),
  151. + HID_COLLECTION(HID_PHYSICAL_COLLECTION),
  152. + HID_REPORT_ID(ReportIdMouse),
  153. + // Mouse report
  154. + HID_USAGE_PAGE(HID_PAGE_BUTTON),
  155. + HID_USAGE_MINIMUM(1),
  156. + HID_USAGE_MAXIMUM(3),
  157. + HID_LOGICAL_MINIMUM(0),
  158. + HID_LOGICAL_MAXIMUM(1),
  159. + HID_REPORT_COUNT(3),
  160. + HID_REPORT_SIZE(1),
  161. + // Input - Mouse keys
  162. + HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  163. +
  164. + HID_REPORT_SIZE(1),
  165. + HID_REPORT_COUNT(5),
  166. + // Input - Mouse keys padding
  167. + HID_INPUT(HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
  168. +
  169. + HID_USAGE_PAGE(HID_PAGE_DESKTOP),
  170. + HID_USAGE(HID_DESKTOP_X),
  171. + HID_USAGE(HID_DESKTOP_Y),
  172. + HID_USAGE(HID_DESKTOP_WHEEL),
  173. + HID_LOGICAL_MINIMUM(-127),
  174. + HID_LOGICAL_MAXIMUM(127),
  175. + HID_REPORT_SIZE(8),
  176. + HID_REPORT_COUNT(3),
  177. + // Input - Mouse movement data (x, y, scroll)
  178. + HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
  179. + HID_END_COLLECTION,
  180. HID_END_COLLECTION,
  181. +
  182. HID_USAGE_PAGE(HID_PAGE_CONSUMER),
  183. HID_USAGE(HID_CONSUMER_CONTROL),
  184. HID_COLLECTION(HID_APPLICATION_COLLECTION),
  185. - HID_REPORT_ID(ReportIdConsumer),
  186. - HID_LOGICAL_MINIMUM(0),
  187. - HID_RI_LOGICAL_MAXIMUM(16, 0x3FF),
  188. - HID_USAGE_MINIMUM(0),
  189. - HID_RI_USAGE_MAXIMUM(16, 0x3FF),
  190. - HID_REPORT_COUNT(HID_CONSUMER_MAX_KEYS),
  191. - HID_REPORT_SIZE(16),
  192. - HID_INPUT(HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
  193. + HID_REPORT_ID(ReportIdConsumer),
  194. + // Consumer report
  195. + HID_LOGICAL_MINIMUM(0),
  196. + HID_RI_LOGICAL_MAXIMUM(16, 0x3FF),
  197. + HID_USAGE_MINIMUM(0),
  198. + HID_RI_USAGE_MAXIMUM(16, 0x3FF),
  199. + HID_REPORT_COUNT(HID_CONSUMER_MAX_KEYS),
  200. + HID_REPORT_SIZE(16),
  201. + // Input - Consumer control keys
  202. + HID_INPUT(HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
  203. HID_END_COLLECTION,
  204. + // clang-format on
  205. };
  206. /* Device descriptor */
  207. @@ -114,9 +131,9 @@ static struct usb_device_descriptor hid_device_desc = {
  208. .bLength = sizeof(struct usb_device_descriptor),
  209. .bDescriptorType = USB_DTYPE_DEVICE,
  210. .bcdUSB = VERSION_BCD(2, 0, 0),
  211. - .bDeviceClass = USB_CLASS_IAD,
  212. - .bDeviceSubClass = USB_SUBCLASS_IAD,
  213. - .bDeviceProtocol = USB_PROTO_IAD,
  214. + .bDeviceClass = USB_CLASS_PER_INTERFACE,
  215. + .bDeviceSubClass = USB_SUBCLASS_NONE,
  216. + .bDeviceProtocol = USB_PROTO_NONE,
  217. .bMaxPacketSize0 = USB_EP0_SIZE,
  218. .idVendor = HID_VID_DEFAULT,
  219. .idProduct = HID_PID_DEFAULT,
  220. @@ -140,29 +157,18 @@ static const struct HidConfigDescriptor hid_cfg_desc = {
  221. .bmAttributes = USB_CFG_ATTR_RESERVED | USB_CFG_ATTR_SELFPOWERED,
  222. .bMaxPower = USB_CFG_POWER_MA(100),
  223. },
  224. - .iad_0 =
  225. + .intf_0 =
  226. {
  227. - .hid_iad =
  228. - {
  229. - .bLength = sizeof(struct usb_iad_descriptor),
  230. - .bDescriptorType = USB_DTYPE_INTERFASEASSOC,
  231. - .bFirstInterface = 0,
  232. - .bInterfaceCount = 1,
  233. - .bFunctionClass = USB_CLASS_PER_INTERFACE,
  234. - .bFunctionSubClass = USB_SUBCLASS_NONE,
  235. - .bFunctionProtocol = USB_PROTO_NONE,
  236. - .iFunction = NO_DESCRIPTOR,
  237. - },
  238. .hid =
  239. {
  240. .bLength = sizeof(struct usb_interface_descriptor),
  241. .bDescriptorType = USB_DTYPE_INTERFACE,
  242. .bInterfaceNumber = 0,
  243. .bAlternateSetting = 0,
  244. - .bNumEndpoints = 2,
  245. + .bNumEndpoints = 1,
  246. .bInterfaceClass = USB_CLASS_HID,
  247. - .bInterfaceSubClass = USB_HID_SUBCLASS_NONBOOT,
  248. - .bInterfaceProtocol = USB_HID_PROTO_NONBOOT,
  249. + .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT,
  250. + .bInterfaceProtocol = USB_HID_PROTO_KEYBOARD,
  251. .iInterface = NO_DESCRIPTOR,
  252. },
  253. .hid_desc =
  254. @@ -184,15 +190,6 @@ static const struct HidConfigDescriptor hid_cfg_desc = {
  255. .wMaxPacketSize = HID_EP_SZ,
  256. .bInterval = HID_INTERVAL,
  257. },
  258. - .hid_ep_out =
  259. - {
  260. - .bLength = sizeof(struct usb_endpoint_descriptor),
  261. - .bDescriptorType = USB_DTYPE_ENDPOINT,
  262. - .bEndpointAddress = HID_EP_OUT,
  263. - .bmAttributes = USB_EPTYPE_INTERRUPT,
  264. - .wMaxPacketSize = HID_EP_SZ,
  265. - .bInterval = HID_INTERVAL,
  266. - },
  267. },
  268. };
  269. @@ -206,9 +203,11 @@ struct HidReportMouse {
  270. struct HidReportKB {
  271. uint8_t report_id;
  272. - uint8_t mods;
  273. - uint8_t reserved;
  274. - uint8_t btn[HID_KB_MAX_KEYS];
  275. + struct {
  276. + uint8_t mods;
  277. + uint8_t reserved;
  278. + uint8_t btn[HID_KB_MAX_KEYS];
  279. + } boot;
  280. } __attribute__((packed));
  281. struct HidReportConsumer {
  282. @@ -256,6 +255,7 @@ static bool hid_connected = false;
  283. static HidStateCallback callback;
  284. static void* cb_ctx;
  285. static uint8_t led_state;
  286. +static bool boot_protocol = false;
  287. bool furi_hal_hid_is_connected() {
  288. return hid_connected;
  289. @@ -280,31 +280,31 @@ void furi_hal_hid_set_state_callback(HidStateCallback cb, void* ctx) {
  290. bool furi_hal_hid_kb_press(uint16_t button) {
  291. for(uint8_t key_nb = 0; key_nb < HID_KB_MAX_KEYS; key_nb++) {
  292. - if(hid_report.keyboard.btn[key_nb] == 0) {
  293. - hid_report.keyboard.btn[key_nb] = button & 0xFF;
  294. + if(hid_report.keyboard.boot.btn[key_nb] == 0) {
  295. + hid_report.keyboard.boot.btn[key_nb] = button & 0xFF;
  296. break;
  297. }
  298. }
  299. - hid_report.keyboard.mods |= (button >> 8);
  300. + hid_report.keyboard.boot.mods |= (button >> 8);
  301. return hid_send_report(ReportIdKeyboard);
  302. }
  303. bool furi_hal_hid_kb_release(uint16_t button) {
  304. for(uint8_t key_nb = 0; key_nb < HID_KB_MAX_KEYS; key_nb++) {
  305. - if(hid_report.keyboard.btn[key_nb] == (button & 0xFF)) {
  306. - hid_report.keyboard.btn[key_nb] = 0;
  307. + if(hid_report.keyboard.boot.btn[key_nb] == (button & 0xFF)) {
  308. + hid_report.keyboard.boot.btn[key_nb] = 0;
  309. break;
  310. }
  311. }
  312. - hid_report.keyboard.mods &= ~(button >> 8);
  313. + hid_report.keyboard.boot.mods &= ~(button >> 8);
  314. return hid_send_report(ReportIdKeyboard);
  315. }
  316. bool furi_hal_hid_kb_release_all() {
  317. for(uint8_t key_nb = 0; key_nb < HID_KB_MAX_KEYS; key_nb++) {
  318. - hid_report.keyboard.btn[key_nb] = 0;
  319. + hid_report.keyboard.boot.btn[key_nb] = 0;
  320. }
  321. - hid_report.keyboard.mods = 0;
  322. + hid_report.keyboard.boot.mods = 0;
  323. return hid_send_report(ReportIdKeyboard);
  324. }
  325. @@ -434,27 +434,35 @@ static void hid_on_suspend(usbd_device* dev) {
  326. static bool hid_send_report(uint8_t report_id) {
  327. if((hid_semaphore == NULL) || (hid_connected == false)) return false;
  328. + if((boot_protocol == true) && (report_id != ReportIdKeyboard)) return false;
  329. furi_check(furi_semaphore_acquire(hid_semaphore, FuriWaitForever) == FuriStatusOk);
  330. - if(hid_connected == true) {
  331. + if(hid_connected == false) {
  332. + return false;
  333. + }
  334. + if(boot_protocol == true) {
  335. + usbd_ep_write(
  336. + usb_dev, HID_EP_IN, &hid_report.keyboard.boot, sizeof(hid_report.keyboard.boot));
  337. + } else {
  338. if(report_id == ReportIdKeyboard)
  339. usbd_ep_write(usb_dev, HID_EP_IN, &hid_report.keyboard, sizeof(hid_report.keyboard));
  340. else if(report_id == ReportIdMouse)
  341. usbd_ep_write(usb_dev, HID_EP_IN, &hid_report.mouse, sizeof(hid_report.mouse));
  342. else if(report_id == ReportIdConsumer)
  343. usbd_ep_write(usb_dev, HID_EP_IN, &hid_report.consumer, sizeof(hid_report.consumer));
  344. - return true;
  345. }
  346. - return false;
  347. + return true;
  348. }
  349. static void hid_txrx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) {
  350. UNUSED(dev);
  351. if(event == usbd_evt_eptx) {
  352. furi_semaphore_release(hid_semaphore);
  353. + } else if(boot_protocol == true) {
  354. + usbd_ep_read(usb_dev, ep, &led_state, sizeof(led_state));
  355. } else {
  356. struct HidReportLED leds;
  357. - usbd_ep_read(usb_dev, ep, &leds, 2);
  358. + usbd_ep_read(usb_dev, ep, &leds, sizeof(leds));
  359. led_state = leds.led_state;
  360. }
  361. }
  362. @@ -464,18 +472,15 @@ static usbd_respond hid_ep_config(usbd_device* dev, uint8_t cfg) {
  363. switch(cfg) {
  364. case 0:
  365. /* deconfiguring device */
  366. - usbd_ep_deconfig(dev, HID_EP_OUT);
  367. usbd_ep_deconfig(dev, HID_EP_IN);
  368. - usbd_reg_endpoint(dev, HID_EP_OUT, 0);
  369. usbd_reg_endpoint(dev, HID_EP_IN, 0);
  370. return usbd_ack;
  371. case 1:
  372. /* configuring device */
  373. usbd_ep_config(dev, HID_EP_IN, USB_EPTYPE_INTERRUPT, HID_EP_SZ);
  374. - usbd_ep_config(dev, HID_EP_OUT, USB_EPTYPE_INTERRUPT, HID_EP_SZ);
  375. usbd_reg_endpoint(dev, HID_EP_IN, hid_txrx_ep_callback);
  376. - usbd_reg_endpoint(dev, HID_EP_OUT, hid_txrx_ep_callback);
  377. usbd_ep_write(dev, HID_EP_IN, 0, 0);
  378. + boot_protocol = false; /* BIOS will SET_PROTOCOL if it wants this */
  379. return usbd_ack;
  380. default:
  381. return usbd_fail;
  382. @@ -493,8 +498,21 @@ static usbd_respond hid_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_cal
  383. case USB_HID_SETIDLE:
  384. return usbd_ack;
  385. case USB_HID_GETREPORT:
  386. - dev->status.data_ptr = &hid_report;
  387. - dev->status.data_count = sizeof(hid_report);
  388. + if(boot_protocol == true) {
  389. + dev->status.data_ptr = &hid_report.keyboard.boot;
  390. + dev->status.data_count = sizeof(hid_report.keyboard.boot);
  391. + } else {
  392. + dev->status.data_ptr = &hid_report;
  393. + dev->status.data_count = sizeof(hid_report);
  394. + }
  395. + return usbd_ack;
  396. + case USB_HID_SETPROTOCOL:
  397. + if(req->wValue == 0)
  398. + boot_protocol = true;
  399. + else if(req->wValue == 1)
  400. + boot_protocol = false;
  401. + else
  402. + return usbd_fail;
  403. return usbd_ack;
  404. default:
  405. return usbd_fail;
  406. @@ -505,10 +523,11 @@ static usbd_respond hid_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_cal
  407. req->wIndex == 0 && req->bRequest == USB_STD_GET_DESCRIPTOR) {
  408. switch(req->wValue >> 8) {
  409. case USB_DTYPE_HID:
  410. - dev->status.data_ptr = (uint8_t*)&(hid_cfg_desc.iad_0.hid_desc);
  411. - dev->status.data_count = sizeof(hid_cfg_desc.iad_0.hid_desc);
  412. + dev->status.data_ptr = (uint8_t*)&(hid_cfg_desc.intf_0.hid_desc);
  413. + dev->status.data_count = sizeof(hid_cfg_desc.intf_0.hid_desc);
  414. return usbd_ack;
  415. case USB_DTYPE_HID_REPORT:
  416. + boot_protocol = false; /* BIOS does not read this */
  417. dev->status.data_ptr = (uint8_t*)hid_report_desc;
  418. dev->status.data_count = sizeof(hid_report_desc);
  419. return usbd_ack;