acpi_ibm howto

Kamikaze

Warrior of Sunlight
Teammitglied
Ich dachte es wäre mal an der Zeit einige Tasten an meinem Thinkpad zu belegen. Dazu muss man erstmal zu ein paar Dateien Einträge hinzufügen:

/boot/loader.conf
Code:
# load ibm acpi
acpi_ibm_load="YES"

/etc/sysctl.conf
Code:
# enable acpi_ibm devd events
dev.acpi_ibm.0.events=1

/etc/devd.conf
Code:
# ACPI_IBM
notify 10 {
        match   "system"        "ACPI";
        match   "subsystem"     "IBM";
        action  "/usr/local/sbin/acpi_ibm $notify 2>&1 > /var/run/acpi_ibm.log";
};


Dannn legt man das Skript '/usr/local/sbin/acpi_ibm' an.
Code:
#!/bin/sh

event=$1
status=

case $1 in
	0x03) {
		event="'backlight'";
		status=$(/usr/local/bin/radeontool light | grep -Eo '[^ ]+$')
		if [ "$status" = "on" ]; then
			status=off
		else
			status=on
		fi
		/usr/local/bin/radeontool light $status
	};;
	0x05) {
		event="'wireless'"
		command=start
		status=on
		if /etc/rc.d/wpa_supplicant onestatus > /dev/null; then
			command=stop
			status=off
		fi
		/etc/rc.d/wpa_supplicant one$command > /dev/null
	};;
	0x07) {
		event="'dac'"
		status=$(/usr/local/bin/radeontool dac | grep -Eo '[^ ]+$')
		if [ "$status" = "on" ]; then
			status=off
		else
			status=on
		fi
		/usr/local/bin/radeontool dac $status
	};;
	0x10) {
		event="'raise brightness'"
		status=$(sysctl dev.acpi_ibm.0.lcd_brightness | grep -Eo '[0-9]+$')
	};;
	0x11) {
		event="'lower brightness'"
		status=$(sysctl dev.acpi_ibm.0.lcd_brightness | grep -Eo '[0-9]+$')
	};;
	0x12) {
		event="'thinklight'"
		status=$(sysctl dev.acpi_ibm.0.thinklight | grep -Eo '[^ ]+$')
		if [ $status -eq 1 ]; then
			status=on
		else
			status=off
		fi
	};;
	0x15) {
		event="'raise volume'"
		status=$(sysctl dev.acpi_ibm.0.volume | grep -Eo '[0-9]+$')
	};;
	0x16) {
		event="'lower volume'"
		status=$(sysctl dev.acpi_ibm.0.volume | grep -Eo '[0-9]+$')
	};;
esac

echo "ACPI_IBM event ($1) $event."
if [ "$status" != "" ]; then
	echo "	status: $status"
fi

Jetzt noch ein:

# chmod +x /usr/local/sbin/acpi_ibm

und radeontool installieren, falls es noch nicht vorhanden ist:

# cd /usr/ports/sysutils/radeontool
# make install clean

Wenn man das ganze ohne Neustart ausprobieren will einfach:

# /etc/rc.d/devd restart

Jetzt sollte ein Fn-F3 den Bildschirm dunkel schalten und ein Fn-F5 den wpa_supplicant stoppen, bzw. wieder einschalten. Die Ausgabe des Skriptes kann man mit dem Befehl:

# tail -f /var/run/acpi_ibm.log

ansehen. Was vor allem zum Testen nützlich ist. Praktischerweise kann man das Skript im laufenden Betrieb ändern und testen.
 
An dieser Stelle möchte ich noch zusätzlich auf zwei Ports hinweisen, die vom acpi_ibm Treiber Gebrauch machen:

deskutils/tpb (Screenshot):

With TPB it is possible to bind programs to the ThinkPad, Mail, Home and
Search buttons. TPB can also run a callback program on each state change with
the changed state and the new state as options. So it is possible to trigger
several actions on different events.

TPB has an on-screen display (OSD) to show volume, mute, brightness and some
other information. Furthermore TPB supports a software mixer, as the R series
ThinkPads have no hardware mixer to change the volume.

sysutils/kmilo für KDE User (Screenshot):

Kmilo is a utiltiy that enables special keys on a number of custom keyboards on
devices such as IBM ThinkPad notebooks.
 
Das ist seltsam, denn mein R-40 hat einen Hardware-Mixer (will heißen die Lautstärketasten funktionieren einfach so, in jeder Lebenslage). Dafür hat es keinen Home-, Mail- oder Search-Button.
 
