Обеспечь единый процесс обновления для STM32F103/F407/G474 и TMS320F2812/F28335: discovery, служебные ответы, BUSY, тайм-аут сессии и подтверждение приложения. Добавь самостоятельные проекты CCS, аппаратные хранилища и Python-клиент. Совместимость: структуры конфигурации и порта расширены, поэтому потребители должны пересобраться и обнулить новые поля. Для C28x callbacks используют pcan_boot_byte_t; периодический pcan_boot_poll обслуживает discovery и настроенный тайм-аут.
33 lines
3.0 KiB
Python
33 lines
3.0 KiB
Python
"""Host regression suite. CC may point to clang/gcc; this does not replace a TI build."""
|
|
import os
|
|
from pathlib import Path
|
|
import shutil
|
|
import subprocess
|
|
import tempfile
|
|
|
|
root = Path(__file__).resolve().parents[1]
|
|
cc = os.environ.get('CC') or shutil.which('clang') or shutil.which('gcc')
|
|
if not cc:
|
|
raise SystemExit('Set CC to a C99 host compiler')
|
|
store = 'ports/tms320f28335/f28335_boot_store.c'
|
|
cases = [
|
|
('core', [], ['src/pcan_boot.c', 'tests/test_pcan_boot.c']),
|
|
('busy', ['-DPCAN_BOOT_WIDE_BYTES'], ['src/pcan_boot.c', 'tests/test_pcan_busy.c']), # Длительный NOR erase с BUSY продлевает session и сохраняет wire-поля ответа.
|
|
('store_native', [], [store, 'tests/test_f28335_boot_store.c']),
|
|
('store_wide', ['-DPCAN_BOOT_WIDE_BYTES'], [store, 'tests/test_f28335_boot_store.c']),
|
|
('loader', ['-DPCAN_BOOT_WIDE_BYTES'], [store, 'src/pcan_boot.c', 'tests/test_f28335_can_boot.c']),
|
|
('application', ['-DPCAN_BOOT_WIDE_BYTES', '-DF28335_BOOT_LOADER=0'],
|
|
[store, 'src/pcan_boot.c', 'tests/test_f28335_can_boot.c']),
|
|
('f2812_nor', ['-DPCAN_BOOT_WIDE_BYTES', '-DBOOT2812_HOST'], ['src/pcan_boot.c', 'ports/tms320f2812/nor_flash.c', 'ports/tms320f2812/boot_store.c', 'tests/test_f2812_nor.c']), # Проверяет настоящий AMD driver, NOR manifest, SCI8 и восстановление после обрывов записи.
|
|
('stm32f103', ['-DTEST_STM32F103', '-Itests/stm32_stubs'], ['src/pcan_boot.c', 'ports/stm32f103/pcan_boot_stm32f103.c', 'tests/test_stm32_ports.c']), # Проверяет production-порт F103: границы страниц, все хвосты CAN, CRC readback и отказ reset без TX ACK.
|
|
('stm32f407', ['-Itests/stm32_stubs'], ['src/pcan_boot.c', 'ports/stm32f407/pcan_boot_stm32f407.c', 'tests/test_stm32_ports.c']), # Проверяет production-порт F407, включая сохранность загрузчика и EEPROM-кольца секторов 6/7.
|
|
('stm32g474', ['-DTEST_STM32G474', '-Itests/stm32_stubs'], ['src/pcan_boot.c', 'ports/stm32g474/pcan_boot_stm32g474.c', 'tests/test_stm32_ports.c']), # Проверяет FDCAN, обе геометрии DBANK, границу банков и запрет bank swap/ошибочной ёмкости Flash.
|
|
]
|
|
with tempfile.TemporaryDirectory(prefix='f28335-ab-') as tmp:
|
|
for name, defines, sources in cases:
|
|
exe = Path(tmp) / (name + '.exe')
|
|
subprocess.run([cc, '-std=c99', '-Wall', '-Wextra', '-Werror', '-Wno-misleading-indentation', '-Iinclude', # GCC допускает существующие однострочные циклы старых аппаратных моделей без подавления остальных ошибок.
|
|
'-Itests/f28335_stubs', *defines, *sources, '-o', str(exe)], cwd=root, check=True)
|
|
sample = os.environ.get('F28335_SAMPLE_IMAGE') if name == 'store_wide' else None
|
|
subprocess.run([str(exe), *([sample] if sample else [])], check=True, timeout=30)
|