UDEV Rules

Um Musikaufnahmen mit Linux zu machen habe ich ein neues USB Interface gekauft, das Scarlet 2i2 von Focusrite. Es funktioniert recht gut zusammen mit Linux, ich kann die Monitor Kanaele nutzen um Ton abzuspielen. Aufnahmen funktionieren auch, bisher habe ich nur Audacity ausprobiert und vielleicht arbeite ich mich in Ardour oder etwas aehnliches ein.

Doch leider bleibt ein Problem, wenn das Interface nichts abspielt scheint es sofort auszugehen. Nach ein bisschen Recherche bin ich sicher, dass Linux versucht Energie zu sparen. Um das Interface sinnvoll zu nutzen sollte ich es richtig konfigurieren. Das Tool der Wahl ist eine UDEV Regel zu schreiben.

Spurensuche

Zuerst brauchen wir mehr Informationen ueber das Geraet. Dazu stecken wir es aus und ein und schauen uns die letzten dmesg Eintraege an:

[ 2440.837059] usb 1-7.3: USB disconnect, device number 6
[ 2457.200255] usb 1-7.3: new high-speed USB device number 11 using xhci_hcd
[ 2457.312928] usb 1-7.3: New USB device found, idVendor=1235, idProduct=8202
[ 2457.312933] usb 1-7.3: New USB device strings: Mfr=1, Product=3, SerialNumber=0
[ 2457.312936] usb 1-7.3: Product: Scarlett 2i2 USB
[ 2457.312938] usb 1-7.3: Manufacturer: Focusrite

Somit weiss ich jetzt, den USB Bus, an dem das Geraet liegt: 1-7.3. Der Pfad im sys-Filesystem ist: /sys/bus/usb/devices/1-7.3

Der Ordner power sieht interessant aus, mit Hilfe von Google finde ich die Dokumentation:

https://elixir.free-electrons.com/linux/v3.2.91/source/Documentation/usb/power-management.txt#L130

power/control
    This file contains one of two words: "on" or "auto".
    You can write those words to the file to change the
    device's setting.

    "on" means that the device should be resumed and
    autosuspend is not allowed.  (Of course, system
    suspends are still allowed.)

    "auto" is the normal state in which the kernel is
    allowed to autosuspend and autoresume the device.

    (In kernels up to 2.6.32, you could also specify
    "suspend", meaning that the device should remain
    suspended and autoresume was not allowed.  This
    setting is no longer supported.)

Wenn ich die Dateo power/control auslese bekomme ich folgenden Output:

cat /sys/bus/usb/devices/1-7.3/power/control
auto

Das Ergebnis ist wie erwartet, jetzt muss der Parameter nur auf on gesetzt werden. Leider kann man nicht einfach in das sys Dateisystem schreiben. Um den Parameter beim erkennen des USB Interfaces zu setzen brauche ich eine UDEV Regel.

UDEV

Das Prinzip von udev war fuer mich immer sehr kryptisch und ich habe bisher nur Regeln von anderen kopiert. Dabei sind sie nicht sehr kompliziert, man muss sich nur ein bisschen Zeit nehmen.

Diese Regel ist recht einfach, wir wollen ein Attribut setzen, wenn das Interface angeschlossen wird. power/control soll auf on gesetzt werden.

Um das Geraet einwandfrei zu erkennen machen wir einen Vergleich, der Hersteller ID und noch ein paar anderer Parameter. Diese kann man recht einfach auslesen:

udevadm info -a -p /sys/bus/usb/devices/1-7.3/

Jetzt sollten sehr viele Informationen auf dem Bildschirm ausgegeben werden, fuer uns ist nur der oberste Absatz relevant. Dort finden wir folgende Informationen:

ATTR{idProduct}=="8202"
ATTR{idVendor}=="1235"
ATTR{manufacturer}=="Focusrite"
ATTR{product}=="Scarlett 2i2 USB"

Das koennen wir direkt in unsere Regel verwenden, dazu oeffnen wir die Datei /etc/udev/rules.d/70-focusrite-2i2.rules.

Um den Parameter zu setzen reicht es wenn wir nur ein = benutzen. Die komplette Regel sieht dann so aus:

ATTR{idProduct}=="8202", ATTR{idVendor}=="1235", ATTR{manufacturer}=="Focusrite", ATTR{product}=="Scarlett 2i2 USB", ATTR{power/control}="on"

Zwischen alle Attribute muss ein Komma. Nachdem man die Regel per Hand laufen laesst, oder das Kabel aus und ein steckt sollte control jetzt auf on gesetzt sein.