usbdetect
Aus Mikiwiki
usbdetect ist ein Shellskript zur Hardwareerkennung.
#!/bin/bash
#
# Pfade zu den benötigten Dateien
USBIDS=usb.ids # USB-ID-Liste von http://www.linux-usb.org/usb.ids
USBMAP=/lib/modules/`uname -r`/modules.usbmap
#
# Tabulator- und Newline-Zeichen als Variable, ist so leichter lesbar
Tab=$'\t'
Newline=$'\n'
#
# Wir benötigen Zugriff auf /proc/bus/pci, daher prüfen, ob es das Verzeichnis
# überhaupt gibt
if [ ! -d /proc/bus/usb ]; then
echo "/proc/bus/usb existiert nicht."
exit 1
fi
#
# Die USB-ID-Datenbank (http://www.linux-usb.org/usb.ids) einlesen
if [ -r "$USBIDS" ]; then
USBIDCMD="cat $USBIDS"
else
USBIDCMD="wget -q -O - http://www.linux-usb.org/usb.ids"
fi
#
# USB-ID-Liste zeilenweise einlesen
LastVendor=""
IFS="${Newline}"
for z in `eval ${USBIDCMD}`; do
case "${z:0:1}" in
[0123456789abcdef])
# 0-9 und a-f kennzeichnen einen Vendor-Eintrag
LastVendor=${z:0:4}
declare v${LastVendor}="${z:6}"
;;
$Tab)
if [ -n "$LastVendor" ]; then
# Tab kennzeichnet einen Device-Eintrag
declare d${LastVendor}${z:1:4}="${z:7}"
fi
;;
*)
LastVendor=""
;;
esac
done
#
# USB-Modul-Liste zeilenweise einlesen
IFS="${Newline}"
for z in `cat $USBMAP`; do
# Die Spalten sind mit (mehreren) Leerzeichen getrennt
IFS=" "
set -- $z
# Spalte 3 und 4 enthalten Vendor-/Device-ID, 10 und 11 die Class-ID
if [ "$3" = "0x0000" -a "$4" = "0x0000" ]; then
# generischer Treiber für bestimmte Geräteklassen
id="c${10:2:2}${11:2:2}${12:2:2}"
elif [ "$4" = "0xffff" ]; then
# generischer Treiber für alle Geräte des Herstellers
id="m${3:2}"
else
id="m${3:2}${4:2}"
fi
if [ -z "${!id}" ]; then
# Spalte 1 den Namen des Moduls
declare ${id}="$1"
else
declare ${id}="${!id}${Tab}${1}"
fi
done
IFS=",${Tab}${Newline}"
#
# /sys/bus/usb/devices/* respektive /proc/bus/usb/[0-9]*/* nach Geräten scannen
if [ -e /sys/bus/usb/devices ]; then
USBDevices=/sys/bus/usb/devices/*
Method="sysfs"
elif [ -e /proc/bus/usb ]; then
USBDevices=/proc/bus/usb/[0-9]*/[0-9]*
Method="proc"
else
echo "Neiter proc nor sysfs support. Emergency exit."
exit 1
fi
# Geräte nacheinander bestimmen
for device in $USBDevices; do
Vendor=0000
Device=0000
Class=000000
if [ "$Method" = "sysfs" ]; then
if [ -e ${device}/idVendor -a -e ${device}/idProduct ]; then
read Vendor < ${device}/idVendor
read Device < ${device}/idProduct
fi
if [ -e ${device}/*/bInterfaceClass ]; then
read Class < ${device}/*/bInterfaceClass
read SubClass < ${device}/*/bInterfaceSubClass
read Protocol < ${device}/*/bInterfaceProtocol
Class=${Class}${SubClass}${Protocol}
fi
elif [ "$Method" = "proc" ]; then
# Vendor- und Device-ID auslesen und nach Hex wandeln
Vendor=`hexdump -s 8 -n 2 -e '1/2 "%04x"' $device`
Device=`hexdump -s 10 -n 2 -e '1/2 "%04x"' $device`
# Class-ID und Sub-Class-ID
Class=`hexdump -s 32 -n 3 -e '1/1 "%02x"' $device`
fi
if [ "$Vendor" = "0000" -a "$Device" = "0000" ]; then
continue
fi
# variable Variablennamen generieren
v="v${Vendor}" # Variablenname des Herstellernamens
d="d${Vendor}${Device}" # Variablenname der Gerätebeschreibung
m="m${Vendor}${Device}" # Variablenname des Kernel-Moduls
g="m${Vendor}" # Variablenname des generischen Kernel-Moduls
c="c${Class}" # USB-Geräteklasse
echo "Hersteller: ${!v}${Tab}[0x${Vendor}]"
echo "Gerät: ${!d}${Tab}[0x${Device}]"
# echo "Klasse: [0x${Class}]"
if [ -n "${!m}" -o -n "${!g}" -o -n "${!c}" ]; then
set -- ${!m} ${!g} ${!c}
if [ "$#" -gt "1" ]; then
echo "Kernel-Module: $*"
else
echo "Kernel-Modul: $1"
fi
else
echo "Nicht unterstützt"
fi
echo
done
Weblinks
Originalskript: http://www.linux-magazin.de/static/listings/magazin/2005/09/hwdetect/usbdetect
