Fix NRF52 UART DMA and Renode test infrastructure

hal/nrf52.c:
- Use static volatile buffer for UARTE DMA source instead of stack
  variable address. GCC 15.2 with -Os optimized away the store to the
  stack slot, causing the DMA to read zeros.
- Set UART0_ENABLE to 4 (UARTE mode) per NRF52840 datasheet.

tools/test-expect-version/test-expect-version.c:
- Replace deprecated termio.h and linux/serial.h with sys/ioctl.h
  for compatibility with newer glibc.

tools/renode/docker-test.sh:
- Remove unused RENODE_CHECKOUT env var.

tools/scripts/renode-test-update.sh:
- Add robust UART wait functions with timeouts and liveness checks.
- Log Renode output to /tmp/renode.log for diagnostics on failure.
- Use run_expect_version helper with configurable timeout.
pull/754/head
Daniele Lacamera 2026-04-16 18:38:56 +02:00
parent 85f5b493c0
commit 42455508c0
4 changed files with 89 additions and 13 deletions

View File

@ -29,14 +29,16 @@
void uart_init(void)
{
UART0_BAUDRATE = BAUD_115200;
UART0_ENABLE = 1;
UART0_ENABLE = 4;
}
static volatile uint8_t uart_tx_buf;
static void uart_write_char(char c)
{
uart_tx_buf = c;
UART0_EVENT_ENDTX = 0;
UART0_TXD_PTR = (uint32_t)(&c);
UART0_TXD_PTR = (uint32_t)&uart_tx_buf;
UART0_TXD_MAXCOUNT = 1;
UART0_TASK_STARTTX = 1;
while(UART0_EVENT_ENDTX == 0)

View File

@ -18,7 +18,6 @@ if ! docker run \
--volume ${HOST_ROOT_DIR}:${DOCKER_WORKSPACE} \
--volume ${HOST_TEST_RESULTS_PATH}:${DOCKER_TEST_RESULTS_PATH} \
--env SCRIPT=${DOCKER_WORKSPACE}/renode-config.resc \
--env RENODE_CHECKOUT=/home/developer/renode \
--workdir ${DOCKER_WORKSPACE} \
${DOCKER_IMAGE} \
/bin/bash -c "tools/scripts/renode-test-update.sh $@ 2>&1 > ${DOCKER_TEST_RESULTS_PATH}/logs.txt"

View File

@ -1,4 +1,5 @@
#!/bin/bash
set -u
export RENODE_UART=/tmp/wolfboot.uart
export RENODE_PIDFILE=/tmp/renode.pid
@ -8,6 +9,18 @@ export RENODE_PORT=55155
export RENODE_OPTIONS="--pid-file=$RENODE_PIDFILE --disable-xwt -P $RENODE_PORT"
export EXPVER=tools/test-expect-version/test-expect-version
export TEST_OPTIONS=$@
export RENODE_START_TIMEOUT=30
export UART_OPEN_TIMEOUT=10
export EXPVER_TIMEOUT=75
export RENODE_LOG=/tmp/renode.log
RENODE_BG_PID=
show_renode_log() {
if [ -f "$RENODE_LOG" ]; then
echo "----- Renode log -----"
tail -n 80 "$RENODE_LOG"
fi
}
quit_renode() {
if (which nc); then
@ -15,10 +28,72 @@ quit_renode() {
fi
}
renode_is_alive() {
if [ -n "${RENODE_BG_PID:-}" ] && kill -0 "$RENODE_BG_PID" 2>/dev/null; then
return 0
fi
if [ -f "$RENODE_PIDFILE" ] && kill -0 "$(cat "$RENODE_PIDFILE")" 2>/dev/null; then
return 0
fi
return 1
}
wait_for_uart_node() {
local waited=0
while [ "$waited" -lt "$RENODE_START_TIMEOUT" ]; do
if [ -e "$RENODE_UART" ]; then
return 0
fi
if ! renode_is_alive; then
echo "Renode exited before creating UART PTY"
show_renode_log
return 1
fi
sleep 1
waited=$((waited + 1))
done
rm -f $RENODE_UART
echo "Timed out waiting for Renode UART PTY: $RENODE_UART"
show_renode_log
return 1
}
wait_for_uart_ready() {
local waited=0
while [ "$waited" -lt "$UART_OPEN_TIMEOUT" ]; do
if bash -lc 'exec 3<>"$1"' _ "$RENODE_UART" 2>/dev/null; then
return 0
fi
if ! renode_is_alive; then
echo "Renode exited before UART became ready"
show_renode_log
return 1
fi
sleep 1
waited=$((waited + 1))
done
echo "Timed out waiting for Renode UART readiness: $RENODE_UART"
show_renode_log
return 1
}
run_expect_version() {
local expected="$1"
local ret
ret=$(timeout "$EXPVER_TIMEOUT" "$EXPVER" "$RENODE_UART")
if [ "$ret" = "$expected" ]; then
return 0
fi
echo "Unexpected version from UART: got ${ret}, expected ${expected}"
return 1
}
rm -f $RENODE_UART $RENODE_LOG
make keysclean
make keytools
@ -31,13 +106,15 @@ cp wolfboot.elf /tmp/renode-wolfboot.elf || exit 3
cp test-app/image_v1_signed.bin /tmp/renode-test-v1.bin || exit 3
cp test-app/renode-test-update.bin /tmp || exit 3
echo "Launching Renode"
renode $RENODE_OPTIONS $RENODE_CONFIG >/dev/null &
while ! (test -e $RENODE_UART); do sleep .1; done
renode $RENODE_OPTIONS $RENODE_CONFIG >"$RENODE_LOG" 2>&1 &
RENODE_BG_PID=$!
wait_for_uart_node || { quit_renode; exit 1; }
echo "Renode up: uart port activated"
wait_for_uart_ready || { quit_renode; exit 1; }
sleep 1
echo "Renode running: renode has been started."
RET=$($EXPVER $RENODE_UART)
if (test $RET -eq 1); then
if run_expect_version 1; then
echo "Factory img: OK"
else
echo "FAILURE"
@ -45,8 +122,7 @@ else
exit 1
fi
RET=$($EXPVER $RENODE_UART)
if (test $RET -eq 2); then
if run_expect_version 2; then
echo "Update: OK"
else
echo "FAILURE"

View File

@ -41,8 +41,7 @@
#include <errno.h>
#ifndef __MACH__
#include <termio.h>
#include <linux/serial.h>
#include <sys/ioctl.h>
typedef void (*sighandler_t)(int);
sighandler_t sigset(int sig, sighandler_t disp);
#endif