summaryrefslogtreecommitdiff
path: root/tinyusb/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-12-09 11:15:13 +0700
committerhathach <[email protected]>2013-12-09 11:15:13 +0700
commite320659f8a4869a81e656285ed1263d8515aa7ee (patch)
treebf355e111ebfc710bf3c30a31919e6f98542bf2b /tinyusb/class
parent1ad78f104ed87957bd4cf7e15029ab3e4e3cb377 (diff)
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
Diffstat (limited to 'tinyusb/class')
-rw-r--r--tinyusb/class/cdc_device.c8
-rw-r--r--tinyusb/class/cdc_device.h2
-rw-r--r--tinyusb/class/hid.h8
-rw-r--r--tinyusb/class/hid_device.c76
-rw-r--r--tinyusb/class/hid_device.h10
-rw-r--r--tinyusb/class/msc_device.c2
-rw-r--r--tinyusb/class/msc_device.h2
7 files changed, 68 insertions, 40 deletions
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_idx<HIDD_NUMBER_OF_SUBCLASS; subclass_idx++)
@@ -194,7 +203,7 @@ tusb_error_t hidd_control_request(uint8_t coreid, tusb_control_request_t const *
ASSERT(subclass_idx < HIDD_NUMBER_OF_SUBCLASS, TUSB_ERROR_FAILED);
- hidd_class_driver_t* const p_driver = &hidd_class_driver[subclass_idx];
+ hidd_class_driver_t const * const p_driver = &hidd_class_driver[subclass_idx];
hidd_interface_t* const p_hid = p_driver->p_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);