You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.2 KiB
64 lines
2.2 KiB
#!/bin/sh
|
|
set -e
|
|
|
|
action=watch
|
|
device=
|
|
usbbid=
|
|
usbvid=
|
|
usbpid=
|
|
usbcls=
|
|
usbsubcls=
|
|
usbproto=
|
|
|
|
usage() {
|
|
echo "usage: $0 [-h] [-r DEVICE | -w [-b BUSID] [-v VENDORID] [-p PRODUCTID] [-c CLASS] [-C SUBCLASS] [-P PROTOCOL]]" >&2
|
|
}
|
|
|
|
while getopts hwrb:v:p:c:C:P: opt; do
|
|
case "$opt" in
|
|
w) action=watch;;
|
|
r) action=remove; device="$OPTARG";;
|
|
b) usbbid="$OPTARG";;
|
|
v) usbvid="$(printf "%04x" 0x$OPTARG)";;
|
|
p) usbpid="$(printf "%04x" 0x$OPTARG)";;
|
|
c) usbcls="$(printf "%02x" $OPTARG)";;
|
|
C) usbsubcls="$(printf "%02x" $OPTARG)";;
|
|
P) usbproto="$(printf "%02x" $OPTARG)";;
|
|
h) usage; exit 0;;
|
|
?) usage; exit 255;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND - 1))
|
|
|
|
case "$action" in
|
|
watch)
|
|
inotifywait -e create -m -r /dev/bus/usb | {
|
|
while read -r basedir action devname; do (
|
|
bus="${basedir#/dev/bus/usb}"
|
|
bus="${bus#/}"
|
|
[ -n "$bus" ] || continue
|
|
busnum="$(echo "$bus" | sed -e 's/^0+//')"
|
|
devnum="$(echo "$devname" | sed -e 's/^0+//')"
|
|
[ -z "$usbbid" ] || [ "$busnum" -eq "$usbbid" ] || continue
|
|
|
|
# ref: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/stable/sysfs-bus-usb?h=v5.19#n63
|
|
sysdir="$(echo /sys/bus/usb/devices/$busnum-$devnum:*)"
|
|
devvid="$(cat "$sysdir/idVendor" | tr '[A-Z]' '[a-z]')"
|
|
[ -z "$usbvid" ] || [ "$devvid" = "$usbvid" ] || continue
|
|
devpid="$(cat "$sysdir/idProduct" | tr '[A-Z]' '[a-z]')"
|
|
[ -z "$usbpid" ] || [ "$devpid" = "$usbpid" ] || continue
|
|
devcls="$(cat "$sysdir/bDeviceClass" | tr '[A-Z]' '[a-z]')"
|
|
[ -z "$usbcls" ] || [ "$devcls" = "$usbcls" ] || continue
|
|
debsubcls="$(cat "$sysdir/bDeviceSubClass" | tr '[A-Z]' '[a-z]')"
|
|
[ -z "$usbsubcls" ] || [ "$devsubcls" = "$usbsubcls" ] || continue
|
|
devproto="$(cat "$sysdir/bDeviceProtocol" | tr '[A-Z]' '[a-z]')"
|
|
[ -z "$usbproto" ] || [ "$devproto" = "$usbproto" ] || continue
|
|
|
|
rp-make "$sysdir" protocol=usb rm_command="$0 -r '$sysdir'"
|
|
) || true; done
|
|
}
|
|
;;
|
|
remove)
|
|
# todo
|
|
;;
|
|
esac
|
|
|