From d0a73f4b0d6d25d5f6a08f3b519241cec4e2a535 Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 25 Mar 2013 17:39:22 +0700 Subject: [PATCH] add several helper function add test & code for hidh_keyboard_open_subtask - skip parsing HID descriptor for keyboard --- tests/project.yml | 1 + tests/test/host/hid/test_hidh_keyboard.c | 45 +++++++++++------------- tests/test/support/descriptor_test.h | 1 + tinyusb/class/hid_host_keyboard.c | 27 ++++++++++---- tinyusb/common/errors.h | 2 -- tinyusb/core/tusb_types.h | 5 +++ tinyusb/host/hcd.h | 6 ++++ 7 files changed, 53 insertions(+), 34 deletions(-) diff --git a/tests/project.yml b/tests/project.yml index 54a07be6f..57ea70986 100644 --- a/tests/project.yml +++ b/tests/project.yml @@ -77,6 +77,7 @@ - :callback - :array :ignore: :args_only +# :unity_helper_path: test/support/type_helper.h :treat_as: uint8: HEX8 uint16: HEX16 diff --git a/tests/test/host/hid/test_hidh_keyboard.c b/tests/test/host/hid/test_hidh_keyboard.c index ffd712bf9..b437c9cab 100644 --- a/tests/test/host/hid/test_hidh_keyboard.c +++ b/tests/test/host/hid/test_hidh_keyboard.c @@ -43,6 +43,7 @@ #include "mock_osal.h" #include "mock_usbh.h" #include "mock_hcd.h" +#include "descriptor_test.h" extern hidh_keyboard_info_t keyboard_data[TUSB_CFG_HOST_DEVICE_MAX]; @@ -63,19 +64,8 @@ tusb_keyboard_report_t report; uint8_t instance_num; keyboard_interface_t* p_hidh_kbd_interface; -tusb_descriptor_interface_t const kbd_descriptor = -{ - .bLength = sizeof(tusb_descriptor_interface_t), - .bDescriptorType = TUSB_DESC_INTERFACE, - .bInterfaceNumber = 1, - .bAlternateSetting = 0, - .bNumEndpoints = 1, - .bInterfaceClass = TUSB_CLASS_HID, - .bInterfaceSubClass = HID_SUBCLASS_BOOT, - .bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, - .iInterface = 0 -}; - +tusb_descriptor_interface_t const *p_kbd_interface_desc = &desc_configuration.keyboard_interface; +tusb_descriptor_endpoint_t const *p_kdb_endpoint_desc = &desc_configuration.keyboard_endpoint; void setUp(void) { @@ -86,7 +76,7 @@ void setUp(void) hidh_keyboard_init(); - keyboard_data[dev_addr-1].instance_count = 0; + keyboard_data[dev_addr-1].instance_count = 1; p_hidh_kbd_interface = &keyboard_data[dev_addr-1].instance[instance_num]; p_hidh_kbd_interface->report_size = sizeof(tusb_keyboard_report_t); @@ -105,6 +95,13 @@ void tearDown(void) //--------------------------------------------------------------------+ // keyboard_install, keyboard_no_instances, keybaord_init //--------------------------------------------------------------------+ +void TEST_ASSERT_PIPE_HANDLE(pipe_handle_t x, pipe_handle_t y) +{ + TEST_ASSERT_EQUAL(x.dev_addr , y.dev_addr); + TEST_ASSERT_EQUAL(x.xfer_type , y.xfer_type); + TEST_ASSERT_EQUAL(x.index , y.index); +} + void test_keyboard_no_instances_invalid_para(void) { tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_UNPLUG); @@ -114,12 +111,17 @@ void test_keyboard_no_instances_invalid_para(void) void test_keyboard_open_ok(void) { uint16_t length=0; - tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); - TEST_ASSERT_EQUAL(0, tusbh_hid_keyboard_no_instances(dev_addr)); + pipe_handle_t pipe_hdl = {.dev_addr = dev_addr, .xfer_type = TUSB_XFER_INTERRUPT, .index = 1}; + + hcd_pipe_open_ExpectAndReturn(dev_addr, p_kdb_endpoint_desc, TUSB_CLASS_HID, pipe_hdl); + + //------------- Code Under TEST -------------// + TEST_ASSERT_EQUAL(TUSB_ERROR_NONE, hidh_keyboard_open_subtask(dev_addr, (uint8_t*) p_kbd_interface_desc, &length)); - TEST_ASSERT_EQUAL(TUSB_ERROR_NONE, hidh_keyboard_open_subtask(dev_addr, (uint8_t*) &kbd_descriptor, &length)); tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); - TEST_ASSERT_EQUAL(1, tusbh_hid_keyboard_no_instances(dev_addr)); + TEST_ASSERT_EQUAL(2, tusbh_hid_keyboard_no_instances(dev_addr)); // init instance to 1 + TEST_ASSERT_PIPE_HANDLE(pipe_hdl, p_hidh_kbd_interface->pipe_in); + TEST_ASSERT_EQUAL(8, p_hidh_kbd_interface->report_size); } void test_keyboard_init(void) @@ -157,13 +159,6 @@ void test_keyboard_get_device_not_ready(void) TEST_ASSERT_EQUAL(TUSB_ERROR_DEVICE_NOT_READY, tusbh_hid_keyboard_get(dev_addr, 0, &report)); // device not mounted } -void test_keyboard_get_class_not_supported() -{ - tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); - p_hidh_kbd_interface->pipe_in = (pipe_handle_t) { 0 }; - TEST_ASSERT_EQUAL(TUSB_ERROR_CLASS_DEVICE_DONT_SUPPORT, tusbh_hid_keyboard_get(dev_addr, instance_num, &report)); -} - void test_keyboard_get_report_xfer_failed() { tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); diff --git a/tests/test/support/descriptor_test.h b/tests/test/support/descriptor_test.h index 24a45f10d..a87dd30bf 100644 --- a/tests/test/support/descriptor_test.h +++ b/tests/test/support/descriptor_test.h @@ -100,6 +100,7 @@ typedef struct extern tusb_descriptor_device_t const desc_device; extern app_configuration_desc_t const desc_configuration; +extern const uint8_t keyboard_report_descriptor[]; #ifdef __cplusplus } diff --git a/tinyusb/class/hid_host_keyboard.c b/tinyusb/class/hid_host_keyboard.c index 72ba4d7be..2647f9bca 100644 --- a/tinyusb/class/hid_host_keyboard.c +++ b/tinyusb/class/hid_host_keyboard.c @@ -56,6 +56,12 @@ //--------------------------------------------------------------------+ STATIC_ hidh_keyboard_info_t keyboard_data[TUSB_CFG_HOST_DEVICE_MAX]; // does not have addr0, index = dev_address-1 +static inline keyboard_interface_t* get_kbd_instance(uint8_t dev_addr, uint8_t instance_num) ATTR_PURE ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +static inline keyboard_interface_t* get_kbd_instance(uint8_t dev_addr, uint8_t instance_num) +{ + return &keyboard_data[dev_addr-1].instance[instance_num]; +} + //--------------------------------------------------------------------+ // IMPLEMENTATION //--------------------------------------------------------------------+ @@ -68,16 +74,12 @@ tusb_error_t tusbh_hid_keyboard_get(uint8_t const dev_addr, uint8_t instance_num //------------- 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); - ASSERT(instance_num < TUSB_CFG_HOST_HID_KEYBOARD_NO_INSTANCES_PER_DEVICE, TUSB_ERROR_INVALID_PARA); + ASSERT(instance_num < keyboard_data[dev_addr-1].instance_count, TUSB_ERROR_INVALID_PARA); - keyboard_interface_t *p_kbd; - p_kbd = &keyboard_data[dev_addr-1].instance[instance_num]; - - // TODO abtract class support for device - ASSERT(0 != p_kbd->pipe_in.dev_addr, TUSB_ERROR_CLASS_DEVICE_DONT_SUPPORT); + keyboard_interface_t *p_kbd = get_kbd_instance(dev_addr, instance_num); // TODO abtract to use hidh service - ASSERT_STATUS( hcd_pipe_xfer(p_kbd->pipe_in, report, p_kbd->report_size, 1) ) ; + ASSERT_STATUS( hcd_pipe_xfer(p_kbd->pipe_in, (uint8_t*) report, p_kbd->report_size, true) ) ; return TUSB_ERROR_NONE; } @@ -99,6 +101,17 @@ void hidh_keyboard_init(void) tusb_error_t hidh_keyboard_open_subtask(uint8_t dev_addr, uint8_t const *descriptor, uint16_t *p_length) { + descriptor += *descriptor; // skip interface + descriptor += *descriptor; // TODO skip HID, only support std keyboard + + keyboard_interface_t *p_kbd = get_kbd_instance(dev_addr, keyboard_data[dev_addr-1].instance_count); + + ASSERT_INT(TUSB_DESC_ENDPOINT, descriptor[DESCRIPTOR_OFFSET_TYPE], TUSB_ERROR_INVALID_PARA); + + p_kbd->pipe_in = hcd_pipe_open(dev_addr, (tusb_descriptor_endpoint_t*) descriptor, TUSB_CLASS_HID); + + ASSERT (pipehandle_is_valid(p_kbd->pipe_in), TUSB_ERROR_HCD_FAILED); + keyboard_data[dev_addr-1].instance_count++; return TUSB_ERROR_NONE; diff --git a/tinyusb/common/errors.h b/tinyusb/common/errors.h index fbb5a5901..95ac20928 100644 --- a/tinyusb/common/errors.h +++ b/tinyusb/common/errors.h @@ -63,8 +63,6 @@ ENTRY(TUSB_ERROR_NONE)\ ENTRY(TUSB_ERROR_INVALID_PARA)\ ENTRY(TUSB_ERROR_DEVICE_NOT_READY)\ - ENTRY(TUSB_ERROR_CLASS_DEVICE_DONT_SUPPORT)\ - /*ENTRY(TUSB_ERROR_CLASS_DATA_NOT_AVAILABLE)*/\ ENTRY(TUSB_ERROR_HCD_FAILED)\ ENTRY(TUSB_ERROR_USBH_MOUNT_DEVICE_NOT_RESPOND)\ ENTRY(TUSB_ERROR_USBH_MOUNT_CONFIG_DESC_TOO_LONG)\ diff --git a/tinyusb/core/tusb_types.h b/tinyusb/core/tusb_types.h index 6a641930d..8dd9a529e 100644 --- a/tinyusb/core/tusb_types.h +++ b/tinyusb/core/tusb_types.h @@ -194,6 +194,11 @@ typedef enum { BUS_EVENT_XFER_ERROR }tusb_bus_event_t; +enum { + DESCRIPTOR_OFFSET_LENGTH = 0, + DESCRIPTOR_OFFSET_TYPE = 1 +}; + #ifdef __cplusplus } #endif diff --git a/tinyusb/host/hcd.h b/tinyusb/host/hcd.h index ab324b6d4..05b4d6d6d 100644 --- a/tinyusb/host/hcd.h +++ b/tinyusb/host/hcd.h @@ -66,6 +66,12 @@ typedef struct { uint8_t index; } pipe_handle_t; +static inline bool pipehandle_is_valid(pipe_handle_t pipe_hdl) ATTR_CONST ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +static inline bool pipehandle_is_valid(pipe_handle_t pipe_hdl) +{ + return pipe_hdl.dev_addr > 0; +} + //--------------------------------------------------------------------+ // USBH-HCD API //--------------------------------------------------------------------+