Skip to content

Instantly share code, notes, and snippets.

@tsjk
Last active August 9, 2020 13:40
Show Gist options
  • Save tsjk/e50a09f607200c60fe58eb6abc572def to your computer and use it in GitHub Desktop.
Save tsjk/e50a09f607200c60fe58eb6abc572def to your computer and use it in GitHub Desktop.
/lib/preinit/79_usbmode - For pre-init USB mode switch on OpenWRT
#!/bin/sh
# Copyright (C) 2006 OpenWrt.org
# Copyright (C) 2010 Vertical Communications
# To be included in ROM image, together with at least usb-modeswitch,
# kmod-usb-storage and a /etc/usb-mode.preinit.json.
#
# Tested on OpenWRT v19.07.3
log_usbmode() {
echo "preinit-usbmode: $1" > /dev/kmsg
}
wait_for_usbmode() {
local i=0 T=30 g=0 USBMODE_BLOCK_DEVICE="${1}"
[ -d "/sys/dev/block" ] || { log_usbmode "/sys/dev/block not available. Sleeping $(( T / 2 )) seconds and exiting."; sleep "$(( T / 2 ))"; return; }
while [ ${i} -lt ${T} ] && [ ${g} -eq 0 ]; do
[ ${i} -gt 0 ] || log_usbmode "Waiting a maximum of ${T} seconds for dongle-attached block device ${USBMODE_BLOCK_DEVICE} to (re-)appear."
sleep 5; i="$(( ${i} + 5 ))"
for l in $(ls -1A /sys/dev/block); do readlink "/sys/dev/block/${l}" | grep -qo "[^/]*${USBMODE_BLOCK_DEVICE}\$" && { g=1; break; }; done
done
[ ${g} -eq 1 ] && \
log_usbmode "USB-dongle-attached block device ${USBMODE_BLOCK_DEVICE} seems to have (re-)appeared after ${i} seconds." || \
log_usbmode "USB-dongle-attached block device ${USBMODE_BLOCK_DEVICE} seems NOT to have (re-)appeared within ${T} seconds."
}
do_usbmode() {
local USBMODE_BLOCK_DEVICE="sda"
[ -s "/etc/usb-mode.preinit.json" ] || {
log_usbmode "Not configured. Exiting."; return 0; }
[ -d "/dev/bus/usb" ] || {
log_usbmode "Creating /dev/bus/usb/001/00{1,2,3,4}."
/bin/mkdir -m 755 -p "/dev/bus/usb/001" && \
/bin/mknod -m 600 "/dev/bus/usb/001/001" c 189 0 && \
/bin/mknod -m 600 "/dev/bus/usb/001/002" c 189 1 && \
/bin/mknod -m 600 "/dev/bus/usb/001/003" c 189 2 && \
/bin/mknod -m 600 "/dev/bus/usb/001/004" c 189 3
}
log_usbmode "Checking for USB device to mode switch."
[ `/sbin/usbmode -c "/etc/usb-mode.preinit.json" -l 2>&1 | /usr/bin/wc -l` -gt 0 ] || sleep 5;
/sbin/usbmode -c "/etc/usb-mode.preinit.json" -l 1> /dev/kmsg 2> /dev/kmsg
[ `/sbin/usbmode -c "/etc/usb-mode.preinit.json" -l 2>&1 | /usr/bin/wc -l` -gt 0 ] || {
log_usbmode "Found no USB device to mode switch. Exiting."; return 0; }
log_usbmode "Found USB device to mode switch. Switching..."
/sbin/usbmode -c "/etc/usb-mode.preinit.json" -s 1> /dev/kmsg 2> /dev/kmsg
wait_for_usbmode "${USBMODE_BLOCK_DEVICE}"
}
boot_hook_add preinit_main do_usbmode
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment