From 9dd896904c3897515a0fc0bd06bda235d049019c Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Sun, 6 Aug 2023 13:41:41 +0200 Subject: WIP. --- test/hitl/hitl_test.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 test/hitl/hitl_test.py (limited to 'test') diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py new file mode 100644 index 000000000..7853c9886 --- /dev/null +++ b/test/hitl/hitl_test.py @@ -0,0 +1,76 @@ +# +# The MIT License (MIT) +# +# Copyright (c) 2023 HiFiPhile +# +# 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. + +import os +import sys +import time +import serial +import subprocess + +def flash_jlink(sn, dev, firmware): + script = ['halt', 'r', f'loadfile {firmware}', 'r', 'go', 'exit'] + f = open('flash.jlink', 'w') + f.writelines(f'{s}\n' for s in script) + f.close() + ret = subprocess.run(f'JLinkExe -USB {sn} -device {dev} -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile flash.jlink', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + assert ret.returncode == 0, 'Flash failed' + +def test_cdc_dual_ports(port1, port2): + # Wait device enum + timeout = 10 + while timeout: + if os.path.exists(port1) and os.path.exists(port2): + break + time.sleep(1) + timeout = timeout - 1 + + assert os.path.exists(port1) and os.path.exists(port2), \ + 'Port not available' + + ser1 = serial.Serial(port1) + ser2 = serial.Serial(port2) + + ser1.timeout = 1 + ser2.timeout = 1 + + str1 = b"test_no1" + ser1.write(str1) + ser1.flush() + assert ser1.read(100) == str1.lower(), 'Port1 wrong data' + assert ser2.read(100) == str1.upper(), 'Port2 wrong data' + + str2 = b"test_no2" + ser2.write(str2) + ser2.flush() + assert ser1.read(100) == str2.lower(), 'Port1 wrong data' + assert ser2.read(100) == str2.upper(), 'Port2 wrong data' + + print('cdc_dual_ports test done') + + + + +flash_jlink('774470029', 'stm32l412kb', 'examples/device/cdc_dual_ports/_build/stm32l412nucleo/cdc_dual_ports.elf') + +test_cdc_dual_ports('/dev/ttyUSB_57323020.00', '/dev/ttyUSB_57323020.02') \ No newline at end of file -- cgit v1.3.1 From b9e614bd39b994a8b83ab09483635a67ae7f1d44 Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Sun, 6 Aug 2023 15:59:25 +0200 Subject: Fix LPC54 build. --- hw/bsp/lpc54/boards/lpcxpresso54628/board.mk | 2 +- hw/bsp/lpc54/family.mk | 3 +- test/hitl/hitl_config.json | 28 +++++++ test/hitl/hitl_test.py | 117 ++++++++++++++++++++++++++- 4 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 test/hitl/hitl_config.json (limited to 'test') diff --git a/hw/bsp/lpc54/boards/lpcxpresso54628/board.mk b/hw/bsp/lpc54/boards/lpcxpresso54628/board.mk index 5f15e2bbe..e0b382aeb 100644 --- a/hw/bsp/lpc54/boards/lpcxpresso54628/board.mk +++ b/hw/bsp/lpc54/boards/lpcxpresso54628/board.mk @@ -1,7 +1,7 @@ MCU_VARIANT = LPC54628 MCU_CORE = LPC54628 -PORT ?= 0 +PORT ?= 1 CFLAGS += -DCPU_LPC54628J512ET180 CFLAGS += -Wno-error=double-promotion diff --git a/hw/bsp/lpc54/family.mk b/hw/bsp/lpc54/family.mk index b9fcab809..46a5f7930 100644 --- a/hw/bsp/lpc54/family.mk +++ b/hw/bsp/lpc54/family.mk @@ -8,12 +8,11 @@ CFLAGS += \ -flto \ -DCFG_TUSB_MCU=OPT_MCU_LPC54XXX \ -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' \ - -DBOARD_TUD_RHPORT=$(PORT) ifeq ($(PORT), 1) $(info "PORT1 High Speed") CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED - + CFLAGS += -DBOARD_TUD_RHPORT=1 # LPC55 Highspeed Port1 can only write to USB_SRAM region CFLAGS += -DCFG_TUSB_MEM_SECTION='__attribute__((section("m_usb_global")))' else diff --git a/test/hitl/hitl_config.json b/test/hitl/hitl_config.json new file mode 100644 index 000000000..f57629a52 --- /dev/null +++ b/test/hitl/hitl_config.json @@ -0,0 +1,28 @@ +{ + "devices": [ + { + "uid": "41003B000E504E5457323020", + "debugger": "jlink", + "debugger_sn": "774470029", + "device": "stm32l412kb", + "tests": [ + { + "name": "cdc_dual_ports", + "firmware": "examples/device/cdc_dual_ports/_build/stm32l412nucleo/cdc_dual_ports.elf" + }, + { + "name": "cdc_msc", + "firmware": "examples/device/cdc_msc/_build/stm32l412nucleo/cdc_msc.elf" + }, + { + "name": "dfu", + "firmware": "examples/device/dfu/_build/stm32l412nucleo/dfu.elf" + }, + { + "name": "dfu_runtime", + "firmware": "examples/device/dfu_runtime/_build/stm32l412nucleo/dfu_runtime.elf" + } + ] + } + ] +} \ No newline at end of file diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py index 7853c9886..d51a13ce3 100644 --- a/test/hitl/hitl_test.py +++ b/test/hitl/hitl_test.py @@ -21,11 +21,16 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +# udev rules : +# SUBSYSTEM=="block", SUBSYSTEMS=="usb", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", SYMLINK+="blkUSB_%c.%s{bInterfaceNumber}" +# SUBSYSTEM=="tty", SUBSYSTEMS=="usb", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", SYMLINK+="ttyUSB_%c.%s{bInterfaceNumber}" + import os import sys import time import serial import subprocess +import json def flash_jlink(sn, dev, firmware): script = ['halt', 'r', f'loadfile {firmware}', 'r', 'go', 'exit'] @@ -34,9 +39,12 @@ def flash_jlink(sn, dev, firmware): f.close() ret = subprocess.run(f'JLinkExe -USB {sn} -device {dev} -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile flash.jlink', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + os.remove('flash.jlink') assert ret.returncode == 0, 'Flash failed' -def test_cdc_dual_ports(port1, port2): +def test_cdc_dual_ports(id): + port1 = f'/dev/ttyUSB_{id[-8:]}.00' + port2 = f'/dev/ttyUSB_{id[-8:]}.02' # Wait device enum timeout = 10 while timeout: @@ -46,8 +54,9 @@ def test_cdc_dual_ports(port1, port2): timeout = timeout - 1 assert os.path.exists(port1) and os.path.exists(port2), \ - 'Port not available' + 'Device not available' + # Echo test ser1 = serial.Serial(port1) ser2 = serial.Serial(port2) @@ -68,9 +77,109 @@ def test_cdc_dual_ports(port1, port2): print('cdc_dual_ports test done') +def test_cdc_msc(id): + port = f'/dev/ttyUSB_{id[-8:]}.00' + block = f'/dev/blkUSB_{id[-8:]}.02' + # Wait device enum + timeout = 10 + while timeout: + if os.path.exists(port) and os.path.exists(block): + break + time.sleep(1) + timeout = timeout - 1 + + assert os.path.exists(port) and os.path.exists(block), \ + 'Device not available' + + # Echo test + ser = serial.Serial(port) + + ser.timeout = 1 + + str = b"test_str" + ser.write(str) + ser.flush() + assert ser.read(100) == str, 'Port wrong data' + + # Block test + f = open(block, 'rb') + data = f.read() + + readme = \ + b"This is tinyusb's MassStorage Class demo.\r\n\r\n\ +If you find any bugs or get any questions, feel free to file an\r\n\ +issue at github.com/hathach/tinyusb" + + assert data[0x600:0x600 + len(readme)] == readme, 'Block wrong data' + print('cdc_msc test done') + +def test_dfu(id): + # Wait device enum + timeout = 10 + while timeout: + ret = subprocess.run(f'dfu-util -l', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout = ret.stdout.decode() + if f'serial="{id}"' in stdout and 'Found DFU: [cafe:4000]' in stdout: + break + time.sleep(1) + timeout = timeout - 1 + + assert timeout, 'Device not available' + + # Test upload + try: + os.remove('dfu0') + os.remove('dfu1') + except OSError: + pass + + ret = subprocess.run(f'dfu-util -S {id} -a 0 -U dfu0', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + assert ret.returncode == 0, 'Upload failed' + + ret = subprocess.run(f'dfu-util -S {id} -a 1 -U dfu1', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + assert ret.returncode == 0, 'Upload failed' + + with open('dfu0') as f: + assert 'Hello world from TinyUSB DFU! - Partition 0' in f.read(), 'Wrong uploaded data' + + with open('dfu1') as f: + assert 'Hello world from TinyUSB DFU! - Partition 1' in f.read(), 'Wrong uploaded data' + os.remove('dfu0') + os.remove('dfu1') + print('dfu test done') -flash_jlink('774470029', 'stm32l412kb', 'examples/device/cdc_dual_ports/_build/stm32l412nucleo/cdc_dual_ports.elf') +def test_dfu_runtime(id): + # Wait device enum + timeout = 10 + while timeout: + ret = subprocess.run(f'dfu-util -l', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout = ret.stdout.decode() + if f'serial="{id}"' in stdout and 'Found Runtime: [cafe:4000]' in stdout: + break + time.sleep(1) + timeout = timeout - 1 + + assert timeout, 'Device not available' + + print('dfu_runtime test done') -test_cdc_dual_ports('/dev/ttyUSB_57323020.00', '/dev/ttyUSB_57323020.02') \ No newline at end of file + +if __name__ == '__main__': + with open(f'{os.path.dirname(__file__)}/hitl_config.json') as f: + config = json.load(f) + + for device in config['devices']: + print(f"Testing device:{device['device']}") + for test in device['tests']: + if device['debugger'] == 'jlink': + flash_jlink(device['debugger_sn'], device['device'], test['firmware']) + else: + # ToDo + pass + locals()[f'test_{test["name"]}'](device['uid']) -- cgit v1.3.1 From 4d1f3f4e9dbe97060d41c188573fe94057ea1428 Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Sun, 6 Aug 2023 16:30:19 +0200 Subject: Add more MCU. --- test/hitl/hitl_config.json | 52 ++++++++++++++++++++++++++++++++++++++++++++-- test/hitl/hitl_test.py | 33 +++++++++++++++-------------- 2 files changed, 67 insertions(+), 18 deletions(-) (limited to 'test') diff --git a/test/hitl/hitl_config.json b/test/hitl/hitl_config.json index f57629a52..297ae8b81 100644 --- a/test/hitl/hitl_config.json +++ b/test/hitl/hitl_config.json @@ -4,7 +4,7 @@ "uid": "41003B000E504E5457323020", "debugger": "jlink", "debugger_sn": "774470029", - "device": "stm32l412kb", + "device": "STM32L412KB", "tests": [ { "name": "cdc_dual_ports", @@ -23,6 +23,54 @@ "firmware": "examples/device/dfu_runtime/_build/stm32l412nucleo/dfu_runtime.elf" } ] + }, + { + "uid": "210041000C51343237303334", + "debugger": "jlink", + "debugger_sn": "770935966", + "device": "STM32F746NG", + "tests": [ + { + "name": "cdc_dual_ports", + "firmware": "examples/device/cdc_dual_ports/_build/stm32f746disco/cdc_dual_ports.elf" + }, + { + "name": "cdc_msc", + "firmware": "examples/device/cdc_msc/_build/stm32f746disco/cdc_msc.elf" + }, + { + "name": "dfu", + "firmware": "examples/device/dfu/_build/stm32f746disco/dfu.elf" + }, + { + "name": "dfu_runtime", + "firmware": "examples/device/dfu_runtime/_build/stm32f746disco/dfu_runtime.elf" + } + ] + }, + { + "uid": "0123456789ABCDEF", + "debugger": "jlink", + "debugger_sn": "727600775", + "device": "LPC54608J512", + "tests": [ + { + "name": "cdc_dual_ports", + "firmware": "examples/device/cdc_dual_ports/_build/lpcxpresso54628/cdc_dual_ports.elf" + }, + { + "name": "cdc_msc", + "firmware": "examples/device/cdc_msc/_build/lpcxpresso54628/cdc_msc.elf" + }, + { + "name": "dfu", + "firmware": "examples/device/dfu/_build/lpcxpresso54628/dfu.elf" + }, + { + "name": "dfu_runtime", + "firmware": "examples/device/dfu_runtime/_build/lpcxpresso54628/dfu_runtime.elf" + } + ] } ] -} \ No newline at end of file +} diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py index d51a13ce3..60eda57ef 100644 --- a/test/hitl/hitl_test.py +++ b/test/hitl/hitl_test.py @@ -39,8 +39,9 @@ def flash_jlink(sn, dev, firmware): f.close() ret = subprocess.run(f'JLinkExe -USB {sn} -device {dev} -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile flash.jlink', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - os.remove('flash.jlink') - assert ret.returncode == 0, 'Flash failed' + stdout = ret.stdout.decode() + os.remove('flash.jlink') + assert ret.returncode == 0, 'Flash failed\n' + stdout def test_cdc_dual_ports(id): port1 = f'/dev/ttyUSB_{id[-8:]}.00' @@ -55,7 +56,7 @@ def test_cdc_dual_ports(id): assert os.path.exists(port1) and os.path.exists(port2), \ 'Device not available' - + # Echo test ser1 = serial.Serial(port1) ser2 = serial.Serial(port2) @@ -90,16 +91,16 @@ def test_cdc_msc(id): assert os.path.exists(port) and os.path.exists(block), \ 'Device not available' - + # Echo test - ser = serial.Serial(port) + ser1 = serial.Serial(port) - ser.timeout = 1 + ser1.timeout = 1 str = b"test_str" - ser.write(str) - ser.flush() - assert ser.read(100) == str, 'Port wrong data' + ser1.write(str) + ser1.flush() + assert ser1.read(100) == str, 'Port wrong data' # Block test f = open(block, 'rb') @@ -124,12 +125,12 @@ def test_dfu(id): break time.sleep(1) timeout = timeout - 1 - + assert timeout, 'Device not available' - + # Test upload try: - os.remove('dfu0') + os.remove('dfu0') os.remove('dfu1') except OSError: pass @@ -148,7 +149,7 @@ def test_dfu(id): with open('dfu1') as f: assert 'Hello world from TinyUSB DFU! - Partition 1' in f.read(), 'Wrong uploaded data' - os.remove('dfu0') + os.remove('dfu0') os.remove('dfu1') print('dfu test done') @@ -164,7 +165,7 @@ def test_dfu_runtime(id): break time.sleep(1) timeout = timeout - 1 - + assert timeout, 'Device not available' print('dfu_runtime test done') @@ -173,11 +174,11 @@ def test_dfu_runtime(id): if __name__ == '__main__': with open(f'{os.path.dirname(__file__)}/hitl_config.json') as f: config = json.load(f) - + for device in config['devices']: print(f"Testing device:{device['device']}") for test in device['tests']: - if device['debugger'] == 'jlink': + if device['debugger'].lower() == 'jlink': flash_jlink(device['debugger_sn'], device['device'], test['firmware']) else: # ToDo -- cgit v1.3.1 From 87150b77702d93527e2998c62371ef2d7d2b9860 Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Sun, 6 Aug 2023 22:02:15 +0200 Subject: Add config file as argument. --- test/hitl/hitl_config.json | 76 ---------------------------------------------- test/hitl/hitl_hfp.json | 76 ++++++++++++++++++++++++++++++++++++++++++++++ test/hitl/hitl_test.py | 7 ++++- 3 files changed, 82 insertions(+), 77 deletions(-) delete mode 100644 test/hitl/hitl_config.json create mode 100644 test/hitl/hitl_hfp.json (limited to 'test') diff --git a/test/hitl/hitl_config.json b/test/hitl/hitl_config.json deleted file mode 100644 index 297ae8b81..000000000 --- a/test/hitl/hitl_config.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "devices": [ - { - "uid": "41003B000E504E5457323020", - "debugger": "jlink", - "debugger_sn": "774470029", - "device": "STM32L412KB", - "tests": [ - { - "name": "cdc_dual_ports", - "firmware": "examples/device/cdc_dual_ports/_build/stm32l412nucleo/cdc_dual_ports.elf" - }, - { - "name": "cdc_msc", - "firmware": "examples/device/cdc_msc/_build/stm32l412nucleo/cdc_msc.elf" - }, - { - "name": "dfu", - "firmware": "examples/device/dfu/_build/stm32l412nucleo/dfu.elf" - }, - { - "name": "dfu_runtime", - "firmware": "examples/device/dfu_runtime/_build/stm32l412nucleo/dfu_runtime.elf" - } - ] - }, - { - "uid": "210041000C51343237303334", - "debugger": "jlink", - "debugger_sn": "770935966", - "device": "STM32F746NG", - "tests": [ - { - "name": "cdc_dual_ports", - "firmware": "examples/device/cdc_dual_ports/_build/stm32f746disco/cdc_dual_ports.elf" - }, - { - "name": "cdc_msc", - "firmware": "examples/device/cdc_msc/_build/stm32f746disco/cdc_msc.elf" - }, - { - "name": "dfu", - "firmware": "examples/device/dfu/_build/stm32f746disco/dfu.elf" - }, - { - "name": "dfu_runtime", - "firmware": "examples/device/dfu_runtime/_build/stm32f746disco/dfu_runtime.elf" - } - ] - }, - { - "uid": "0123456789ABCDEF", - "debugger": "jlink", - "debugger_sn": "727600775", - "device": "LPC54608J512", - "tests": [ - { - "name": "cdc_dual_ports", - "firmware": "examples/device/cdc_dual_ports/_build/lpcxpresso54628/cdc_dual_ports.elf" - }, - { - "name": "cdc_msc", - "firmware": "examples/device/cdc_msc/_build/lpcxpresso54628/cdc_msc.elf" - }, - { - "name": "dfu", - "firmware": "examples/device/dfu/_build/lpcxpresso54628/dfu.elf" - }, - { - "name": "dfu_runtime", - "firmware": "examples/device/dfu_runtime/_build/lpcxpresso54628/dfu_runtime.elf" - } - ] - } - ] -} diff --git a/test/hitl/hitl_hfp.json b/test/hitl/hitl_hfp.json new file mode 100644 index 000000000..297ae8b81 --- /dev/null +++ b/test/hitl/hitl_hfp.json @@ -0,0 +1,76 @@ +{ + "devices": [ + { + "uid": "41003B000E504E5457323020", + "debugger": "jlink", + "debugger_sn": "774470029", + "device": "STM32L412KB", + "tests": [ + { + "name": "cdc_dual_ports", + "firmware": "examples/device/cdc_dual_ports/_build/stm32l412nucleo/cdc_dual_ports.elf" + }, + { + "name": "cdc_msc", + "firmware": "examples/device/cdc_msc/_build/stm32l412nucleo/cdc_msc.elf" + }, + { + "name": "dfu", + "firmware": "examples/device/dfu/_build/stm32l412nucleo/dfu.elf" + }, + { + "name": "dfu_runtime", + "firmware": "examples/device/dfu_runtime/_build/stm32l412nucleo/dfu_runtime.elf" + } + ] + }, + { + "uid": "210041000C51343237303334", + "debugger": "jlink", + "debugger_sn": "770935966", + "device": "STM32F746NG", + "tests": [ + { + "name": "cdc_dual_ports", + "firmware": "examples/device/cdc_dual_ports/_build/stm32f746disco/cdc_dual_ports.elf" + }, + { + "name": "cdc_msc", + "firmware": "examples/device/cdc_msc/_build/stm32f746disco/cdc_msc.elf" + }, + { + "name": "dfu", + "firmware": "examples/device/dfu/_build/stm32f746disco/dfu.elf" + }, + { + "name": "dfu_runtime", + "firmware": "examples/device/dfu_runtime/_build/stm32f746disco/dfu_runtime.elf" + } + ] + }, + { + "uid": "0123456789ABCDEF", + "debugger": "jlink", + "debugger_sn": "727600775", + "device": "LPC54608J512", + "tests": [ + { + "name": "cdc_dual_ports", + "firmware": "examples/device/cdc_dual_ports/_build/lpcxpresso54628/cdc_dual_ports.elf" + }, + { + "name": "cdc_msc", + "firmware": "examples/device/cdc_msc/_build/lpcxpresso54628/cdc_msc.elf" + }, + { + "name": "dfu", + "firmware": "examples/device/dfu/_build/lpcxpresso54628/dfu.elf" + }, + { + "name": "dfu_runtime", + "firmware": "examples/device/dfu_runtime/_build/lpcxpresso54628/dfu_runtime.elf" + } + ] + } + ] +} diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py index 60eda57ef..6c8066add 100644 --- a/test/hitl/hitl_test.py +++ b/test/hitl/hitl_test.py @@ -172,7 +172,12 @@ def test_dfu_runtime(id): if __name__ == '__main__': - with open(f'{os.path.dirname(__file__)}/hitl_config.json') as f: + if len(sys.argv) != 2: + print('Usage:') + print('python hitl_test.py config.json') + sys.exit(-1) + + with open(f'{os.path.dirname(__file__)}/{sys.argv[1]}') as f: config = json.load(f) for device in config['devices']: -- cgit v1.3.1 From c24f10e4f6d46c7f65136b57be0fa2063fe7c9f2 Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Mon, 7 Aug 2023 20:48:54 +0200 Subject: Mount block device in test_cdc_msc. --- test/hitl/hitl_test.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'test') diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py index 6c8066add..f6e741646 100644 --- a/test/hitl/hitl_test.py +++ b/test/hitl/hitl_test.py @@ -22,8 +22,8 @@ # THE SOFTWARE. # udev rules : -# SUBSYSTEM=="block", SUBSYSTEMS=="usb", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", SYMLINK+="blkUSB_%c.%s{bInterfaceNumber}" -# SUBSYSTEM=="tty", SUBSYSTEMS=="usb", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", SYMLINK+="ttyUSB_%c.%s{bInterfaceNumber}" +# ACTION=="add", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", SYMLINK+="ttyUSB_%c.%s{bInterfaceNumber}" +# ACTION=="add", SUBSYSTEM=="block", SUBSYSTEMS=="usb", ENV{ID_FS_USAGE}=="filesystem", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /media/blkUSB_%c.%s{bInterfaceNumber}" import os import sys @@ -80,16 +80,16 @@ def test_cdc_dual_ports(id): def test_cdc_msc(id): port = f'/dev/ttyUSB_{id[-8:]}.00' - block = f'/dev/blkUSB_{id[-8:]}.02' + file = f'/media/blkUSB_{id[-8:]}.02/README.TXT' # Wait device enum timeout = 10 while timeout: - if os.path.exists(port) and os.path.exists(block): + if os.path.exists(port) and os.path.isfile(file): break time.sleep(1) timeout = timeout - 1 - assert os.path.exists(port) and os.path.exists(block), \ + assert os.path.exists(port) and os.path.isfile(file), \ 'Device not available' # Echo test @@ -100,10 +100,10 @@ def test_cdc_msc(id): str = b"test_str" ser1.write(str) ser1.flush() - assert ser1.read(100) == str, 'Port wrong data' + assert ser1.read(100) == str, 'CDC wrong data' # Block test - f = open(block, 'rb') + f = open(file, 'rb') data = f.read() readme = \ @@ -111,7 +111,7 @@ def test_cdc_msc(id): If you find any bugs or get any questions, feel free to file an\r\n\ issue at github.com/hathach/tinyusb" - assert data[0x600:0x600 + len(readme)] == readme, 'Block wrong data' + assert data == readme, 'MSC wrong data' print('cdc_msc test done') def test_dfu(id): -- cgit v1.3.1 From 3444c4abe5d12ac2a74726cb244525f9481830ff Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Tue, 8 Aug 2023 17:34:07 +0200 Subject: Add dummy board_test. --- test/hitl/hitl_test.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py index f6e741646..dc6019470 100644 --- a/test/hitl/hitl_test.py +++ b/test/hitl/hitl_test.py @@ -155,7 +155,7 @@ def test_dfu(id): print('dfu test done') def test_dfu_runtime(id): - # Wait device enum + # Wait device enum timeout = 10 while timeout: ret = subprocess.run(f'dfu-util -l', @@ -170,6 +170,9 @@ def test_dfu_runtime(id): print('dfu_runtime test done') +def test_board_test(id): + # Dummy test + pass if __name__ == '__main__': if len(sys.argv) != 2: -- cgit v1.3.1 From 56bed1e5811a97016533a25069408e45dd6f41ba Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Tue, 8 Aug 2023 17:34:45 +0200 Subject: Flash board_test when done, skip cdc_msc for LPC54. --- test/hitl/hitl_hfp.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'test') diff --git a/test/hitl/hitl_hfp.json b/test/hitl/hitl_hfp.json index 297ae8b81..426123288 100644 --- a/test/hitl/hitl_hfp.json +++ b/test/hitl/hitl_hfp.json @@ -21,6 +21,10 @@ { "name": "dfu_runtime", "firmware": "examples/device/dfu_runtime/_build/stm32l412nucleo/dfu_runtime.elf" + }, + { + "name": "board_test", + "firmware": "examples/device/board_test/_build/stm32l412nucleo/board_test.elf" } ] }, @@ -45,6 +49,10 @@ { "name": "dfu_runtime", "firmware": "examples/device/dfu_runtime/_build/stm32f746disco/dfu_runtime.elf" + }, + { + "name": "board_test", + "firmware": "examples/device/board_test/_build/stm32f746disco/board_test.elf" } ] }, @@ -58,10 +66,6 @@ "name": "cdc_dual_ports", "firmware": "examples/device/cdc_dual_ports/_build/lpcxpresso54628/cdc_dual_ports.elf" }, - { - "name": "cdc_msc", - "firmware": "examples/device/cdc_msc/_build/lpcxpresso54628/cdc_msc.elf" - }, { "name": "dfu", "firmware": "examples/device/dfu/_build/lpcxpresso54628/dfu.elf" @@ -69,6 +73,10 @@ { "name": "dfu_runtime", "firmware": "examples/device/dfu_runtime/_build/lpcxpresso54628/dfu_runtime.elf" + }, + { + "name": "board_test", + "firmware": "examples/device/board_test/_build/lpcxpresso54628/board_test.elf" } ] } -- cgit v1.3.1 From 992e17fb4833f102e23f8241ac1d7fea0985cb4e Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Tue, 8 Aug 2023 22:08:59 +0200 Subject: Add simple test for hid_boot_interface. --- test/hitl/hitl_hfp.json | 8 ++++++++ test/hitl/hitl_test.py | 22 ++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) (limited to 'test') diff --git a/test/hitl/hitl_hfp.json b/test/hitl/hitl_hfp.json index 426123288..866e5233f 100644 --- a/test/hitl/hitl_hfp.json +++ b/test/hitl/hitl_hfp.json @@ -22,6 +22,10 @@ "name": "dfu_runtime", "firmware": "examples/device/dfu_runtime/_build/stm32l412nucleo/dfu_runtime.elf" }, + { + "name": "hid_boot_interface", + "firmware": "examples/device/hid_boot_interface/_build/stm32l412nucleo/hid_boot_interface.elf" + }, { "name": "board_test", "firmware": "examples/device/board_test/_build/stm32l412nucleo/board_test.elf" @@ -50,6 +54,10 @@ "name": "dfu_runtime", "firmware": "examples/device/dfu_runtime/_build/stm32f746disco/dfu_runtime.elf" }, + { + "name": "hid_boot_interface", + "firmware": "examples/device/hid_boot_interface/_build/stm32f746disco/hid_boot_interface.elf" + }, { "name": "board_test", "firmware": "examples/device/board_test/_build/stm32f746disco/board_test.elf" diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py index dc6019470..695c6a28c 100644 --- a/test/hitl/hitl_test.py +++ b/test/hitl/hitl_test.py @@ -54,8 +54,7 @@ def test_cdc_dual_ports(id): time.sleep(1) timeout = timeout - 1 - assert os.path.exists(port1) and os.path.exists(port2), \ - 'Device not available' + assert timeout, 'Device not available' # Echo test ser1 = serial.Serial(port1) @@ -89,8 +88,7 @@ def test_cdc_msc(id): time.sleep(1) timeout = timeout - 1 - assert os.path.exists(port) and os.path.isfile(file), \ - 'Device not available' + assert timeout, 'Device not available' # Echo test ser1 = serial.Serial(port) @@ -170,6 +168,22 @@ def test_dfu_runtime(id): print('dfu_runtime test done') +def test_hid_boot_interface(id): + kbd = f'/dev/input/by-id/usb-TinyUSB_TinyUSB_Device_{id}-event-kbd' + mouse1 = f'/dev/input/by-id/usb-TinyUSB_TinyUSB_Device_{id}-if01-event-mouse' + mouse2 = f'/dev/input/by-id/usb-TinyUSB_TinyUSB_Device_{id}-if01-mouse' + # Wait device enum + timeout = 10 + while timeout: + if os.path.exists(kbd) and os.path.exists(mouse1) and os.path.exists(mouse2): + break + time.sleep(1) + timeout = timeout - 1 + + assert timeout, 'Device not available' + + print('hid_boot_interface test done') + def test_board_test(id): # Dummy test pass -- cgit v1.3.1 From 1268d1a0937a1a7c9d7b20b17581a82f233d066d Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 9 Aug 2023 18:46:23 +0700 Subject: update hil test and json (remove troublesome lpc54608), run hil test on ci with IAR build --- .github/workflows/build_iar.yml | 151 ++++++++++++------------ .idea/cmake.xml | 1 - examples/device/CMakeLists.txt | 1 + hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake | 2 +- test/hitl/hitl_hfp.json | 84 +------------ test/hitl/hitl_test.py | 84 +++++++++---- 6 files changed, 147 insertions(+), 176 deletions(-) (limited to 'test') diff --git a/.github/workflows/build_iar.yml b/.github/workflows/build_iar.yml index 454ad12fe..a62e62b79 100644 --- a/.github/workflows/build_iar.yml +++ b/.github/workflows/build_iar.yml @@ -32,7 +32,7 @@ jobs: # Alphabetical order # Note: bundle multiple families into a matrix since there is only one self-hosted instance can # run IAR build. Too many matrix can hurt due to setup/teardown overhead. - - 'stm32f0 stm32f1 stm32f7 stm32g0 stm32g4 stm32h7 stm32l4' + - 'stm32f0 stm32f1 stm32f4 stm32f7 stm32g0 stm32g4 stm32h7 stm32l4' steps: - name: Clean workspace run: | @@ -49,82 +49,85 @@ jobs: - name: Build run: python3 tools/build_cmake.py ${{ matrix.family }} -DTOOLCHAIN=iar -DCMAKE_BUILD_TYPE=MinSizeRel - # Upload binaries for hardware test with self-hosted - - name: Prepare stm32l412nucleo Artifacts - if: contains(matrix.family, 'stm32l4') - working-directory: ${{github.workspace}}/cmake-build/cmake-build-stm32l412nucleo + - name: Test on actual hardware (hardware in the loop) run: | - find device/ -name "*.elf" -exec mv {} ../../ \; - - - name: Upload Artifacts for stm32l412nucleo - if: contains(matrix.family, 'stm32l4') && github.repository_owner == 'hathach' - uses: actions/upload-artifact@v3 - with: - name: stm32l4 - path: | - *.elf + python3 tools/hitl_test.py hitl_hfp.json + +# # Upload binaries for hardware test with self-hosted +# - name: Prepare stm32l412nucleo Artifacts +# if: contains(matrix.family, 'stm32l4') +# working-directory: ${{github.workspace}}/cmake-build/cmake-build-stm32l412nucleo +# run: | +# find device/ -name "*.elf" -exec mv {} ../../ \; +# +# - name: Upload Artifacts for stm32l412nucleo +# if: contains(matrix.family, 'stm32l4') && github.repository_owner == 'hathach' +# uses: actions/upload-artifact@v3 +# with: +# name: stm32l4 +# path: | +# *.elf # --------------------------------------- # Hardware in the loop (HIL) # Current self-hosted instance is running on an EPYC 7232 server hosted by HiFiPhile user - # - STM32L412 Nucleo with on-board jlink as ttyACM0 # --------------------------------------- - hw-stm32l412nucleo-test: - needs: cmake - runs-on: [self-hosted, Linux, X64, hifiphile] - - steps: - - name: Clean workspace - run: | - echo "Cleaning up previous run" - rm -rf "${{ github.workspace }}" - mkdir -p "${{ github.workspace }}" - - - name: Download stm32l4 Artifacts - uses: actions/download-artifact@v3 - with: - name: stm32l4 - - - name: Create flash.sh - run: | - echo > flash.sh 'echo halt > flash.jlink' - echo >> flash.sh 'echo r >> flash.jlink' - echo >> flash.sh 'echo loadfile $1 >> flash.jlink' - echo >> flash.sh 'echo r >> flash.jlink' - echo >> flash.sh 'echo go >> flash.jlink' - echo >> flash.sh 'echo exit >> flash.jlink' - echo >> flash.sh 'cmdout=$(JLinkExe -USB 774470029 -device stm32l412kb -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile flash.jlink)' - echo >> flash.sh 'if (( $? )) ; then echo $cmdout ; fi' - chmod +x flash.sh - - - name: Test cdc_dual_ports - run: | - ./flash.sh cdc_dual_ports.elf - while (! ([ -e /dev/ttyACM1 ] && [ -e /dev/ttyACM2 ])) && [ $SECONDS -le 10 ]; do :; done - test -e /dev/ttyACM1 && echo "ttyACM1 exists" - test -e /dev/ttyACM2 && echo "ttyACM2 exists" - - # Debian does not auto mount usb drive. skip this test for now - - name: Test cdc_msc - if: false - run: | - ./flash.sh cdc_msc.elf - readme='/media/pi/TinyUSB MSC/README.TXT' - while (! ([ -e /dev/ttyACM1 ] && [ -f "$readme" ])) && [ $SECONDS -le 10 ]; do :; done - test -e /dev/ttyACM1 && echo "ttyACM1 exists" - test -f "$readme" && echo "$readme exists" - cat "$readme" - - - name: Test dfu - run: | - ./flash.sh dfu.elf - while (! (dfu-util -l | grep "Found DFU")) && [ $SECONDS -le 10 ]; do :; done - dfu-util -d cafe -a 0 -U dfu0 - dfu-util -d cafe -a 1 -U dfu1 - grep "TinyUSB DFU! - Partition 0" dfu0 - grep "TinyUSB DFU! - Partition 1" dfu1 - - - name: Test dfu_runtime - run: | - ./flash.sh dfu_runtime.elf - while (! (dfu-util -l | grep "Found Runtime")) && [ $SECONDS -le 10 ]; do :; done +# hw-stm32l412nucleo-test: +# needs: cmake +# runs-on: [self-hosted, Linux, X64, hifiphile] +# +# steps: +# - name: Clean workspace +# run: | +# echo "Cleaning up previous run" +# rm -rf "${{ github.workspace }}" +# mkdir -p "${{ github.workspace }}" +# +# - name: Download stm32l4 Artifacts +# uses: actions/download-artifact@v3 +# with: +# name: stm32l4 +# +# - name: Create flash.sh +# run: | +# echo > flash.sh 'echo halt > flash.jlink' +# echo >> flash.sh 'echo r >> flash.jlink' +# echo >> flash.sh 'echo loadfile $1 >> flash.jlink' +# echo >> flash.sh 'echo r >> flash.jlink' +# echo >> flash.sh 'echo go >> flash.jlink' +# echo >> flash.sh 'echo exit >> flash.jlink' +# echo >> flash.sh 'cmdout=$(JLinkExe -USB 774470029 -device stm32l412kb -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile flash.jlink)' +# echo >> flash.sh 'if (( $? )) ; then echo $cmdout ; fi' +# chmod +x flash.sh +# +# - name: Test cdc_dual_ports +# run: | +# ./flash.sh cdc_dual_ports.elf +# while (! ([ -e /dev/ttyACM1 ] && [ -e /dev/ttyACM2 ])) && [ $SECONDS -le 10 ]; do :; done +# test -e /dev/ttyACM1 && echo "ttyACM1 exists" +# test -e /dev/ttyACM2 && echo "ttyACM2 exists" +# +# # Debian does not auto mount usb drive. skip this test for now +# - name: Test cdc_msc +# if: false +# run: | +# ./flash.sh cdc_msc.elf +# readme='/media/pi/TinyUSB MSC/README.TXT' +# while (! ([ -e /dev/ttyACM1 ] && [ -f "$readme" ])) && [ $SECONDS -le 10 ]; do :; done +# test -e /dev/ttyACM1 && echo "ttyACM1 exists" +# test -f "$readme" && echo "$readme exists" +# cat "$readme" +# +# - name: Test dfu +# run: | +# ./flash.sh dfu.elf +# while (! (dfu-util -l | grep "Found DFU")) && [ $SECONDS -le 10 ]; do :; done +# dfu-util -d cafe -a 0 -U dfu0 +# dfu-util -d cafe -a 1 -U dfu1 +# grep "TinyUSB DFU! - Partition 0" dfu0 +# grep "TinyUSB DFU! - Partition 1" dfu1 +# +# - name: Test dfu_runtime +# run: | +# ./flash.sh dfu_runtime.elf +# while (! (dfu-util -l | grep "Found Runtime")) && [ $SECONDS -le 10 ]; do :; done diff --git a/.idea/cmake.xml b/.idea/cmake.xml index 4a69d02cf..8ee7f09a0 100644 --- a/.idea/cmake.xml +++ b/.idea/cmake.xml @@ -52,7 +52,6 @@ - \ No newline at end of file diff --git a/examples/device/CMakeLists.txt b/examples/device/CMakeLists.txt index f590fff3f..0a2e49ef0 100644 --- a/examples/device/CMakeLists.txt +++ b/examples/device/CMakeLists.txt @@ -17,6 +17,7 @@ family_add_subdirectory(cdc_uac2) family_add_subdirectory(dfu) family_add_subdirectory(dfu_runtime) family_add_subdirectory(dynamic_configuration) +family_add_subdirectory(hid_boot_interface) family_add_subdirectory(hid_composite) family_add_subdirectory(hid_composite_freertos) family_add_subdirectory(hid_generic_inout) diff --git a/hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake index 3af6034ad..b52ec2f9d 100644 --- a/hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake +++ b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake @@ -1,7 +1,7 @@ set(MCU_VARIANT LPC55S69) set(MCU_CORE LPC55S69_cm33_core0) -set(JLINK_DEVICE LPC55S69) +set(JLINK_DEVICE LPC55S69_M33_0) set(PYOCD_TARGET LPC55S69) set(NXPLINK_DEVICE LPC55S69:LPCXpresso55S69) diff --git a/test/hitl/hitl_hfp.json b/test/hitl/hitl_hfp.json index 866e5233f..7912af245 100644 --- a/test/hitl/hitl_hfp.json +++ b/test/hitl/hitl_hfp.json @@ -1,92 +1,18 @@ { - "devices": [ + "boards": [ { + "name": "stm32l412nucleo", "uid": "41003B000E504E5457323020", "debugger": "jlink", "debugger_sn": "774470029", - "device": "STM32L412KB", - "tests": [ - { - "name": "cdc_dual_ports", - "firmware": "examples/device/cdc_dual_ports/_build/stm32l412nucleo/cdc_dual_ports.elf" - }, - { - "name": "cdc_msc", - "firmware": "examples/device/cdc_msc/_build/stm32l412nucleo/cdc_msc.elf" - }, - { - "name": "dfu", - "firmware": "examples/device/dfu/_build/stm32l412nucleo/dfu.elf" - }, - { - "name": "dfu_runtime", - "firmware": "examples/device/dfu_runtime/_build/stm32l412nucleo/dfu_runtime.elf" - }, - { - "name": "hid_boot_interface", - "firmware": "examples/device/hid_boot_interface/_build/stm32l412nucleo/hid_boot_interface.elf" - }, - { - "name": "board_test", - "firmware": "examples/device/board_test/_build/stm32l412nucleo/board_test.elf" - } - ] + "cpu": "STM32L412KB" }, { + "name": "stm32f746disco", "uid": "210041000C51343237303334", "debugger": "jlink", "debugger_sn": "770935966", - "device": "STM32F746NG", - "tests": [ - { - "name": "cdc_dual_ports", - "firmware": "examples/device/cdc_dual_ports/_build/stm32f746disco/cdc_dual_ports.elf" - }, - { - "name": "cdc_msc", - "firmware": "examples/device/cdc_msc/_build/stm32f746disco/cdc_msc.elf" - }, - { - "name": "dfu", - "firmware": "examples/device/dfu/_build/stm32f746disco/dfu.elf" - }, - { - "name": "dfu_runtime", - "firmware": "examples/device/dfu_runtime/_build/stm32f746disco/dfu_runtime.elf" - }, - { - "name": "hid_boot_interface", - "firmware": "examples/device/hid_boot_interface/_build/stm32f746disco/hid_boot_interface.elf" - }, - { - "name": "board_test", - "firmware": "examples/device/board_test/_build/stm32f746disco/board_test.elf" - } - ] - }, - { - "uid": "0123456789ABCDEF", - "debugger": "jlink", - "debugger_sn": "727600775", - "device": "LPC54608J512", - "tests": [ - { - "name": "cdc_dual_ports", - "firmware": "examples/device/cdc_dual_ports/_build/lpcxpresso54628/cdc_dual_ports.elf" - }, - { - "name": "dfu", - "firmware": "examples/device/dfu/_build/lpcxpresso54628/dfu.elf" - }, - { - "name": "dfu_runtime", - "firmware": "examples/device/dfu_runtime/_build/lpcxpresso54628/dfu_runtime.elf" - }, - { - "name": "board_test", - "firmware": "examples/device/board_test/_build/lpcxpresso54628/board_test.elf" - } - ] + "cpu": "STM32F746NG" } ] } diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py index 695c6a28c..6bcde36c6 100644 --- a/test/hitl/hitl_test.py +++ b/test/hitl/hitl_test.py @@ -32,6 +32,21 @@ import serial import subprocess import json + +def get_serial_dev(id, product, ifnum): + # get usb serial by id + return f'/dev/serial/by-id/usb-TinyUSB_{product}_{id}-if{ifnum:02d}' + + +def get_disk_dev(id, lun): + # get usb disk by id + return f'/dev/disk/by-id/usb-TinyUSB_Mass_Storage_{id}-0:{lun}' + + +def get_hid_dev(id, product, event): + return f'/dev/input/by-id/usb-TinyUSB_{product}_{id}-{event}' + + def flash_jlink(sn, dev, firmware): script = ['halt', 'r', f'loadfile {firmware}', 'r', 'go', 'exit'] f = open('flash.jlink', 'w') @@ -43,9 +58,15 @@ def flash_jlink(sn, dev, firmware): os.remove('flash.jlink') assert ret.returncode == 0, 'Flash failed\n' + stdout + +def test_board_test(id): + # Dummy test + pass + def test_cdc_dual_ports(id): - port1 = f'/dev/ttyUSB_{id[-8:]}.00' - port2 = f'/dev/ttyUSB_{id[-8:]}.02' + port1 = get_serial_dev(id, "TinyUSB_Device", 0) + port2 = get_serial_dev(id, "TinyUSB_Device", 2) + # Wait device enum timeout = 10 while timeout: @@ -75,10 +96,9 @@ def test_cdc_dual_ports(id): assert ser1.read(100) == str2.lower(), 'Port1 wrong data' assert ser2.read(100) == str2.upper(), 'Port2 wrong data' - print('cdc_dual_ports test done') def test_cdc_msc(id): - port = f'/dev/ttyUSB_{id[-8:]}.00' + port = get_serial_dev(id, "TinyUSB_Device", 0) file = f'/media/blkUSB_{id[-8:]}.02/README.TXT' # Wait device enum timeout = 10 @@ -110,7 +130,6 @@ If you find any bugs or get any questions, feel free to file an\r\n\ issue at github.com/hathach/tinyusb" assert data == readme, 'MSC wrong data' - print('cdc_msc test done') def test_dfu(id): # Wait device enum @@ -150,7 +169,6 @@ def test_dfu(id): os.remove('dfu0') os.remove('dfu1') - print('dfu test done') def test_dfu_runtime(id): # Wait device enum @@ -166,12 +184,11 @@ def test_dfu_runtime(id): assert timeout, 'Device not available' - print('dfu_runtime test done') def test_hid_boot_interface(id): - kbd = f'/dev/input/by-id/usb-TinyUSB_TinyUSB_Device_{id}-event-kbd' - mouse1 = f'/dev/input/by-id/usb-TinyUSB_TinyUSB_Device_{id}-if01-event-mouse' - mouse2 = f'/dev/input/by-id/usb-TinyUSB_TinyUSB_Device_{id}-if01-mouse' + kbd = get_hid_dev(id, 'TinyUSB_Device', 'event-kbd') + mouse1 = get_hid_dev(id, 'TinyUSB_Device', 'if01-event-mouse') + mouse2 = get_hid_dev(id, 'TinyUSB_Device', 'if01-mouse') # Wait device enum timeout = 10 while timeout: @@ -182,11 +199,6 @@ def test_hid_boot_interface(id): assert timeout, 'Device not available' - print('hid_boot_interface test done') - -def test_board_test(id): - # Dummy test - pass if __name__ == '__main__': if len(sys.argv) != 2: @@ -197,12 +209,42 @@ if __name__ == '__main__': with open(f'{os.path.dirname(__file__)}/{sys.argv[1]}') as f: config = json.load(f) - for device in config['devices']: - print(f"Testing device:{device['device']}") - for test in device['tests']: - if device['debugger'].lower() == 'jlink': - flash_jlink(device['debugger_sn'], device['device'], test['firmware']) + # all possible tests, board_test is last to disable board's usb + all_tests = [ + 'cdc_dual_ports', 'cdc_msc', 'dfu', 'dfu_runtime', 'hid_boot_interface', 'board_test' + ] + + for board in config['boards']: + print(f'Testing board:{board["name"]}') + + # default to all tests + if 'tests' in board: + test_list = board['tests'] + else: + test_list = all_tests + + # remove skip_tests + if 'tests_skip' in board: + for skip in board['tests_skip']: + if skip in test_list: + test_list.remove(skip) + + for test in test_list: + mk_elf = f'examples/device/{test}/_build/{board["name"]}/{test}.elf' + cmake_elf = f'cmake-build/cmake-build-{board["name"]}/device/{test}/{test}.elf' + if os.path.isfile(cmake_elf): + elf = cmake_elf + elif os.path.isfile(mk_elf): + elf = mk_elf + else: + print(f'Cannot find firmware file for {test}') + sys.exit(-1) + + if board['debugger'].lower() == 'jlink': + flash_jlink(board['debugger_sn'], board['cpu'], elf) else: # ToDo pass - locals()[f'test_{test["name"]}'](device['uid']) + print(f' {test} ...', end='') + locals()[f'test_{test}'](board['uid']) + print('OK') -- cgit v1.3.1 From 8e690df1da3b542988b9ec093f3ce03c8cfd9248 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 9 Aug 2023 19:03:56 +0700 Subject: rename hitl to hil --- .github/workflows/build_iar.yml | 2 +- test/hil/hil_hfp.json | 18 +++ test/hil/hil_test.py | 250 ++++++++++++++++++++++++++++++++++++++++ test/hitl/hitl_hfp.json | 18 --- test/hitl/hitl_test.py | 250 ---------------------------------------- 5 files changed, 269 insertions(+), 269 deletions(-) create mode 100644 test/hil/hil_hfp.json create mode 100644 test/hil/hil_test.py delete mode 100644 test/hitl/hitl_hfp.json delete mode 100644 test/hitl/hitl_test.py (limited to 'test') diff --git a/.github/workflows/build_iar.yml b/.github/workflows/build_iar.yml index a62e62b79..48fdd6a8a 100644 --- a/.github/workflows/build_iar.yml +++ b/.github/workflows/build_iar.yml @@ -51,7 +51,7 @@ jobs: - name: Test on actual hardware (hardware in the loop) run: | - python3 tools/hitl_test.py hitl_hfp.json + python3 test/hil/hil_test.py hil_hfp.json # # Upload binaries for hardware test with self-hosted # - name: Prepare stm32l412nucleo Artifacts diff --git a/test/hil/hil_hfp.json b/test/hil/hil_hfp.json new file mode 100644 index 000000000..7912af245 --- /dev/null +++ b/test/hil/hil_hfp.json @@ -0,0 +1,18 @@ +{ + "boards": [ + { + "name": "stm32l412nucleo", + "uid": "41003B000E504E5457323020", + "debugger": "jlink", + "debugger_sn": "774470029", + "cpu": "STM32L412KB" + }, + { + "name": "stm32f746disco", + "uid": "210041000C51343237303334", + "debugger": "jlink", + "debugger_sn": "770935966", + "cpu": "STM32F746NG" + } + ] +} diff --git a/test/hil/hil_test.py b/test/hil/hil_test.py new file mode 100644 index 000000000..6bcde36c6 --- /dev/null +++ b/test/hil/hil_test.py @@ -0,0 +1,250 @@ +# +# The MIT License (MIT) +# +# Copyright (c) 2023 HiFiPhile +# +# 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. + +# udev rules : +# ACTION=="add", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", SYMLINK+="ttyUSB_%c.%s{bInterfaceNumber}" +# ACTION=="add", SUBSYSTEM=="block", SUBSYSTEMS=="usb", ENV{ID_FS_USAGE}=="filesystem", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /media/blkUSB_%c.%s{bInterfaceNumber}" + +import os +import sys +import time +import serial +import subprocess +import json + + +def get_serial_dev(id, product, ifnum): + # get usb serial by id + return f'/dev/serial/by-id/usb-TinyUSB_{product}_{id}-if{ifnum:02d}' + + +def get_disk_dev(id, lun): + # get usb disk by id + return f'/dev/disk/by-id/usb-TinyUSB_Mass_Storage_{id}-0:{lun}' + + +def get_hid_dev(id, product, event): + return f'/dev/input/by-id/usb-TinyUSB_{product}_{id}-{event}' + + +def flash_jlink(sn, dev, firmware): + script = ['halt', 'r', f'loadfile {firmware}', 'r', 'go', 'exit'] + f = open('flash.jlink', 'w') + f.writelines(f'{s}\n' for s in script) + f.close() + ret = subprocess.run(f'JLinkExe -USB {sn} -device {dev} -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile flash.jlink', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout = ret.stdout.decode() + os.remove('flash.jlink') + assert ret.returncode == 0, 'Flash failed\n' + stdout + + +def test_board_test(id): + # Dummy test + pass + +def test_cdc_dual_ports(id): + port1 = get_serial_dev(id, "TinyUSB_Device", 0) + port2 = get_serial_dev(id, "TinyUSB_Device", 2) + + # Wait device enum + timeout = 10 + while timeout: + if os.path.exists(port1) and os.path.exists(port2): + break + time.sleep(1) + timeout = timeout - 1 + + assert timeout, 'Device not available' + + # Echo test + ser1 = serial.Serial(port1) + ser2 = serial.Serial(port2) + + ser1.timeout = 1 + ser2.timeout = 1 + + str1 = b"test_no1" + ser1.write(str1) + ser1.flush() + assert ser1.read(100) == str1.lower(), 'Port1 wrong data' + assert ser2.read(100) == str1.upper(), 'Port2 wrong data' + + str2 = b"test_no2" + ser2.write(str2) + ser2.flush() + assert ser1.read(100) == str2.lower(), 'Port1 wrong data' + assert ser2.read(100) == str2.upper(), 'Port2 wrong data' + + +def test_cdc_msc(id): + port = get_serial_dev(id, "TinyUSB_Device", 0) + file = f'/media/blkUSB_{id[-8:]}.02/README.TXT' + # Wait device enum + timeout = 10 + while timeout: + if os.path.exists(port) and os.path.isfile(file): + break + time.sleep(1) + timeout = timeout - 1 + + assert timeout, 'Device not available' + + # Echo test + ser1 = serial.Serial(port) + + ser1.timeout = 1 + + str = b"test_str" + ser1.write(str) + ser1.flush() + assert ser1.read(100) == str, 'CDC wrong data' + + # Block test + f = open(file, 'rb') + data = f.read() + + readme = \ + b"This is tinyusb's MassStorage Class demo.\r\n\r\n\ +If you find any bugs or get any questions, feel free to file an\r\n\ +issue at github.com/hathach/tinyusb" + + assert data == readme, 'MSC wrong data' + +def test_dfu(id): + # Wait device enum + timeout = 10 + while timeout: + ret = subprocess.run(f'dfu-util -l', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout = ret.stdout.decode() + if f'serial="{id}"' in stdout and 'Found DFU: [cafe:4000]' in stdout: + break + time.sleep(1) + timeout = timeout - 1 + + assert timeout, 'Device not available' + + # Test upload + try: + os.remove('dfu0') + os.remove('dfu1') + except OSError: + pass + + ret = subprocess.run(f'dfu-util -S {id} -a 0 -U dfu0', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + assert ret.returncode == 0, 'Upload failed' + + ret = subprocess.run(f'dfu-util -S {id} -a 1 -U dfu1', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + assert ret.returncode == 0, 'Upload failed' + + with open('dfu0') as f: + assert 'Hello world from TinyUSB DFU! - Partition 0' in f.read(), 'Wrong uploaded data' + + with open('dfu1') as f: + assert 'Hello world from TinyUSB DFU! - Partition 1' in f.read(), 'Wrong uploaded data' + + os.remove('dfu0') + os.remove('dfu1') + + +def test_dfu_runtime(id): + # Wait device enum + timeout = 10 + while timeout: + ret = subprocess.run(f'dfu-util -l', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout = ret.stdout.decode() + if f'serial="{id}"' in stdout and 'Found Runtime: [cafe:4000]' in stdout: + break + time.sleep(1) + timeout = timeout - 1 + + assert timeout, 'Device not available' + + +def test_hid_boot_interface(id): + kbd = get_hid_dev(id, 'TinyUSB_Device', 'event-kbd') + mouse1 = get_hid_dev(id, 'TinyUSB_Device', 'if01-event-mouse') + mouse2 = get_hid_dev(id, 'TinyUSB_Device', 'if01-mouse') + # Wait device enum + timeout = 10 + while timeout: + if os.path.exists(kbd) and os.path.exists(mouse1) and os.path.exists(mouse2): + break + time.sleep(1) + timeout = timeout - 1 + + assert timeout, 'Device not available' + + +if __name__ == '__main__': + if len(sys.argv) != 2: + print('Usage:') + print('python hitl_test.py config.json') + sys.exit(-1) + + with open(f'{os.path.dirname(__file__)}/{sys.argv[1]}') as f: + config = json.load(f) + + # all possible tests, board_test is last to disable board's usb + all_tests = [ + 'cdc_dual_ports', 'cdc_msc', 'dfu', 'dfu_runtime', 'hid_boot_interface', 'board_test' + ] + + for board in config['boards']: + print(f'Testing board:{board["name"]}') + + # default to all tests + if 'tests' in board: + test_list = board['tests'] + else: + test_list = all_tests + + # remove skip_tests + if 'tests_skip' in board: + for skip in board['tests_skip']: + if skip in test_list: + test_list.remove(skip) + + for test in test_list: + mk_elf = f'examples/device/{test}/_build/{board["name"]}/{test}.elf' + cmake_elf = f'cmake-build/cmake-build-{board["name"]}/device/{test}/{test}.elf' + if os.path.isfile(cmake_elf): + elf = cmake_elf + elif os.path.isfile(mk_elf): + elf = mk_elf + else: + print(f'Cannot find firmware file for {test}') + sys.exit(-1) + + if board['debugger'].lower() == 'jlink': + flash_jlink(board['debugger_sn'], board['cpu'], elf) + else: + # ToDo + pass + print(f' {test} ...', end='') + locals()[f'test_{test}'](board['uid']) + print('OK') diff --git a/test/hitl/hitl_hfp.json b/test/hitl/hitl_hfp.json deleted file mode 100644 index 7912af245..000000000 --- a/test/hitl/hitl_hfp.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "boards": [ - { - "name": "stm32l412nucleo", - "uid": "41003B000E504E5457323020", - "debugger": "jlink", - "debugger_sn": "774470029", - "cpu": "STM32L412KB" - }, - { - "name": "stm32f746disco", - "uid": "210041000C51343237303334", - "debugger": "jlink", - "debugger_sn": "770935966", - "cpu": "STM32F746NG" - } - ] -} diff --git a/test/hitl/hitl_test.py b/test/hitl/hitl_test.py deleted file mode 100644 index 6bcde36c6..000000000 --- a/test/hitl/hitl_test.py +++ /dev/null @@ -1,250 +0,0 @@ -# -# The MIT License (MIT) -# -# Copyright (c) 2023 HiFiPhile -# -# 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. - -# udev rules : -# ACTION=="add", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", SYMLINK+="ttyUSB_%c.%s{bInterfaceNumber}" -# ACTION=="add", SUBSYSTEM=="block", SUBSYSTEMS=="usb", ENV{ID_FS_USAGE}=="filesystem", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /media/blkUSB_%c.%s{bInterfaceNumber}" - -import os -import sys -import time -import serial -import subprocess -import json - - -def get_serial_dev(id, product, ifnum): - # get usb serial by id - return f'/dev/serial/by-id/usb-TinyUSB_{product}_{id}-if{ifnum:02d}' - - -def get_disk_dev(id, lun): - # get usb disk by id - return f'/dev/disk/by-id/usb-TinyUSB_Mass_Storage_{id}-0:{lun}' - - -def get_hid_dev(id, product, event): - return f'/dev/input/by-id/usb-TinyUSB_{product}_{id}-{event}' - - -def flash_jlink(sn, dev, firmware): - script = ['halt', 'r', f'loadfile {firmware}', 'r', 'go', 'exit'] - f = open('flash.jlink', 'w') - f.writelines(f'{s}\n' for s in script) - f.close() - ret = subprocess.run(f'JLinkExe -USB {sn} -device {dev} -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile flash.jlink', - shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - stdout = ret.stdout.decode() - os.remove('flash.jlink') - assert ret.returncode == 0, 'Flash failed\n' + stdout - - -def test_board_test(id): - # Dummy test - pass - -def test_cdc_dual_ports(id): - port1 = get_serial_dev(id, "TinyUSB_Device", 0) - port2 = get_serial_dev(id, "TinyUSB_Device", 2) - - # Wait device enum - timeout = 10 - while timeout: - if os.path.exists(port1) and os.path.exists(port2): - break - time.sleep(1) - timeout = timeout - 1 - - assert timeout, 'Device not available' - - # Echo test - ser1 = serial.Serial(port1) - ser2 = serial.Serial(port2) - - ser1.timeout = 1 - ser2.timeout = 1 - - str1 = b"test_no1" - ser1.write(str1) - ser1.flush() - assert ser1.read(100) == str1.lower(), 'Port1 wrong data' - assert ser2.read(100) == str1.upper(), 'Port2 wrong data' - - str2 = b"test_no2" - ser2.write(str2) - ser2.flush() - assert ser1.read(100) == str2.lower(), 'Port1 wrong data' - assert ser2.read(100) == str2.upper(), 'Port2 wrong data' - - -def test_cdc_msc(id): - port = get_serial_dev(id, "TinyUSB_Device", 0) - file = f'/media/blkUSB_{id[-8:]}.02/README.TXT' - # Wait device enum - timeout = 10 - while timeout: - if os.path.exists(port) and os.path.isfile(file): - break - time.sleep(1) - timeout = timeout - 1 - - assert timeout, 'Device not available' - - # Echo test - ser1 = serial.Serial(port) - - ser1.timeout = 1 - - str = b"test_str" - ser1.write(str) - ser1.flush() - assert ser1.read(100) == str, 'CDC wrong data' - - # Block test - f = open(file, 'rb') - data = f.read() - - readme = \ - b"This is tinyusb's MassStorage Class demo.\r\n\r\n\ -If you find any bugs or get any questions, feel free to file an\r\n\ -issue at github.com/hathach/tinyusb" - - assert data == readme, 'MSC wrong data' - -def test_dfu(id): - # Wait device enum - timeout = 10 - while timeout: - ret = subprocess.run(f'dfu-util -l', - shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - stdout = ret.stdout.decode() - if f'serial="{id}"' in stdout and 'Found DFU: [cafe:4000]' in stdout: - break - time.sleep(1) - timeout = timeout - 1 - - assert timeout, 'Device not available' - - # Test upload - try: - os.remove('dfu0') - os.remove('dfu1') - except OSError: - pass - - ret = subprocess.run(f'dfu-util -S {id} -a 0 -U dfu0', - shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - assert ret.returncode == 0, 'Upload failed' - - ret = subprocess.run(f'dfu-util -S {id} -a 1 -U dfu1', - shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - assert ret.returncode == 0, 'Upload failed' - - with open('dfu0') as f: - assert 'Hello world from TinyUSB DFU! - Partition 0' in f.read(), 'Wrong uploaded data' - - with open('dfu1') as f: - assert 'Hello world from TinyUSB DFU! - Partition 1' in f.read(), 'Wrong uploaded data' - - os.remove('dfu0') - os.remove('dfu1') - - -def test_dfu_runtime(id): - # Wait device enum - timeout = 10 - while timeout: - ret = subprocess.run(f'dfu-util -l', - shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - stdout = ret.stdout.decode() - if f'serial="{id}"' in stdout and 'Found Runtime: [cafe:4000]' in stdout: - break - time.sleep(1) - timeout = timeout - 1 - - assert timeout, 'Device not available' - - -def test_hid_boot_interface(id): - kbd = get_hid_dev(id, 'TinyUSB_Device', 'event-kbd') - mouse1 = get_hid_dev(id, 'TinyUSB_Device', 'if01-event-mouse') - mouse2 = get_hid_dev(id, 'TinyUSB_Device', 'if01-mouse') - # Wait device enum - timeout = 10 - while timeout: - if os.path.exists(kbd) and os.path.exists(mouse1) and os.path.exists(mouse2): - break - time.sleep(1) - timeout = timeout - 1 - - assert timeout, 'Device not available' - - -if __name__ == '__main__': - if len(sys.argv) != 2: - print('Usage:') - print('python hitl_test.py config.json') - sys.exit(-1) - - with open(f'{os.path.dirname(__file__)}/{sys.argv[1]}') as f: - config = json.load(f) - - # all possible tests, board_test is last to disable board's usb - all_tests = [ - 'cdc_dual_ports', 'cdc_msc', 'dfu', 'dfu_runtime', 'hid_boot_interface', 'board_test' - ] - - for board in config['boards']: - print(f'Testing board:{board["name"]}') - - # default to all tests - if 'tests' in board: - test_list = board['tests'] - else: - test_list = all_tests - - # remove skip_tests - if 'tests_skip' in board: - for skip in board['tests_skip']: - if skip in test_list: - test_list.remove(skip) - - for test in test_list: - mk_elf = f'examples/device/{test}/_build/{board["name"]}/{test}.elf' - cmake_elf = f'cmake-build/cmake-build-{board["name"]}/device/{test}/{test}.elf' - if os.path.isfile(cmake_elf): - elf = cmake_elf - elif os.path.isfile(mk_elf): - elf = mk_elf - else: - print(f'Cannot find firmware file for {test}') - sys.exit(-1) - - if board['debugger'].lower() == 'jlink': - flash_jlink(board['debugger_sn'], board['cpu'], elf) - else: - # ToDo - pass - print(f' {test} ...', end='') - locals()[f'test_{test}'](board['uid']) - print('OK') -- cgit v1.3.1 From 088180e3d86cc51472dcd06ae42c613b534bf71c Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 14 Aug 2023 20:58:00 +0700 Subject: add iar support for lpc43, add lpcxpresso43s67 to hil farm --- .github/workflows/build_iar.yml | 81 +------------------------- examples/host/msc_file_explorer/CMakeLists.txt | 12 ++-- hw/bsp/lpc43/family.c | 18 +++++- hw/bsp/lpc43/family.cmake | 75 +++++++++++++----------- test/hil/hil_hfp.json | 7 +++ tools/get_deps.py | 2 +- 6 files changed, 71 insertions(+), 124 deletions(-) (limited to 'test') diff --git a/.github/workflows/build_iar.yml b/.github/workflows/build_iar.yml index 48fdd6a8a..1eacf90c9 100644 --- a/.github/workflows/build_iar.yml +++ b/.github/workflows/build_iar.yml @@ -32,7 +32,7 @@ jobs: # Alphabetical order # Note: bundle multiple families into a matrix since there is only one self-hosted instance can # run IAR build. Too many matrix can hurt due to setup/teardown overhead. - - 'stm32f0 stm32f1 stm32f4 stm32f7 stm32g0 stm32g4 stm32h7 stm32l4' + - 'lpc43 stm32f0 stm32f1 stm32f4 stm32f7 stm32g0 stm32g4 stm32h7 stm32l4' steps: - name: Clean workspace run: | @@ -52,82 +52,3 @@ jobs: - name: Test on actual hardware (hardware in the loop) run: | python3 test/hil/hil_test.py hil_hfp.json - -# # Upload binaries for hardware test with self-hosted -# - name: Prepare stm32l412nucleo Artifacts -# if: contains(matrix.family, 'stm32l4') -# working-directory: ${{github.workspace}}/cmake-build/cmake-build-stm32l412nucleo -# run: | -# find device/ -name "*.elf" -exec mv {} ../../ \; -# -# - name: Upload Artifacts for stm32l412nucleo -# if: contains(matrix.family, 'stm32l4') && github.repository_owner == 'hathach' -# uses: actions/upload-artifact@v3 -# with: -# name: stm32l4 -# path: | -# *.elf - - # --------------------------------------- - # Hardware in the loop (HIL) - # Current self-hosted instance is running on an EPYC 7232 server hosted by HiFiPhile user - # --------------------------------------- -# hw-stm32l412nucleo-test: -# needs: cmake -# runs-on: [self-hosted, Linux, X64, hifiphile] -# -# steps: -# - name: Clean workspace -# run: | -# echo "Cleaning up previous run" -# rm -rf "${{ github.workspace }}" -# mkdir -p "${{ github.workspace }}" -# -# - name: Download stm32l4 Artifacts -# uses: actions/download-artifact@v3 -# with: -# name: stm32l4 -# -# - name: Create flash.sh -# run: | -# echo > flash.sh 'echo halt > flash.jlink' -# echo >> flash.sh 'echo r >> flash.jlink' -# echo >> flash.sh 'echo loadfile $1 >> flash.jlink' -# echo >> flash.sh 'echo r >> flash.jlink' -# echo >> flash.sh 'echo go >> flash.jlink' -# echo >> flash.sh 'echo exit >> flash.jlink' -# echo >> flash.sh 'cmdout=$(JLinkExe -USB 774470029 -device stm32l412kb -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile flash.jlink)' -# echo >> flash.sh 'if (( $? )) ; then echo $cmdout ; fi' -# chmod +x flash.sh -# -# - name: Test cdc_dual_ports -# run: | -# ./flash.sh cdc_dual_ports.elf -# while (! ([ -e /dev/ttyACM1 ] && [ -e /dev/ttyACM2 ])) && [ $SECONDS -le 10 ]; do :; done -# test -e /dev/ttyACM1 && echo "ttyACM1 exists" -# test -e /dev/ttyACM2 && echo "ttyACM2 exists" -# -# # Debian does not auto mount usb drive. skip this test for now -# - name: Test cdc_msc -# if: false -# run: | -# ./flash.sh cdc_msc.elf -# readme='/media/pi/TinyUSB MSC/README.TXT' -# while (! ([ -e /dev/ttyACM1 ] && [ -f "$readme" ])) && [ $SECONDS -le 10 ]; do :; done -# test -e /dev/ttyACM1 && echo "ttyACM1 exists" -# test -f "$readme" && echo "$readme exists" -# cat "$readme" -# -# - name: Test dfu -# run: | -# ./flash.sh dfu.elf -# while (! (dfu-util -l | grep "Found DFU")) && [ $SECONDS -le 10 ]; do :; done -# dfu-util -d cafe -a 0 -U dfu0 -# dfu-util -d cafe -a 1 -U dfu1 -# grep "TinyUSB DFU! - Partition 0" dfu0 -# grep "TinyUSB DFU! - Partition 1" dfu1 -# -# - name: Test dfu_runtime -# run: | -# ./flash.sh dfu_runtime.elf -# while (! (dfu-util -l | grep "Found Runtime")) && [ $SECONDS -le 10 ]; do :; done diff --git a/examples/host/msc_file_explorer/CMakeLists.txt b/examples/host/msc_file_explorer/CMakeLists.txt index a35a7f0fb..1868b632e 100644 --- a/examples/host/msc_file_explorer/CMakeLists.txt +++ b/examples/host/msc_file_explorer/CMakeLists.txt @@ -22,11 +22,13 @@ target_sources(${PROJECT} PUBLIC ) # Suppress warnings on fatfs -set_source_files_properties( - ${TOP}/lib/fatfs/source/ff.c - PROPERTIES - COMPILE_FLAGS "-Wno-conversion -Wno-cast-qual" -) +if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + set_source_files_properties( + ${TOP}/lib/fatfs/source/ff.c + PROPERTIES + COMPILE_FLAGS "-Wno-conversion -Wno-cast-qual" + ) +endif () # Example include target_include_directories(${PROJECT} PUBLIC diff --git a/hw/bsp/lpc43/family.c b/hw/bsp/lpc43/family.c index 8d80bf951..d52c1a071 100644 --- a/hw/bsp/lpc43/family.c +++ b/hw/bsp/lpc43/family.c @@ -63,13 +63,25 @@ const uint32_t ExtRateIn = 0; void SystemInit(void) { #ifdef __USE_LPCOPEN - extern void (* const g_pfnVectors[])(void); unsigned int *pSCB_VTOR = (unsigned int *) 0xE000ED08; + +#ifdef __ICCARM__ + extern void *__vector_table; + *pSCB_VTOR = (unsigned int) &__vector_table; + +#elif defined(__ARMCC_VERSION) + extern void *__Vectors; + *pSCB_VTOR = (unsigned int) &__Vectors; + +#else // other compoiler using cr_startup_lpc43xx.c + extern void (* const g_pfnVectors[])(void); *pSCB_VTOR = (unsigned int) g_pfnVectors; +#endif - #if __FPU_USED == 1 +#if __FPU_USED == 1 fpuInit(); - #endif +#endif + #endif /* Setup system level pin muxing */ diff --git a/hw/bsp/lpc43/family.cmake b/hw/bsp/lpc43/family.cmake index e79004686..608fc4ca3 100644 --- a/hw/bsp/lpc43/family.cmake +++ b/hw/bsp/lpc43/family.cmake @@ -17,43 +17,48 @@ set(FAMILY_MCUS LPC43XX CACHE INTERNAL "") #------------------------------------ # only need to be built ONCE for all examples function(add_board_target BOARD_TARGET) - if (NOT TARGET ${BOARD_TARGET}) - add_library(${BOARD_TARGET} STATIC - ${SDK_DIR}/../gcc/cr_startup_lpc43xx.c - ${SDK_DIR}/src/chip_18xx_43xx.c - ${SDK_DIR}/src/clock_18xx_43xx.c - ${SDK_DIR}/src/fpu_init.c - ${SDK_DIR}/src/gpio_18xx_43xx.c - ${SDK_DIR}/src/iap_18xx_43xx.c - ${SDK_DIR}/src/sysinit_18xx_43xx.c - ${SDK_DIR}/src/uart_18xx_43xx.c - ) - target_compile_options(${BOARD_TARGET} PUBLIC - -nostdlib - ) - target_compile_definitions(${BOARD_TARGET} PUBLIC - __USE_LPCOPEN - CORE_M4 + if (TARGET ${BOARD_TARGET}) + return() + endif () + + # Startup & Linker script + set(STARTUP_FILE_GNU ${SDK_DIR}/../gcc/cr_startup_lpc43xx.c) + set(STARTUP_FILE_IAR ${SDK_DIR}/../iar/iar_startup_lpc18xx43xx.s) + set(LD_FILE_IAR ${SDK_DIR}/../iar/linker/lpc18xx_43xx_ldscript_iflash.icf) + + add_library(${BOARD_TARGET} STATIC + ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} + ${SDK_DIR}/src/chip_18xx_43xx.c + ${SDK_DIR}/src/clock_18xx_43xx.c + ${SDK_DIR}/src/fpu_init.c + ${SDK_DIR}/src/gpio_18xx_43xx.c + ${SDK_DIR}/src/iap_18xx_43xx.c + ${SDK_DIR}/src/sysinit_18xx_43xx.c + ${SDK_DIR}/src/uart_18xx_43xx.c + ) + target_compile_definitions(${BOARD_TARGET} PUBLIC + __USE_LPCOPEN + CORE_M4 + ) + target_include_directories(${BOARD_TARGET} PUBLIC + ${SDK_DIR}/inc + ${SDK_DIR}/inc/config_43xx + ) + + update_board(${BOARD_TARGET}) + + if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + target_compile_options(${BOARD_TARGET} PUBLIC -nostdlib) + target_link_options(${BOARD_TARGET} PUBLIC + "LINKER:--script=${LD_FILE_GNU}" + # nanolib + --specs=nosys.specs + --specs=nano.specs ) - target_include_directories(${BOARD_TARGET} PUBLIC - ${SDK_DIR}/inc - ${SDK_DIR}/inc/config_43xx + elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR") + target_link_options(${BOARD_TARGET} PUBLIC + "LINKER:--config=${LD_FILE_IAR}" ) - - update_board(${BOARD_TARGET}) - - if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - target_link_options(${BOARD_TARGET} PUBLIC - "LINKER:--script=${LD_FILE_GNU}" - # nanolib - --specs=nosys.specs - --specs=nano.specs - ) - elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR") - target_link_options(${BOARD_TARGET} PUBLIC - "LINKER:--config=${LD_FILE_IAR}" - ) - endif () endif () endfunction() diff --git a/test/hil/hil_hfp.json b/test/hil/hil_hfp.json index 7912af245..58f550901 100644 --- a/test/hil/hil_hfp.json +++ b/test/hil/hil_hfp.json @@ -13,6 +13,13 @@ "debugger": "jlink", "debugger_sn": "770935966", "cpu": "STM32F746NG" + }, + { + "name": "lpcxpresso43s67", + "uid": "08F000044528BAAA8D858F58C50700F5", + "debugger": "jlink", + "debugger_sn": "728973776", + "cpu": "LPC43S67_M4" } ] } diff --git a/tools/get_deps.py b/tools/get_deps.py index 82f756f64..1fac291a3 100644 --- a/tools/get_deps.py +++ b/tools/get_deps.py @@ -48,7 +48,7 @@ deps_optional = { '2204191ec76283371419fbcec207da02e1bc22fa', 'nuc'], 'hw/mcu/nxp/lpcopen': ['https://github.com/hathach/nxp_lpcopen.git', - '43c45c85405a5dd114fff0ea95cca62837740c13', + '84e0bd3e43910aaf71eefd62075cf57495418312', 'lpc11 lpc13 lpc15 lpc17 lpc18 lpc40 lpc43'], 'hw/mcu/nxp/mcux-sdk': ['https://github.com/hathach/mcux-sdk.git', '950819b7de9b32f92c3edf396bc5ffb8d66e7009', -- cgit v1.3.1