[LoN]Kamikaze schrieb:
Das ist seltsam, denn mein R-40 hat einen Hardware-Mixer (will heißen die Lautstärketasten funktionieren einfach so, in jeder Lebenslage).

Das bezieht sich auf R30-R32. Vielleicht sollte ich "as the R series ThinkPads" in der pkg-descr in "as some models of the R series ThinkPads" ändern.

[LoN]Kamikaze schrieb:
Dafür hat es keinen Home-, Mail- oder Search-Button.
Die sind nur auf relativ alten ThinkPads vorhanden. Falls jemand so ein ThinkPad hat, möchte ich denjenigen bitten, sich kurz bei mir zu melden.
 
tpb funktioniert hier manuell aufgerufen mit einem X31 wunderbar.

Die Lautstärke funktioniert auch so (Hardware) allerdings sieht man grafisch wo man ist. Frage ist nur, wie tpb beim Start aktiviert wird?
 
Ich werd nachher mal ein rc.d script zum Port hinzufügen. Dann kannst du tpb einfach in der rc.conf mit tpb_enable="YES" starten.
 
Yes ;)

Ich habe es schon so eingetragen, wurde immer zurückgeworfen ... ein "tpb -d" hat es dann für die Sitzung geklärt. Wenn ich mal gross bin und das alles richtig blicke ... ;)

Danke
 
Hmm, da hab ich wohl zu viel versprochen. tpb versucht beim start xosd zu initialisieren, was einen X server benötigt. Du wirst tpb also in .xinitrc eintragen müssen oder von xdm/kdm/gdm starten lassen müssen.

@[LoN]Kamikaze: pkg-descr hab ich grad bzgl. R-Serie und software mixer geändert.
 
Du kannst deinen deamon doch veranlassen zu warten bis der Xserver Prozess auftaucht.

Kann mein Skript irgendetwas was dein Port nicht kann? Oder habe ich das umsonst geschrieben?
 
Theoretisch ja, praktisch ist es nicht "mein" daemon sondern ein Programm, das ich portiert habe. Insofern habe ich wenig Motivation nur wegen der Datei, wo man den Startaufruf einträgt, tpb umzuschreiben.

Da du devd Events benutzt, hat dein Script einen entscheidenen Vorteil gegenüber tpb: es muss keine sysctls pollen und nimmt somit etwas Last vom System. Diesen Weg mußte ich bei tpb und kmilo leider für maximale Kompatibilität gehen, da IBM erst bei neueren ThinkPad Modellen die komplette Bandbreite an ACPI Events nutzt.
 
Rueckfrage zu acpi_ibm

Geraet ist bei mir ein TP X21. Folgende Fragen:

1) Wenn ich auf die ThinkPad Taste druecke (betrifft auch andere Events) passiert gar nichts. Auf devctl kommt da schon keinerlei Event an. Die Lautstaerketasten funktionieren auch so, aber liefern ebefalls keinerlei Events. Jetzt gibt es ja diese availmask, mit der ich das vermutlich aendern koennte, wenn ich Glueck habe (richtig?). Gibt es irgendeinen Weg, abseits von Durchprobieren, mit dem ich zu diesen Bitmasken kommen kann? Die in der Manpage passen bei mir vermutlich nicht (habs jetzt auf dem X21 noch nicht probiert, aber auf dem R32 klappte das mit dem Access IBM Button schonmal irgendwie nicht).

2) Wenn ich z.B. Fn-F3 druecke, wirft er mir auf der Console folgende Meldung:
Code:
IBM:NOTIFY:80
notify:1003
Unknown key 3

Aber kein ACPI Event dazu - devctl schweigt. Helfen mir die Werte in irgendeiner Form weiter bei Frage 1?

Gruss
Dierk
 
Zuletzt bearbeitet:
Versuch mal die Zeile
match "subsystem" "IBM";
aus der devd.conf zu entfernen, dann bekommst du mehr Ereignisse.
 
Hast du dev.acpi_ibm.0.events auf 1 gesetzt? Wenn nicht, werden keine ACPI Events generiert. Gleichzeitig bewirkt das, dass das Maximum an ACPI-Events generiert wird (eventmask wird auf den Wert von availmask gesetzt).

"availmask" (read-only) ist eine Bitmaske, die alle verfügbaren Events angibt. Welche Events dann wirklich feuern wird durch "eventmask" bestimmt.
 
Zurück
Oben