#!/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