diff options
| author | hathach <[email protected]> | 2013-03-26 13:07:42 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-03-26 13:07:42 +0700 |
| commit | 3c767e9f44ff6e430f85f7fae7c38ee8aca3b6e2 (patch) | |
| tree | 2aa3fac2e208acd4614dd139eafa6f6b914453d0 /tinyusb/class | |
| parent | 03d045ecde8961ec7ca1579b9d207a0a83d442e3 (diff) | |
add field to endpoint maxpacketsize (mult)
refractor hidh_open_subtask & hidh_keyboard_open
add ATTR_PACKED_STRUCT(x)
- TODO remove ugly pre_pack & post pack
Diffstat (limited to 'tinyusb/class')
| -rw-r--r-- | tinyusb/class/hid_host.c | 103 |
1 files changed, 52 insertions, 51 deletions
diff --git a/tinyusb/class/hid_host.c b/tinyusb/class/hid_host.c index c14b497c4..6665d2320 100644 --- a/tinyusb/class/hid_host.c +++ b/tinyusb/class/hid_host.c @@ -53,6 +53,12 @@ //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION //--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// KEYBOARD PUBLIC API (parameter validation required) +//--------------------------------------------------------------------+ +#if TUSB_CFG_HOST_HID_KEYBOARD + STATIC_ hidh_keyboard_info_t keyboard_data[TUSB_CFG_HOST_DEVICE_MAX]; // does not have addr0, index = dev_address-1 static inline hidh_keyboard_info_t* get_kbd_data(uint8_t dev_addr) ATTR_PURE ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; @@ -61,6 +67,30 @@ static inline hidh_keyboard_info_t* get_kbd_data(uint8_t dev_addr) return &keyboard_data[dev_addr-1]; } + +bool tusbh_hid_keyboard_is_supported(uint8_t dev_addr) +{ + return tusbh_device_is_configured(dev_addr) && pipehandle_is_valid(keyboard_data[dev_addr-1].pipe_hdl); +} + +tusb_error_t tusbh_hid_keyboard_get_report(uint8_t dev_addr, uint8_t instance_num, tusb_keyboard_report_t * const report) +{ + //------------- parameters validation -------------// + ASSERT_INT(TUSB_DEVICE_STATE_CONFIGURED, tusbh_device_get_state(dev_addr), TUSB_ERROR_DEVICE_NOT_READY); + ASSERT_PTR(report, TUSB_ERROR_INVALID_PARA); + + (void) instance_num; + + hidh_keyboard_info_t *p_keyboard = get_kbd_data(dev_addr); + + // TODO abstract to use hidh service + ASSERT_STATUS( hcd_pipe_xfer(p_keyboard->pipe_hdl, (uint8_t*) report, p_keyboard->report_size, true) ) ; + + return TUSB_ERROR_NONE; +} + +#endif + //--------------------------------------------------------------------+ // CLASS-USBD API (don't require to verify parameters) //--------------------------------------------------------------------+ @@ -79,29 +109,12 @@ void hidh_init(void) #endif } -tusb_error_t hidh_keyboard_open_subtask(uint8_t dev_addr, uint8_t const *descriptor, uint16_t *p_length) +tusb_error_t hidh_keyboard_open(uint8_t dev_addr, tusb_descriptor_endpoint_t const *p_endpoint_desc) { hidh_keyboard_info_t *p_keyboard = get_kbd_data(dev_addr); - uint8_t const *p_desc = descriptor; - - p_desc += p_desc[DESCRIPTOR_OFFSET_LENGTH]; // skip interface - (*p_length) = p_desc - descriptor; // set ASAP, in case of error, p_length has to be not zero to prevent infinite re-open - - //------------- HID descriptor -------------// - tusb_hid_descriptor_hid_t* const p_desc_hid = (tusb_hid_descriptor_hid_t* const) p_desc; - ASSERT_INT(HID_DESC_HID, p_desc_hid->bDescriptorType, TUSB_ERROR_INVALID_PARA); - - p_desc += p_desc[DESCRIPTOR_OFFSET_LENGTH]; // TODO skip HID, only support std keyboard - (*p_length) = p_desc - descriptor; - - //------------- Endpoint Descriptor -------------// - ASSERT_INT(TUSB_DESC_ENDPOINT, p_desc[DESCRIPTOR_OFFSET_TYPE], TUSB_ERROR_INVALID_PARA); - p_keyboard->pipe_hdl = hcd_pipe_open(dev_addr, (tusb_descriptor_endpoint_t*) p_desc, TUSB_CLASS_HID); - p_keyboard->report_size = ( ((tusb_descriptor_endpoint_t*) p_desc)->wMaxPacketSize & (BIT_(12)-1) ); - - p_desc += p_desc[DESCRIPTOR_OFFSET_LENGTH]; // advance endpoint descriptor - (*p_length) = p_desc - descriptor; + p_keyboard->pipe_hdl = hcd_pipe_open(dev_addr, p_endpoint_desc, TUSB_CLASS_HID); + p_keyboard->report_size = p_endpoint_desc->wMaxPacketSize.size; // TODO get size from report descriptor ASSERT (pipehandle_is_valid(p_keyboard->pipe_hdl), TUSB_ERROR_HCD_FAILED); @@ -111,32 +124,46 @@ tusb_error_t hidh_keyboard_open_subtask(uint8_t dev_addr, uint8_t const *descrip tusb_error_t hidh_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t const *p_interface_desc, uint16_t *p_length) { uint8_t const *p_desc = (uint8_t const *) p_interface_desc; + + //------------- HID descriptor -------------// + p_desc += p_desc[DESCRIPTOR_OFFSET_LENGTH]; + tusb_hid_descriptor_hid_t const *p_desc_hid = (tusb_hid_descriptor_hid_t const *) p_desc; + ASSERT_INT(HID_DESC_HID, p_desc_hid->bDescriptorType, TUSB_ERROR_INVALID_PARA); + + //------------- TODO skip Get Report Descriptor -------------// + uint8_t *p_report_desc = NULL; // report descriptor has to be global & in USB RAM + + //------------- Endpoint Descriptor -------------// + p_desc += p_desc[DESCRIPTOR_OFFSET_LENGTH]; + ASSERT_INT(TUSB_DESC_ENDPOINT, p_desc[DESCRIPTOR_OFFSET_TYPE], TUSB_ERROR_INVALID_PARA); + if (p_interface_desc->bInterfaceSubClass == HID_SUBCLASS_BOOT) { switch(p_interface_desc->bInterfaceProtocol) { #if TUSB_CFG_HOST_HID_KEYBOARD case HID_PROTOCOL_KEYBOARD: - return hidh_keyboard_open_subtask(dev_addr, p_desc, p_length); + ASSERT_STATUS ( hidh_keyboard_open(dev_addr, (tusb_descriptor_endpoint_t const *) p_desc) ); break; #endif #if TUSB_CFG_HOST_HID_MOUSE case HID_PROTOCOL_MOUSE: - return hidh_keyboard_open_subtask(dev_addr, p_desc, p_length); + ASSERT_STATUS ( hidh_keyboard_open(dev_addr, p_desc, p_length) ); break; #endif default: // unknown protocol --> skip this interface - *p_length = p_interface_desc->bLength; return TUSB_ERROR_NONE; } + *p_length = sizeof(tusb_descriptor_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + sizeof(tusb_descriptor_endpoint_t); }else { // open generic - *p_length = p_interface_desc->bLength; - return TUSB_ERROR_NONE; + *p_length = 0; } + + return TUSB_ERROR_NONE; } void hidh_isr(pipe_handle_t pipe_hdl, tusb_bus_event_t event) @@ -159,32 +186,6 @@ void hidh_close(uint8_t dev_addr) #endif } -//--------------------------------------------------------------------+ -// KEYBOARD PUBLIC API (parameter validation required) -//--------------------------------------------------------------------+ -#if TUSB_CFG_HOST_HID_KEYBOARD -bool tusbh_hid_keyboard_is_supported(uint8_t dev_addr) -{ - return tusbh_device_is_configured(dev_addr) && pipehandle_is_valid(keyboard_data[dev_addr-1].pipe_hdl); -} - -tusb_error_t tusbh_hid_keyboard_get_report(uint8_t dev_addr, uint8_t instance_num, tusb_keyboard_report_t * const report) -{ - //------------- parameters validation -------------// - ASSERT_INT(TUSB_DEVICE_STATE_CONFIGURED, tusbh_device_get_state(dev_addr), TUSB_ERROR_DEVICE_NOT_READY); - ASSERT_PTR(report, TUSB_ERROR_INVALID_PARA); - - (void) instance_num; - - hidh_keyboard_info_t *p_keyboard = get_kbd_data(dev_addr); - - // TODO abstract to use hidh service - ASSERT_STATUS( hcd_pipe_xfer(p_keyboard->pipe_hdl, (uint8_t*) report, p_keyboard->report_size, true) ) ; - - return TUSB_ERROR_NONE; -} - -#endif #endif |
