diff options
| author | Ha Thach <[email protected]> | 2023-11-29 15:34:05 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-11-29 15:34:05 +0700 |
| commit | 9c9ebb342d2d3cb0396ff4ad8c7b09acd2aee75e (patch) | |
| tree | 25c1bdd8a9f5e74cd32448b0a79d32d184ce86cc /test | |
| parent | 390c109aed6afe69285fb68cd7f778fa7f6a47b0 (diff) | |
| parent | b8d1acd1049d0535c9c2ef8f63a7aea82abd9cbd (diff) | |
Merge pull request #2355 from hathach/update-hil-rp2040
Update hil test for rp2040 on self-hosted PI4
Diffstat (limited to 'test')
| -rw-r--r-- | test/hil/hil_pi4.json | 11 | ||||
| -rw-r--r-- | test/hil/hil_test.py | 158 |
2 files changed, 110 insertions, 59 deletions
diff --git a/test/hil/hil_pi4.json b/test/hil/hil_pi4.json new file mode 100644 index 000000000..d613f8da8 --- /dev/null +++ b/test/hil/hil_pi4.json @@ -0,0 +1,11 @@ +{ + "boards": [ + { + "name": "raspberry_pi_pico", + "uid": "E6614C311B764A37", + "debugger": "openocd", + "debugger_sn": "E6614103E72C1D2F", + "debugger_args": "-f interface/cmsis-dap.cfg -f target/rp2040.cfg -c \"adapter speed 5000\"" + } + ] +} diff --git a/test/hil/hil_test.py b/test/hil/hil_test.py index 6bcde36c6..5f8425549 100644 --- a/test/hil/hil_test.py +++ b/test/hil/hil_test.py @@ -32,21 +32,66 @@ import serial import subprocess import json +ENUM_TIMEOUT = 10 -def get_serial_dev(id, product, ifnum): + +def get_serial_dev(id, vendor_str, product_str, ifnum): # get usb serial by id - return f'/dev/serial/by-id/usb-TinyUSB_{product}_{id}-if{ifnum:02d}' + return f'/dev/serial/by-id/usb-{vendor_str}_{product_str}_{id}-if{ifnum:02d}' -def get_disk_dev(id, lun): +# Currently not used, left as reference +def get_disk_dev(id, vendor_str, lun): # get usb disk by id - return f'/dev/disk/by-id/usb-TinyUSB_Mass_Storage_{id}-0:{lun}' + return f'/dev/disk/by-id/usb-{vendor_str}_Mass_Storage_{id}-0:{lun}' + + +def get_hid_dev(id, vendor_str, product_str, event): + return f'/dev/input/by-id/usb-{vendor_str}_{product_str}_{id}-{event}' + + +def open_serial_dev(port): + timeout = ENUM_TIMEOUT + ser = None + while timeout: + if os.path.exists(port): + try: + # slight delay since kernel may occupy the port briefly + time.sleep(0.2) + ser = serial.Serial(port, timeout=1) + break + except serial.SerialException: + pass + time.sleep(0.8) + timeout = timeout - 1 + assert timeout, 'Device not available or Cannot open port' + return ser -def get_hid_dev(id, product, event): - return f'/dev/input/by-id/usb-TinyUSB_{product}_{id}-{event}' +def read_disk_file(id, fname): + # on different self-hosted, the mount point is different + file_list = [ + f'/media/blkUSB_{id[-8:]}.02/{fname}', + f'/media/{os.getenv("USER")}/TinyUSB MSC/{fname}' + ] + timeout = ENUM_TIMEOUT + while timeout: + for file in file_list: + if os.path.isfile(file): + with open(file, 'rb') as f: + data = f.read() + return data + time.sleep(1) + timeout = timeout - 1 + assert timeout, 'Device not available' + return None + + +# ------------------------------------------------------------- +# Flash with debugger +# ------------------------------------------------------------- def flash_jlink(sn, dev, firmware): script = ['halt', 'r', f'loadfile {firmware}', 'r', 'go', 'exit'] f = open('flash.jlink', 'w') @@ -59,31 +104,29 @@ def flash_jlink(sn, dev, firmware): assert ret.returncode == 0, 'Flash failed\n' + stdout +def flash_openocd(sn, args, firmware): + ret = subprocess.run(f'openocd {args} -c "program {firmware} reset exit"', + shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout = ret.stdout.decode() + assert ret.returncode == 0, 'Flash failed\n' + stdout + + +# ------------------------------------------------------------- +# Tests +# ------------------------------------------------------------- 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 +def test_cdc_dual_ports(id): + port1 = get_serial_dev(id, 'TinyUSB', "TinyUSB_Device", 0) + port2 = get_serial_dev(id, 'TinyUSB', "TinyUSB_Device", 2) - assert timeout, 'Device not available' + ser1 = open_serial_dev(port1) + ser2 = open_serial_dev(port2) # 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() @@ -98,32 +141,17 @@ def test_cdc_dual_ports(id): 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 + port = get_serial_dev(id, 'TinyUSB', "TinyUSB_Device", 0) + ser = open_serial_dev(port) str = b"test_str" - ser1.write(str) - ser1.flush() - assert ser1.read(100) == str, 'CDC wrong data' + ser.write(str) + ser.flush() + assert ser.read(100) == str, 'CDC wrong data' # Block test - f = open(file, 'rb') - data = f.read() - + data = read_disk_file(id, 'README.TXT') 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\ @@ -131,9 +159,10 @@ issue at github.com/hathach/tinyusb" assert data == readme, 'MSC wrong data' + def test_dfu(id): # Wait device enum - timeout = 10 + timeout = ENUM_TIMEOUT while timeout: ret = subprocess.run(f'dfu-util -l', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) @@ -172,7 +201,7 @@ def test_dfu(id): def test_dfu_runtime(id): # Wait device enum - timeout = 10 + timeout = ENUM_TIMEOUT while timeout: ret = subprocess.run(f'dfu-util -l', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) @@ -186,11 +215,11 @@ def test_dfu_runtime(id): 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') + kbd = get_hid_dev(id, 'TinyUSB', 'TinyUSB_Device', 'event-kbd') + mouse1 = get_hid_dev(id, 'TinyUSB', 'TinyUSB_Device', 'if01-event-mouse') + mouse2 = get_hid_dev(id, 'TinyUSB', 'TinyUSB_Device', 'if01-mouse') # Wait device enum - timeout = 10 + timeout = ENUM_TIMEOUT while timeout: if os.path.exists(kbd) and os.path.exists(mouse1) and os.path.exists(mouse2): break @@ -211,11 +240,13 @@ if __name__ == '__main__': # 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' + 'cdc_dual_ports', 'cdc_msc', 'dfu', 'dfu_runtime', 'hid_boot_interface', + 'board_test' ] for board in config['boards']: print(f'Testing board:{board["name"]}') + debugger = board['debugger'].lower() # default to all tests if 'tests' in board: @@ -230,18 +261,27 @@ if __name__ == '__main__': 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: + # cmake, make, download from artifacts + elf_list = [ + f'cmake-build/cmake-build-{board["name"]}/device/{test}/{test}.elf', + f'examples/device/{test}/_build/{board["name"]}/{test}.elf', + f'{test}.elf' + ] + + elf = None + for e in elf_list: + if os.path.isfile(e): + elf = e + break + + if elf is None: print(f'Cannot find firmware file for {test}') sys.exit(-1) - if board['debugger'].lower() == 'jlink': + if debugger == 'jlink': flash_jlink(board['debugger_sn'], board['cpu'], elf) + elif debugger == 'openocd': + flash_openocd(board['debugger_sn'], board['debugger_args'], elf) else: # ToDo pass |
