obu-firmware is now a port of the colleague's standalone VRU station (microbu-esp32c5/firmware, kept beside this repository and gitignored): the vanetza-idf C-ITS stack with the TS 103 097 security entity, credentials in NVS, the station-link v1 protocol over the native USB port (frame type 0x10 in the existing 0xAA55 framing) and over a BLE GATT peripheral, and its ITS-G5 radio adapter. The phone still builds CAM and VAM; the board adds GeoNetworking/BTP and signs with the provisioned authorization ticket. The private key never leaves the board. Builds with ESP-IDF 6.0.2 only, which vanetza-idf pins for the radio's private driver ABI. The previous C firmware stays on disk unbuilt; a full-flash backup of the bench board is kept in firmware-backups/ (gitignored). Changed against the colleague's firmware, marked MicrOBU: in the sources: - Reception unchanged for the app. vanetza-idf drops what it cannot verify (unsigned traffic, every RSU), so each captured frame also goes through the previous gn_unwrap.c and reaches the phone as link opcode V2X_RX (0x85), whose body is the old SERIAL_MSG_V2X_RX payload. - Unsigned transmission still possible, with the previous geonet.c header; the phone chooses per message. - Console on UART0 (CH343 port); the native USB port carries only link frames. - BLE advertising pauses while the USB link is in use: BLE and ITS-G5 share one RF front end. - NVS 80 KB (app at 0x20000). At 24 KB, with Wi-Fi settings the previous firmware left behind, the BLE bond could not be stored and the phone had to pair on every connection. - Bench fixes: the radio queue is drained before the first PoTi (no RX and ~177 queue drops before); the station loop waited pdMS_TO_TICKS(5) = 0 ticks at 100 Hz and starved the idle task; the 2.4 KB RX capture buffer is off the Wi-Fi task stack; BLE notifications longer than the MTU are dropped instead of cut short, MTU 517; serial writes are skipped with no USB host. - Manual country policy and TX-power read-back from the previous radio setup; logs for BLE encryption changes and the number of stored bonds. Verified on the bench board (COM3) with the phone over USB and BLE: CAM and VAM, signed and unsigned, go out; reception of the sim car and the RSU's CAM/SPATEM/MAPEM continues; the board survives app restarts and reconnects. See docs/06-signed-its-vam-ble.md.
63 lines
3.8 KiB
CMake
63 lines
3.8 KiB
CMake
cmake_minimum_required(VERSION 3.22)
|
|
# obu-firmware: the ESP32-C5 half of the MicrOBU station, on the vanetza-idf C-ITS stack.
|
|
#
|
|
# Since 2026-09-23 this is a port of the colleague's standalone VRU station
|
|
# (microbu-esp32c5/firmware, its own git repository beside this one and gitignored here). From it:
|
|
# BTP/GeoNetworking and the TS 103 097 security entity (vanetza-idf), the station-link message
|
|
# layer over native USB Serial/JTAG and BLE GATT, the NVS credential store, and the C5 radio adapter.
|
|
# Added here for this project: the raw receive path of the previous firmware (gn_unwrap.c, forwarded
|
|
# as link opcode V2X_RX) so unsigned and non-demo-signed traffic still reaches the phone, the
|
|
# unsigned transmit path of the previous firmware (geonet.c), and BLE pausing while USB is in use.
|
|
# See NOTES.md.
|
|
#
|
|
# ESP-IDF 6.0.2 exactly: the C5 radio's private Wi-Fi driver ABI (otm_tx_custom.c) is pinned to it
|
|
# by vanetza-idf's radio_c5.cmake and has only been validated there. The previous C firmware was
|
|
# built with IDF 6.1; see FLASHING.md for the export script of each.
|
|
#
|
|
# vanetza-idf is taken from the colleague's tree rather than vendored (it is ~90 MB). Override with
|
|
# -DVANETZA_IDF_DIR=... if it lives elsewhere.
|
|
if(NOT VANETZA_IDF_DIR)
|
|
set(VANETZA_IDF_DIR "${CMAKE_CURRENT_LIST_DIR}/../microbu-esp32c5/external/vanetza-idf")
|
|
endif()
|
|
if(NOT EXISTS "${VANETZA_IDF_DIR}/idf_component.yml")
|
|
message(FATAL_ERROR "vanetza-idf not found at ${VANETZA_IDF_DIR}: clone microbu-esp32c5 beside this "
|
|
"repository or pass -DVANETZA_IDF_DIR=<path to external/vanetza-idf>")
|
|
endif()
|
|
|
|
# Provenance guard for main/otm_tx_custom.c, copied unchanged from microbu-esp32c5/firmware/CMakeLists.txt:
|
|
# this checked-in copy is what microbu::C5Radio::request() links against for every transmission.
|
|
# Fail configure if either the pinned upstream or this file drifts from the reviewed revision.
|
|
set(_otm_upstream "${VANETZA_IDF_DIR}/ports/esp_idf/third_party/otm/main/tx_custom.c")
|
|
if(EXISTS "${_otm_upstream}")
|
|
file(READ "${_otm_upstream}" _otm_upstream_text)
|
|
string(REPLACE "\r\n" "\n" _otm_upstream_text "${_otm_upstream_text}")
|
|
string(SHA256 _otm_upstream_hash "${_otm_upstream_text}")
|
|
if(NOT _otm_upstream_hash STREQUAL "cb1dccfef96912ca59275e8a9102f41f56925b94a19d4a4629082aaeb779be1b")
|
|
message(FATAL_ERROR "OpenTrafficMap upstream tx_custom.c differs from the reviewed source revision (674e3412) -- review before updating main/otm_tx_custom.c and this hash")
|
|
endif()
|
|
endif()
|
|
set(_otm_checked_in "${CMAKE_CURRENT_LIST_DIR}/main/otm_tx_custom.c")
|
|
file(READ "${_otm_checked_in}" _otm_checked_in_text)
|
|
string(REPLACE "\r\n" "\n" _otm_checked_in_text "${_otm_checked_in_text}")
|
|
string(SHA256 _otm_checked_in_hash "${_otm_checked_in_text}")
|
|
if(NOT _otm_checked_in_hash STREQUAL "114693af99ce3866cfc767066d484e45822eaf15335d94a03626b60ac5777277")
|
|
message(FATAL_ERROR "main/otm_tx_custom.c differs from the reviewed copy -- review the change, then update this hash")
|
|
endif()
|
|
|
|
list(APPEND EXTRA_COMPONENT_DIRS "${VANETZA_IDF_DIR}")
|
|
set(SDKCONFIG_DEFAULTS "${CMAKE_CURRENT_LIST_DIR}/sdkconfig.defaults")
|
|
set(COMPONENTS main)
|
|
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
|
project(obu_firmware)
|
|
add_compile_options(-Wno-error -Wno-cpp -Wno-error=implicit-function-declaration)
|
|
idf_component_get_property(vanetza_lib vanetza-idf COMPONENT_LIB)
|
|
if(vanetza_lib)
|
|
target_compile_options(${vanetza_lib} PRIVATE -Wno-error=implicit-function-declaration -Wno-error=cpp)
|
|
endif()
|
|
# GCC 15's stricter -Warray-bounds false-positives on NimBLE's fixed-size bond-store arrays
|
|
# (upstream Apache Mynewt code); demote to a warning so the component still builds.
|
|
idf_component_get_property(bt_lib bt COMPONENT_LIB)
|
|
if(bt_lib)
|
|
target_compile_options(${bt_lib} PRIVATE -Wno-error=array-bounds)
|
|
endif()
|