#!/bin/rc
-
if(! bind -a '#u' /dev)
exit
-mkdir -m 0700 '#σc/usb'
+
+mkdir -p -m 700 '#σc/usb'
+mkdir -p -m 700 '#σc/usbnet'
+
if(! nusb/usbd)
exit
@{
rfork ne
fn attach {
- switch($4){
- case *03
- nusb/kb $1
- case *08
- nusb/disk $1
- @{
- rfork ne
- cd '#σ/usb'
- for(dev in sdU^$1.*) if(test -d $dev) {
- diskparts $dev
- for(part in $dev/dos* $dev/9fat) if(test -r $part) {
- mkdir -m 0700 '#σc/'^$dev || exit
- {dossrv -s -f $part &} <[0=1] |
- echo 0 >'#σc/'^$dev/dos
- exit
+ id=$1
+ if(~ $#* 5 && ! test -e /env/nousbhname)
+ id=$1:$5
+ switch($2$3){
+ case 0b957720 0b95772a 0db0a877 13b10018 15577720 20013c05 07d13c05 05ac1402
+ nusb/ether -t a88772 $etherargs $id
+ case 0b951780 14eaab11 17370039 0411006e 050d5055
+ nusb/ether -t a88178 $etherargs $id
+ case 2001abc1
+ nusb/ether -t aue $etherargs $id
+ case 0bda8150
+ nusb/ether -t url $etherargs $id
+ case 18d14ee3 0bb40003
+ nusb/ether -t rndis $etherargs $id
+ case *
+ switch($4){
+ case *03
+ nusb/kb $id
+ case *02
+ # CDC ethernet
+ nusb/ether $etherargs $id
+ case *08
+ if(nusb/disk $id) @{
+ rfork ne
+ cd '#σ/usb'
+ devs=sdU^($1 $5)
+ for(dev in $devs $devs.*) if(test -d $dev) {
+ diskparts $dev
+ for(part in $dev/dos* $dev/9fat* $dev/data) if(test -r $part && ~ `{fstype $part} dos) {
+ mkdir -m 0700 '#σc/'^$dev || exit
+ {dossrv -s -f $part &} <[0=1] |
+ echo 0 >'#σc/'^$dev/dos
+ exit
+ }
}
}
- } &
+ case *
+ # Raspberry Pi ethernet will always appear as /net/etherU0
+ if(~ $2 0424)
+ nusb/ether -t smsc $etherargs $1:0
+ }
}
}
fn detach {
- rm -rf '#σc/usb/'^$1.* '#σc/sdU'^$1.*
+ devs='#σc/sdU'^($1 $5)
+ rm -rf '#σc/usb/'^$1.* '#σc/usbnet/'^$1.* $devs $devs.*
}
rc < '#σ/usb/usbevent' &
}
-bind -a '#σ/usb' /dev
-
-if(! ~ $#usbdelay 0)
- sleep $usbdelay
+# usbd removes this file once all devices have been enumerated
+while(test -e /env/usbbusy)
+ sleep 1
+bind -a '#σ/usb' /dev
+bind -a '#σ/usbnet' /net