* feat: Add with_pins methods for UART * feat: Remove configure_pin methods * docs: Update changelog * fix: Update tests and examples * style: Fix format * Add UartTx/Rx constructors * feat: Add new_with_default_pins methods * docs: Update changelog * feat: Remove optional cts/rts arguments * feat: Add UartTx/Rx::new_async methods * fix: Attach interrupt handler to new_ascyn UartRx/Tx * style: Avoid long module paths * feat: Make flush_tx public * test: Use Uart async instead of UartTx/Rx async * test: Add tests for UartTx/UartRx * feat: Add configuration method to constuctors * feat: Move set_rx_fifo_full_threshold and set_rx_timeout to UartRx * docs: Fix changelog * test: Fix executor * feat: Configure UartRx threshold and timeout * docs: Update changelog * test: Update uart instance * feat: Add default_uart0_pins macro to simplify examples * feat: Address feedback pt1 * feat: Address feedback pt2 - Make constructors fallible * fix: Doctest |
||
|---|---|---|
| .. | ||
| .cargo | ||
| tests | ||
| Cargo.toml | ||
| README.md | ||
hil-test
Hardware-in-loop testing for esp-hal.
For assistance with this package please open an issue or start a discussion.
Quickstart
We use embedded-test as our testing framework, which relies on defmt internally. This allows us to write unit and integration tests much in the same way you would for a normal Rust project, when the standard library is available, and to execute them using Cargo's built-in test runner.
Running Tests Locally
We use [probe-rs] for flashing and running the tests on a target device, however, this MUST be installed from the correct revision, and with the correct features enabled:
cargo install probe-rs-tools \
--git https://github.com/probe-rs/probe-rs \
--rev a6dd038 --force --locked
Target device MUST connected via its USB-Serial-JTAG port, or if unavailable (eg. ESP32, ESP32-C2, ESP32-S2) then you must connect a compatible debug probe such as an [ESP-Prog].
You can run all tests for a given device by running the following command from the xtask folder:
cargo xtask run-tests $CHIP
For running a single test on a target, from the xtask folder run:
# Run GPIO tests for ESP32-C6
cargo xtask run-tests esp32c6 --test gpio
Another alternative way of running a single test is, from the hil-tests folder:
# Run GPIO tests for ESP32-C6
CARGO_BUILD_TARGET=riscv32imac-unknown-none-elf \
PROBE_RS_CHIP=esp32c6 \
cargo +nightly test --features=esp32c6 --test=gpio
- If the
--testargument is omitted, then all tests will be run, independently if the tests are supported for that target, for this reason, we encourage using thextaskapproach. - The build target MUST be specified via the
CARGO_BUILD_TARGETenvironment variable or as an argument (--target). - The chip MUST be specified via the
PROBE_RS_CHIPenvironment variable or as an argument ofprobe-rs(--chip).
Some tests will require physical connections, please see the current configuration in our runners.
Running Tests Remotes (ie. On Self-Hosted Runners)
The hil.yml workflow builds the test suite for all our available targets and executes them.
Our Virtual Machines have the following setup:
- ESP32-C3 (
rustboard):- Devkit:
ESP32-C3-DevKit-RUST-1connected via USB-Serial-JTAG.GPIO2andGPIO4are connected.
- RPi: Raspbian 12 configured with the following setup
- Devkit:
- ESP32-C6 (
esp32c6-usb):- Devkit:
ESP32-C6-DevKitC-1 V1.2connected via USB-Serial-JTAG (USBport).GPIO2andGPIO4are connected.
- RPi: Raspbian 12 configured with the following setup
- Devkit:
- ESP32-H2 (
esp32h2-usb):- Devkit:
ESP32-H2-DevKitM-1connected via USB-Serial-JTAG (USBport).GPIO2andGPIO4are connected.
- RPi: Raspbian 12 configured with the following setup
- Devkit:
- ESP32-S2 (
esp32s2-jtag):- Devkit:
ESP32-S2-Saola-1connected via UART.GPIO2andGPIO4are connected.
- Probe:
ESP-Progconnected with the following connections - RPi: Raspbian 12 configured with the following setup
- Devkit:
- ESP32-S3 (
esp32s3-usb):- Devkit:
ESP32-S3-DevKitC-1connected via USB-Serial-JTAG.GPIO2andGPIO4are connected.
- RPi: Raspbian 12 configured with the following setup
- Devkit:
VM Setup
# Install Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain stable -y --profile minimal
# Source the current shell:
source "$HOME/.cargo/env"
# Install dependencies
sudo apt install -y pkg-config libudev-dev
# Install probe-rs
cargo install probe-rs-tools --git https://github.com/probe-rs/probe-rs --rev a6dd038 --force
# Add the udev rules
wget -O - https://probe.rs/files/69-probe-rs.rules | sudo tee /etc/udev/rules.d/69-probe-rs.rules > /dev/null
# Add the user to plugdev group
sudo usermod -a -G plugdev $USER
# Reboot the VM
sudo reboot
Adding New Tests
- Create a new integration test file (
tests/$PERIPHERAL.rs) - Add a corresponding
[[test]]entry toCargol.toml(MUST setharness = false) - Write the tests
- Document any necessary physical connections on boards connected to self-hosted runners
- Add a header in the test stating which targets support the given tests. Eg:
//! AES Test
//% CHIPS: esp32 esp32c3 esp32c6 esp32h2 esp32s2 esp32s3
If the test is supported by all the targets, you can omit the header.
6. Write some documentation at the top of the tests/$PERIPHERAL.rs file with the pins being used and the required connections, if applicable.