diff --git a/tests/test/host/test_hidh.c b/tests/test/host/hid/test_hidh.c similarity index 99% rename from tests/test/host/test_hidh.c rename to tests/test/host/hid/test_hidh.c index f27a19b2c..838805c63 100644 --- a/tests/test/host/test_hidh.c +++ b/tests/test/host/hid/test_hidh.c @@ -45,7 +45,7 @@ void tearDown(void) { } -void test_() +void test_hidh() { TEST_IGNORE(); } diff --git a/tests/test/host/test_hidh_keyboard.c b/tests/test/host/hid/test_hidh_keyboard.c similarity index 99% rename from tests/test/host/test_hidh_keyboard.c rename to tests/test/host/hid/test_hidh_keyboard.c index 5153a5f2d..a74594603 100644 --- a/tests/test/host/test_hidh_keyboard.c +++ b/tests/test/host/hid/test_hidh_keyboard.c @@ -39,6 +39,7 @@ #include "unity.h" #include "errors.h" #include "hid_host.h" +#include "hid_host_keyboard.h" #include "mock_osal.h" #include "mock_usbh.h" #include "mock_hcd.h" diff --git a/tinyusb/class/hid_host.c b/tinyusb/class/hid_host.c index e322349b5..91a5c4991 100644 --- a/tinyusb/class/hid_host.c +++ b/tinyusb/class/hid_host.c @@ -47,7 +47,6 @@ #include "common/common.h" #include "hid_host.h" -#if TUSB_CFG_HOST_HID_KEYBOARD //--------------------------------------------------------------------+ // MACRO CONSTANT TYPEDEF //--------------------------------------------------------------------+ @@ -55,37 +54,6 @@ //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION //--------------------------------------------------------------------+ -STATIC_ hidh_keyboard_info_t keyboard_data[TUSB_CFG_HOST_DEVICE_MAX]; // does not have addr0, index = dev_address-1 - - -//--------------------------------------------------------------------+ -// PUBLIC API (Parameter Verification is required) -//--------------------------------------------------------------------+ -tusb_error_t tusbh_hid_keyboard_get(uint8_t const 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); - ASSERT(instance_num < TUSB_CFG_HOST_HID_KEYBOARD_NO_INSTANCES_PER_DEVICE, 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); - - // TODO abtract to use hidh service - ASSERT_STATUS( hcd_pipe_xfer(p_kbd->pipe_in, report, p_kbd->report_size, 1) ) ; - - return TUSB_ERROR_NONE; -} - -uint8_t tusbh_hid_keyboard_no_instances(uint8_t const dev_addr) -{ - ASSERT(tusbh_device_is_configured(dev_addr), 0); - - return keyboard_data[dev_addr-1].instance_count; -} //--------------------------------------------------------------------+ // CLASS-USBD API (don't require to verify parameters) @@ -95,19 +63,29 @@ void hidh_init(void) #if TUSB_CFG_HOST_HID_KEYBOARD hidh_keyboard_init(); #endif + +#if TUSB_CFG_HOST_HID_MOUSE + hidh_mouse_init(); +#endif + +#if TUSB_CFG_HOST_HID_GENERIC + hidh_generic_init(); +#endif } -void hidh_keyboard_init(void) +tusb_error_t hidh_open_subtask(uint8_t dev_addr, uint8_t const *descriptor, uint16_t *p_length) { - memclr_(&keyboard_data, sizeof(hidh_keyboard_info_t)*TUSB_CFG_HOST_DEVICE_MAX); -} - -tusb_error_t hidh_keyboard_install(uint8_t const dev_addr, uint8_t const *descriptor) -{ - keyboard_data[dev_addr-1].instance_count++; - return TUSB_ERROR_NONE; } -#endif + +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/class/hid_host.h b/tinyusb/class/hid_host.h index a61f56125..f4f1cbb9b 100644 --- a/tinyusb/class/hid_host.h +++ b/tinyusb/class/hid_host.h @@ -59,45 +59,27 @@ #include "host/usbh.h" #include "hid.h" +#if TUSB_CFG_HOST_HID_KEYBOARD + #include "hid_host_keyboard.h" +#endif + +#if TUSB_CFG_HOST_HID_MOUSE + #include "hid_host_mouse.h" +#endif + //--------------------------------------------------------------------+ // APPLICATION API //--------------------------------------------------------------------+ -uint8_t tusbh_hid_keyboard_no_instances(uint8_t const dev_addr) ATTR_PURE ATTR_WARN_UNUSED_RESULT; -static inline bool tusbh_hid_keyboard_is_supported(uint8_t const dev_addr) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_PURE; -static inline bool tusbh_hid_keyboard_is_supported(uint8_t const dev_addr) -{ - return tusbh_hid_keyboard_no_instances(dev_addr) > 0; -} - -tusb_error_t tusbh_hid_keyboard_get(uint8_t const handle, uint8_t const instance_num, tusb_keyboard_report_t * const report) ATTR_WARN_UNUSED_RESULT; -pipe_status_t tusbh_hid_keyboard_pipe_status(uint8_t const handle, uint8_t const instance_num) ATTR_WARN_UNUSED_RESULT; - -//--------------------------------------------------------------------+ -// INTERNAL API -//--------------------------------------------------------------------+ -#ifdef _TINY_USB_SOURCE_FILE_ - -typedef struct { - pipe_handle_t pipe_in; - uint8_t report_size; - uint8_t buffer[TUSB_CFG_HOST_HID_KEYBOARD_ENDPOINT_SIZE]; -}keyboard_interface_t; - -typedef struct { - uint8_t instance_count; - keyboard_interface_t instance[TUSB_CFG_HOST_HID_KEYBOARD_NO_INSTANCES_PER_DEVICE]; -} hidh_keyboard_info_t; - -void hidh_keyboard_init(void); -tusb_error_t hidh_keyboard_install(uint8_t dev_addr, uint8_t const *descriptor) ATTR_WARN_UNUSED_RESULT; //--------------------------------------------------------------------+ // CLASS DRIVER FUNCTION (all declared with WEAK) //--------------------------------------------------------------------+ +#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_isr(pipe_handle_t pipe_hdl, tusb_bus_event_t event) ATTR_WEAK; +void hidh_close(uint8_t dev_addr) ATTR_WEAK; #endif diff --git a/tinyusb/class/hid_host_keyboard.c b/tinyusb/class/hid_host_keyboard.c new file mode 100644 index 000000000..2bb9503c0 --- /dev/null +++ b/tinyusb/class/hid_host_keyboard.c @@ -0,0 +1,102 @@ +/* + * hid_host_keyboard.c + * + * Created on: Mar 25, 2013 + * Author: hathach + */ + +/* + * Software License Agreement (BSD License) + * Copyright (c) 2012, hathach (tinyusb.net) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the tiny usb stack. + */ + +#include "tusb_option.h" + +#if (MODE_HOST_SUPPORTED && TUSB_CFG_HOST_HID_KEYBOARD) + +#define _TINY_USB_SOURCE_FILE_ + +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ +#include "common/common.h" +#include "hid_host.h" + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +STATIC_ hidh_keyboard_info_t keyboard_data[TUSB_CFG_HOST_DEVICE_MAX]; // does not have addr0, index = dev_address-1 + +//--------------------------------------------------------------------+ +// IMPLEMENTATION +//--------------------------------------------------------------------+ + +//------------- PUBLIC API (Parameter Verification is required) -------------// +tusb_error_t tusbh_hid_keyboard_get(uint8_t const 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); + ASSERT(instance_num < TUSB_CFG_HOST_HID_KEYBOARD_NO_INSTANCES_PER_DEVICE, 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); + + // TODO abtract to use hidh service + ASSERT_STATUS( hcd_pipe_xfer(p_kbd->pipe_in, report, p_kbd->report_size, 1) ) ; + + return TUSB_ERROR_NONE; +} + +uint8_t tusbh_hid_keyboard_no_instances(uint8_t const dev_addr) +{ + ASSERT(tusbh_device_is_configured(dev_addr), 0); + + return keyboard_data[dev_addr-1].instance_count; +} + +void hidh_keyboard_init(void) +{ + memclr_(&keyboard_data, sizeof(hidh_keyboard_info_t)*TUSB_CFG_HOST_DEVICE_MAX); +} + +tusb_error_t hidh_keyboard_install(uint8_t const dev_addr, uint8_t const *descriptor) +{ + keyboard_data[dev_addr-1].instance_count++; + + return TUSB_ERROR_NONE; +} + +#endif diff --git a/tinyusb/class/hid_host_keyboard.h b/tinyusb/class/hid_host_keyboard.h new file mode 100644 index 000000000..a3c096bf6 --- /dev/null +++ b/tinyusb/class/hid_host_keyboard.h @@ -0,0 +1,99 @@ +/* + * hid_host_keyboard.h + * + * Created on: Mar 25, 2013 + * Author: hathach + */ + +/* + * Software License Agreement (BSD License) + * Copyright (c) 2012, hathach (tinyusb.net) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the tiny usb stack. + */ + +/** \file + * \brief TBD + * + * \note TBD + */ + +/** \ingroup TBD + * \defgroup TBD + * \brief TBD + * + * @{ + */ + +#ifndef _TUSB_HID_HOST_KEYBOARD_H_ +#define _TUSB_HID_HOST_KEYBOARD_H_ + +#include "common/common.h" + +#ifdef __cplusplus + extern "C" { +#endif + +//--------------------------------------------------------------------+ +// PUBLIC API (parameter validation required) +//--------------------------------------------------------------------+ +uint8_t tusbh_hid_keyboard_no_instances(uint8_t const dev_addr) ATTR_PURE ATTR_WARN_UNUSED_RESULT; +static inline bool tusbh_hid_keyboard_is_supported(uint8_t const dev_addr) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_PURE; +static inline bool tusbh_hid_keyboard_is_supported(uint8_t const dev_addr) +{ + return tusbh_hid_keyboard_no_instances(dev_addr) > 0; +} + +tusb_error_t tusbh_hid_keyboard_get(uint8_t const dev_addr, uint8_t const instance_num, tusb_keyboard_report_t * const report) ATTR_WARN_UNUSED_RESULT; +pipe_status_t tusbh_hid_keyboard_pipe_status(uint8_t const dev_addr, uint8_t const instance_num) ATTR_WARN_UNUSED_RESULT; + +//--------------------------------------------------------------------+ +// INTERNAL API (no need for parameter validation) +//--------------------------------------------------------------------+ +#ifdef _TINY_USB_SOURCE_FILE_ + +typedef struct { + pipe_handle_t pipe_in; + uint16_t report_size; +}keyboard_interface_t; + +typedef struct { + uint8_t instance_count; + keyboard_interface_t instance[TUSB_CFG_HOST_HID_KEYBOARD_NO_INSTANCES_PER_DEVICE]; +} hidh_keyboard_info_t; + +void hidh_keyboard_init(void); +tusb_error_t hidh_keyboard_install(uint8_t dev_addr, uint8_t const *descriptor) ATTR_WARN_UNUSED_RESULT; + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_HID_HOST_KEYBOARD_H_ */ + +/** @} */