Hallo arch-community,
Viel Text, aber vielleicht hat einer eine zündende Idee für mich. Ich versuche seit einger Zeit eine tevii-nec-Fernbedienung über ir-keytable zum laufen zu bekommen.
Allgemein: Ich versuche hier ausdrücklich nicht lirc zum laufen zu bekommen. Lirc hatte ich es schon durch, hab da aber ähnliche Probleme beim booten. Die Keymap von ir-keytable laufen aber sauberer.
Kurzum, es geht schon etwas. Aber ich habe noch drei Probleme. Die ir-keymaps manuel laden geht schon, wenn mal der IR-receiver vom System erkannt wurde.
Als IR-Empfänger habe ich einen selbst gebauten 38kHz Empfänger auf einer echten (kein USB) RS232 Schnittstelle. Der läuft soweit fehlerfrei, wenn serial_ir den Empfänger mal erkannt hat.
Systemd dienst lircd ist ausgeschaltet. Ich habe eine serial_ir.conf:
> cat /etc/modprobe.d/serial_ir.conf
options serial_ir irq=4 io=0x3f8
Und so komme ich zu den drei Grund-Problemen bei denen ich aktuell nicht mehr weiter weiß:
Problem Nummer 1
Mir ist aufgefallen, dass das Modul serial_ir nicht immer beim Booten geladen werden kann, weil der IRQ-Port 0x3F8 bereits belegt ist. Das Problem tritt sogut wie immer auf, wenn ich den PC neu starte. Wenn ich den PC herunterfahre, kurz komplett vom Netz trenne (ja wirklich) und dann wieder starte, dann wird meistens der Port von serial_ir geladen.
dmesg bei einen "Kaltstart":
> dmesg | grep serial_ir
[ 4.677087] serial_ir serial_ir.0: auto-detected active low receiver
[ 4.730454] rc rc0: Serial IR type home-brew as /devices/platform/serial_ir.0/rc/rc0
[ 4.730494] rc rc0: lirc_dev: driver serial_ir registered at minor = 0, raw IR receiver, raw IR transmitter
[ 4.730521] input: Serial IR type home-brew as /devices/platform/serial_ir.0/rc/rc0/input2
dmesg bei einen Neustart:
> dmesg | grep serial_ir
[ 3.623004] serial_ir serial_ir.0: port 03f8 already in use
[ 3.623006] serial_ir serial_ir.0: use 'setserial /dev/ttySX uart none'
[ 3.623006] serial_ir serial_ir.0: or compile the serial port driver as module and
[ 3.623007] serial_ir serial_ir.0: make sure this module is loaded first
[ 3.623018] serial_ir: probe of serial_ir.0 failed with error -16
...nur weiß ich nicht wie ich es hinbekomme, dass
setserial /dev/ttySX uart none gesetzt wird, bevor das Modul
serial_ir geladen wird.
Ich bekomme es auch nicht hin nach einen Neustart manuell zu starten, mit..
rmmod serial_ir
setserial /dev/ttyS0 uart none
/modprobe serial_ir
Gibts da ein Trick?
Problem Nummer 2
Wenn dann mal nach einen "kaltstart" der IR-Empränger von serial_ir geladen wurde, funktioniert ir-keytable nur manuell.
Ich habe mir meine passenden Keys aus /usr/lib/udev/rc_keymaps mit
ir-keytable -t gefunden und mir die tevii_nec.toml nach
/etc/rc_keymaps/tevii_1.toml kopiert+umbenannt+inhalt angepasst:
[[protocols]]
name = "tevii_1"
protocol = "nec"
[protocols.scancodes]
0x0a = "KEY_POWER"
0x0c = "KEY_MUTE"
...
Ich kann mit
ir-keytable -r prüfen welche Keys geladen sind.
Ebenso kann ich mit
ir-keytable -c die geladenen Keys leeren/löschen.
Ich kann dann aber nur manuell die Keys laden mit
ir-keytable -c -w /etc/rc_keymaps/tevii_1.toml. Die Fernbediennung funktioniert dann auch.
Was nicht geht ist das automatische Laden mit der /etc/rc_maps.cfg. Diese habe ich angepasst: Ich hab alle Einträge auskommentiert und nur eine Zeile drin:
* tevii_1 /etc/rc_keymaps/tevii_1.toml
Wenn ich also die geladenen keys leere (
ir-keytable -c) und dann versuche zu laden mit
ir-keytable -a /etc/rc_maps.cfg --sysdev=rc0
passiert nichts. Die gegenprobe mit
ir-keytable -r zeigt keine geladenen Keys wie wenn ich die -w Option benutze.
Ich denke, dass sollte es aber, denn ich habe im System eine udev Regel gefunden:
> cat /lib/udev/rules.d/70-infrared.rules
# Automatically load the proper keymaps after the Remote Controller device
# creation. The keycode tables rules should be at /etc/rc_maps.cfg
ACTION=="add", SUBSYSTEM=="input", SUBSYSTEMS=="rc", KERNEL=="event*", ENV{.rc_sysdev}="$id", RUN+="/usr/bin/ir-keytable -a /etc/rc_maps.cfg -s $env{.rc_sysdev}"
Problem Nummer 3
Problem 3 baut auf Problem 1+2 auf. Wenn dann mal
ir-keytable -a /etc/rc_maps.cfg --sysdev=rc0 irgendwann mal behoben ist... wie bekomme ich das automatisch beim Booten geladen?
Muss ich irgendwas mit der
/lib/udev/rules.d/70-infrared.rules anstellen?
Oder muss ich eine eigene udev regel in
/etc/udev/rules.d anlegen?
Oder lässt sich das mit ein systemd-dienst beim Bootvorgand erledigen?
Alles was ich sonst so in Foren finde ist etwas älter, benutzt noch /etc/rc.local. Gibts ja nicht bei systemd. Was das Booten betrifft muss ich gestehen, habe ich noch etwas wenig Berührungspunkte mit Systemd.