diff --git a/tests/test/host/hid/test_hidh_keyboard.c b/tests/test/host/hid/test_hidh_keyboard.c index fc453176..101cc0bb 100644 --- a/tests/test/host/hid/test_hidh_keyboard.c +++ b/tests/test/host/hid/test_hidh_keyboard.c @@ -97,7 +97,6 @@ void test_keyboard_init(void) void test_keyboard_is_supported_fail_unplug(void) { - hidh_init(); tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_UNPLUG); TEST_ASSERT_FALSE( tusbh_hid_keyboard_is_supported(dev_addr) ); } @@ -134,6 +133,7 @@ void test_keyboard_open_ok(void) tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); TEST_ASSERT_TRUE( tusbh_hid_keyboard_is_supported(dev_addr) ); + TEST_ASSERT_EQUAL(TUSB_INTERFACE_STATUS_READY, p_hidh_kbd->status); } //--------------------------------------------------------------------+ @@ -166,12 +166,24 @@ void test_keyboard_get_report_xfer_failed() TEST_ASSERT_EQUAL(TUSB_ERROR_INVALID_PARA, tusbh_hid_keyboard_get_report(dev_addr, 0, &report)); } +void test_keyboard_get_report_xfer_failed_busy() +{ + tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); + p_hidh_kbd->status = TUSB_INTERFACE_STATUS_BUSY; + TEST_ASSERT_EQUAL(TUSB_ERROR_INTERFACE_IS_BUSY, tusbh_hid_keyboard_get_report(dev_addr, 0, &report)); +} + void test_keyboard_get_ok() { + tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); + TEST_ASSERT_EQUAL(TUSB_INTERFACE_STATUS_READY, tusbh_hid_keyboard_status(dev_addr, 0)); + tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); hcd_pipe_xfer_ExpectAndReturn(p_hidh_kbd->pipe_hdl, (uint8_t*) &report, p_hidh_kbd->report_size, true, TUSB_ERROR_NONE); //------------- Code Under TEST -------------// TEST_ASSERT_EQUAL(TUSB_ERROR_NONE, tusbh_hid_keyboard_get_report(dev_addr, 0, &report)); -} + tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); + TEST_ASSERT_EQUAL(TUSB_INTERFACE_STATUS_BUSY, tusbh_hid_keyboard_status(dev_addr, 0)); +} diff --git a/tinyusb/class/hid_host.c b/tinyusb/class/hid_host.c index 723fd64f..bd63aa99 100644 --- a/tinyusb/class/hid_host.c +++ b/tinyusb/class/hid_host.c @@ -95,12 +95,21 @@ tusb_error_t tusbh_hid_keyboard_get_report(uint8_t dev_addr, uint8_t instance_nu hidh_keyboard_info_t *p_keyboard = get_kbd_data(dev_addr); + ASSERT(TUSB_INTERFACE_STATUS_BUSY != p_keyboard->status, TUSB_ERROR_INTERFACE_IS_BUSY); + // TODO abstract to use hidh service ASSERT_STATUS( hcd_pipe_xfer(p_keyboard->pipe_hdl, (uint8_t*) report, p_keyboard->report_size, true) ) ; + p_keyboard->status = TUSB_INTERFACE_STATUS_BUSY; + return TUSB_ERROR_NONE; } +tusb_interface_status_t tusbh_hid_keyboard_status(uint8_t dev_addr, uint8_t instance_num) +{ + return tusbh_device_get_state(dev_addr) ? keyboard_data[dev_addr-1].status : TUSB_INTERFACE_STATUS_INVALID_PARA; +} + void hidh_keyboard_close(uint8_t dev_addr) { pipe_handle_t pipe_hdl = keyboard_data[dev_addr-1].pipe_hdl; diff --git a/tinyusb/class/hid_host.h b/tinyusb/class/hid_host.h index 482c3213..1846bf67 100644 --- a/tinyusb/class/hid_host.h +++ b/tinyusb/class/hid_host.h @@ -65,11 +65,12 @@ typedef struct { pipe_handle_t pipe_hdl; uint16_t report_size; + volatile tusb_interface_status_t status; }hidh_keyboard_info_t; bool tusbh_hid_keyboard_is_supported(uint8_t dev_addr) ATTR_PURE ATTR_WARN_UNUSED_RESULT; tusb_error_t tusbh_hid_keyboard_get_report(uint8_t dev_addr, uint8_t instance_num, tusb_keyboard_report_t * const report) ATTR_WARN_UNUSED_RESULT; -pipe_status_t tusbh_hid_keyboard_status(uint8_t dev_addr, uint8_t instance_num) ATTR_WARN_UNUSED_RESULT; +tusb_interface_status_t tusbh_hid_keyboard_status(uint8_t dev_addr, uint8_t instance_num) ATTR_WARN_UNUSED_RESULT; //--------------------------------------------------------------------+ // MOUSE Public API diff --git a/tinyusb/common/errors.h b/tinyusb/common/errors.h index 95ac2092..41d8d43f 100644 --- a/tinyusb/common/errors.h +++ b/tinyusb/common/errors.h @@ -63,6 +63,7 @@ ENTRY(TUSB_ERROR_NONE)\ ENTRY(TUSB_ERROR_INVALID_PARA)\ ENTRY(TUSB_ERROR_DEVICE_NOT_READY)\ + ENTRY(TUSB_ERROR_INTERFACE_IS_BUSY)\ 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/host/hcd.h b/tinyusb/host/hcd.h index 05b4d6d6..b3c4a57c 100644 --- a/tinyusb/host/hcd.h +++ b/tinyusb/host/hcd.h @@ -64,6 +64,7 @@ typedef struct { uint8_t dev_addr; uint8_t xfer_type; uint8_t index; + uint8_t reserved; } pipe_handle_t; static inline bool pipehandle_is_valid(pipe_handle_t pipe_hdl) ATTR_CONST ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; diff --git a/tinyusb/host/usbh.c b/tinyusb/host/usbh.c index 7deb68bb..08ab5688 100644 --- a/tinyusb/host/usbh.c +++ b/tinyusb/host/usbh.c @@ -148,13 +148,13 @@ tusb_error_t usbh_control_xfer_subtask(uint8_t dev_addr, tusb_std_request_t cons OSAL_SUBTASK_BEGIN - usbh_devices[dev_addr].control.pipe_status = PIPE_STATUS_BUSY; + usbh_devices[dev_addr].control.pipe_status = TUSB_INTERFACE_STATUS_BUSY; usbh_devices[dev_addr].control.request = *p_request; (void) hcd_pipe_control_xfer(dev_addr, &usbh_devices[dev_addr].control.request, data); osal_semaphore_wait(usbh_devices[dev_addr].control.sem_hdl, OSAL_TIMEOUT_NORMAL, &error); // careful of local variable without static // TODO make handler for this function general purpose - SUBTASK_ASSERT_STATUS_WITH_HANDLER(error || usbh_devices[dev_addr].control.pipe_status == PIPE_STATUS_ERROR, + SUBTASK_ASSERT_STATUS_WITH_HANDLER(error || usbh_devices[dev_addr].control.pipe_status == TUSB_INTERFACE_STATUS_ERROR, tusbh_device_mount_failed_cb(TUSB_ERROR_USBH_MOUNT_DEVICE_NOT_RESPOND, NULL) ); OSAL_SUBTASK_END @@ -178,9 +178,9 @@ static inline tusb_error_t usbh_pipe_control_close(uint8_t dev_addr) return TUSB_ERROR_NONE; } -pipe_status_t usbh_pipe_status_get(pipe_handle_t pipe_hdl) +tusb_interface_status_t usbh_pipe_status_get(pipe_handle_t pipe_hdl) { - return PIPE_STATUS_BUSY; + return TUSB_INTERFACE_STATUS_BUSY; } //--------------------------------------------------------------------+ @@ -191,7 +191,7 @@ void usbh_isr(pipe_handle_t pipe_hdl, uint8_t class_code, tusb_bus_event_t event { if (class_code == 0) // Control transfer { - usbh_devices[ pipe_hdl.dev_addr ].control.pipe_status = (event == BUS_EVENT_XFER_COMPLETE) ? PIPE_STATUS_COMPLETE : PIPE_STATUS_ERROR; + usbh_devices[ pipe_hdl.dev_addr ].control.pipe_status = (event == BUS_EVENT_XFER_COMPLETE) ? TUSB_INTERFACE_STATUS_COMPLETE : TUSB_INTERFACE_STATUS_ERROR; osal_semaphore_post( usbh_devices[ pipe_hdl.dev_addr ].control.sem_hdl ); }else if (usbh_class_drivers[class_code].isr) { diff --git a/tinyusb/host/usbh.h b/tinyusb/host/usbh.h index 1e1653e8..68450547 100644 --- a/tinyusb/host/usbh.h +++ b/tinyusb/host/usbh.h @@ -63,12 +63,13 @@ //--------------------------------------------------------------------+ // MACRO CONSTANT TYPEDEF //--------------------------------------------------------------------+ -typedef enum pipe_status_{ - PIPE_STATUS_READY = 0, - PIPE_STATUS_BUSY, - PIPE_STATUS_COMPLETE, - PIPE_STATUS_ERROR -} pipe_status_t; +typedef enum tusb_interface_status_{ + TUSB_INTERFACE_STATUS_READY = 0, + TUSB_INTERFACE_STATUS_BUSY, + TUSB_INTERFACE_STATUS_COMPLETE, + TUSB_INTERFACE_STATUS_ERROR, + TUSB_INTERFACE_STATUS_INVALID_PARA +} tusb_interface_status_t; typedef struct { void (* const init) (void); @@ -84,9 +85,9 @@ typedef struct { // APPLICATION API //--------------------------------------------------------------------+ tusb_error_t tusbh_configuration_set (uint8_t dev_addr, uint8_t configure_number) ATTR_WARN_UNUSED_RESULT; -tusb_device_state_t tusbh_device_get_state (uint8_t const dev_addr) ATTR_WARN_UNUSED_RESULT ATTR_PURE; -static inline bool tusbh_device_is_configured(uint8_t const dev_addr) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_PURE; -static inline bool tusbh_device_is_configured(uint8_t const dev_addr) +tusb_device_state_t tusbh_device_get_state (uint8_t dev_addr) ATTR_WARN_UNUSED_RESULT ATTR_PURE; +static inline bool tusbh_device_is_configured(uint8_t dev_addr) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_PURE; +static inline bool tusbh_device_is_configured(uint8_t dev_addr) { return tusbh_device_get_state(dev_addr) == TUSB_DEVICE_STATE_CONFIGURED; }