diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fe24472f1..b5b027c9b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -257,7 +257,6 @@ add_subdirectory(connectivity) # The directories below contain optional target libraries add_subdirectory(drivers/device_key EXCLUDE_FROM_ALL) -add_subdirectory(drivers/usb EXCLUDE_FROM_ALL) add_subdirectory(features EXCLUDE_FROM_ALL) add_subdirectory(cmsis/CMSIS_5/CMSIS/RTOS2 EXCLUDE_FROM_ALL) add_subdirectory(cmsis/device/rtos EXCLUDE_FROM_ALL) diff --git a/drivers/CMakeLists.txt b/drivers/CMakeLists.txt index dc5c85e79b..d74e1eb593 100644 --- a/drivers/CMakeLists.txt +++ b/drivers/CMakeLists.txt @@ -53,3 +53,4 @@ target_sources(mbed-core-sources source/Watchdog.cpp ) +add_subdirectory(usb) diff --git a/drivers/usb/CMakeLists.txt b/drivers/usb/CMakeLists.txt index 98f51d2637..bfc3578bac 100644 --- a/drivers/usb/CMakeLists.txt +++ b/drivers/usb/CMakeLists.txt @@ -1,17 +1,14 @@ # Copyright (c) 2020 ARM Limited. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -add_library(mbed-usb INTERFACE) +if(MBED_ENABLE_OS_INTERNAL_TESTS) + if(MBED_BUILD_GREENTEA_TESTS) + add_subdirectory(tests/TESTS) + endif() +endif() -target_include_directories(mbed-usb - INTERFACE - include - include/usb - include/usb/internal -) - -target_sources(mbed-usb - INTERFACE +if("DEVICE_USBDEVICE=1" IN_LIST MBED_TARGET_DEFINITIONS) + add_library(mbed-usb STATIC EXCLUDE_FROM_ALL source/AsyncOp.cpp source/ByteBuffer.cpp source/EndpointResolver.cpp @@ -21,15 +18,43 @@ target_sources(mbed-usb source/TaskBase.cpp source/USBAudio.cpp source/USBCDC.cpp - source/USBCDC_ECM.cpp source/USBDevice.cpp source/USBHID.cpp source/USBKeyboard.cpp source/USBMIDI.cpp - source/USBMSD.cpp source/USBMouse.cpp source/USBMouseKeyboard.cpp - source/USBSerial.cpp -) + source/USBSerial.cpp) -target_link_libraries(mbed-usb INTERFACE mbed-storage) + target_include_directories(mbed-usb + PUBLIC + include + include/usb + include/usb/internal + ) + + target_link_libraries(mbed-usb PUBLIC mbed-core-flags) + + # USB Mass Storage Device library is separate because it pulls in a dependency on mbed-storage-blockdevice + add_library(mbed-usb-msd STATIC EXCLUDE_FROM_ALL + source/msd/USBMSD.cpp) + + target_include_directories(mbed-usb-msd + PUBLIC + include/usb/msd + ) + + target_link_libraries(mbed-usb-msd PUBLIC mbed-usb mbed-storage-blockdevice) + + # USB CDC ECM library is separate because it pulls in a dependency on mbed-rtos-flags + add_library(mbed-usb-cdc-ecm STATIC EXCLUDE_FROM_ALL + source/cdc_ecm/USBCDC_ECM.cpp) + + + target_include_directories(mbed-usb-cdc-ecm + PUBLIC + include/usb/cdc_ecm + ) + + target_link_libraries(mbed-usb-cdc-ecm PUBLIC mbed-usb mbed-rtos-flags) +endif() \ No newline at end of file diff --git a/drivers/usb/include/usb/USBCDC_ECM.h b/drivers/usb/include/usb/cdc_ecm/USBCDC_ECM.h similarity index 100% rename from drivers/usb/include/usb/USBCDC_ECM.h rename to drivers/usb/include/usb/cdc_ecm/USBCDC_ECM.h diff --git a/drivers/usb/include/usb/USBMSD.h b/drivers/usb/include/usb/msd/USBMSD.h similarity index 100% rename from drivers/usb/include/usb/USBMSD.h rename to drivers/usb/include/usb/msd/USBMSD.h diff --git a/drivers/usb/source/USBCDC_ECM.cpp b/drivers/usb/source/cdc_ecm/USBCDC_ECM.cpp similarity index 100% rename from drivers/usb/source/USBCDC_ECM.cpp rename to drivers/usb/source/cdc_ecm/USBCDC_ECM.cpp diff --git a/drivers/usb/source/USBMSD.cpp b/drivers/usb/source/msd/USBMSD.cpp similarity index 100% rename from drivers/usb/source/USBMSD.cpp rename to drivers/usb/source/msd/USBMSD.cpp diff --git a/drivers/usb/tests/TESTS/CMakeLists.txt b/drivers/usb/tests/TESTS/CMakeLists.txt new file mode 100644 index 0000000000..294b423419 --- /dev/null +++ b/drivers/usb/tests/TESTS/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(usb_device) \ No newline at end of file diff --git a/drivers/usb/tests/TESTS/host_tests/usb_device_serial.py b/drivers/usb/tests/TESTS/host_tests/usb_device_serial.py index d462d761e9..cf281bcdde 100644 --- a/drivers/usb/tests/TESTS/host_tests/usb_device_serial.py +++ b/drivers/usb/tests/TESTS/host_tests/usb_device_serial.py @@ -27,6 +27,12 @@ import serial.tools.list_ports as stlp import six import mbed_host_tests +# Pyserial 3.5 has a compatibility breaking capitalization change :(( +try: + from serial import portNotOpenError as PortNotOpenError +except ImportError: + from serial import PortNotOpenError as PortNotOpenError + MSG_KEY_DEVICE_READY = 'ready' MSG_KEY_SERIAL_NUMBER = 'usb_dev_sn' @@ -130,7 +136,11 @@ class USBSerialTest(mbed_host_tests.BaseHostTest): def port_open_wait(self): """Open the serial and wait until it's closed by the device.""" - mbed_serial = serial.Serial(dsrdtr=False) + + # Note: Need to set dsrdtr on open to true to avoid exception on Linux + # https://github.com/pyserial/pyserial/issues/67 + mbed_serial = serial.Serial(dsrdtr=True) + mbed_serial.dtr = False try: mbed_serial.port = retry_fun_call( @@ -148,12 +158,12 @@ class USBSerialTest(mbed_host_tests.BaseHostTest): mbed_serial.dtr = True try: mbed_serial.read() # wait until closed - except (serial.portNotOpenError, serial.SerialException): + except (PortNotOpenError, serial.SerialException): pass def port_open_close(self): """Open the serial and close it with a delay.""" - mbed_serial = serial.Serial(timeout=0.5, write_timeout=0.1, dsrdtr=False) + mbed_serial = serial.Serial(timeout=0.5, write_timeout=0.1, dsrdtr=True) mbed_serial.dtr = False try: mbed_serial.port = retry_fun_call( @@ -179,7 +189,7 @@ class USBSerialTest(mbed_host_tests.BaseHostTest): chunk_size defines the size of data sent in each write operation. The input buffer content is discarded. """ - mbed_serial = serial.Serial(write_timeout=0.1, dsrdtr=False) + mbed_serial = serial.Serial(write_timeout=0.1, dsrdtr=True) try: mbed_serial.port = retry_fun_call( fun=functools.partial(self.get_usb_serial_name, self.dut_usb_dev_sn), # pylint: disable=not-callable @@ -214,7 +224,7 @@ class USBSerialTest(mbed_host_tests.BaseHostTest): def loopback(self): """Open the serial and send back every byte received.""" - mbed_serial = serial.Serial(timeout=0.5, write_timeout=0.1, dsrdtr=False) + mbed_serial = serial.Serial(timeout=0.5, write_timeout=0.1, dsrdtr=True) mbed_serial.dtr = False try: mbed_serial.port = retry_fun_call( diff --git a/drivers/usb/tests/TESTS/usb_device/CMakeLists.txt b/drivers/usb/tests/TESTS/usb_device/CMakeLists.txt new file mode 100644 index 0000000000..6783c6075a --- /dev/null +++ b/drivers/usb/tests/TESTS/usb_device/CMakeLists.txt @@ -0,0 +1,4 @@ +add_subdirectory(basic) +add_subdirectory(hid) +add_subdirectory(msd) +add_subdirectory(serial) \ No newline at end of file diff --git a/drivers/usb/tests/TESTS/usb_device/basic/CMakeLists.txt b/drivers/usb/tests/TESTS/usb_device/basic/CMakeLists.txt new file mode 100644 index 0000000000..17cbc9ecea --- /dev/null +++ b/drivers/usb/tests/TESTS/usb_device/basic/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2022 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +if(NOT "DEVICE_USBDEVICE=1" IN_LIST MBED_TARGET_DEFINITIONS) + set(TEST_SKIPPED "USB Device is not supported for this target") +endif() + +mbed_greentea_add_test( + TEST_NAME + mbed-usb-device-basic + TEST_SOURCES + main.cpp + USBEndpointTester.cpp + USBTester.cpp + HOST_TESTS_DIR + "${CMAKE_CURRENT_LIST_DIR}/../../host_tests" + TEST_SKIPPED + ${TEST_SKIPPED} + TEST_REQUIRED_LIBS + mbed-usb +) \ No newline at end of file diff --git a/drivers/usb/tests/TESTS/usb_device/basic/USBEndpointTester.cpp b/drivers/usb/tests/TESTS/usb_device/basic/USBEndpointTester.cpp index 4b48e94bd6..46a1dd2fc8 100644 --- a/drivers/usb/tests/TESTS/usb_device/basic/USBEndpointTester.cpp +++ b/drivers/usb/tests/TESTS/usb_device/basic/USBEndpointTester.cpp @@ -15,7 +15,7 @@ * limitations under the License. */ -#if USB_DEVICE_TESTS +#if DEVICE_USBDEVICE #include "stdint.h" #include "stdlib.h" diff --git a/drivers/usb/tests/TESTS/usb_device/basic/USBTester.cpp b/drivers/usb/tests/TESTS/usb_device/basic/USBTester.cpp index 743f217225..14dcfdb7f9 100644 --- a/drivers/usb/tests/TESTS/usb_device/basic/USBTester.cpp +++ b/drivers/usb/tests/TESTS/usb_device/basic/USBTester.cpp @@ -15,7 +15,7 @@ * limitations under the License. */ -#if USB_DEVICE_TESTS +#if DEVICE_USBDEVICE #include "stdint.h" #include "USBTester.h" diff --git a/drivers/usb/tests/TESTS/usb_device/basic/main.cpp b/drivers/usb/tests/TESTS/usb_device/basic/main.cpp index 2667af2c61..33a81698b0 100644 --- a/drivers/usb/tests/TESTS/usb_device/basic/main.cpp +++ b/drivers/usb/tests/TESTS/usb_device/basic/main.cpp @@ -15,10 +15,6 @@ * limitations under the License. */ -#if !USB_DEVICE_TESTS -#error [NOT_SUPPORTED] usb device tests not enabled -#else - #include #include #include "mbed.h" @@ -664,5 +660,4 @@ int main() Harness::run(specification); } -#endif // !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE -#endif // !defined(USB_DEVICE_TESTS) +#endif // !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE \ No newline at end of file diff --git a/drivers/usb/tests/TESTS/usb_device/hid/CMakeLists.txt b/drivers/usb/tests/TESTS/usb_device/hid/CMakeLists.txt new file mode 100644 index 0000000000..c4bcf776b2 --- /dev/null +++ b/drivers/usb/tests/TESTS/usb_device/hid/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2022 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +if(NOT "DEVICE_USBDEVICE=1" IN_LIST MBED_TARGET_DEFINITIONS) + set(TEST_SKIPPED "USB Device is not supported for this target") +endif() + +mbed_greentea_add_test( + TEST_NAME + mbed-usb-device-hid + TEST_SOURCES + main.cpp + HOST_TESTS_DIR + "${CMAKE_CURRENT_LIST_DIR}/../../host_tests" + TEST_SKIPPED + ${TEST_SKIPPED} + TEST_REQUIRED_LIBS + mbed-usb +) \ No newline at end of file diff --git a/drivers/usb/tests/TESTS/usb_device/hid/main.cpp b/drivers/usb/tests/TESTS/usb_device/hid/main.cpp index 551bac2a8f..e29139f53e 100644 --- a/drivers/usb/tests/TESTS/usb_device/hid/main.cpp +++ b/drivers/usb/tests/TESTS/usb_device/hid/main.cpp @@ -15,11 +15,7 @@ * limitations under the License. */ -#if !USB_DEVICE_TESTS -#error [NOT_SUPPORTED] usb device tests not enabled -#else - -#if !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE +#if !DEVICE_USBDEVICE #error [NOT_SUPPORTED] USB Device not supported for this target #else @@ -388,5 +384,4 @@ int main() return !Harness::run(specification); } -#endif // !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE -#endif // !defined(USB_DEVICE_TESTS) +#endif // !DEVICE_USBDEVICE diff --git a/drivers/usb/tests/TESTS/usb_device/msd/CMakeLists.txt b/drivers/usb/tests/TESTS/usb_device/msd/CMakeLists.txt new file mode 100644 index 0000000000..59a434af5c --- /dev/null +++ b/drivers/usb/tests/TESTS/usb_device/msd/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (c) 2022 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +if(NOT "DEVICE_USBDEVICE=1" IN_LIST MBED_TARGET_DEFINITIONS) + set(TEST_SKIPPED "USB Device is not supported for this target") +endif() + +if(MBED_GREENTEA_TEST_BAREMETAL) + set(TEST_SKIPPED "USB MSD test is not compatible with mbed-baremetal") +endif() + +mbed_greentea_add_test( + TEST_NAME + mbed-usb-device-msd + TEST_SOURCES + main.cpp + HOST_TESTS_DIR + "${CMAKE_CURRENT_LIST_DIR}/../../host_tests" + TEST_SKIPPED + ${TEST_SKIPPED} + TEST_REQUIRED_LIBS + mbed-usb-msd + mbed-storage-fat +) \ No newline at end of file diff --git a/drivers/usb/tests/TESTS/usb_device/msd/main.cpp b/drivers/usb/tests/TESTS/usb_device/msd/main.cpp index 9539b2ab5e..19f5f1dcae 100644 --- a/drivers/usb/tests/TESTS/usb_device/msd/main.cpp +++ b/drivers/usb/tests/TESTS/usb_device/msd/main.cpp @@ -15,10 +15,6 @@ * limitations under the License. */ -#if !USB_DEVICE_TESTS -#error [NOT_SUPPORTED] usb device tests not enabled -#else - #if !defined(MBED_CONF_RTOS_PRESENT) #error [NOT_SUPPORTED] USB stack and test cases require RTOS to run. #else @@ -492,5 +488,4 @@ int main() } #endif // !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE -#endif // !defined(MBED_CONF_RTOS_PRESENT) -#endif // !defined(USB_DEVICE_TESTS) +#endif // !defined(MBED_CONF_RTOS_PRESENT) \ No newline at end of file diff --git a/drivers/usb/tests/TESTS/usb_device/serial/CMakeLists.txt b/drivers/usb/tests/TESTS/usb_device/serial/CMakeLists.txt new file mode 100644 index 0000000000..1a0f1c5dbe --- /dev/null +++ b/drivers/usb/tests/TESTS/usb_device/serial/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2022 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +if(NOT "DEVICE_USBDEVICE=1" IN_LIST MBED_TARGET_DEFINITIONS) + set(TEST_SKIPPED "USB Device is not supported for this target") +endif() + +mbed_greentea_add_test( + TEST_NAME + mbed-usb-device-serial + TEST_SOURCES + main.cpp + HOST_TESTS_DIR + "${CMAKE_CURRENT_LIST_DIR}/../../host_tests" + TEST_SKIPPED + ${TEST_SKIPPED} + TEST_REQUIRED_LIBS + mbed-usb +) \ No newline at end of file diff --git a/drivers/usb/tests/TESTS/usb_device/serial/main.cpp b/drivers/usb/tests/TESTS/usb_device/serial/main.cpp index 7f16ef5573..011cbbe168 100644 --- a/drivers/usb/tests/TESTS/usb_device/serial/main.cpp +++ b/drivers/usb/tests/TESTS/usb_device/serial/main.cpp @@ -15,11 +15,7 @@ * limitations under the License. */ -#if !USB_DEVICE_TESTS -#error [NOT_SUPPORTED] usb device tests not enabled -#else - -#if !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE +#if !DEVICE_USBDEVICE #error [NOT_SUPPORTED] USB Device not supported for this target #else @@ -879,5 +875,4 @@ int main() return !Harness::run(specification); } -#endif // !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE -#endif // !defined(USB_DEVICE_TESTS) +#endif // !DEVICE_USBDEVICE \ No newline at end of file diff --git a/tools/requirements-ci-build.txt b/tools/requirements-ci-build.txt index a13393c602..35efca1b35 100644 --- a/tools/requirements-ci-build.txt +++ b/tools/requirements-ci-build.txt @@ -2,4 +2,8 @@ # It installs flashing support through the mbed tools packages and also the mbedhtrun test runner. mbed-host-tests mbed-greentea -mbed-ls \ No newline at end of file +mbed-ls + +# For USB Device host tests +hidapi>=0.7.99 +pyusb>=1.2.0 \ No newline at end of file