Просмотр исходного кода

rename pipe_status_t to tusb_interface_status_t
add tusbh_hid_keyboard_status & test code

hathach 13 лет назад
Родитель
Сommit
ac905a8d09

+ 14 - 2
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));
+}

+ 9 - 0
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;

+ 2 - 1
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

+ 1 - 0
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)\

+ 1 - 0
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;

+ 5 - 5
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)
   {

+ 10 - 9
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;
 }