diff --git a/examples/obsolete/device/src/tusb_config.h b/examples/obsolete/device/src/tusb_config.h index 67604710..40b5d9a6 100644 --- a/examples/obsolete/device/src/tusb_config.h +++ b/examples/obsolete/device/src/tusb_config.h @@ -57,8 +57,8 @@ #define TUSB_CFG_DEVICE_CONTROL_ENDOINT_SIZE 64 //------------- CLASS -------------// -#define TUSB_CFG_DEVICE_HID_KEYBOARD 0 -#define TUSB_CFG_DEVICE_HID_MOUSE 0 +#define TUSB_CFG_DEVICE_HID_KEYBOARD 1 +#define TUSB_CFG_DEVICE_HID_MOUSE 1 #define TUSB_CFG_DEVICE_HID_GENERIC 0 // not supported yet #define TUSB_CFG_DEVICE_MSC 1 #define TUSB_CFG_DEVICE_CDC 1 diff --git a/tinyusb/class/hid/hid_device.c b/tinyusb/class/hid/hid_device.c index 69f0778a..70747651 100644 --- a/tinyusb/class/hid/hid_device.c +++ b/tinyusb/class/hid/hid_device.c @@ -46,6 +46,7 @@ //--------------------------------------------------------------------+ #include "common/tusb_common.h" #include "hid_device.h" +#include "device/usbd_pvt.h" //--------------------------------------------------------------------+ // MACRO CONSTANT TYPEDEF @@ -184,11 +185,15 @@ tusb_error_t hidd_control_request_subtask(uint8_t port, tusb_control_request_t c if ( (p_interface != NULL) && (p_request->wIndex == p_interface->interface_number) ) break; } - ASSERT(subclass_idx < HIDD_NUMBER_OF_SUBCLASS, TUSB_ERROR_FAILED); + TU_ASSERT(subclass_idx < HIDD_NUMBER_OF_SUBCLASS, TUSB_ERROR_FAILED); hidd_class_driver_t const * const p_driver = &hidd_class_driver[subclass_idx]; hidd_interface_t* const p_hid = p_driver->p_interface; + OSAL_SUBTASK_BEGIN + + tusb_error_t err; + //------------- STD Request -------------// if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) { @@ -197,18 +202,22 @@ tusb_error_t hidd_control_request_subtask(uint8_t port, tusb_control_request_t c (void) desc_index; - ASSERT ( p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT, - TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT); - ASSERT ( p_hid->report_length <= HIDD_BUFFER_SIZE, TUSB_ERROR_NOT_ENOUGH_MEMORY); + if (p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT) + { + SUBTASK_ASSERT ( p_hid->report_length <= HIDD_BUFFER_SIZE ); - memcpy(m_hid_buffer, p_hid->p_report_desc, p_hid->report_length); // to allow report descriptor not to be in USBRAM - tusb_dcd_control_xfer(port, TUSB_DIR_IN, m_hid_buffer, p_hid->report_length, false); + // copy to allow report descriptor not to be in USBRAM + memcpy(m_hid_buffer, p_hid->p_report_desc, p_hid->report_length); + + SUBTASK_INVOKE( usbd_control_xfer_stask(port, p_request->bmRequestType_bit.direction, m_hid_buffer, p_hid->report_length), err ); + }else + { + usbd_control_stall(port); + } } //------------- Class Specific Request -------------// else if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS) { - OSAL_SUBTASK_BEGIN - if( (HID_REQUEST_CONTROL_GET_REPORT == p_request->bRequest) && (p_driver->get_report_cb != NULL) ) { // wValue = Report Type | Report ID @@ -218,40 +227,34 @@ tusb_error_t hidd_control_request_subtask(uint8_t port, tusb_control_request_t c &p_buffer, p_request->wLength); SUBTASK_ASSERT( p_buffer != NULL && actual_length > 0 ); - tusb_dcd_control_xfer(port, (tusb_dir_t) p_request->bmRequestType_bit.direction, p_buffer, actual_length, false); + SUBTASK_INVOKE( usbd_control_xfer_stask(port, p_request->bmRequestType_bit.direction, p_buffer, actual_length), err ); } else if ( (HID_REQUEST_CONTROL_SET_REPORT == p_request->bRequest) && (p_driver->set_report_cb != NULL) ) { // return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; // TODO test STALL control out endpoint (with mouse+keyboard) // wValue = Report Type | Report ID - tusb_error_t error; + SUBTASK_INVOKE( usbd_control_xfer_stask(port, p_request->bmRequestType_bit.direction, m_hid_buffer, p_request->wLength), err ); + SUBTASK_ASSERT_STATUS(err); - tusb_dcd_control_xfer(port, (tusb_dir_t) p_request->bmRequestType_bit.direction, m_hid_buffer, p_request->wLength, true); - - osal_semaphore_wait(usbd_control_xfer_sem_hdl, OSAL_TIMEOUT_NORMAL, &error); // wait for control xfer complete - SUBTASK_ASSERT_STATUS(error); - - p_driver->set_report_cb(port, (hid_request_report_type_t) u16_high_u8(p_request->wValue), - m_hid_buffer, p_request->wLength); + p_driver->set_report_cb(port, u16_high_u8(p_request->wValue), m_hid_buffer, p_request->wLength); } else if (HID_REQUEST_CONTROL_SET_IDLE == p_request->bRequest) { // uint8_t idle_rate = u16_high_u8(p_request->wValue); + usbd_control_status(port, p_request->bmRequestType_bit.direction); }else { // HID_REQUEST_CONTROL_GET_IDLE: // HID_REQUEST_CONTROL_GET_PROTOCOL: // HID_REQUEST_CONTROL_SET_PROTOCOL: - return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; + usbd_control_stall(port); } - - OSAL_SUBTASK_END }else { - return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; + usbd_control_stall(port); } - return TUSB_ERROR_NONE; + OSAL_SUBTASK_END } tusb_error_t hidd_open(uint8_t port, tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length)