6
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | --- | ||||||
|  | BreakBeforeBraces: Linux | ||||||
|  | ColumnLimit: '200' | ||||||
|  | ReflowComments: 'true' | ||||||
|  |  | ||||||
|  | ... | ||||||
| @@ -39,8 +39,7 @@ | |||||||
| //--------------------------------------------------------------------+ | //--------------------------------------------------------------------+ | ||||||
| // MACRO CONSTANT TYPEDEF | // MACRO CONSTANT TYPEDEF | ||||||
| //--------------------------------------------------------------------+ | //--------------------------------------------------------------------+ | ||||||
| typedef struct | typedef struct { | ||||||
| { |  | ||||||
|   uint8_t itf_num; |   uint8_t itf_num; | ||||||
|   uint8_t ep_in; |   uint8_t ep_in; | ||||||
|   uint8_t ep_out;       // optional Out endpoint |   uint8_t ep_out;       // optional Out endpoint | ||||||
| @@ -64,9 +63,9 @@ CFG_TUD_MEM_SECTION tu_static hidd_interface_t _hidd_itf[CFG_TUD_HID]; | |||||||
| /*------------- Helpers -------------*/ | /*------------- Helpers -------------*/ | ||||||
| static inline uint8_t get_index_by_itfnum(uint8_t itf_num) | static inline uint8_t get_index_by_itfnum(uint8_t itf_num) | ||||||
| { | { | ||||||
| 	for (uint8_t i=0; i < CFG_TUD_HID; i++ ) |   for (uint8_t i = 0; i < CFG_TUD_HID; i++) { | ||||||
| 	{ |     if (itf_num == _hidd_itf[i].itf_num) | ||||||
| 		if ( itf_num == _hidd_itf[i].itf_num ) return i; |       return i; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   return 0xFF; |   return 0xFF; | ||||||
| @@ -91,28 +90,20 @@ bool tud_hid_n_report(uint8_t instance, uint8_t report_id, void const* report, u | |||||||
|   TU_VERIFY(usbd_edpt_claim(rhport, p_hid->ep_in)); |   TU_VERIFY(usbd_edpt_claim(rhport, p_hid->ep_in)); | ||||||
|  |  | ||||||
|   // prepare data |   // prepare data | ||||||
|   if (report_id) |   if (report_id) { | ||||||
|   { |  | ||||||
|     p_hid->epin_buf[0] = report_id; |     p_hid->epin_buf[0] = report_id; | ||||||
|     TU_VERIFY(0 == tu_memcpy_s(p_hid->epin_buf + 1, CFG_TUD_HID_EP_BUFSIZE - 1, report, len)); |     TU_VERIFY(0 == tu_memcpy_s(p_hid->epin_buf + 1, CFG_TUD_HID_EP_BUFSIZE - 1, report, len)); | ||||||
|     len++; |     len++; | ||||||
|   }else |   } else { | ||||||
|   { |  | ||||||
|     TU_VERIFY(0 == tu_memcpy_s(p_hid->epin_buf, CFG_TUD_HID_EP_BUFSIZE, report, len)); |     TU_VERIFY(0 == tu_memcpy_s(p_hid->epin_buf, CFG_TUD_HID_EP_BUFSIZE, report, len)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   return usbd_edpt_xfer(rhport, p_hid->ep_in, p_hid->epin_buf, len); |   return usbd_edpt_xfer(rhport, p_hid->ep_in, p_hid->epin_buf, len); | ||||||
| } | } | ||||||
|  |  | ||||||
| uint8_t tud_hid_n_interface_protocol(uint8_t instance) | uint8_t tud_hid_n_interface_protocol(uint8_t instance) { return _hidd_itf[instance].itf_protocol; } | ||||||
| { |  | ||||||
|   return _hidd_itf[instance].itf_protocol; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| uint8_t tud_hid_n_get_protocol(uint8_t instance) | uint8_t tud_hid_n_get_protocol(uint8_t instance) { return _hidd_itf[instance].protocol_mode; } | ||||||
| { |  | ||||||
|   return _hidd_itf[instance].protocol_mode; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool tud_hid_n_keyboard_report(uint8_t instance, uint8_t report_id, uint8_t modifier, uint8_t keycode[6]) | bool tud_hid_n_keyboard_report(uint8_t instance, uint8_t report_id, uint8_t modifier, uint8_t keycode[6]) | ||||||
| { | { | ||||||
| @@ -121,22 +112,18 @@ bool tud_hid_n_keyboard_report(uint8_t instance, uint8_t report_id, uint8_t modi | |||||||
|   report.modifier = modifier; |   report.modifier = modifier; | ||||||
|   report.reserved = 0; |   report.reserved = 0; | ||||||
|  |  | ||||||
|   if ( keycode ) |   if (keycode) { | ||||||
|   { |  | ||||||
|     memcpy(report.keycode, keycode, sizeof(report.keycode)); |     memcpy(report.keycode, keycode, sizeof(report.keycode)); | ||||||
|   }else |   } else { | ||||||
|   { |  | ||||||
|     tu_memclr(report.keycode, 6); |     tu_memclr(report.keycode, 6); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   return tud_hid_n_report(instance, report_id, &report, sizeof(report)); |   return tud_hid_n_report(instance, report_id, &report, sizeof(report)); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id, | bool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal) | ||||||
|                             uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal) |  | ||||||
| { |  | ||||||
|   hid_mouse_report_t report = |  | ||||||
| { | { | ||||||
|  |   hid_mouse_report_t report = { | ||||||
|     .buttons = buttons, |     .buttons = buttons, | ||||||
|     .x = x, |     .x = x, | ||||||
|     .y = y, |     .y = y, | ||||||
| @@ -149,8 +136,7 @@ bool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id, | |||||||
|  |  | ||||||
| bool tud_hid_n_abs_mouse_report(uint8_t instance, uint8_t report_id, uint8_t buttons, int16_t x, int16_t y, int8_t vertical, int8_t horizontal) | bool tud_hid_n_abs_mouse_report(uint8_t instance, uint8_t report_id, uint8_t buttons, int16_t x, int16_t y, int8_t vertical, int8_t horizontal) | ||||||
| { | { | ||||||
|   hid_abs_mouse_report_t report = |   hid_abs_mouse_report_t report = { | ||||||
|   { |  | ||||||
|     .buttons = buttons, |     .buttons = buttons, | ||||||
|     .x = x, |     .x = x, | ||||||
|     .y = y, |     .y = y, | ||||||
| @@ -160,10 +146,9 @@ bool tud_hid_n_abs_mouse_report(uint8_t instance, uint8_t report_id, uint8_t but | |||||||
|   return tud_hid_n_report(instance, report_id, &report, sizeof(report)); |   return tud_hid_n_report(instance, report_id, &report, sizeof(report)); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, | bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons) | ||||||
|                               int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons) { |  | ||||||
|   hid_gamepad_report_t report = |  | ||||||
| { | { | ||||||
|  |   hid_gamepad_report_t report = { | ||||||
|       .x = x, |       .x = x, | ||||||
|       .y = y, |       .y = y, | ||||||
|       .z = z, |       .z = z, | ||||||
| @@ -180,11 +165,13 @@ bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, | |||||||
| //--------------------------------------------------------------------+ | //--------------------------------------------------------------------+ | ||||||
| // USBD-CLASS API | // USBD-CLASS API | ||||||
| //--------------------------------------------------------------------+ | //--------------------------------------------------------------------+ | ||||||
| void hidd_init(void) { | void hidd_init(void) | ||||||
|  | { | ||||||
|   hidd_reset(0); |   hidd_reset(0); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool hidd_deinit(void) { | bool hidd_deinit(void) | ||||||
|  | { | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -199,18 +186,14 @@ uint16_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint1 | |||||||
|   TU_VERIFY(TUSB_CLASS_HID == desc_itf->bInterfaceClass, 0); |   TU_VERIFY(TUSB_CLASS_HID == desc_itf->bInterfaceClass, 0); | ||||||
|  |  | ||||||
|   // len = interface + hid + n*endpoints |   // len = interface + hid + n*endpoints | ||||||
|   uint16_t const drv_len = |   uint16_t const drv_len = (uint16_t)(sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + desc_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t)); | ||||||
|       (uint16_t) (sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + |  | ||||||
|                                        desc_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t)); |  | ||||||
|   TU_ASSERT(max_len >= drv_len, 0); |   TU_ASSERT(max_len >= drv_len, 0); | ||||||
|  |  | ||||||
|   // Find available interface |   // Find available interface | ||||||
|   hidd_interface_t *p_hid = NULL; |   hidd_interface_t *p_hid = NULL; | ||||||
|   uint8_t hid_id; |   uint8_t hid_id; | ||||||
|   for(hid_id=0; hid_id<CFG_TUD_HID; hid_id++) |   for (hid_id = 0; hid_id < CFG_TUD_HID; hid_id++) { | ||||||
|   { |     if (_hidd_itf[hid_id].ep_in == 0) { | ||||||
|     if ( _hidd_itf[hid_id].ep_in == 0 ) |  | ||||||
|     { |  | ||||||
|       p_hid = &_hidd_itf[hid_id]; |       p_hid = &_hidd_itf[hid_id]; | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
| @@ -228,7 +211,8 @@ uint16_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint1 | |||||||
|   p_desc = tu_desc_next(p_desc); |   p_desc = tu_desc_next(p_desc); | ||||||
|   TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, desc_itf->bNumEndpoints, TUSB_XFER_INTERRUPT, &p_hid->ep_out, &p_hid->ep_in), 0); |   TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, desc_itf->bNumEndpoints, TUSB_XFER_INTERRUPT, &p_hid->ep_out, &p_hid->ep_in), 0); | ||||||
|  |  | ||||||
|   if ( desc_itf->bInterfaceSubClass == HID_SUBCLASS_BOOT ) p_hid->itf_protocol = desc_itf->bInterfaceProtocol; |   if (desc_itf->bInterfaceSubClass == HID_SUBCLASS_BOOT) | ||||||
|  |     p_hid->itf_protocol = desc_itf->bInterfaceProtocol; | ||||||
|  |  | ||||||
|   p_hid->protocol_mode = HID_PROTOCOL_REPORT; // Per Specs: default is report mode |   p_hid->protocol_mode = HID_PROTOCOL_REPORT; // Per Specs: default is report mode | ||||||
|   p_hid->itf_num = desc_itf->bInterfaceNumber; |   p_hid->itf_num = desc_itf->bInterfaceNumber; | ||||||
| @@ -237,10 +221,8 @@ uint16_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint1 | |||||||
|   p_hid->report_desc_len = tu_unaligned_read16((uint8_t const *)p_hid->hid_descriptor + offsetof(tusb_hid_descriptor_hid_t, wReportLength)); |   p_hid->report_desc_len = tu_unaligned_read16((uint8_t const *)p_hid->hid_descriptor + offsetof(tusb_hid_descriptor_hid_t, wReportLength)); | ||||||
|  |  | ||||||
|   // Prepare for output endpoint |   // Prepare for output endpoint | ||||||
|   if (p_hid->ep_out) |   if (p_hid->ep_out) { | ||||||
|   { |     if (!usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf))) { | ||||||
|     if ( !usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf)) ) |  | ||||||
|     { |  | ||||||
|       TU_LOG_FAILED(); |       TU_LOG_FAILED(); | ||||||
|       TU_BREAKPOINT(); |       TU_BREAKPOINT(); | ||||||
|     } |     } | ||||||
| @@ -261,38 +243,27 @@ bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t | |||||||
|  |  | ||||||
|   hidd_interface_t *p_hid = &_hidd_itf[hid_itf]; |   hidd_interface_t *p_hid = &_hidd_itf[hid_itf]; | ||||||
|  |  | ||||||
|   if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) |   if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) { | ||||||
|   { |  | ||||||
|     //------------- STD Request -------------// |     //------------- STD Request -------------// | ||||||
|     if ( stage == CONTROL_STAGE_SETUP ) |     if (stage == CONTROL_STAGE_SETUP) { | ||||||
|     { |  | ||||||
|       uint8_t const desc_type = tu_u16_high(request->wValue); |       uint8_t const desc_type = tu_u16_high(request->wValue); | ||||||
|       // uint8_t const desc_index = tu_u16_low (request->wValue); |       // uint8_t const desc_index = tu_u16_low (request->wValue); | ||||||
|  |  | ||||||
|       if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID) |       if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID) { | ||||||
|       { |  | ||||||
|         TU_VERIFY(p_hid->hid_descriptor); |         TU_VERIFY(p_hid->hid_descriptor); | ||||||
|         TU_VERIFY(tud_control_xfer(rhport, request, (void *)(uintptr_t)p_hid->hid_descriptor, p_hid->hid_descriptor->bLength)); |         TU_VERIFY(tud_control_xfer(rhport, request, (void *)(uintptr_t)p_hid->hid_descriptor, p_hid->hid_descriptor->bLength)); | ||||||
|       } |       } else if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT) { | ||||||
|       else if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT) |  | ||||||
|       { |  | ||||||
|         uint8_t const *desc_report = tud_hid_descriptor_report_cb(hid_itf); |         uint8_t const *desc_report = tud_hid_descriptor_report_cb(hid_itf); | ||||||
|         tud_control_xfer(rhport, request, (void *)(uintptr_t)desc_report, p_hid->report_desc_len); |         tud_control_xfer(rhport, request, (void *)(uintptr_t)desc_report, p_hid->report_desc_len); | ||||||
|       } |       } else { | ||||||
|       else |  | ||||||
|       { |  | ||||||
|         return false; // stall unsupported request |         return false; // stall unsupported request | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } else if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS) { | ||||||
|   else if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS) |  | ||||||
|   { |  | ||||||
|     //------------- Class Specific Request -------------// |     //------------- Class Specific Request -------------// | ||||||
|     switch( request->bRequest ) |     switch (request->bRequest) { | ||||||
|     { |  | ||||||
|     case HID_REQ_CONTROL_GET_REPORT: |     case HID_REQ_CONTROL_GET_REPORT: | ||||||
|         if ( stage == CONTROL_STAGE_SETUP ) |       if (stage == CONTROL_STAGE_SETUP) { | ||||||
|         { |  | ||||||
|         uint8_t const report_type = tu_u16_high(request->wValue); |         uint8_t const report_type = tu_u16_high(request->wValue); | ||||||
|         uint8_t const report_id = tu_u16_low(request->wValue); |         uint8_t const report_id = tu_u16_low(request->wValue); | ||||||
|  |  | ||||||
| @@ -302,8 +273,7 @@ bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t | |||||||
|         uint16_t xferlen = 0; |         uint16_t xferlen = 0; | ||||||
|  |  | ||||||
|         // If host request a specific Report ID, add ID to as 1 byte of response |         // If host request a specific Report ID, add ID to as 1 byte of response | ||||||
|           if ( (report_id != HID_REPORT_TYPE_INVALID) && (req_len > 1) ) |         if ((report_id != HID_REPORT_TYPE_INVALID) && (req_len > 1)) { | ||||||
|           { |  | ||||||
|           *report_buf++ = report_id; |           *report_buf++ = report_id; | ||||||
|           req_len--; |           req_len--; | ||||||
|  |  | ||||||
| @@ -318,13 +288,10 @@ bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t | |||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case HID_REQ_CONTROL_SET_REPORT: |     case HID_REQ_CONTROL_SET_REPORT: | ||||||
|         if ( stage == CONTROL_STAGE_SETUP ) |       if (stage == CONTROL_STAGE_SETUP) { | ||||||
|         { |  | ||||||
|         TU_VERIFY(request->wLength <= sizeof(p_hid->ctrl_buf)); |         TU_VERIFY(request->wLength <= sizeof(p_hid->ctrl_buf)); | ||||||
|         tud_control_xfer(rhport, request, p_hid->ctrl_buf, request->wLength); |         tud_control_xfer(rhport, request, p_hid->ctrl_buf, request->wLength); | ||||||
|         } |       } else if (stage == CONTROL_STAGE_ACK) { | ||||||
|         else if ( stage == CONTROL_STAGE_ACK ) |  | ||||||
|         { |  | ||||||
|         uint8_t const report_type = tu_u16_high(request->wValue); |         uint8_t const report_type = tu_u16_high(request->wValue); | ||||||
|         uint8_t const report_id = tu_u16_low(request->wValue); |         uint8_t const report_id = tu_u16_low(request->wValue); | ||||||
|  |  | ||||||
| @@ -332,8 +299,7 @@ bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t | |||||||
|         uint16_t report_len = tu_min16(request->wLength, CFG_TUD_HID_EP_BUFSIZE); |         uint16_t report_len = tu_min16(request->wLength, CFG_TUD_HID_EP_BUFSIZE); | ||||||
|  |  | ||||||
|         // If host request a specific Report ID, extract report ID in buffer before invoking callback |         // If host request a specific Report ID, extract report ID in buffer before invoking callback | ||||||
|           if ( (report_id != HID_REPORT_TYPE_INVALID) && (report_len > 1) && (report_id == report_buf[0]) ) |         if ((report_id != HID_REPORT_TYPE_INVALID) && (report_len > 1) && (report_id == report_buf[0])) { | ||||||
|           { |  | ||||||
|           report_buf++; |           report_buf++; | ||||||
|           report_len--; |           report_len--; | ||||||
|         } |         } | ||||||
| @@ -343,11 +309,9 @@ bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t | |||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case HID_REQ_CONTROL_SET_IDLE: |     case HID_REQ_CONTROL_SET_IDLE: | ||||||
|         if ( stage == CONTROL_STAGE_SETUP ) |       if (stage == CONTROL_STAGE_SETUP) { | ||||||
|         { |  | ||||||
|         p_hid->idle_rate = tu_u16_high(request->wValue); |         p_hid->idle_rate = tu_u16_high(request->wValue); | ||||||
|           if ( tud_hid_set_idle_cb ) |         if (tud_hid_set_idle_cb) { | ||||||
|           { |  | ||||||
|           // stall request if callback return false |           // stall request if callback return false | ||||||
|           TU_VERIFY(tud_hid_set_idle_cb(hid_itf, p_hid->idle_rate)); |           TU_VERIFY(tud_hid_set_idle_cb(hid_itf, p_hid->idle_rate)); | ||||||
|         } |         } | ||||||
| @@ -357,39 +321,33 @@ bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t | |||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case HID_REQ_CONTROL_GET_IDLE: |     case HID_REQ_CONTROL_GET_IDLE: | ||||||
|         if ( stage == CONTROL_STAGE_SETUP ) |       if (stage == CONTROL_STAGE_SETUP) { | ||||||
|         { |  | ||||||
|         // TODO idle rate of report |         // TODO idle rate of report | ||||||
|         tud_control_xfer(rhport, request, &p_hid->idle_rate, 1); |         tud_control_xfer(rhport, request, &p_hid->idle_rate, 1); | ||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case HID_REQ_CONTROL_GET_PROTOCOL: |     case HID_REQ_CONTROL_GET_PROTOCOL: | ||||||
|         if ( stage == CONTROL_STAGE_SETUP ) |       if (stage == CONTROL_STAGE_SETUP) { | ||||||
|         { |  | ||||||
|         tud_control_xfer(rhport, request, &p_hid->protocol_mode, 1); |         tud_control_xfer(rhport, request, &p_hid->protocol_mode, 1); | ||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case HID_REQ_CONTROL_SET_PROTOCOL: |     case HID_REQ_CONTROL_SET_PROTOCOL: | ||||||
|         if ( stage == CONTROL_STAGE_SETUP ) |       if (stage == CONTROL_STAGE_SETUP) { | ||||||
|         { |  | ||||||
|         tud_control_status(rhport, request); |         tud_control_status(rhport, request); | ||||||
|         } |       } else if (stage == CONTROL_STAGE_ACK) { | ||||||
|         else if ( stage == CONTROL_STAGE_ACK ) |  | ||||||
|         { |  | ||||||
|         p_hid->protocol_mode = (uint8_t)request->wValue; |         p_hid->protocol_mode = (uint8_t)request->wValue; | ||||||
|           if (tud_hid_set_protocol_cb) |         if (tud_hid_set_protocol_cb) { | ||||||
|           { |  | ||||||
|           tud_hid_set_protocol_cb(hid_itf, p_hid->protocol_mode); |           tud_hid_set_protocol_cb(hid_itf, p_hid->protocol_mode); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|       default: return false; // stall unsupported request |     default: | ||||||
|  |       return false; // stall unsupported request | ||||||
|     } |     } | ||||||
|   }else |   } else { | ||||||
|   { |  | ||||||
|     return false; // stall unsupported request |     return false; // stall unsupported request | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -404,25 +362,37 @@ bool hidd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_ | |||||||
|   hidd_interface_t *p_hid = _hidd_itf; |   hidd_interface_t *p_hid = _hidd_itf; | ||||||
|  |  | ||||||
|   // Identify which interface to use |   // Identify which interface to use | ||||||
|   for (instance = 0; instance < CFG_TUD_HID; instance++) |   for (instance = 0; instance < CFG_TUD_HID; instance++) { | ||||||
|   { |  | ||||||
|     p_hid = &_hidd_itf[instance]; |     p_hid = &_hidd_itf[instance]; | ||||||
|     if ( (ep_addr == p_hid->ep_out) || (ep_addr == p_hid->ep_in) ) break; |     if ((ep_addr == p_hid->ep_out) || (ep_addr == p_hid->ep_in)) | ||||||
|  |       break; | ||||||
|   } |   } | ||||||
|   TU_ASSERT(instance < CFG_TUD_HID); |   TU_ASSERT(instance < CFG_TUD_HID); | ||||||
|  |  | ||||||
|  |   // Check if there was a problem | ||||||
|  |   if (XFER_RESULT_SUCCESS != result) { // Inform application about the issue | ||||||
|  |     if (tud_hid_report_fail_cb) { | ||||||
|  |       tud_hid_report_fail_cb(instance, ep_addr, (uint16_t)xferred_bytes); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Allow a new transfer to be received if issue happened on an OUT endpoint | ||||||
|  |     if (ep_addr == p_hid->ep_out) { | ||||||
|  |       // Prepare the OUT endpoint to be able to receive a new transfer | ||||||
|  |       TU_ASSERT(usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf))); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   // Sent report successfully |   // Sent report successfully | ||||||
|   if (ep_addr == p_hid->ep_in) |   if (ep_addr == p_hid->ep_in) { | ||||||
|   { |     if (tud_hid_report_complete_cb) { | ||||||
|     if (tud_hid_report_complete_cb) |  | ||||||
|     { |  | ||||||
|       tud_hid_report_complete_cb(instance, p_hid->epin_buf, (uint16_t)xferred_bytes); |       tud_hid_report_complete_cb(instance, p_hid->epin_buf, (uint16_t)xferred_bytes); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   // Received report |   // Received report successfully | ||||||
|   else if (ep_addr == p_hid->ep_out) |   else if (ep_addr == p_hid->ep_out) { | ||||||
|   { |     tud_hid_set_report_cb(instance, 0, HID_REPORT_TYPE_OUTPUT, p_hid->epout_buf, (uint16_t)xferred_bytes); | ||||||
|     tud_hid_set_report_cb(instance, 0, HID_REPORT_TYPE_INVALID, p_hid->epout_buf, (uint16_t) xferred_bytes); |  | ||||||
|     TU_ASSERT(usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf))); |     TU_ASSERT(usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf))); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -128,6 +128,8 @@ TU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t instance, uint8_t idle_rate); | |||||||
| // Note: For composite reports, report[0] is report ID | // Note: For composite reports, report[0] is report ID | ||||||
| TU_ATTR_WEAK void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_t len); | TU_ATTR_WEAK void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_t len); | ||||||
|  |  | ||||||
|  | // Invoked when a transfer wasn't successful | ||||||
|  | TU_ATTR_WEAK void tud_hid_report_fail_cb(uint8_t instance, uint8_t ep_addr, uint16_t len); | ||||||
|  |  | ||||||
| //--------------------------------------------------------------------+ | //--------------------------------------------------------------------+ | ||||||
| // Inline Functions | // Inline Functions | ||||||
| @@ -471,6 +473,7 @@ uint16_t hidd_open            (uint8_t rhport, tusb_desc_interface_t const * itf | |||||||
| bool     hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request); | bool     hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request); | ||||||
| bool     hidd_xfer_cb         (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes); | bool     hidd_xfer_cb         (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|  } |  } | ||||||
| #endif | #endif | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 HiFiPhile
					HiFiPhile