From 086a8e4a2dbd78dc42a6359c40e1920c9b93a701 Mon Sep 17 00:00:00 2001 From: hathach Date: Tue, 26 Mar 2013 02:02:54 +0700 Subject: [PATCH] add flag_supported_class to usbh_devices remove all ATTR_WEAK in init,open,isr,close driver functions of USBH-CLASS API - prefer testing --- .../ehci/test_ehci_usbh_hcd_integration.c | 2 + .../host/hid/{test_hidh.c => test_hid_host.c} | 42 +++++++++++++------ tests/test/host/hid/test_hidh_keyboard.c | 2 +- tests/test/host/test_enum_task.c | 1 + tinyusb/class/hid_host.c | 10 +++++ tinyusb/class/hid_host.h | 10 ++--- tinyusb/host/usbh.c | 14 ++++++- tinyusb/host/usbh_hcd.h | 8 ++-- 8 files changed, 66 insertions(+), 23 deletions(-) rename tests/test/host/hid/{test_hidh.c => test_hid_host.c} (64%) diff --git a/tests/test/host/ehci/test_ehci_usbh_hcd_integration.c b/tests/test/host/ehci/test_ehci_usbh_hcd_integration.c index b1417c388..ee640fff2 100644 --- a/tests/test/host/ehci/test_ehci_usbh_hcd_integration.c +++ b/tests/test/host/ehci/test_ehci_usbh_hcd_integration.c @@ -42,6 +42,8 @@ #include "hal.h" #include "mock_osal.h" +#include "mock_hid_host.h" + #include "hcd.h" #include "usbh_hcd.h" #include "usbh.h" diff --git a/tests/test/host/hid/test_hidh.c b/tests/test/host/hid/test_hid_host.c similarity index 64% rename from tests/test/host/hid/test_hidh.c rename to tests/test/host/hid/test_hid_host.c index 412b5d820..3a398257c 100644 --- a/tests/test/host/hid/test_hidh.c +++ b/tests/test/host/hid/test_hid_host.c @@ -37,44 +37,62 @@ #include "stdlib.h" #include "unity.h" -#include "common/common.h" +#include "tusb_option.h" #include "errors.h" -#include "hid_host.h" +#include "binary.h" +#include "descriptor_test.h" #include "mock_osal.h" #include "mock_hcd.h" #include "mock_usbh.h" #include "mock_hid_host_keyboard.h" - +#include "hid_host.h" uint8_t dev_addr; -uint8_t instance_num; + +tusb_descriptor_interface_t const *p_kbd_interface_desc = &desc_configuration.keyboard_interface; +tusb_hid_descriptor_hid_t const *p_kbh_hid_desc = &desc_configuration.keyboard_hid; +tusb_descriptor_endpoint_t const *p_kdb_endpoint_desc = &desc_configuration.keyboard_endpoint; void setUp(void) { - instance_num = 0; -// dev_addr = RANDOM(TUSB_CFG_HOST_DEVICE_MAX)+1; + dev_addr = RANDOM(TUSB_CFG_HOST_DEVICE_MAX)+1; } void tearDown(void) { } -void test_hidh_init(void) +void test_hidh_init_ok(void) { - hidh_keyboard_init_Expect(); +// hidh_keyboard_init_Expect(); + // TODO mouse, generic expect //------------- Code Under TEST -------------// - if (!hidh_init) - TEST_IGNORE(); +// hidh_init(); +} +void test_hidh_open_ok(void) +{ + uint16_t length=0; +// +// hidh_keyboard_open_subtask_ExpectAndReturn(dev_addr, p_kbd_interface_desc, &length, TUSB_ERROR_NONE); +// + //------------- Code Under TEST -------------// +// hidh_open_subtask(dev_addr, (uint8_t*) p_kbd_interface_desc, &length); + +// TEST_ASSERT_EQUAL(sizeof(tusb_descriptor_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + sizeof(tusb_descriptor_endpoint_t), +// length); } void test_hidh_close(void) { - if (!hidh_close) - TEST_IGNORE(); + hidh_keyboard_init_Ignore(); + hidh_keyboard_close_Expect(dev_addr); + + //------------- Code Under TEST -------------// +// hidh_close(dev_addr); } void test_hihd_isr(void) diff --git a/tests/test/host/hid/test_hidh_keyboard.c b/tests/test/host/hid/test_hidh_keyboard.c index d63a5eedb..528f146e2 100644 --- a/tests/test/host/hid/test_hidh_keyboard.c +++ b/tests/test/host/hid/test_hidh_keyboard.c @@ -126,7 +126,7 @@ void test_keyboard_open_ok(void) TEST_ASSERT_PIPE_HANDLE(pipe_hdl, p_hidh_kbd->pipe_hdl); TEST_ASSERT_EQUAL(8, p_hidh_kbd->report_size); TEST_ASSERT_EQUAL(sizeof(tusb_descriptor_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + sizeof(tusb_descriptor_endpoint_t), - length); + length); tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED); TEST_ASSERT_TRUE( tusbh_hid_keyboard_is_supported(dev_addr) ); diff --git a/tests/test/host/test_enum_task.c b/tests/test/host/test_enum_task.c index f407e84df..70dc8d398 100644 --- a/tests/test/host/test_enum_task.c +++ b/tests/test/host/test_enum_task.c @@ -256,6 +256,7 @@ void test_enum_parse_config_desc(void) usbh_enumeration_task(); TEST_ASSERT_EQUAL(desc_configuration.configuration.bNumInterfaces, usbh_devices[1].interface_count); + TEST_ASSERT_EQUAL(TUSB_CLASS_FLAG_HID, usbh_devices[1].flag_supported_class); // TODO change later } void test_enum_set_configure(void) diff --git a/tinyusb/class/hid_host.c b/tinyusb/class/hid_host.c index 944339344..a01c57963 100644 --- a/tinyusb/class/hid_host.c +++ b/tinyusb/class/hid_host.c @@ -111,7 +111,17 @@ void hidh_isr(pipe_handle_t pipe_hdl, tusb_bus_event_t event) void hidh_close(uint8_t dev_addr) { +#if TUSB_CFG_HOST_HID_KEYBOARD + hidh_keyboard_close(dev_addr); +#endif +#if TUSB_CFG_HOST_HID_MOUSE + hidh_mouse_close(dev_addr); +#endif + +#if TUSB_CFG_HOST_HID_GENERIC + hidh_generic_close(dev_addr); +#endif } #endif diff --git a/tinyusb/class/hid_host.h b/tinyusb/class/hid_host.h index f4f1cbb9b..b06d74eed 100644 --- a/tinyusb/class/hid_host.h +++ b/tinyusb/class/hid_host.h @@ -72,14 +72,14 @@ //--------------------------------------------------------------------+ //--------------------------------------------------------------------+ -// CLASS DRIVER FUNCTION (all declared with WEAK) +// CLASS DRIVER FUNCTION //--------------------------------------------------------------------+ #ifdef _TINY_USB_SOURCE_FILE_ -void hidh_init(void) ATTR_WEAK; -tusb_error_t hidh_open_subtask(uint8_t dev_addr, uint8_t const *descriptor, uint16_t *p_length) ATTR_WEAK ATTR_WARN_UNUSED_RESULT; -void hidh_isr(pipe_handle_t pipe_hdl, tusb_bus_event_t event) ATTR_WEAK; -void hidh_close(uint8_t dev_addr) ATTR_WEAK; +void hidh_init(void); +tusb_error_t hidh_open_subtask(uint8_t dev_addr, uint8_t const *descriptor, uint16_t *p_length) ATTR_WARN_UNUSED_RESULT; +void hidh_isr(pipe_handle_t pipe_hdl, tusb_bus_event_t event); +void hidh_close(uint8_t dev_addr); #endif diff --git a/tinyusb/host/usbh.c b/tinyusb/host/usbh.c index c6fc411fa..587e8a840 100644 --- a/tinyusb/host/usbh.c +++ b/tinyusb/host/usbh.c @@ -63,19 +63,24 @@ void tusb_tick_tock(void) // TODO fix/compress number of class driver static host_class_driver_t const usbh_class_drivers[TUSB_CLASS_MAX_CONSEC_NUMBER] = { +#if HOST_CLASS_HID [TUSB_CLASS_HID] = { .init = hidh_init, .open_subtask = hidh_open_subtask, .isr = hidh_isr, .close = hidh_close }, +#endif +#if TUSB_CFG_HOST_CLASS_MSC [TUSB_CLASS_MSC] = { .init = msch_init, .open_subtask = msch_open_subtask, .isr = msch_isr, .close = msch_close } +#endif + }; //--------------------------------------------------------------------+ @@ -237,6 +242,7 @@ void usbh_device_unplugged_isr(uint8_t hostid) // set to REMOVING to allow HCD to clean up its cached data for this device // HCD must set this device's state to TUSB_DEVICE_STATE_UNPLUG when done usbh_devices[dev_addr].state = TUSB_DEVICE_STATE_REMOVING; + usbh_devices[dev_addr].flag_supported_class = 0; } //--------------------------------------------------------------------+ @@ -384,12 +390,16 @@ OSAL_TASK_DECLARE(usbh_enumeration_task) { TASK_ASSERT( false ); // corrupted data, abort enumeration } - // supported class - else if ( class_code < TUSB_CLASS_MAX_CONSEC_NUMBER && usbh_class_drivers[class_code].open_subtask) // TODO custom class + // supported class TODO custom class + else if ( class_code < TUSB_CLASS_MAX_CONSEC_NUMBER && usbh_class_drivers[class_code].open_subtask) { uint16_t length=0; OSAL_SUBTASK_INVOKED_AND_WAIT ( // parameters in task/sub_task must be static storage (static or global) usbh_class_drivers[ ((tusb_descriptor_interface_t*) p_desc)->bInterfaceClass ].open_subtask(new_addr, p_desc, &length) ); + + // TODO check class_open_subtask status + usbh_devices[new_addr].flag_supported_class |= BIT_(((tusb_descriptor_interface_t*) p_desc)->bInterfaceClass); + p_desc += length; } else // unsupported class (not enable or yet implemented) { diff --git a/tinyusb/host/usbh_hcd.h b/tinyusb/host/usbh_hcd.h index fd3430042..815d35b32 100644 --- a/tinyusb/host/usbh_hcd.h +++ b/tinyusb/host/usbh_hcd.h @@ -76,21 +76,23 @@ typedef struct ATTR_ALIGNED(4){ } usbh_enumerate_t; typedef struct { // TODO internal structure, re-order members - //------------- port info -------------// + //------------- port -------------// uint8_t core_id; uint8_t hub_addr; uint8_t hub_port; uint8_t speed; - //------------- device descriptor info -------------// + //------------- device descriptor -------------// uint16_t vendor_id; uint16_t product_id; uint8_t configure_count; // bNumConfigurations alias - //------------- configuration descriptor info -------------// + //------------- configuration descriptor -------------// uint8_t interface_count; // bNumInterfaces alias + //------------- device -------------// volatile uint8_t state; // device state, value from enum tusbh_device_state_t + uint32_t flag_supported_class; // a bitmap of supported class //------------- control pipe -------------// struct {