Skip to content

Commit

Permalink
factory sdcard image:
Browse files Browse the repository at this point in the history
Added a post build step that generates a dedicated factory sdcard image.
It roughly does the following steps:
* burns eeprom if contents is empty
* flashes firmware if to flash if empty
* starts test runner on login
* test runner executes certain scripts prefixed with 000-
* added first couple of tests
  • Loading branch information
svenrademakers committed Jun 3, 2024
1 parent 0582e6d commit 21840cc
Show file tree
Hide file tree
Showing 26 changed files with 871 additions and 18 deletions.
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ jobs:
run: |
mkdir artifacts
sudo mv buildroot/output/images/tp2-bmc-firmware-sdcard.img artifacts/tp2-firmware-sdcard-${{ env.BUILD_VERSION }}.img
sudo mv buildroot/output/images/tp2-factory-sdcard.img artifacts/tp2-factory-sdcard-${{ env.BUILD_VERSION }}.img
sudo mv buildroot/output/images/rootfs.erofs artifacts/tp2-ota-${{ env.BUILD_VERSION }}.tpu
- name: archive artifacts
Expand Down
10 changes: 8 additions & 2 deletions tp2bmc/board/tp2bmc/boot.scr
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,13 @@ if test "${tpi_hw_version}" = "v2.4.0"; then
else
env set ethsw_reset_pin PG3
fi

run ethsw_do_reset

bootm ${loadaddr}#config-${tpi_hw_version:-v2.4.0}#locked
setenv fit_boot_args "${loadaddr}#config-${tpi_hw_version:-v2.4.0}"
if env exists boot_unlocked; then
echo "disabling write protection.."
else
setenv fit_boot_args "${fit_boot_args}#locked"
fi

bootm ${fit_boot_args}
28 changes: 28 additions & 0 deletions tp2bmc/board/tp2bmc/factory_install.scr
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# SPDX-License-Identifier: GPL-2.0+
# Copyright (C) 2024 Sven Rademakers <sven.rademakers@gmail.com>

# read hardware version from EEPROM
tpi_info hw_version tpi_hw_version
if test -z "$tpi_crc_ok"; then
echo eeprom crc failure, rewrite version ${eeprom_ver}
run burn_eeprom
fi

install_magic=0x12341234
install_addr=0x0709010C
mw ${loadaddr} ${install_magic}

if cmp ${loadaddr} ${install_addr} 1; then
echo post firmware install, skipping factory boot
mw ${install_addr} 0x00000000
ubi part ubi
env set devtype ubi
env set devnum 0
run bootcmd_ubi_primary
else
echo booting factory image
# let the boot.scr scan the rootfs partition on the
# SDcard and boot it. `boot_unlocked` signals that we want to release the write
# protection on the boot partition and eeprom.
env set boot_unlocked 0
fi
Empty file.
54 changes: 54 additions & 0 deletions tp2bmc/board/tp2bmc/factory_overlay/upper/etc/init.d/S94bmcd
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/bin/sh

DAEMON="bmcd"
BIN="/usr/bin/$DAEMON"
PIDFILE="/var/run/$DAEMON.pid"
CERTFILE="/etc/ssl/certs/bmcd_cert.pem"
KEYFILE="/etc/ssl/certs/bmcd_key.pem"

start() {
printf 'Starting %s...\n' "$DAEMON"

[ ! -f "$CERTFILE" ] || [ ! -f "$KEYFILE" ] && /etc/bmcd/generate_self_signedx509.sh

start-stop-daemon --start --quiet --background --make-pidfile --pidfile "$PIDFILE" --no-close \
--exec "$BIN" -- --config "/etc/bmcd/config.yaml" > /dev/null

# Note: there are a lot of init.d scripts in buildroot packages that use -b/--background flag
# for programs that don't daemonize themselves. Contrary to the vast majority of them, it's
# pointless to check exit code ($?) here because in that case start-stop-daemon(8) "cannot
# check the exit status if the process fails to execute for any reason". Because of that, we
# rely on `bmcd` itself to notify where, and if, it failed.
}

stop() {
printf 'Stopping %s: ' "$DAEMON"

start-stop-daemon --stop --quiet --pidfile "$PIDFILE"

status=$?
if [ "$status" -eq 0 ]; then
rm -f "$PIDFILE"
echo "OK"
else
echo "FAIL"
fi

return "$status"
}

restart() {
stop
sleep 1
start
}

