diff --git a/hal/nrf52.c b/hal/nrf52.c index 4204c18d..b606a41c 100644 --- a/hal/nrf52.c +++ b/hal/nrf52.c @@ -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) diff --git a/tools/renode/docker-test.sh b/tools/renode/docker-test.sh index 772a62da..c2e6d0d1 100755 --- a/tools/renode/docker-test.sh +++ b/tools/renode/docker-test.sh @@ -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" diff --git a/tools/scripts/renode-test-update.sh b/tools/scripts/renode-test-update.sh index 71de4198..f06788ab 100755 --- a/tools/scripts/renode-test-update.sh +++ b/tools/scripts/renode-test-update.sh @@ -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" diff --git a/tools/test-expect-version/test-expect-version.c b/tools/test-expect-version/test-expect-version.c index effc8e89..8c45c21f 100644 --- a/tools/test-expect-version/test-expect-version.c +++ b/tools/test-expect-version/test-expect-version.c @@ -41,8 +41,7 @@ #include #ifndef __MACH__ -#include -#include +#include typedef void (*sighandler_t)(int); sighandler_t sigset(int sig, sighandler_t disp); #endif