Last active
August 9, 2020 13:40
-
-
Save tsjk/e50a09f607200c60fe58eb6abc572def to your computer and use it in GitHub Desktop.
/lib/preinit/79_usbmode - For pre-init USB mode switch on OpenWRT
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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