The shell sample, and a two-board rig for testing on hardware

samples/shell is `rb9704` on the shell with callbacks that print what
arrives, a CRC-32 and the start of each message from the network. Board
overlays for native_sim (the modem a host serial port, a pty or a real
9704 on USB), NUCLEO-U575ZI-Q, XIAO ESP32S3 and ESP32-S3-DevKitC.

tests/rig/bridge copies bytes between a board's USB serial port and a
UART, so two boards wired together stand in for a USB-serial adapter: one
runs the sample, the other bridges its modem UART to the host, where the
fake modem answers. Overlays for a Nucleo and a XIAO, either way round.
This commit is contained in:
scottp committed 2026-10-09 12:48:16 +11:00
1 parent c0e92a7f02
commit dbed9bbc88
17 files changed
+350

No files matched your search

+57
View File
@@ -0,0 +1,57 @@
/* SPDX-License-Identifier: MIT
*
* A two-way UART bridge, for the test rig: every byte in on `host` goes out
* on `target`, and the other way round. With `host` a board's USB serial
* port and `target` a UART wired to another board's modem pins, the fake
* modem on the host answers that board as a modem would. The aliases are
* the board overlay's. */
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/uart.h>
#include <zephyr/sys/ring_buffer.h>
static const struct device *const host = DEVICE_DT_GET(DT_ALIAS(bridge_host));
static const struct device *const target = DEVICE_DT_GET(DT_ALIAS(bridge_target));
RING_BUF_DECLARE(to_target, 4096);
RING_BUF_DECLARE(to_host, 4096);
static void isr(const struct device *dev, void *user)
{
struct ring_buf *out = user; /* bytes read here go into this ring */
const struct device *other = dev == host ? target : host;
struct ring_buf *back = out == &to_target ? &to_host : &to_target;
uint8_t b[64];
while (uart_irq_update(dev) && uart_irq_is_pending(dev)) {
if (uart_irq_rx_ready(dev)) {
int n = uart_fifo_read(dev, b, sizeof(b));
if (n > 0) {
ring_buf_put(out, b, n);
uart_irq_tx_enable(other);
}
}
if (uart_irq_tx_ready(dev)) {
uint8_t *p;
uint32_t n = ring_buf_get_claim(back, &p, 64);
if (n == 0) {
uart_irq_tx_disable(dev);
} else {
int w = uart_fifo_fill(dev, p, n);
ring_buf_get_finish(back, w > 0 ? w : 0);
}
}
}
}
int main(void)
{
uart_irq_callback_user_data_set(host, isr, &to_target);
uart_irq_callback_user_data_set(target, isr, &to_host);
uart_irq_rx_enable(host);
uart_irq_rx_enable(target);
return 0;
}