From e320659f8a4869a81e656285ed1263d8515aa7ee Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 9 Dec 2013 11:15:13 +0700 Subject: add keyboard led mask make usbd control request to subtask add get/set report via control pipe to hidd enforce soft DMA to control pipe for lpc11u (lpc17xx not yet) temp add led_blinking_set_interval to change led blinking interval refractor dcd_pipe_control_xfer to have interrupt on complete option add get/set report support of moused_app and keyboardd_app, keyboard LED will make LED blink faster --- tinyusb/class/cdc_device.c | 8 ++--- tinyusb/class/cdc_device.h | 2 +- tinyusb/class/hid.h | 8 +++++ tinyusb/class/hid_device.c | 76 +++++++++++++++++++++++++++++----------------- tinyusb/class/hid_device.h | 10 +++--- tinyusb/class/msc_device.c | 2 +- tinyusb/class/msc_device.h | 2 +- 7 files changed, 68 insertions(+), 40 deletions(-) (limited to 'tinyusb/class') diff --git a/tinyusb/class/cdc_device.c b/tinyusb/class/cdc_device.c index bb3e86db4..39619fbd5 100644 --- a/tinyusb/class/cdc_device.c +++ b/tinyusb/class/cdc_device.c @@ -182,7 +182,7 @@ void cdcd_close(uint8_t coreid) memclr_(&cdcd_data[coreid], sizeof(cdcd_data_t)); } -tusb_error_t cdcd_control_request(uint8_t coreid, tusb_control_request_t const * p_request) +tusb_error_t cdcd_control_request_subtask(uint8_t coreid, tusb_control_request_t const * p_request) { //------------- Class Specific Request -------------// if (p_request->bmRequestType_bit.type != TUSB_REQUEST_TYPE_CLASS) return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; @@ -191,17 +191,17 @@ tusb_error_t cdcd_control_request(uint8_t coreid, tusb_control_request_t const * { case CDC_REQUEST_GET_LINE_CODING: dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, - &cdcd_line_coding[coreid], min16_of(sizeof(cdc_line_coding_t), p_request->wLength) ); + &cdcd_line_coding[coreid], min16_of(sizeof(cdc_line_coding_t), p_request->wLength), false ); break; case CDC_REQUEST_SET_LINE_CODING: dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, - &cdcd_line_coding[coreid], min16_of(sizeof(cdc_line_coding_t), p_request->wLength) ); + &cdcd_line_coding[coreid], min16_of(sizeof(cdc_line_coding_t), p_request->wLength), false ); // TODO notify application on xfer complete break; case CDC_REQUEST_SET_CONTROL_LINE_STATE: // TODO extract DTE present - dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, NULL, 0); +// dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, NULL, 0); break; diff --git a/tinyusb/class/cdc_device.h b/tinyusb/class/cdc_device.h index bb0c7644c..601b29cca 100644 --- a/tinyusb/class/cdc_device.h +++ b/tinyusb/class/cdc_device.h @@ -76,7 +76,7 @@ void tusbd_cdc_xfer_cb(uint8_t coreid, tusb_event_t event, cdc_pipeid_t pipe_id, void cdcd_init(void); tusb_error_t cdcd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length); -tusb_error_t cdcd_control_request(uint8_t coreid, tusb_control_request_t const * p_request); +tusb_error_t cdcd_control_request_subtask(uint8_t coreid, tusb_control_request_t const * p_request); tusb_error_t cdcd_xfer_cb(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes); void cdcd_close(uint8_t coreid); diff --git a/tinyusb/class/hid.h b/tinyusb/class/hid.h index fcb192c4d..017223c0f 100644 --- a/tinyusb/class/hid.h +++ b/tinyusb/class/hid.h @@ -199,6 +199,14 @@ typedef enum { KEYBOARD_MODIFIER_RIGHTGUI = BIT_(7) ///< Right Window }hid_keyboard_modifier_bm_t; +typedef enum { + KEYBOARD_LED_NUMLOCK = BIT_(0), ///< Num Lock LED + KEYBOARD_LED_CAPSLOCK = BIT_(1), ///< Caps Lock LED + KEYBOARD_LED_SCROLLLOCK = BIT_(2), ///< Scroll Lock LED + KEYBOARD_LED_COMPOSE = BIT_(3), ///< Composition Mode + KEYBOARD_LED_KANA = BIT_(4) ///< Kana mode +}hid_keyboard_led_bm_t; + /// @} #define HID_KEYCODE_TABLE(ENTRY) \ diff --git a/tinyusb/class/hid_device.c b/tinyusb/class/hid_device.c index 3e171a1de..0b413329c 100644 --- a/tinyusb/class/hid_device.c +++ b/tinyusb/class/hid_device.c @@ -51,7 +51,6 @@ //--------------------------------------------------------------------+ // MACRO CONSTANT TYPEDEF //--------------------------------------------------------------------+ -ATTR_USB_MIN_ALIGNMENT uint8_t set_report[ MAX_OF(sizeof(hid_keyboard_report_t), sizeof(hid_mouse_report_t)) ] TUSB_CFG_ATTR_USBRAM; enum { HIDD_NUMBER_OF_SUBCLASS = 3 @@ -70,6 +69,8 @@ typedef struct { void (* const mounted_cb) (uint8_t coreid); void (* const unmounted_cb) (uint8_t coreid); void (* const xfer_cb) (uint8_t, tusb_event_t, uint32_t); + uint16_t (* const get_report_cb) (uint8_t, hid_request_report_type_t, void**, uint16_t ); + void (* const set_report_cb) (uint8_t, hid_request_report_type_t, uint8_t[], uint16_t); }hidd_class_driver_t; extern ATTR_WEAK hidd_interface_t keyboardd_data; @@ -86,7 +87,9 @@ static hidd_class_driver_t const hidd_class_driver[HIDD_NUMBER_OF_SUBCLASS] = .p_interface = &keyboardd_data, .mounted_cb = tusbd_hid_keyboard_mounted_cb, .unmounted_cb = tusbd_hid_keyboard_unmounted_cb, - .xfer_cb = tusbd_hid_keyboard_cb + .xfer_cb = tusbd_hid_keyboard_cb, + .get_report_cb = tusbd_hid_keyboard_get_report_cb, + .set_report_cb = tusbd_hid_keyboard_set_report_cb }, #endif @@ -97,11 +100,17 @@ static hidd_class_driver_t const hidd_class_driver[HIDD_NUMBER_OF_SUBCLASS] = .p_interface = &moused_data, .mounted_cb = tusbd_hid_mouse_mounted_cb, .unmounted_cb = tusbd_hid_mouse_unmounted_cb, - .xfer_cb = tusbd_hid_mouse_cb + .xfer_cb = tusbd_hid_mouse_cb, + .get_report_cb = tusbd_hid_mouse_get_report_cb, + .set_report_cb = tusbd_hid_mouse_set_report_cb } #endif }; +#if TUSB_CFG_DEVICE_HID_KEYBOARD || TUSB_CFG_DEVICE_HID_MOUSE +ATTR_USB_MIN_ALIGNMENT uint8_t m_control_data[ MAX_OF(sizeof(hid_keyboard_report_t), sizeof(hid_mouse_report_t)) ] TUSB_CFG_ATTR_USBRAM; +#endif + //--------------------------------------------------------------------+ // KEYBOARD APPLICATION API //--------------------------------------------------------------------+ @@ -180,7 +189,7 @@ void hidd_close(uint8_t coreid) } } -tusb_error_t hidd_control_request(uint8_t coreid, tusb_control_request_t const * p_request) +tusb_error_t hidd_control_request_subtask(uint8_t coreid, tusb_control_request_t const * p_request) { uint8_t subclass_idx; for(subclass_idx=0; subclass_idxp_interface; //------------- STD Request -------------// @@ -208,39 +217,50 @@ tusb_error_t hidd_control_request(uint8_t coreid, tusb_control_request_t const * ASSERT ( p_request->bRequest == TUSB_REQUEST_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT, TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT); - dcd_pipe_control_xfer(coreid, TUSB_DIR_DEV_TO_HOST, p_driver->p_report_desc, p_hid->report_length); + dcd_pipe_control_xfer(coreid, TUSB_DIR_DEV_TO_HOST, p_driver->p_report_desc, p_hid->report_length, false); } //------------- Class Specific Request -------------// else if (p_request->bmRequestType_bit.type == TUSB_REQUEST_TYPE_CLASS) { - switch(p_request->bRequest) + OSAL_SUBTASK_BEGIN + + if( (HID_REQUEST_CONTROL_GET_REPORT == p_request->bRequest) && (p_driver->get_report_cb != NULL) ) { - case HID_REQUEST_CONTROL_SET_IDLE: - // idle_rate = u16_high_u8(p_request->wValue); - break; + // wValue = Report Type | Report ID + void* p_buffer = NULL; - case HID_REQUEST_CONTROL_SET_REPORT: - { -// return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; // TODO test STALL control out endpoint (with mouse+keyboard)aaaaa + uint16_t actual_length = p_driver->get_report_cb(coreid, (hid_request_report_type_t) u16_high_u8(p_request->wValue), + &p_buffer, p_request->wLength); + SUBTASK_ASSERT( p_buffer != NULL && actual_length > 0 ); - // TODO HIDD set report support - hid_request_report_type_t report_type = u16_high_u8(p_request->wValue); - uint8_t report_id = u16_low_u8(p_request->wValue); + dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, p_buffer, actual_length, false); + } + 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; - (void) report_id; - (void) report_type; + dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, &m_control_data, p_request->wLength, true); - dcd_pipe_control_xfer(coreid, TUSB_DIR_HOST_TO_DEV, &set_report, p_request->wLength); - } - break; + osal_semaphore_wait(usbd_control_xfer_sem_hdl, OSAL_TIMEOUT_NORMAL, &error); // wait for control xfer complete + SUBTASK_ASSERT_STATUS(error); - case HID_REQUEST_CONTROL_GET_IDLE: - case HID_REQUEST_CONTROL_GET_REPORT: - case HID_REQUEST_CONTROL_GET_PROTOCOL: - case HID_REQUEST_CONTROL_SET_PROTOCOL: - default: - return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; + p_driver->set_report_cb(coreid, (hid_request_report_type_t) u16_high_u8(p_request->wValue), + &m_control_data, p_request->wLength); } + else if (HID_REQUEST_CONTROL_SET_IDLE == p_request->bRequest) + { + // uint8_t idle_rate = u16_high_u8(p_request->wValue); + }else + { +// HID_REQUEST_CONTROL_GET_IDLE: +// HID_REQUEST_CONTROL_GET_PROTOCOL: +// HID_REQUEST_CONTROL_SET_PROTOCOL: + return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; + } + + OSAL_SUBTASK_END }else { return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; @@ -270,7 +290,7 @@ tusb_error_t hidd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_int case HID_PROTOCOL_KEYBOARD: case HID_PROTOCOL_MOUSE: { - hidd_class_driver_t * const p_driver = &hidd_class_driver[p_interface_desc->bInterfaceProtocol]; + hidd_class_driver_t const * const p_driver = &hidd_class_driver[p_interface_desc->bInterfaceProtocol]; hidd_interface_t * const p_hid = p_driver->p_interface; ASSERT_PTR(p_hid, TUSB_ERROR_FAILED); diff --git a/tinyusb/class/hid_device.h b/tinyusb/class/hid_device.h index b51b0d8eb..e91000f68 100644 --- a/tinyusb/class/hid_device.h +++ b/tinyusb/class/hid_device.h @@ -94,8 +94,8 @@ void tusbd_hid_keyboard_unmounted_cb(uint8_t coreid); */ void tusbd_hid_keyboard_cb(uint8_t coreid, tusb_event_t event, uint32_t xferred_bytes); -void tusbd_hid_keyboard_set_report_cb(uint8_t coreid, hid_request_report_type_t report_type, uint8_t report_data[]); -void tusbd_hid_keyboard_get_report_cb(uint8_t coreid, hid_request_report_type_t report_type, void** pp_report); +void tusbd_hid_keyboard_set_report_cb(uint8_t coreid, hid_request_report_type_t report_type, uint8_t p_report_data[], uint16_t length); +uint16_t tusbd_hid_keyboard_get_report_cb(uint8_t coreid, hid_request_report_type_t report_type, void** pp_report, uint16_t requested_length); /** @} */ /** @} */ @@ -108,8 +108,6 @@ void tusbd_hid_keyboard_get_report_cb(uint8_t coreid, hid_request_report_type_t /** \defgroup Mouse_Device Device * @{ */ -//bool tusbd_hid_mouse_is_configured(uint8_t coreid); - /** \brief Check if the interface is currently busy or not * \param[in] coreid USB Controller ID * \retval true if the interface is busy meaning the stack is still transferring/waiting data from/to host @@ -149,6 +147,8 @@ void tusbd_hid_mouse_unmounted_cb(uint8_t coreid); */ void tusbd_hid_mouse_cb(uint8_t coreid, tusb_event_t event, uint32_t xferred_bytes); +uint16_t tusbd_hid_mouse_get_report_cb(uint8_t coreid, hid_request_report_type_t report_type, void** pp_report, uint16_t requested_length); +void tusbd_hid_mouse_set_report_cb(uint8_t coreid, hid_request_report_type_t report_type, uint8_t p_report_data[], uint16_t length); /** @} */ /** @} */ @@ -161,7 +161,7 @@ void tusbd_hid_mouse_cb(uint8_t coreid, tusb_event_t event, uint32_t xferred_byt void hidd_init(void); tusb_error_t hidd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length); -tusb_error_t hidd_control_request(uint8_t coreid, tusb_control_request_t const * p_request); +tusb_error_t hidd_control_request_subtask(uint8_t coreid, tusb_control_request_t const * p_request); tusb_error_t hidd_xfer_cb(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes); void hidd_close(uint8_t coreid); diff --git a/tinyusb/class/msc_device.c b/tinyusb/class/msc_device.c index c91c1913e..52c2e5de8 100644 --- a/tinyusb/class/msc_device.c +++ b/tinyusb/class/msc_device.c @@ -113,7 +113,7 @@ tusb_error_t mscd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_int return TUSB_ERROR_NONE; } -tusb_error_t mscd_control_request(uint8_t coreid, tusb_control_request_t const * p_request) +tusb_error_t mscd_control_request_subtask(uint8_t coreid, tusb_control_request_t const * p_request) { ASSERT(p_request->bmRequestType_bit.type == TUSB_REQUEST_TYPE_CLASS, TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT); diff --git a/tinyusb/class/msc_device.h b/tinyusb/class/msc_device.h index bb20e4b13..8f824380a 100644 --- a/tinyusb/class/msc_device.h +++ b/tinyusb/class/msc_device.h @@ -126,7 +126,7 @@ msc_csw_status_t tusbd_msc_scsi_received_isr (uint8_t coreid, uint8_t lun, uint8 void mscd_init(void); tusb_error_t mscd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length); -tusb_error_t mscd_control_request(uint8_t coreid, tusb_control_request_t const * p_request); +tusb_error_t mscd_control_request_subtask(uint8_t coreid, tusb_control_request_t const * p_request); tusb_error_t mscd_xfer_cb(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes); void mscd_close(uint8_t coreid); -- cgit v1.3.1