From 16665672a45c4f85cb2e1a47873825f2b48fcf1a Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 30 Oct 2019 12:24:07 +0700 Subject: initally adding test_usbd.c --- test/project.yml | 5 +-- test/test/support/tusb_config.h | 11 +++---- test/test/test_usbd.c | 68 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 test/test/test_usbd.c (limited to 'test') diff --git a/test/project.yml b/test/project.yml index 403aa0119..cf29c3b04 100644 --- a/test/project.yml +++ b/test/project.yml @@ -9,6 +9,7 @@ :use_exceptions: TRUE :use_test_preprocessor: TRUE :use_auxiliary_dependencies: TRUE + :use_deep_dependencies: TRUE :build_root: _build # :release_build: TRUE :test_file_prefix: test_ @@ -41,10 +42,10 @@ :commmon: &common_defines [] :test: - *common_defines - - TEST + - _TEST_ :test_preprocess: - *common_defines - - TEST + - _TEST_ :cmock: :mock_prefix: mock_ diff --git a/test/test/support/tusb_config.h b/test/test/support/tusb_config.h index b82a09a23..bfe5bf9e9 100644 --- a/test/test/support/tusb_config.h +++ b/test/test/support/tusb_config.h @@ -73,12 +73,11 @@ #define CFG_TUD_ENDOINT0_SIZE 64 //------------- CLASS -------------// -#define CFG_TUD_CDC 1 -#define CFG_TUD_MSC 1 -#define CFG_TUD_HID 1 - -#define CFG_TUD_MIDI 1 -#define CFG_TUD_VENDOR 1 +#define CFG_TUD_CDC 0 +#define CFG_TUD_MSC 0 +#define CFG_TUD_HID 0 +#define CFG_TUD_MIDI 0 +#define CFG_TUD_VENDOR 0 //------------- CDC -------------// diff --git a/test/test/test_usbd.c b/test/test/test_usbd.c new file mode 100644 index 000000000..8c29ee853 --- /dev/null +++ b/test/test/test_usbd.c @@ -0,0 +1,68 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 hathach for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "unity.h" + +// Files to test +#include "tusb_fifo.h" +#include "tusb.h" +#include "usbd.h" +TEST_FILE("usbd_control.c") + +// Mock File +#include "mock_dcd.h" + +//--------------------------------------------------------------------+ +// MACRO TYPEDEF CONSTANT ENUM DECLARATION +//--------------------------------------------------------------------+ + +uint8_t const * tud_descriptor_device_cb(void) +{ + return NULL; +} + +uint8_t const * tud_descriptor_configuration_cb(uint8_t index) +{ + return NULL; +} + +uint16_t const* tud_descriptor_string_cb(uint8_t index) +{ + return NULL; +} + +//------------- IMPLEMENTATION -------------// +void setUp(void) +{ + +} + +void tearDown(void) +{ +} + +void test_ok(void) +{ + +} -- cgit v1.3.1 From 8f2e70756b582f75d47257c8f116449babb5059d Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 30 Oct 2019 16:19:47 +0700 Subject: added firs usbd test with get device descriptor --- test/project.yml | 1 + test/test/test_usbd.c | 68 ---------------------- test/test/test_usbd/test_usbd.c | 121 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 68 deletions(-) delete mode 100644 test/test/test_usbd.c create mode 100644 test/test/test_usbd/test_usbd.c (limited to 'test') diff --git a/test/project.yml b/test/project.yml index cf29c3b04..8ceaf63ce 100644 --- a/test/project.yml +++ b/test/project.yml @@ -54,6 +54,7 @@ :plugins: - :ignore - :callback + - :array :treat_as: uint8: HEX8 uint16: HEX16 diff --git a/test/test/test_usbd.c b/test/test/test_usbd.c deleted file mode 100644 index 8c29ee853..000000000 --- a/test/test/test_usbd.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 hathach for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "unity.h" - -// Files to test -#include "tusb_fifo.h" -#include "tusb.h" -#include "usbd.h" -TEST_FILE("usbd_control.c") - -// Mock File -#include "mock_dcd.h" - -//--------------------------------------------------------------------+ -// MACRO TYPEDEF CONSTANT ENUM DECLARATION -//--------------------------------------------------------------------+ - -uint8_t const * tud_descriptor_device_cb(void) -{ - return NULL; -} - -uint8_t const * tud_descriptor_configuration_cb(uint8_t index) -{ - return NULL; -} - -uint16_t const* tud_descriptor_string_cb(uint8_t index) -{ - return NULL; -} - -//------------- IMPLEMENTATION -------------// -void setUp(void) -{ - -} - -void tearDown(void) -{ -} - -void test_ok(void) -{ - -} diff --git a/test/test/test_usbd/test_usbd.c b/test/test/test_usbd/test_usbd.c new file mode 100644 index 000000000..fe8adf5d8 --- /dev/null +++ b/test/test/test_usbd/test_usbd.c @@ -0,0 +1,121 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 hathach for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "unity.h" + +// Files to test +#include "tusb_fifo.h" +#include "tusb.h" +#include "usbd.h" +TEST_FILE("usbd_control.c") +//TEST_FILE("usb_descriptors.c") + +// Mock File +#include "mock_dcd.h" + +//--------------------------------------------------------------------+ +// MACRO TYPEDEF CONSTANT ENUM DECLARATION +//--------------------------------------------------------------------+ + +uint8_t const rhport = 0; + +tusb_desc_device_t const desc_device = +{ + .bLength = sizeof(tusb_desc_device_t), + .bDescriptorType = TUSB_DESC_DEVICE, + .bcdUSB = 0x0200, + + // Use Interface Association Descriptor (IAD) for CDC + // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1) + .bDeviceClass = TUSB_CLASS_MISC, + .bDeviceSubClass = MISC_SUBCLASS_COMMON, + .bDeviceProtocol = MISC_PROTOCOL_IAD, + + .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, + + .idVendor = 0xCafe, + .idProduct = 0xCafe, + .bcdDevice = 0x0100, + + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x03, + + .bNumConfigurations = 0x01 +}; + +uint8_t const * tud_descriptor_device_cb(void) +{ + return (uint8_t const *) &desc_device; +} + +uint8_t const * tud_descriptor_configuration_cb(uint8_t index) +{ + TEST_FAIL(); + return NULL; +} + +uint16_t const* tud_descriptor_string_cb(uint8_t index) +{ + return NULL; +} + +void setUp(void) +{ + dcd_init_Expect(rhport); + dcd_int_enable_Expect(rhport); + tusb_init(); +} + +void tearDown(void) +{ +} + +//--------------------------------------------------------------------+ +// +//--------------------------------------------------------------------+ +void test_usbd_get_device_descriptor(void) +{ + tusb_control_request_t request = + { + .bmRequestType = 0x80, + .bRequest = TUSB_REQ_GET_DESCRIPTOR, + .wValue = (TUSB_DESC_DEVICE << 8), + .wIndex = 0x0000, + .wLength = 64 + }; + + dcd_int_disable_Expect(rhport); + dcd_int_enable_Expect(rhport); + dcd_event_setup_received(rhport, (uint8_t*) &request, false); + + dcd_int_disable_Expect(rhport); + dcd_int_enable_Expect(rhport); + + dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), true); + + dcd_int_disable_Expect(rhport); + dcd_int_enable_Expect(rhport); + tud_task(); +} -- cgit v1.3.1 From 58089934024c3869f90159641e2b569d663ce826 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 30 Oct 2019 23:22:07 +0700 Subject: add 2nd test, but failed due to lack of tusb_teardown() --- test/test/test_usbd/test_usbd.c | 53 ++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 19 deletions(-) (limited to 'test') diff --git a/test/test/test_usbd/test_usbd.c b/test/test/test_usbd/test_usbd.c index fe8adf5d8..0e746d371 100644 --- a/test/test/test_usbd/test_usbd.c +++ b/test/test/test_usbd/test_usbd.c @@ -65,9 +65,23 @@ tusb_desc_device_t const desc_device = .bNumConfigurations = 0x01 }; +tusb_control_request_t const req_get_desc_device = +{ + .bmRequestType = 0x80, + .bRequest = TUSB_REQ_GET_DESCRIPTOR, + .wValue = (TUSB_DESC_DEVICE << 8), + .wIndex = 0x0000, + .wLength = 64 +}; + +//--------------------------------------------------------------------+ +// +//--------------------------------------------------------------------+ +uint8_t const * ptr_desc_device; + uint8_t const * tud_descriptor_device_cb(void) { - return (uint8_t const *) &desc_device; + return ptr_desc_device; } uint8_t const * tud_descriptor_configuration_cb(uint8_t index) @@ -84,8 +98,13 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index) void setUp(void) { dcd_init_Expect(rhport); - dcd_int_enable_Expect(rhport); + + dcd_int_disable_Ignore(); + dcd_int_enable_Ignore(); + tusb_init(); + + ptr_desc_device = (uint8_t const *) &desc_device; } void tearDown(void) @@ -97,25 +116,21 @@ void tearDown(void) //--------------------------------------------------------------------+ void test_usbd_get_device_descriptor(void) { - tusb_control_request_t request = - { - .bmRequestType = 0x80, - .bRequest = TUSB_REQ_GET_DESCRIPTOR, - .wValue = (TUSB_DESC_DEVICE << 8), - .wIndex = 0x0000, - .wLength = 64 - }; - - dcd_int_disable_Expect(rhport); - dcd_int_enable_Expect(rhport); - dcd_event_setup_received(rhport, (uint8_t*) &request, false); - - dcd_int_disable_Expect(rhport); - dcd_int_enable_Expect(rhport); + dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), true); - dcd_int_disable_Expect(rhport); - dcd_int_enable_Expect(rhport); tud_task(); } + +void test_usbd_get_device_descriptor_null(void) +{ + ptr_desc_device = NULL; + +// dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); +// +// dcd_edpt_stall_Expect(rhport, 0); +// dcd_edpt_stall_Expect(rhport, 0x80); +// +// tud_task(); +} -- cgit v1.3.1 From 0653e1d1f5a82dc6713f4175fd12c62e353e4628 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 30 Oct 2019 23:34:09 +0700 Subject: fix 2nd test when tud_descriptor_device_cb() return NULL --- test/test/test_usbd/test_usbd.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'test') diff --git a/test/test/test_usbd/test_usbd.c b/test/test/test_usbd/test_usbd.c index 0e746d371..d4b3f806b 100644 --- a/test/test/test_usbd/test_usbd.c +++ b/test/test/test_usbd/test_usbd.c @@ -97,12 +97,14 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index) void setUp(void) { - dcd_init_Expect(rhport); - dcd_int_disable_Ignore(); dcd_int_enable_Ignore(); - tusb_init(); + if ( !tusb_inited() ) + { + dcd_init_Expect(rhport); + tusb_init(); + } ptr_desc_device = (uint8_t const *) &desc_device; } @@ -127,10 +129,10 @@ void test_usbd_get_device_descriptor_null(void) { ptr_desc_device = NULL; -// dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); -// -// dcd_edpt_stall_Expect(rhport, 0); -// dcd_edpt_stall_Expect(rhport, 0x80); -// -// tud_task(); + dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); + + dcd_edpt_stall_Expect(rhport, 0); + dcd_edpt_stall_Expect(rhport, 0x80); + + tud_task(); } -- cgit v1.3.1 From e69d2a4a834b975f957fc5341fe4d08cf706adb6 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 30 Oct 2019 23:41:42 +0700 Subject: move test_usbd around --- test/test/device/usbd/test_usbd.c | 138 ++++++++++++++++++++++++++++++++++++++ test/test/test_usbd/test_usbd.c | 138 -------------------------------------- 2 files changed, 138 insertions(+), 138 deletions(-) create mode 100644 test/test/device/usbd/test_usbd.c delete mode 100644 test/test/test_usbd/test_usbd.c (limited to 'test') diff --git a/test/test/device/usbd/test_usbd.c b/test/test/device/usbd/test_usbd.c new file mode 100644 index 000000000..d4b3f806b --- /dev/null +++ b/test/test/device/usbd/test_usbd.c @@ -0,0 +1,138 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 hathach for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "unity.h" + +// Files to test +#include "tusb_fifo.h" +#include "tusb.h" +#include "usbd.h" +TEST_FILE("usbd_control.c") +//TEST_FILE("usb_descriptors.c") + +// Mock File +#include "mock_dcd.h" + +//--------------------------------------------------------------------+ +// MACRO TYPEDEF CONSTANT ENUM DECLARATION +//--------------------------------------------------------------------+ + +uint8_t const rhport = 0; + +tusb_desc_device_t const desc_device = +{ + .bLength = sizeof(tusb_desc_device_t), + .bDescriptorType = TUSB_DESC_DEVICE, + .bcdUSB = 0x0200, + + // Use Interface Association Descriptor (IAD) for CDC + // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1) + .bDeviceClass = TUSB_CLASS_MISC, + .bDeviceSubClass = MISC_SUBCLASS_COMMON, + .bDeviceProtocol = MISC_PROTOCOL_IAD, + + .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, + + .idVendor = 0xCafe, + .idProduct = 0xCafe, + .bcdDevice = 0x0100, + + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x03, + + .bNumConfigurations = 0x01 +}; + +tusb_control_request_t const req_get_desc_device = +{ + .bmRequestType = 0x80, + .bRequest = TUSB_REQ_GET_DESCRIPTOR, + .wValue = (TUSB_DESC_DEVICE << 8), + .wIndex = 0x0000, + .wLength = 64 +}; + +//--------------------------------------------------------------------+ +// +//--------------------------------------------------------------------+ +uint8_t const * ptr_desc_device; + +uint8_t const * tud_descriptor_device_cb(void) +{ + return ptr_desc_device; +} + +uint8_t const * tud_descriptor_configuration_cb(uint8_t index) +{ + TEST_FAIL(); + return NULL; +} + +uint16_t const* tud_descriptor_string_cb(uint8_t index) +{ + return NULL; +} + +void setUp(void) +{ + dcd_int_disable_Ignore(); + dcd_int_enable_Ignore(); + + if ( !tusb_inited() ) + { + dcd_init_Expect(rhport); + tusb_init(); + } + + ptr_desc_device = (uint8_t const *) &desc_device; +} + +void tearDown(void) +{ +} + +//--------------------------------------------------------------------+ +// +//--------------------------------------------------------------------+ +void test_usbd_get_device_descriptor(void) +{ + dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); + + dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), true); + + tud_task(); +} + +void test_usbd_get_device_descriptor_null(void) +{ + ptr_desc_device = NULL; + + dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); + + dcd_edpt_stall_Expect(rhport, 0); + dcd_edpt_stall_Expect(rhport, 0x80); + + tud_task(); +} diff --git a/test/test/test_usbd/test_usbd.c b/test/test/test_usbd/test_usbd.c deleted file mode 100644 index d4b3f806b..000000000 --- a/test/test/test_usbd/test_usbd.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 hathach for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "unity.h" - -// Files to test -#include "tusb_fifo.h" -#include "tusb.h" -#include "usbd.h" -TEST_FILE("usbd_control.c") -//TEST_FILE("usb_descriptors.c") - -// Mock File -#include "mock_dcd.h" - -//--------------------------------------------------------------------+ -// MACRO TYPEDEF CONSTANT ENUM DECLARATION -//--------------------------------------------------------------------+ - -uint8_t const rhport = 0; - -tusb_desc_device_t const desc_device = -{ - .bLength = sizeof(tusb_desc_device_t), - .bDescriptorType = TUSB_DESC_DEVICE, - .bcdUSB = 0x0200, - - // Use Interface Association Descriptor (IAD) for CDC - // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1) - .bDeviceClass = TUSB_CLASS_MISC, - .bDeviceSubClass = MISC_SUBCLASS_COMMON, - .bDeviceProtocol = MISC_PROTOCOL_IAD, - - .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, - - .idVendor = 0xCafe, - .idProduct = 0xCafe, - .bcdDevice = 0x0100, - - .iManufacturer = 0x01, - .iProduct = 0x02, - .iSerialNumber = 0x03, - - .bNumConfigurations = 0x01 -}; - -tusb_control_request_t const req_get_desc_device = -{ - .bmRequestType = 0x80, - .bRequest = TUSB_REQ_GET_DESCRIPTOR, - .wValue = (TUSB_DESC_DEVICE << 8), - .wIndex = 0x0000, - .wLength = 64 -}; - -//--------------------------------------------------------------------+ -// -//--------------------------------------------------------------------+ -uint8_t const * ptr_desc_device; - -uint8_t const * tud_descriptor_device_cb(void) -{ - return ptr_desc_device; -} - -uint8_t const * tud_descriptor_configuration_cb(uint8_t index) -{ - TEST_FAIL(); - return NULL; -} - -uint16_t const* tud_descriptor_string_cb(uint8_t index) -{ - return NULL; -} - -void setUp(void) -{ - dcd_int_disable_Ignore(); - dcd_int_enable_Ignore(); - - if ( !tusb_inited() ) - { - dcd_init_Expect(rhport); - tusb_init(); - } - - ptr_desc_device = (uint8_t const *) &desc_device; -} - -void tearDown(void) -{ -} - -//--------------------------------------------------------------------+ -// -//--------------------------------------------------------------------+ -void test_usbd_get_device_descriptor(void) -{ - dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); - - dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), true); - - tud_task(); -} - -void test_usbd_get_device_descriptor_null(void) -{ - ptr_desc_device = NULL; - - dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); - - dcd_edpt_stall_Expect(rhport, 0); - dcd_edpt_stall_Expect(rhport, 0x80); - - tud_task(); -} -- cgit v1.3.1 From 6de9eb4b1a6bb84832ce4a55f050763d05f8a6b3 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 31 Oct 2019 13:06:57 +0700 Subject: add more tests, fix an issue with tud_descriptor_configuration_cb() return NULL --- src/device/usbd.c | 2 ++ test/test/device/usbd/test_usbd.c | 72 +++++++++++++++++++++++++++++++++------ 2 files changed, 63 insertions(+), 11 deletions(-) (limited to 'test') diff --git a/src/device/usbd.c b/src/device/usbd.c index 46affdab4..2d2f1cafd 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -785,6 +785,8 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const case TUSB_DESC_CONFIGURATION: { tusb_desc_configuration_t const* desc_config = (tusb_desc_configuration_t const*) tud_descriptor_configuration_cb(desc_index); + TU_ASSERT(desc_config); + uint16_t total_len; memcpy(&total_len, &desc_config->wTotalLength, 2); // possibly mis-aligned memory diff --git a/test/test/device/usbd/test_usbd.c b/test/test/device/usbd/test_usbd.c index d4b3f806b..b58a79a8f 100644 --- a/test/test/device/usbd/test_usbd.c +++ b/test/test/device/usbd/test_usbd.c @@ -40,7 +40,7 @@ TEST_FILE("usbd_control.c") uint8_t const rhport = 0; -tusb_desc_device_t const desc_device = +tusb_desc_device_t const data_desc_device = { .bLength = sizeof(tusb_desc_device_t), .bDescriptorType = TUSB_DESC_DEVICE, @@ -65,6 +65,12 @@ tusb_desc_device_t const desc_device = .bNumConfigurations = 0x01 }; +uint8_t const data_desc_configuration[] = +{ + // Interface count, string index, total length, attribute, power in mA + TUD_CONFIG_DESCRIPTOR(0, 0, TUD_CONFIG_DESC_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), +}; + tusb_control_request_t const req_get_desc_device = { .bmRequestType = 0x80, @@ -74,20 +80,29 @@ tusb_control_request_t const req_get_desc_device = .wLength = 64 }; +tusb_control_request_t const req_get_desc_configuration = +{ + .bmRequestType = 0x80, + .bRequest = TUSB_REQ_GET_DESCRIPTOR, + .wValue = (TUSB_DESC_CONFIGURATION << 8), + .wIndex = 0x0000, + .wLength = 256 +}; + +uint8_t const* desc_device; +uint8_t const* desc_configuration; + //--------------------------------------------------------------------+ // //--------------------------------------------------------------------+ -uint8_t const * ptr_desc_device; - uint8_t const * tud_descriptor_device_cb(void) { - return ptr_desc_device; + return desc_device; } uint8_t const * tud_descriptor_configuration_cb(uint8_t index) { - TEST_FAIL(); - return NULL; + return desc_configuration; } uint16_t const* tud_descriptor_string_cb(uint8_t index) @@ -105,8 +120,6 @@ void setUp(void) dcd_init_Expect(rhport); tusb_init(); } - - ptr_desc_device = (uint8_t const *) &desc_device; } void tearDown(void) @@ -114,20 +127,23 @@ void tearDown(void) } //--------------------------------------------------------------------+ -// +// Get Descriptor //--------------------------------------------------------------------+ + +//------------- Device -------------// void test_usbd_get_device_descriptor(void) { + desc_device = (uint8_t const *) &data_desc_device; dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); - dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), true); + dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&data_desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), true); tud_task(); } void test_usbd_get_device_descriptor_null(void) { - ptr_desc_device = NULL; + desc_device = NULL; dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); @@ -136,3 +152,37 @@ void test_usbd_get_device_descriptor_null(void) tud_task(); } + +//------------- Configuration -------------// + +void test_usbd_get_configuration_descriptor(void) +{ + desc_configuration = data_desc_configuration; + uint16_t total_len = ((tusb_desc_configuration_t const*) data_desc_configuration)->wTotalLength; + + dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_configuration, false); + + dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*) data_desc_configuration, total_len, total_len, true); + + tud_task(); +} + +void test_usbd_get_configuration_descriptor_null(void) +{ + desc_configuration = NULL; + dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_configuration, false); + + dcd_edpt_stall_Expect(rhport, 0); + dcd_edpt_stall_Expect(rhport, 0x80); + + tud_task(); +} + +//--------------------------------------------------------------------+ +// Control ZLP +//--------------------------------------------------------------------+ + +//void test_control_zlp(void) +//{ +// +//} -- cgit v1.3.1 From 6067adcd08df5eabcfb99cd62611835dc1738c90 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 31 Oct 2019 16:42:51 +0700 Subject: adeded tests for zlp --- test/test/device/usbd/test_usbd.c | 63 ++++++++++++++++++++++++++++++++++----- test/test/support/tusb_config.h | 11 +++---- 2 files changed, 61 insertions(+), 13 deletions(-) (limited to 'test') diff --git a/test/test/device/usbd/test_usbd.c b/test/test/device/usbd/test_usbd.c index b58a79a8f..ea813ea43 100644 --- a/test/test/device/usbd/test_usbd.c +++ b/test/test/device/usbd/test_usbd.c @@ -38,6 +38,12 @@ TEST_FILE("usbd_control.c") // MACRO TYPEDEF CONSTANT ENUM DECLARATION //--------------------------------------------------------------------+ +enum +{ + EDPT_CTRL_OUT = 0x00, + EDPT_CTRL_IN = 0x80 +}; + uint8_t const rhport = 0; tusb_desc_device_t const data_desc_device = @@ -136,7 +142,12 @@ void test_usbd_get_device_descriptor(void) desc_device = (uint8_t const *) &data_desc_device; dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); + // data dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&data_desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), true); + dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, sizeof(tusb_desc_device_t), 0, false); + + // status + dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_OUT, NULL, 0, true); tud_task(); } @@ -147,8 +158,8 @@ void test_usbd_get_device_descriptor_null(void) dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false); - dcd_edpt_stall_Expect(rhport, 0); - dcd_edpt_stall_Expect(rhport, 0x80); + dcd_edpt_stall_Expect(rhport, EDPT_CTRL_OUT); + dcd_edpt_stall_Expect(rhport, EDPT_CTRL_IN); tud_task(); } @@ -162,7 +173,12 @@ void test_usbd_get_configuration_descriptor(void) dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_configuration, false); + // data dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*) data_desc_configuration, total_len, total_len, true); + dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, total_len, 0, false); + + // status + dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_OUT, NULL, 0, true); tud_task(); } @@ -172,8 +188,8 @@ void test_usbd_get_configuration_descriptor_null(void) desc_configuration = NULL; dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_configuration, false); - dcd_edpt_stall_Expect(rhport, 0); - dcd_edpt_stall_Expect(rhport, 0x80); + dcd_edpt_stall_Expect(rhport, EDPT_CTRL_OUT); + dcd_edpt_stall_Expect(rhport, EDPT_CTRL_IN); tud_task(); } @@ -182,7 +198,38 @@ void test_usbd_get_configuration_descriptor_null(void) // Control ZLP //--------------------------------------------------------------------+ -//void test_control_zlp(void) -//{ -// -//} +void test_usbd_control_zlp(void) +{ + // 128 byte total len, with EP0 size = 64, and request length = 256 + // ZLP must be return + uint8_t zlp_desc_configuration[] = + { + // Interface count, string index, total length, attribute, power in mA + TUD_CONFIG_DESCRIPTOR(0, 0, CFG_TUD_ENDOINT0_SIZE*2, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), + }; + + desc_configuration = zlp_desc_configuration; + + // request, then 1st, 2nd xact + ZLP + status + dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_configuration, false); + + // 1st transaction + dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, EDPT_CTRL_IN, + zlp_desc_configuration, CFG_TUD_ENDOINT0_SIZE, CFG_TUD_ENDOINT0_SIZE, true); + dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, CFG_TUD_ENDOINT0_SIZE, 0, false); + + // 2nd transaction + dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, EDPT_CTRL_IN, + zlp_desc_configuration + CFG_TUD_ENDOINT0_SIZE, CFG_TUD_ENDOINT0_SIZE, CFG_TUD_ENDOINT0_SIZE, true); + dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, CFG_TUD_ENDOINT0_SIZE, 0, false); + + // Expect Zero length Packet + dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_IN, NULL, 0, true); + dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, 0, 0, false); + + // Status + dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_OUT, NULL, 0, true); + dcd_event_xfer_complete(rhport, EDPT_CTRL_OUT, 0, 0, false); + + tud_task(); +} diff --git a/test/test/support/tusb_config.h b/test/test/support/tusb_config.h index bfe5bf9e9..e0ab0c68b 100644 --- a/test/test/support/tusb_config.h +++ b/test/test/support/tusb_config.h @@ -41,15 +41,15 @@ #endif #if CFG_TUSB_MCU == OPT_MCU_LPC43XX || CFG_TUSB_MCU == OPT_MCU_LPC18XX -#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | OPT_MODE_HIGH_SPEED) +#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | OPT_MODE_HIGH_SPEED) #else -#define CFG_TUSB_RHPORT0_MODE OPT_MODE_DEVICE +#define CFG_TUSB_RHPORT0_MODE OPT_MODE_DEVICE #endif -#define CFG_TUSB_OS OPT_OS_NONE +#define CFG_TUSB_OS OPT_OS_NONE // CFG_TUSB_DEBUG is defined by compiler in DEBUG build -// #define CFG_TUSB_DEBUG 0 +#define CFG_TUSB_DEBUG 0 /* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment. * Tinyusb use follows macros to declare transferring memory so that they can be put @@ -63,13 +63,14 @@ #endif #ifndef CFG_TUSB_MEM_ALIGN -#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4))) +#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4))) #endif //-------------------------------------------------------------------- // DEVICE CONFIGURATION //-------------------------------------------------------------------- +#define CFG_TUD_TASK_QUEUE_SZ 100 #define CFG_TUD_ENDOINT0_SIZE 64 //------------- CLASS -------------// -- cgit v1.3.1 From cacbb80a9031662074c12652cbec32b491d78507 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 31 Oct 2019 21:14:06 +0700 Subject: zlp should work with control in, tested with Unity framework --- src/device/usbd.c | 5 ---- src/device/usbd_control.c | 48 +++++++++++++++++++++++---------------- test/test/device/usbd/test_usbd.c | 2 +- 3 files changed, 30 insertions(+), 25 deletions(-) (limited to 'test') diff --git a/src/device/usbd.c b/src/device/usbd.c index 2d2f1cafd..0b9713e94 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -404,7 +404,6 @@ void tud_task (void) if ( 0 == epnum ) { - // control transfer DATA stage callback usbd_control_xfer_cb(event.rhport, ep_addr, event.xfer_complete.result, event.xfer_complete.len); } else @@ -869,10 +868,6 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr) break; case DCD_EVENT_XFER_COMPLETE: - // skip zero-length control status complete event, should DCD notify us. - // TODO could cause issue with actual zero length data used by class such as DFU - if ( (0 == tu_edpt_number(event->xfer_complete.ep_addr)) && (event->xfer_complete.len == 0) ) break; - osal_queue_send(_usbd_q, event, in_isr); TU_ASSERT(event->xfer_complete.result == XFER_RESULT_SUCCESS,); break; diff --git a/src/device/usbd_control.c b/src/device/usbd_control.c index 7636f459d..27e2a8214 100644 --- a/src/device/usbd_control.c +++ b/src/device/usbd_control.c @@ -42,9 +42,9 @@ typedef struct { tusb_control_request_t request; - void* buffer; - uint16_t len; - uint16_t total_transferred; + uint8_t* buffer; + uint16_t data_len; + uint16_t total_xferred; bool (*complete_cb) (uint8_t, tusb_control_request_t const *); } usbd_control_xfer_t; @@ -64,35 +64,37 @@ bool tud_control_status(uint8_t rhport, tusb_control_request_t const * request) return dcd_edpt_xfer(rhport, request->bmRequestType_bit.direction ? EDPT_CTRL_OUT : EDPT_CTRL_IN, NULL, 0); } -// Each transaction is up to endpoint0's max packet size -static bool _ctrl_data_xact(uint8_t rhport) +// Transfer an transaction in Data Stage +// Each transaction has up to Endpoint0's max packet size. +// This function can also transfer an zero-length packet +static bool _data_stage_xact(uint8_t rhport) { - uint16_t const xact_len = tu_min16(_ctrl_xfer.len - _ctrl_xfer.total_transferred, CFG_TUD_ENDPOINT0_SIZE); + uint16_t const xact_len = tu_min16(_ctrl_xfer.data_len - _ctrl_xfer.total_xferred, CFG_TUD_ENDPOINT0_SIZE); uint8_t ep_addr = EDPT_CTRL_OUT; if ( _ctrl_xfer.request.bmRequestType_bit.direction == TUSB_DIR_IN ) { ep_addr = EDPT_CTRL_IN; - memcpy(_usbd_ctrl_buf, _ctrl_xfer.buffer, xact_len); + if ( xact_len ) memcpy(_usbd_ctrl_buf, _ctrl_xfer.buffer, xact_len); } - return dcd_edpt_xfer(rhport, ep_addr, _usbd_ctrl_buf, xact_len); + return dcd_edpt_xfer(rhport, ep_addr, xact_len ? _usbd_ctrl_buf : NULL, xact_len); } bool tud_control_xfer(uint8_t rhport, tusb_control_request_t const * request, void* buffer, uint16_t len) { - _ctrl_xfer.request = (*request); - _ctrl_xfer.buffer = buffer; - _ctrl_xfer.total_transferred = 0; - _ctrl_xfer.len = tu_min16(len, request->wLength); + _ctrl_xfer.request = (*request); + _ctrl_xfer.buffer = (uint8_t*) buffer; + _ctrl_xfer.total_xferred = 0; + _ctrl_xfer.data_len = tu_min16(len, request->wLength); - if ( len ) + if ( _ctrl_xfer.data_len ) { TU_ASSERT(buffer); // Data stage - TU_ASSERT( _ctrl_data_xact(rhport) ); + TU_ASSERT( _data_stage_xact(rhport) ); }else { // Status stage @@ -122,7 +124,13 @@ void usbd_control_set_complete_callback( bool (*fp) (uint8_t, tusb_control_reque bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) { (void) result; - (void) ep_addr; + + // Endpoint Address is opposite to direction bit, this is Status Stage complete event + if ( tu_edpt_dir(ep_addr) != _ctrl_xfer.request.bmRequestType_bit.direction ) + { + TU_ASSERT(0 == xferred_bytes); + return true; + } if ( _ctrl_xfer.request.bmRequestType_bit.direction == TUSB_DIR_OUT ) { @@ -130,10 +138,12 @@ bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result memcpy(_ctrl_xfer.buffer, _usbd_ctrl_buf, xferred_bytes); } - _ctrl_xfer.total_transferred += xferred_bytes; - _ctrl_xfer.buffer = ((uint8_t*)_ctrl_xfer.buffer) + xferred_bytes; + _ctrl_xfer.total_xferred += xferred_bytes; + _ctrl_xfer.buffer += xferred_bytes; - if ( (_ctrl_xfer.request.wLength == _ctrl_xfer.total_transferred) || xferred_bytes < CFG_TUD_ENDPOINT0_SIZE ) + // Data Stage is complete when all request's length are transferred or + // a short packet is sent including zero-length packet. + if ( (_ctrl_xfer.request.wLength == _ctrl_xfer.total_xferred) || xferred_bytes < CFG_TUD_ENDPOINT0_SIZE ) { // DATA stage is complete bool is_ok = true; @@ -159,7 +169,7 @@ bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result else { // More data to transfer - TU_ASSERT( _ctrl_data_xact(rhport) ); + TU_ASSERT( _data_stage_xact(rhport) ); } return true; diff --git a/test/test/device/usbd/test_usbd.c b/test/test/device/usbd/test_usbd.c index ea813ea43..71d15dbca 100644 --- a/test/test/device/usbd/test_usbd.c +++ b/test/test/device/usbd/test_usbd.c @@ -202,7 +202,7 @@ void test_usbd_control_zlp(void) { // 128 byte total len, with EP0 size = 64, and request length = 256 // ZLP must be return - uint8_t zlp_desc_configuration[] = + uint8_t zlp_desc_configuration[CFG_TUD_ENDOINT0_SIZE*2] = { // Interface count, string index, total length, attribute, power in mA TUD_CONFIG_DESCRIPTOR(0, 0, CFG_TUD_ENDOINT0_SIZE*2, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), -- cgit v1.3.1 From f58726887a58fe60d7384136f78b5b147fb08fbd Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 31 Oct 2019 21:28:46 +0700 Subject: update doc, hid set report --- docs/porting.md | 10 +++------- src/class/hid/hid_device.c | 3 +-- test/test/support/tusb_config.h | 10 +++++----- 3 files changed, 9 insertions(+), 14 deletions(-) (limited to 'test') diff --git a/docs/porting.md b/docs/porting.md index ded35e7b0..7fdeaeba7 100644 --- a/docs/porting.md +++ b/docs/porting.md @@ -123,17 +123,13 @@ Also make sure to enable endpoint specific interrupts. ##### dcd_edpt_xfer -`dcd_edpt_xfer` is responsible for configuring the peripheral to send or receive data from the host. "xfer" is short for "transfer". **This is one of the core methods you must implement for TinyUSB to work (one other is the interrupt handler).** Data from the host is the OUT direction and data to the host is IN. In other words, direction is relative to the host. - -`dcd_edpt_xfer` is used for all endpoints including the control endpoint 0. Make sure to handle the zero-length packet STATUS packet on endpoint 0 correctly. It may be a special transaction to the peripheral. +`dcd_edpt_xfer` is responsible for configuring the peripheral to send or receive data from the host. "xfer" is short for "transfer". **This is one of the core methods you must implement for TinyUSB to work (one other is the interrupt handler).** Data from the host is the OUT direction and data to the host is IN. It is used for all endpoints including the control endpoint 0. Make sure to handle the zero-length packet STATUS packet on endpoint 0 correctly. It may be a special transaction to the peripheral. Besides that, all other transactions are relatively straight-forward. The endpoint address provides the endpoint number and direction which usually determines where to write the buffer info. The buffer and its length are usually written to a specific location in memory and the peripheral is told the data is valid. (Maybe by writing a 1 to a register or setting a counter register to 0 for OUT or length for IN.) -The transmit buffer is NOT guarenteed to be word-aligned. - One potential pitfall is that the buffer may be longer than the maximum endpoint size of one USB packet. Some peripherals can handle transmitting multiple USB packets for a provided buffer (like the SAMD21). Others (like the nRF52) may need each USB packet queued individually. To make this work you'll need to track @@ -143,11 +139,11 @@ Once the transaction is going, the interrupt handler will notify TinyUSB of tran During transmission, the IN data buffer is guarenteed to remain unchanged in memory until the `dcd_xfer_complete` function is called. The dcd_edpt_xfer function must never add zero-length-packets (ZLP) on its own to a transfer. If a ZLP is required, -then it must be explicitly sent by the module calling dcd_edpt_xfer(), by calling dcd_edpt_xfer() a second time with len=0. +then it must be explicitly sent by the stack calling dcd_edpt_xfer(), by calling dcd_edpt_xfer() a second time with len=0. For control transfers, this is automatically done in `usbd_control.c`. At the moment, only a single buffer can be transmitted at once. There is no provision for double-buffering. new dcd_edpt_xfer() will not -be called again until the driver calls dcd_xfer_complete() (except in cases of USB resets). +be called again on the same endpoint address until the driver calls dcd_xfer_complete() (except in cases of USB resets). ##### dcd_xfer_complete diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c index 9e7bad976..558adc2bb 100644 --- a/src/class/hid/hid_device.c +++ b/src/class/hid/hid_device.c @@ -241,8 +241,7 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * p_reque break; case HID_REQ_CONTROL_SET_REPORT: - TU_VERIFY(p_request->wLength <=sizeof(p_hid->epout_buf)); - tud_control_xfer(rhport, p_request, p_hid->epout_buf, p_request->wLength); + tud_control_xfer(rhport, p_request, p_hid->epout_buf, tu_min16(sizeof(p_hid->epout_buf), p_request->wLength)); break; case HID_REQ_CONTROL_SET_IDLE: diff --git a/test/test/support/tusb_config.h b/test/test/support/tusb_config.h index e0ab0c68b..0a1608a64 100644 --- a/test/test/support/tusb_config.h +++ b/test/test/support/tusb_config.h @@ -74,11 +74,11 @@ #define CFG_TUD_ENDOINT0_SIZE 64 //------------- CLASS -------------// -#define CFG_TUD_CDC 0 -#define CFG_TUD_MSC 0 -#define CFG_TUD_HID 0 -#define CFG_TUD_MIDI 0 -#define CFG_TUD_VENDOR 0 +//#define CFG_TUD_CDC 0 +//#define CFG_TUD_MSC 0 +//#define CFG_TUD_HID 0 +//#define CFG_TUD_MIDI 0 +//#define CFG_TUD_VENDOR 0 //------------- CDC -------------// -- cgit v1.3.1 From bd8b4e48dc4a7430fa1e03f298a86bb0b7135c31 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 31 Oct 2019 21:55:01 +0700 Subject: rename zlp test --- test/test/device/usbd/test_usbd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test') diff --git a/test/test/device/usbd/test_usbd.c b/test/test/device/usbd/test_usbd.c index 71d15dbca..add947b3d 100644 --- a/test/test/device/usbd/test_usbd.c +++ b/test/test/device/usbd/test_usbd.c @@ -198,7 +198,7 @@ void test_usbd_get_configuration_descriptor_null(void) // Control ZLP //--------------------------------------------------------------------+ -void test_usbd_control_zlp(void) +void test_usbd_control_in_zlp(void) { // 128 byte total len, with EP0 size = 64, and request length = 256 // ZLP must be return -- cgit v1.3.1