Skip to content

Commit 602fe82

Browse files
committed
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.
1 parent 856ffc5 commit 602fe82

4 files changed

Lines changed: 89 additions & 13 deletions

File tree

hal/nrf52.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,16 @@
2929
void uart_init(void)
3030
{
3131
UART0_BAUDRATE = BAUD_115200;
32-
UART0_ENABLE = 1;
32+
UART0_ENABLE = 4;
3333
}
3434

35+
static volatile uint8_t uart_tx_buf;
36+
3537
static void uart_write_char(char c)
3638
{
39+
uart_tx_buf = c;
3740
UART0_EVENT_ENDTX = 0;
38-
39-
UART0_TXD_PTR = (uint32_t)(&c);
41+
UART0_TXD_PTR = (uint32_t)&uart_tx_buf;
4042
UART0_TXD_MAXCOUNT = 1;
4143
UART0_TASK_STARTTX = 1;
4244
while(UART0_EVENT_ENDTX == 0)

tools/renode/docker-test.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ if ! docker run \
1818
--volume ${HOST_ROOT_DIR}:${DOCKER_WORKSPACE} \
1919
--volume ${HOST_TEST_RESULTS_PATH}:${DOCKER_TEST_RESULTS_PATH} \
2020
--env SCRIPT=${DOCKER_WORKSPACE}/renode-config.resc \
21-
--env RENODE_CHECKOUT=/home/developer/renode \
2221
--workdir ${DOCKER_WORKSPACE} \
2322
${DOCKER_IMAGE} \
2423
/bin/bash -c "tools/scripts/renode-test-update.sh $@ 2>&1 > ${DOCKER_TEST_RESULTS_PATH}/logs.txt"

tools/scripts/renode-test-update.sh

Lines changed: 83 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/bin/bash
2+
set -u
23

34
export RENODE_UART=/tmp/wolfboot.uart
45
export RENODE_PIDFILE=/tmp/renode.pid
@@ -8,17 +9,91 @@ export RENODE_PORT=55155
89
export RENODE_OPTIONS="--pid-file=$RENODE_PIDFILE --disable-xwt -P $RENODE_PORT"
910
export EXPVER=tools/test-expect-version/test-expect-version
1011
export TEST_OPTIONS=$@
12+
export RENODE_START_TIMEOUT=30
13+
export UART_OPEN_TIMEOUT=10
14+
export EXPVER_TIMEOUT=75
15+
export RENODE_LOG=/tmp/renode.log
16+
RENODE_BG_PID=
17+
18+
show_renode_log() {
19+
if [ -f "$RENODE_LOG" ]; then
20+
echo "----- Renode log -----"
21+
tail -n 80 "$RENODE_LOG"
22+
fi
23+
}
1124

1225
quit_renode() {
1326
if (which nc); then
1427
(echo && echo quit && echo) | nc -q 1 localhost $RENODE_PORT >/dev/null
1528
fi
1629
}
1730

31+
renode_is_alive() {
32+
if [ -n "${RENODE_BG_PID:-}" ] && kill -0 "$RENODE_BG_PID" 2>/dev/null; then
33+
return 0
34+
fi
35+
if [ -f "$RENODE_PIDFILE" ] && kill -0 "$(cat "$RENODE_PIDFILE")" 2>/dev/null; then
36+
return 0
37+
fi
38+
return 1
39+
}
40+
41+
wait_for_uart_node() {
42+
local waited=0
1843

44+
while [ "$waited" -lt "$RENODE_START_TIMEOUT" ]; do
45+
if [ -e "$RENODE_UART" ]; then
46+
return 0
47+
fi
48+
if ! renode_is_alive; then
49+
echo "Renode exited before creating UART PTY"
50+
show_renode_log
51+
return 1
52+
fi
53+
sleep 1
54+
waited=$((waited + 1))
55+
done
56+
57+
echo "Timed out waiting for Renode UART PTY: $RENODE_UART"
58+
show_renode_log
59+
return 1
60+
}
1961

62+
wait_for_uart_ready() {
63+
local waited=0
64+
65+
while [ "$waited" -lt "$UART_OPEN_TIMEOUT" ]; do
66+
if bash -lc 'exec 3<>"$1"' _ "$RENODE_UART" 2>/dev/null; then
67+
return 0
68+
fi
69+
if ! renode_is_alive; then
70+
echo "Renode exited before UART became ready"
71+
show_renode_log
72+
return 1
73+
fi
74+
sleep 1
75+
waited=$((waited + 1))
76+
done
77+
78+
echo "Timed out waiting for Renode UART readiness: $RENODE_UART"
79+
show_renode_log
80+
return 1
81+
}
82+
83+
run_expect_version() {
84+
local expected="$1"
85+
local ret
86+
87+
ret=$(timeout "$EXPVER_TIMEOUT" "$EXPVER" "$RENODE_UART")
88+
if [ "$ret" = "$expected" ]; then
89+
return 0
90+
fi
91+
92+
echo "Unexpected version from UART: got ${ret}, expected ${expected}"
93+
return 1
94+
}
2095

21-
rm -f $RENODE_UART
96+
rm -f $RENODE_UART $RENODE_LOG
2297

2398
make keysclean
2499
make keytools
@@ -31,22 +106,23 @@ cp wolfboot.elf /tmp/renode-wolfboot.elf || exit 3
31106
cp test-app/image_v1_signed.bin /tmp/renode-test-v1.bin || exit 3
32107
cp test-app/renode-test-update.bin /tmp || exit 3
33108
echo "Launching Renode"
34-
renode $RENODE_OPTIONS $RENODE_CONFIG >/dev/null &
35-
while ! (test -e $RENODE_UART); do sleep .1; done
109+
renode $RENODE_OPTIONS $RENODE_CONFIG >"$RENODE_LOG" 2>&1 &
110+
RENODE_BG_PID=$!
111+
wait_for_uart_node || { quit_renode; exit 1; }
36112
echo "Renode up: uart port activated"
113+
wait_for_uart_ready || { quit_renode; exit 1; }
114+
sleep 1
37115
echo "Renode running: renode has been started."
38-
RET=$($EXPVER $RENODE_UART)
39116

40-
if (test $RET -eq 1); then
117+
if run_expect_version 1; then
41118
echo "Factory img: OK"
42119
else
43120
echo "FAILURE"
44121
quit_renode
45122
exit 1
46123
fi
47124

48-
RET=$($EXPVER $RENODE_UART)
49-
if (test $RET -eq 2); then
125+
if run_expect_version 2; then
50126
echo "Update: OK"
51127
else
52128
echo "FAILURE"

tools/test-expect-version/test-expect-version.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@
4141
#include <errno.h>
4242

4343
#ifndef __MACH__
44-
#include <termio.h>
45-
#include <linux/serial.h>
44+
#include <sys/ioctl.h>
4645
typedef void (*sighandler_t)(int);
4746
sighandler_t sigset(int sig, sighandler_t disp);
4847
#endif

0 commit comments

Comments
 (0)