#! /bin/sh # SPDX-License-Identifier: MIT set -eu run_cmd() { set -x "$@" set +x } cleanup_usb_otg() { echo "" > "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/UDC" rm "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/configs/conf.1/acm.1" rmdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/configs/conf.1/strings/0x409/" rmdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/configs/conf.1/" rmdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/functions/acm.1/" rmdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/strings/0x409/" rmdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/" } test_serial() { TX=$1 RX=$2 RXPROOF=$(mktemp) ORIG=$(mktemp) if [ ! -c "$TX" ]; then echo "$TX isn't a character device, failing..." false fi if [ ! -c "$RX" ]; then echo "$RX isn't a character device, failing..." false fi (cat "$RX" > "$RXPROOF")& PID=$! printf "test123test123test\n" > "$ORIG" # NOTE: \r instead of \n # The message is sent only if \r or \n is passed, however the receiving # end adds an additional newline. Therefore, to check data integrity the # last character is different in the reference file and the message # being sent. printf "test123test123test\r" > "$TX" # Give some time for the message to make it to the other side of the # communication before killing the process. sleep 1 kill $PID wait $PID || true diff "$ORIG" "$RXPROOF" rm -rf "$ORIG" "$RXPROOF" } UDC="ff300000.usb" (timeout -s 9 10 udevadm monitor --subsystem-match=usb | grep -q "add.*$UDC" && echo "Found USB stick" || (echo "ERROR: Could not find USB stick" && false)) & PID=$! echo "Please insert a USB stick in Q7 USB P1 port (likely through a male micro-USB-A to female USB-A adapter) in the next 10 seconds..." wait $PID # Give some time for the kernel messages to be printed following the insertion of the USB stick sleep 5 echo "Checking high-speed for Q7 USB P1..." run_cmd grep -E "^480$" /sys/devices/platform/$UDC/*/*/speed read -p "Please insert the micro-USB-A end of a male micro-USB-A to male USB-A cable into Q7 USB P1 port and the male USB-A end into Q7 USB P2 port and press any key to continue..." UNUSED CONFIGFS_HOME=$(findmnt --noheadings --types configfs -o target) if [ -z "$CONFIGFS_HOME" ]; then CONFIGFS_HOME=$(mktemp --directory) run_cmd mount none -t configfs "$CONFIGFS_HOME" fi if [ -e "$CONFIGFS_HOME/usb_gadget/q7-usb-p2" ]; then set +e run_cmd cleanup_usb_otg set -e fi run_cmd mkdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2" run_cmd echo 0xabcd > "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/idVendor" run_cmd echo 0xef01 > "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/idProduct" run_cmd mkdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/strings/0x409" run_cmd echo SN1234567890 > "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/strings/0x409/serialnumber" run_cmd echo Theobroma > "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/strings/0x409/manufacturer" run_cmd echo Ringneck-Haikou > "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/strings/0x409/product" run_cmd mkdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/configs/conf.1/" run_cmd mkdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/configs/conf.1/strings/0x409" run_cmd echo "USB ACM test" > "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/configs/conf.1/strings/0x409/configuration" run_cmd mkdir "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/functions/acm.1" run_cmd ln -s "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/functions/acm.1" "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/configs/conf.1" run_cmd echo "$UDC" > "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/UDC" # Give some time for the ACM device to be probed by the kernel sleep 2 ACM="/dev/ttyACM0" GS="/dev/ttyGS$(cat "$CONFIGFS_HOME/usb_gadget/q7-usb-p2/functions/acm.1/port_num")" run_cmd test_serial "$ACM" "$GS" run_cmd test_serial "$GS" "$ACM" run_cmd cleanup_usb_otg