case "$1" in
start|stop|restart)
"$1";;
reload)
restart;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
32 changes: 32 additions & 0 deletions tp2bmc/board/tp2bmc/factory_overlay/upper/etc/inittab
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# /etc/inittab
#
# This inittab is a basic inittab sample for sysvinit, which mimics
# Buildroot's default inittab for BusyBox.
id:3:initdefault:

si0::sysinit:/bin/mount -t proc proc /proc
si1::sysinit:/bin/mount -o remount,rw /
si2::sysinit:/bin/mkdir -p /dev/pts /dev/shm
si3::sysinit:/bin/mount -a
si4::sysinit:/bin/mkdir -p /run/lock/subsys
si5::sysinit:/sbin/swapon -a
si6::sysinit:/bin/ln -sf /proc/self/fd /dev/fd 2>/dev/null
si7::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin 2>/dev/null
si8::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout 2>/dev/null
si9::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr 2>/dev/null
si10::sysinit:/bin/hostname -F /etc/hostname
rcS:12345:wait:/etc/init.d/rcS

S0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL

# Stuff to do for the 3-finger salute
#ca::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
shd0:06:wait:/etc/init.d/rcK
shd1:06:wait:/sbin/swapoff -a
shd2:06:wait:/bin/umount -a -r

# The usual halt or reboot actions
hlt0:0:wait:/sbin/halt -dhp
reb0:6:wait:/sbin/reboot
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFITCCAwmgAwIBAgIUOjStH7igh+V9d4y830Nv9DcOeeYwDQYJKoZIhvcNAQEL
BQAwIDEeMBwGA1UEAwwVVHVyaW5nLVBpIHNlbGYgc2lnbmVkMB4XDTcwMDEwMTAw
MDExNFoXDTcwMDEzMTAwMDExNFowIDEeMBwGA1UEAwwVVHVyaW5nLVBpIHNlbGYg
c2lnbmVkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApXbjlJXyaN7L
Bck+QCIuECOvKW44Va6lCYaNVFn4NGhZeIlALaoxmTk7zXYWn1PQqY3SM14DupFm
+sJG4bRYoVDQXjp+G9S/h03W5tu0mhh0QE4ZEIyQ9dDAfM2auYeXxb3dvDrk2FNJ
K2DG6XPQQJbIq5fZhkNnV/83/IoILQMu544BY3qgYgJ3D0s5/xEP7K0cRdFQVk7S
tRjfzV2qW9f9G6DZNCXm6+Ulem6FSMzmhnbrrWNAZvZC1k6u6bwoQzE7uF/dpl9n
Y1qPn2Hwqt9uZpdEMekAlQzNMTDXjmyBjXO4xLWCREoa+eopAkwykNr6NSmzA0L4
t7tIoZQ+SGf+5CFPAVjnQn4+EyjNlQvbfMOmNhMbUolnb97uNGNG14nJeK4au5R1
x94nwq4684oC4Lgjpe7vEI6dWJQu19OdGp1fgfLjVVrqllqVO6ULeDcSFzrr87gv
AJUS15XsKJ1UzdVN8eNQQyVJbFcbXlXVH45ts+VYpTjYQUv4gPglHyf15D9kSOY+
DuQXRaLNqKUtLaGSNBpAvJittUSSHfACyZJ2acgvJxLveQHgCKjkY5Zq9fdxvVB1
x0KbRZCNXCSVS+ggGUYLmYoNcrRx76+JpoHW1+O9YhxqByG36eOMpaI4u5wEcGai
/3zyNA/6hEVQUfQrKcJXsvztr4el8vMCAwEAAaNTMFEwHQYDVR0OBBYEFC3FfV4T
TDeB36nMuu9reHt+w5D2MB8GA1UdIwQYMBaAFC3FfV4TTDeB36nMuu9reHt+w5D2
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAAMzbyLq8251QSd2
6LFr0CTaCyKzdwQyqJJwdqI40rqDqN1/m0/M4VHuBiKZYcu9+U4yBhwg18jZMeLU
XETFDQClgT75pzOV1sVjWw2SEHjDhxykIO7yYLVkfK90Cel/ekTkFsh9OMkxR7S2
/UqEIflYKK3JD3OXa6U4nHIsuLoTb/X6HkQCOtJUS4fwL+N9cA6qyHU5R+Ykjx5x
o/W7kIN9gWBkbt3dBb/fz0g5eBrbZNc+E2EzCWF6vl92yUxVgPbPaLcEgrnCC8sx
k9xNLQ26xirKnqPtGPRXj5DUO7SPJ7lVhc+7ZxX/wW8ZbPIwbRUEOfAeCM2gA4Ih
0vx+ICT5A5nIxGerTGCTxWkEK42aP4PRbbwjRZLDBEF8cy8eIfSU0I5esIA2Kub5
QnmCdbmzeaEPeMp++JbtjhKu5iPR3KPG7wuZ+nIJ+1UbC/XBNy/f086dPCJehVN0
pxuUMCH5g54Q5sC4Xg5KGLyHdxTI9dlbSfQCoPoIBn2L2uknSCNvh049+WWfNGS4
nPg0KZ9mDFjEp7qC/Jq3+mRlndjIBa1y2R+ZB+liqiQOrf+SHKJJYibIDhDseIKa
v0CpB4nFbhBqhaqIn4JWmiWntqNkA1jlN0qFcV+zpPX5YzD/9TaNfIKERxLHtoxH
21sArZK4Gl/crAxgh4OHAV3lW4IL
-----END CERTIFICATE-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQClduOUlfJo3ssF
yT5AIi4QI68pbjhVrqUJho1UWfg0aFl4iUAtqjGZOTvNdhafU9CpjdIzXgO6kWb6
wkbhtFihUNBeOn4b1L+HTdbm27SaGHRAThkQjJD10MB8zZq5h5fFvd28OuTYU0kr
YMbpc9BAlsirl9mGQ2dX/zf8iggtAy7njgFjeqBiAncPSzn/EQ/srRxF0VBWTtK1
GN/NXapb1/0boNk0Jebr5SV6boVIzOaGduutY0Bm9kLWTq7pvChDMTu4X92mX2dj
Wo+fYfCq325ml0Qx6QCVDM0xMNeObIGNc7jEtYJEShr56ikCTDKQ2vo1KbMDQvi3
u0ihlD5IZ/7kIU8BWOdCfj4TKM2VC9t8w6Y2ExtSiWdv3u40Y0bXicl4rhq7lHXH
3ifCrjrzigLguCOl7u8Qjp1YlC7X050anV+B8uNVWuqWWpU7pQt4NxIXOuvzuC8A
lRLXlewonVTN1U3x41BDJUlsVxteVdUfjm2z5VilONhBS/iA+CUfJ/XkP2RI5j4O
5BdFos2opS0toZI0GkC8mK21RJId8ALJknZpyC8nEu95AeAIqORjlmr193G9UHXH
QptFkI1cJJVL6CAZRguZig1ytHHvr4mmgdbX471iHGoHIbfp44yloji7nARwZqL/
fPI0D/qERVBR9Cspwley/O2vh6Xy8wIDAQABAoICAAS+JCbRp3mfDTW0v36KHETl
KPOoj5/RGjTsMOfejlE+PnZIhNjqPHK2Y8LvZBWcCuqZQJGtW7EA0vFUGUEF8NZq
4RYaWhwFHJpNvl+uo34ZPlfLhUdmqA8LtUC+ifVQcCbAWvc2vvF+baX7J6hwY+M+
DzFv8FG7Y95vV9T6xeI4aaNEfEC0Np2okW4US2zGueygR6OurL1UlBCRznRt/2CT
j9M3aJJolbZkQo9AVLyx9tea2AWHx0RMQb0v0y6q8IKAikQuJ0XKDUYZRe2dGo9j
SSBSrKc7lQMwsz76NeuEq6/4xa6Jv1qivyQztIo20eo6BJr6f4GT7Voi2aGcBK71
0hMCfxyUt+9lApJvC9Mx/PB70CT4AN4/mSQGva5SPwos32iHwWPgiUFlxkHrmPyR
9icygKqwUinwUErZABhLBofgPmFkLkyo1G1szRazEhU0SYaG9SlfZ+G1BUs3Noc6
VOjSEkn8axZDX8mLbNa8pJx7q3D6XFgnEmvQ1KNGisT8GAaYbHrTc3r1Tpigb3Ed
BKS0F1X/ERFQB9yI7il28B/y4aaQ3xkC+7l9Nze5l9W0+XzW5JIuBFl/qrK1As9N
3WiaQy/0ww61m1HB2QgT3tVflr8Dszl9rwjgdGzp017/XmxFeE5vVsGQeaf3zBYj
otYlvEuUj/8AoIlGRxO1AoIBAQDUpXT8aPoQMArNuXRjq/3+JDRZv2hV1O0F+6YK
XnDbi6s62bY7zc5IiF3HSLlsLbpsO4/axs4ykTcg7i7eXcrPCvpxZ6GEfjG6brc2
zfcSOve71cZEA3i0/qcUI/WeIdUneaeuForctwbszlGTsENWf6y8FX6vDf4WES8Y
m+f/V3iDMfkOjXM6dDiXME2B1eI/xYgl75JNztvPmtp1TMCKo5/L4AyZEvwsb6Vc
GsGP//25SgFqMtIW3CDvVQUfhKm0hk+EqC3UVdsCpOGWldGKBaPxKnqK9qCmoIDn
GFMbbN77IHvK2ZC16LTcvly3B08d4KtqEIdA6i18fDvNfF/dAoIBAQDHMuPs8ILp
hc0PCDSGRXd2XB25VbJCTjLBCMPIMzjO4z/xx0xFM/hG72ZE+wPTnDmZsaA52LG3
NUVdTJx8Px/O1TA3G7McMV/7GPdvNPjqvnnA18SIBPxmbvRUcBxuQGt27XUylK10
KCrIP4/MStp4x229tWcMi9xLyZuJFmZAaWoEothkI1I9SufXWq3aOtFNyysBHXm+
8crUxRlA+Ap05TV+r8mF1EvebTp6Z93Y+B4SHV6GYDqp49n5B+vaGk1c81NhHLgk
Xqp5O0XMvAjDnIHKx6yrH9spQ1l2eg/mRWm+9FIX0UiJhX8hOobQHlk81dI1AXLC
WrTGE5G74tkPAoIBAQDTvbWRqU5nVA9N7r8QiLCvoYlnXIsd/JnP/VbGuGeUlaz5
OtSVFEe2PeNzjtzj9VzObTi/Vnr4K1VDuyh8T9Sk+X+L8O8KKUaHJ7vUHJ9LTeBk
72cvTm2hfHkOOwhWX8YKOr9XQCchxDZnEsJ0V22V8igkWRr+YOaDPrUwwf3vakAc
E2S2su7sY9H96iEjicByU9VQQQ/j3nlObhnd94E6C9gQgJbKzfbAoKN95T6cjwEs
wZ5LCzPbg3JgHr6tNcJuedcwdu67oookRd5Dvgcacqdeezfuq8ooYWY5tyT6CBy4
3w2lXaMVIBUIQZ28utBzJcZKJQ8o+oY0kNhTsucZAoIBAQClTjQbgpQBGspK+TIt
YyR6EoOQM++UWrR/wLhIQUmZVrjP+eXvX+tfYnfqMqzARNsAEom2t37zXL/NZzBN
Y00QJZa3hMMkWE0gYV2k6b7Pf3YmdGhhwFF86ALWt5rAW7FSpkgly4AN7u9h8m1w
yYV3yXfmgM2decs9EXeDUhVUyqXyZvlQUIeE2c5/xn6TpU/gUQPFDyLjNGBwJYiJ
g82ZqES2d0azSrQTR23J+rv9vBmoSrsQpHbKWY2fvdUZz833nu3Inz6o3+50YJ3S
AxD607xZ/U3rTKphGcT6Lt1W6K+Sico+fazGgwQ3HQyXVTgU5hRlbGhBpWhzH/ZG
h0A9AoIBADAT3SV1JmYmHaUoY8hoai8s+/MXHlKNw15qj7Qmo8aqHZlF+p6hkp25
ClkYqot/AFApNdfayZuiURU3BM88U+k4NwXufhPq/2fqxVH++kRv/Zljzg5W/zMQ
fIisII8yLSWehq5t04dSQhuIljPvB+TWYI6LZH2rifB1tfaGyYan/t5fRFOLQ+z7
EU5azAjsduCLFpKJ4tBRiUl8PGijmF4M8Q5ZjvUI08raeWUZHCL7L6/iV/v3ya+k
+O9mKwQn+Z6OlVTrf8zg/vfMxtjAaRUN4o8ZqqS0hHXxcFtlYHhQkJJgKMJlk9tB
37StHzHMK9rTgs9akfnlZcJsDfMo8X0=
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash

source config.sh

eeprom=$(ls /sys/bus/i2c/devices/*/eeprom)
result=$(dd if="$eeprom" bs=1 skip=8 count=2 2>/dev/null | hexdump -e '1/1 "%02x"')

if [[ "$result" != "$ASSERT_VERSION" ]]; then
echo "Error: expected eeprom version '$ASSERT_VERSION' got '$result'"
exit 1
fi

model=$(< /proc/device-tree/model tr -d '\0')

if [[ "$model" != "$ASSERT_MODEL_NAME" ]]; then
echo "Error: got '$model', expected '$ASSERT_MODEL_NAME'"
exit 1
fi
25 changes: 25 additions & 0 deletions tp2bmc/board/tp2bmc/factory_overlay/upper/factory/002-rtc-test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash

set -e

# Check if /sys/class/rtc/rtc0 exists
if [ -d "/sys/class/rtc/rtc0" ]; then
echo -e "\tRTC Information:"

# Read and print various RTC attributes
echo -e "\tName: $(cat /sys/class/rtc/rtc0/name)"
#echo "Date and Time: $(cat /sys/class/rtc/rtc0/date) $(cat /sys/class/rtc/rtc0/time)"
#echo "Alarm: $(cat /sys/class/rtc/rtc0/wakealarm)"
#echo "Since Epoch: $(cat /sys/class/rtc/rtc0/since_epoch)"
echo -e "\tMax User Freq: $(cat /sys/class/rtc/rtc0/max_user_freq)"
else
echo "Error: /sys/class/rtc/rtc0 directory does not exist. No RTC information available."
exit 1
fi

name=$(cat /sys/class/rtc/rtc0/name | awk '{print $1}')

if [[ "$name" != "rtc-pcf8563" ]]; then
echo "Error: rtc clock `rtc-pcf8563` could not be found"
exit 1
fi
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash
source config.sh

# Extract the gateway address for the eth0 interface
gateway=$(ip route show dev eth0 | grep default | awk '{print $3}')
ip=$(ip -o -4 addr show eth0 | awk '{print $4}' | cut -d/ -f1)

if [ "$ip" == "$NODE1_IP" ] || [ "$ip" == "$NODE2_IP" ] || \
[ "$ip" == "$NODE3_IP" ] || [ "$ip" == "$NODE4_IP" ]; then
echo "Error: Turing Pi has same IP ($ip) as one of the modules!!"
exit 1
fi

# Check if the gateway was found
if [ -z "$gateway" ]; then
echo "No gateway found for eth0"
exit 1
fi

mac=$(ifconfig eth0 | grep HWaddr | awk '{print $5}')
echo -e "\tinterface:\t'eth0'"
echo -e "\tMAC: \t\t'${mac}'"

ping -c 4 "${gateway}" > /dev/null

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#!/bin/bash
source helpers.sh

get_latest_device_sys() {
ls -lt /sys/class/block | grep -v 'total' | head -n 1
}

verify_msd_connection() {
partition="$1"
file1="$2"
file2="$3"
file3="$4"

mount_point=$(mktemp -d)
if [ ! -e "/dev/$partition" ]; then
echo "Error: Could not find mount /dev/$partition"
exit 1
fi

mount "/dev/$partition" "$mount_point"
res=$?
if [ "$res" -ne 0 ]; then
echo "error mounting $partition"
exit $res
fi

if [ ! -f "$mount_point/$file1" ] && \
[ ! -f "$mount_point/$file2" ] && \
[ ! -f "$mount_point/$file3" ]; then
echo "$(ls -l $mount_point)"
echo "Error: cannot find $file1 or $file2 on mount $partition"
tpi power off > /dev/null
exit 1
fi

umount "$mount_point"
rmdir "$mount_point"
}

tpi power off > /dev/null
last_added_device=$(get_latest_device_sys)

for n in {1..4}
do
echo -e "\tNode $n"
res=$(tpi advanced msd --node "${n}")
exit_code=$?
sleep 3
new_block=$(get_latest_device_sys)
if [[ "$last_added_device" == "$new_block" ]]; then
echo "$res"
echo -e "\n$(uart_output_node "${n}")"
echo "Error: can not detect node $n over USB"
tpi power off > /dev/null
exit 1
fi

partition=$(echo "$new_block" | awk '{print $9}')
# start.elf should be present on the boot partition of the cm4 rpi
# network-config should be present on the RK1
verify_msd_connection "${partition}1" "rk3588-turing-rk1.dtb" "network-config" "bcm2711-rpi-cm4.dtb"

tpi power off --node "${n}" > /dev/null
tpi usb device --node "${n}" > /dev/null
echo -e "\tNode $n => OK"
done

Loading

0 comments on commit 21840cc

Please sign in to comment.