Lirc

Aus TippvomTibb
Zur Navigation springen Zur Suche springen

Allgemeines

Als ich gerade eben mal auf die Schnelle einen LIRC-Transceiver auf einem Raspi in Betrieb nehmen wollte, habe ich mich gewundert und geaergert zugleich, dass ich zu diesem Thema noch nichts aufgeschrieben hatte. Dabei habe ich gefuehlt die letzten 25 Jahre immer mal wieder was mit LIRC unternommen. Heute werde ich dieser Luecke eine Ende bereiten und das Vorgehen beschreiben.

Raspi mit SuSE

Um es vorweg zu nehmen, es war eine dumme Idee. OpenSUSE lief zwar, aber die Anpassungen und Aenderungen an den LIRC-Support waren mir nach einer Zeit des Probierens zu viel geworden. Abgesehen von der Tatsache, dass LIRC als Paket v0.9.4c(!!!!) angeboten wurde, waren die Kernelmodule nicht dazu zu bewegen mit LIRC, auch nicht mit v0.94d zu laufen. Also dann doch zu Raspberry OS, siehe unten.

zypper se lirc
 S  | Name                   | Summary                                            | Type
---+------------------------+----------------------------------------------------+------
i  | liblirc0               | LIRC driver library                                | Paket
i  | liblirc_client0        | LIRC client library                                | Paket
i  | liblirc_driver0        | LIRC driver library                                | Paket
i+ | lirc-config            | LIRC Configuration Tools and Data                  | Paket
i+ | lirc-core              | LIRC core, always needed to run LIRC               | Paket
i+ | lirc-devel             | LIRC development files                             | Paket
i+ | lirc-disable-kernel-rc | Disable kernel ir device handling in favor of lirc | Paket
i+ | lirc-drv-ftdi          | Ftdi LIRC User-Space Driver                        | Paket
i+ | lirc-drv-portaudio     | Portaudio LIRC User-Space Driver                   | Paket
i+ | lirc-tools-gui         | LIRC GUI tools                                     | Paket
i  | pulseaudio-module-lirc | LIRC module for PulseAudio                         | Paket

An die recht vielen Installationen auf ehemaligen Rechnern kann ich mich an Fallstricke erinnern, die mich jedesmal ueber Gebuehr beschaeftigt hatten. Man kann sich schnell in hunderten Configfiles oder Anbindungen spezieller Hardware verlieren und dabei den Blick auf den Kern verlieren. Hiflreich ist hier sicherlich, sich einen Ueberblick ueber die Softwarebestandteile zu machen. Ich habe aus dem Repository zu SuSE 15.3 die V0.9.4c installiert. Dann gleich schon ein Daempfer.

Bei zypper konnte ich keine Option entdecken, die mir den Inhalt der Pakete anzeigt.

Mit rpm ist mir dieses mit folgendem Befehl gelungen.

rpm -q -i -l <Name>

liblirc0

/usr/lib64/liblirc.so.0 /usr/lib64/liblirc.so.0.0.0

liblirc_client0

/usr/lib64/liblirc_client.so.0 /usr/lib64/liblirc_client.so.0.5.0

liblirc_driver0

/usr/lib64/liblirc_driver.so.0 /usr/lib64/liblirc_driver.so.0.0.0

lirc-config

/usr/share/lirc/configs/xxxxxxxx.config

lirc-core

>
/etc/lirc
/etc/lirc/irexec.lircrc
/etc/lirc/lirc_options.conf
/etc/lirc/lircd.conf
/etc/lirc/lircd.conf.d
/etc/lirc/lircd.conf.d/README.conf.d
/etc/lirc/lircd.conf.d/devinput.lircd.conf
/etc/lirc/lircmd.conf
/run/lirc
/run/lirc/lircd
/run/lirc/lircm
/usr/bin/ircat
/usr/bin/irdb-get
/usr/bin/irexec
/usr/bin/irpipe
/usr/bin/irpty
/usr/bin/irrecord
/usr/bin/irsend
/usr/bin/irsimreceive
/usr/bin/irsimsend
/usr/bin/irtestcase
/usr/bin/irtext2udp
/usr/bin/irw
/usr/bin/lirc-config-tool
/usr/bin/lirc-lsremotes
/usr/bin/lirc-make-devinput
/usr/bin/lirc-setup
/usr/bin/lircrcd
/usr/bin/mode2
/usr/bin/pronto2lirc
/usr/lib/python3.6/site-packages/lirc
/usr/lib/python3.6/site-packages/lirc/__pycache__
/usr/lib/python3.6/site-packages/lirc/__pycache__/baseview.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/baseview.cpython-36.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/choosers.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/choosers.cpython-36.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/config.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/config.cpython-36.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/database.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/database.cpython-36.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/mvc_control.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/mvc_control.cpython-36.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/mvc_model.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/mvc_model.cpython-36.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/mvc_view.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/mvc_view.cpython-36.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/util.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/lirc/__pycache__/util.cpython-36.pyc
/usr/lib/python3.6/site-packages/lirc/baseview.py
/usr/lib/python3.6/site-packages/lirc/choosers.py
/usr/lib/python3.6/site-packages/lirc/config.py
/usr/lib/python3.6/site-packages/lirc/configs
/usr/lib/python3.6/site-packages/lirc/database.py
/usr/lib/python3.6/site-packages/lirc/lirc-setup
/usr/lib/python3.6/site-packages/lirc/lirc-setup.ui
/usr/lib/python3.6/site-packages/lirc/mvc_control.py
/usr/lib/python3.6/site-packages/lirc/mvc_model.py
/usr/lib/python3.6/site-packages/lirc/mvc_view.py
/usr/lib/python3.6/site-packages/lirc/util.py
/usr/lib/systemd/system/irexec.service
/usr/lib/systemd/system/lircd-uinput.service
/usr/lib/systemd/system/lircd.service
/usr/lib/systemd/system/lircd.socket
/usr/lib/systemd/system/lircmd.service
/usr/lib/tmpfiles.d/lirc.conf
/usr/lib/udev/rules.d/60-lirc.rules
/usr/lib64/lirc
/usr/lib64/lirc/plugins
/usr/lib64/lirc/plugins/accent.so
/usr/lib64/lirc/plugins/alsa_usb.so
/usr/lib64/lirc/plugins/atilibusb.so
/usr/lib64/lirc/plugins/atwf83.so
/usr/lib64/lirc/plugins/audio_alsa.so
/usr/lib64/lirc/plugins/awlibusb.so
/usr/lib64/lirc/plugins/bte.so
/usr/lib64/lirc/plugins/commandir.so
/usr/lib64/lirc/plugins/creative.so
/usr/lib64/lirc/plugins/creative_infracd.so
/usr/lib64/lirc/plugins/default.so
/usr/lib64/lirc/plugins/devinput.so
/usr/lib64/lirc/plugins/dfclibusb.so
/usr/lib64/lirc/plugins/dsp.so
/usr/lib64/lirc/plugins/ea65.so
/usr/lib64/lirc/plugins/file.so
/usr/lib64/lirc/plugins/ftdix.so
/usr/lib64/lirc/plugins/girs.so
/usr/lib64/lirc/plugins/hiddev.so
/usr/lib64/lirc/plugins/i2cuser.so
/usr/lib64/lirc/plugins/irlink.so
/usr/lib64/lirc/plugins/irtoy.so
/usr/lib64/lirc/plugins/livedrive_midi.so
/usr/lib64/lirc/plugins/livedrive_seq.so
/usr/lib64/lirc/plugins/logitech.so
/usr/lib64/lirc/plugins/mouseremote.so
/usr/lib64/lirc/plugins/mp3anywhere.so
/usr/lib64/lirc/plugins/mplay.so
/usr/lib64/lirc/plugins/pcmak.so
/usr/lib64/lirc/plugins/pinsys.so
/usr/lib64/lirc/plugins/pixelview.so
/usr/lib64/lirc/plugins/silitek.so
/usr/lib64/lirc/plugins/slinke.so
/usr/lib64/lirc/plugins/srm7500libusb.so
/usr/lib64/lirc/plugins/tira.so
/usr/lib64/lirc/plugins/udp.so
/usr/lib64/lirc/plugins/uirt2.so
/usr/lib64/lirc/plugins/uirt2_raw.so
/usr/lib64/lirc/plugins/usbx.so
/usr/lib64/lirc/plugins/zotac.so
/usr/sbin/lirc-lsplugins
/usr/sbin/lircd
/usr/sbin/lircd-setup
/usr/sbin/lircmd
/usr/sbin/rclircd
/usr/sbin/rclircmd
/usr/share/doc/packages/lirc-core
/usr/share/doc/packages/lirc-core/AUTHORS
/usr/share/doc/packages/lirc-core/ChangeLog
/usr/share/doc/packages/lirc-core/NEWS
/usr/share/doc/packages/lirc-core/README
/usr/share/doc/packages/lirc-core/contrib
/usr/share/doc/packages/lirc-core/contrib/60-lirc.rules
/usr/share/doc/packages/lirc-core/contrib/60-usb-generic-perms.rules
/usr/share/doc/packages/lirc-core/contrib/61-lirc.blacklist-all.conf
/usr/share/doc/packages/lirc-core/contrib/97-lircd-uinput.rules
/usr/share/doc/packages/lirc-core/contrib/98-lirc-stable-link.rules
/usr/share/doc/packages/lirc-core/contrib/99-remote-control-lirc.rules
/usr/share/doc/packages/lirc-core/contrib/irexec.desktop
/usr/share/doc/packages/lirc-core/contrib/irman2lirc
/usr/share/doc/packages/lirc-core/contrib/lircd.conf
/usr/share/doc/packages/lirc-core/contrib/lircmd.conf
/usr/share/doc/packages/lirc-core/contrib/lircrc
/usr/share/doc/packages/lirc-core/contrib/lircrc/lircmap.xml
/usr/share/doc/packages/lirc-core/contrib/lircrc/lircrc
/usr/share/doc/packages/lirc-core/contrib/lircrc/mplayer.lircrc
/usr/share/doc/packages/lirc-core/contrib/lircrc/mythtv.lircrc
/usr/share/doc/packages/lirc-core/contrib/lircrc/vlc.lircrc
/usr/share/doc/packages/lirc-core/contrib/lircrc/volume_alsa.lircrc
/usr/share/doc/packages/lirc-core/contrib/lircrc/volume_mythtv.lircrc
/usr/share/doc/packages/lirc-core/contrib/lircrc/volume_pulse.lircrc
/usr/share/doc/packages/lirc-core/contrib/release-process.txt
/usr/share/doc/packages/lirc-core/html
/usr/share/doc/packages/lirc-core/html/alsa-usb.html
/usr/share/doc/packages/lirc-core/html/api-general.html
/usr/share/doc/packages/lirc-core/html/atilibusb.html
/usr/share/doc/packages/lirc-core/html/atwf83.html
/usr/share/doc/packages/lirc-core/html/audio-alsa.html
/usr/share/doc/packages/lirc-core/html/audio.html
/usr/share/doc/packages/lirc-core/html/configuration-guide.html
/usr/share/doc/packages/lirc-core/html/configure.html
/usr/share/doc/packages/lirc-core/html/default.html
/usr/share/doc/packages/lirc-core/html/devinput.html
/usr/share/doc/packages/lirc-core/html/driver-api.html
/usr/share/doc/packages/lirc-core/html/empty_toc.html
/usr/share/doc/packages/lirc-core/html/file.html
/usr/share/doc/packages/lirc-core/html/ftdi.html
/usr/share/doc/packages/lirc-core/html/ftdix.html
/usr/share/doc/packages/lirc-core/html/girs.html
/usr/share/doc/packages/lirc-core/html/help.html
/usr/share/doc/packages/lirc-core/html/imon-24g.html
/usr/share/doc/packages/lirc-core/html/imon.html
/usr/share/doc/packages/lirc-core/html/index.html
/usr/share/doc/packages/lirc-core/html/install.html
/usr/share/doc/packages/lirc-core/html/irtoy.html
/usr/share/doc/packages/lirc-core/html/lirc_client.html
/usr/share/doc/packages/lirc-core/html/no-api-docs.html
/usr/share/doc/packages/lirc-core/html/programs-overview.html
/usr/share/doc/packages/lirc-core/html/programs.html
/usr/share/doc/packages/lirc-core/html/pronto2lirc.html
/usr/share/doc/packages/lirc-core/html/srm7500atilibusb.html
/usr/share/doc/packages/lirc-core/html/technical.html
/usr/share/doc/packages/lirc-core/html/tira.html
/usr/share/doc/packages/lirc-core/html/udp.html
/usr/share/doc/packages/lirc-core/irxevent.keys
/usr/share/doc/packages/lirc-core/lirc.hwdb
/usr/share/licenses/lirc-core
/usr/share/licenses/lirc-core/COPYING
/usr/share/lirc
/usr/share/lirc/lirc.hwdb
/usr/share/man/man1/ircat.1.gz
/usr/share/man/man1/irdb-get.1.gz
/usr/share/man/man1/irexec.1.gz
/usr/share/man/man1/irpipe.1.gz
/usr/share/man/man1/irpty.1.gz
/usr/share/man/man1/irrecord.1.gz
/usr/share/man/man1/irsend.1.gz
/usr/share/man/man1/irsimreceive.1.gz
/usr/share/man/man1/irsimsend.1.gz
/usr/share/man/man1/irtestcase.1.gz
/usr/share/man/man1/irtext2udp.1.gz
/usr/share/man/man1/irw.1.gz
/usr/share/man/man1/lirc-config-tool.1.gz
/usr/share/man/man1/lirc-lsplugins.1.gz
/usr/share/man/man1/lirc-lsremotes.1.gz
/usr/share/man/man1/lirc-make-devinput.1.gz
/usr/share/man/man1/lirc-setup.1.gz
/usr/share/man/man1/mode2.1.gz
/usr/share/man/man1/pronto2lirc.1.gz
/usr/share/man/man5/lircd.conf.5.gz
/usr/share/man/man5/lircrc.5.gz
/usr/share/man/man8/lircd-setup.8.gz
/usr/share/man/man8/lircd-uinput.8.gz
/usr/share/man/man8/lircd.8.gz
/usr/share/man/man8/lircmd.8.gz
/usr/share/man/man8/lircrcd.8.gz

lirc-devel

/usr/include/lirc
/usr/include/lirc/ciniparser.h
/usr/include/lirc/config_file.h
/usr/include/lirc/config_flags.h
/usr/include/lirc/curl_poll.h
/usr/include/lirc/dictionary.h
/usr/include/lirc/driver.h
/usr/include/lirc/drv_admin.h
/usr/include/lirc/dump_config.h
/usr/include/lirc/include
/usr/include/lirc/include/media
/usr/include/lirc/include/media/lirc.h
/usr/include/lirc/input_map.h
/usr/include/lirc/input_map.inc
/usr/include/lirc/ir_remote.h
/usr/include/lirc/ir_remote_types.h
/usr/include/lirc/irpipe.h
/usr/include/lirc/irrecord.h
/usr/include/lirc/line_buffer.h
/usr/include/lirc/lirc-utils.h
/usr/include/lirc/lirc_client.h
/usr/include/lirc/lirc_config.h
/usr/include/lirc/lirc_log.h
/usr/include/lirc/lirc_options.h
/usr/include/lirc/paths.h
/usr/include/lirc/receive.h
/usr/include/lirc/release.h
/usr/include/lirc/serial.h
/usr/include/lirc/transmit.h
/usr/include/lirc_client.h
/usr/include/lirc_driver.h
/usr/include/lirc_private.h
/usr/lib64/libirrecord.so
/usr/lib64/liblirc.so
/usr/lib64/liblirc_client.so
/usr/lib64/liblirc_driver.so
/usr/lib64/pkgconfig/lirc-driver.pc
/usr/lib64/pkgconfig/lirc.pc

lirc-disable-kernel-rc

/usr/lib/udev/rules.d/99-remote-control-lirc.rules

lirc-drv-ftdi

/usr/lib64/lirc/plugins/ftdi.so
/usr/share/lirc/configs/ftdi.conf

lirc-drv-portaudio

/usr/lib64/lirc/plugins/audio.so
/usr/share/lirc/configs/audio.conf

lirc-tools-gui

/usr/bin/irxevent
/usr/bin/xmode2
/usr/share/man/man1/irxevent.1.gz
/usr/share/man/man1/xmode2.1.gz
===pulseaudio-module-lirc===
<syntaxhighlight lang="bash" line>
/usr/lib64/pulse-14.2
/usr/lib64/pulse-14.2/modules
/usr/lib64/pulse-14.2/modules/module-lirc.so


Die erstmal wichtigsten Dateien befinden sich in lirc-core und lirc-tools-gui. Die wichtigtsten Dateien werden bei der Installation in die folgenden Verzeichnisse abgelegt.

/etc/lirc /run /usr/bin /usr/lib/systemd/system/ /usr/sbin /usr/share/doc/packages/lirc-core


Eine Liste der wichtigsten Programme:

  • lircd - Decode infrared signals and provide them on a socket. Die Zentrale!
  • xmode2 Show the pulse/space length of infrared signals Sozusagen ein Oszilloskop. Eigentlich das wichtigste Programm zu Beginn.
  • irxevent Infrared X-event Sender Sendet IR-Kommandos zu X Programmen weiter. Damit kann man mit einer IR-RemoteControl X-Windows-Programme steuern.(siehe auch irexec und irpty)


Treiber

lirc_rpi scheint es nicht mehr zu geben. Stattdessen findet sich auf meinem System gpio-ir, gpio-ir-tx und pwm-ir-tx. Bisher kannte ich nur den lirc_serial, den das gleiche Schicksal ereilte. Schwuppdiwupp ist da mal serial_ir draus geworden.

RasPi Inbetriebnahme

Was bei OpenSuSE schon mal gleich auffaellt, dass es keine /boot/config.txt gibt. Nach dem Studium der Doku von config.txt

include
Causes the content of the specified file to be inserted into the current file.
For example, adding the line include extraconfig.txt to config.txt will include the content of extraconfig.txt file in the config.txt file.
Include directives are not supported by bootcode.bin or the EEPROM bootloader

Die passenden Dateien finden sich bei openSuSE in /boot...

/boot/efi/config.txt
/boot/efi/extraconfig.txt
/boot/efi/ubootconfig.txt
/boot/vc/config.txt
/boot/vc/ubootconfig.txt

efi ist die UEFI Partition.

/dev/mmcblk0p1 on /boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)

vc kann sinnvollerweise nur VideoCore bedeuten. Einen Beleg dafuer konnte ich nur indirekt finden.

'vcgencmd' is a command line utility that can get various pieces of information from the VideoCore GPU on the Raspberry Pi.

Dieses Programm gibt es unter openSuSE nicht. Grrrr! (BTW: raspi-config gibt es auch nicht und nirgends ein Hinweis zu einem Ersatz)

Bei Bootlin kann man lesen:

Device Tree Overlays

A specificity of the Raspberry Pi is that the boot flow starts from the GPU core and not the ARM core like it does on most embedded processors. The GPU load a first bootloader from a ROM that will load a second bootloader (bootcode.bin) from eMMC/SD card that is in charge of executing a firmware (start.elf). This GPU firmware finally reads and parses a file stored in the boot partition (config.txt), which is used to set various boot parameters such as the image to boot on.

This config.txt file also allows to indicate which Device Tree file should be used as the hardware description, as well as Device Tree Overlays that should be applied on top of the Device Tree files. Device Tree Overlays are a bit like patches for the Device Tree: they allow to extend the base Device Tree with new properties and nodes. They are typically used to describe the hardware attached to the RaspberryPi through expansion boards.

The Raspberry Pi kernel tree contains a number of such Device Tree Overlays in the arch/arm/boot/dts/overlays folder. Each of those overlays, stored in .dts file gets compiled into a .dtbo files. Those .dtbo can be loaded and applied to the main Device Tree by adding the following statement to the config.txt file:

dtoverlay=overlay-name,overlay-arguments

We will fully take advantage of this mechanism to introduce two new Device Tree Overlays that will be parsed and dynamically merged into the main Device Tree.

Weiter kann man bei die dtoverlay Reference nachschlagen.

Allerdings laesst sich der Raspi immer noch nicht bewegen wie gewohnt seinen Betrieb aufzunehmen.

Dann habe ich folgende Meldung gefunden. Na Prost Mahlzeit!

Bevor ich aber kurzerhand auf eine aeltere Rasbian umsteige, gebe ich der V0.9.4d und V0.10.1 eine Chance.

Kompilieren hat soweit geklappt. Jetzt geht's ans Installieren.

       ----------         ---------------                     ----------
       |        |         | Linux input |                     |        |
       |        |---->----| layer       |---------->----------| Appli- |
       |        |         |             |  /dev/input/eventX  | cation |
       |        |         ---------------                     |        |
--->---|        |            |        |                       ----------
remote | kernel |   devinput v        |
       |        |            |        ^ uinput
       |        |            |        |                       ----------
       |        |         ---------------                     | Appli- |
       |        |---->----|    lirc     |---------->----------| cation |--
       |        |         |             | /var/run/lirc/lircd |        | |
       ----------         ---------------                     ---------- |--
                                                               |        | |
                                                               ---------- |
                                                                 |        |
                                                                 ----------

Basic setup flow

     ------------
     |  remote  |
     ------------

       (air gap)

     ------------
     ! capture  !
     ! device   !
     ------------
          |
          v
          |
     ------------
     ! kernel   !                   Sometimes needs
     ! driver   !                   modprobe(1) configuration.
     ------------
          |
          v  IR pulse data          Device like /dev/lirc0, /dev/ttyACM0.
          |                         or /dev/ttyS0.
     ------------
     |  lirc    |                   Configure lirc_options.conf
     |  driver  |                   with driver and usually also device.
     ------------
          |
          v  IR pulse data          Use mode2(1) to debug
          |
  ----------------
  |  lirc pass 1 |                  lircd.conf config file.
  ----------------
          |
          v  Key symbols            Output socket e. g.,
                                                                                                             LIRC - Linux Infrared Remote Control (p5 of 29)
          |                         /var/run/lirc/lircd. Use irw(1) to debug.
          |
  ----------------
  |  lirc pass 2 |                  lircrc config file.
  ----------------
          |
          v  Application strings    Use ircat(1) to debug.
          |
     Applications

Test auf einem Linux (OpenSUSE 15.3) X86 System

worker:/ # dmesg |grep ttyS
[    1.422626] 00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A

setserial /dev/ttyS0 uart none
worker:/ # modinfo serial_ir
filename:       /lib/modules/5.14.21-150400.24.46-default/kernel/drivers/media/rc/serial_ir.ko.zst
license:        GPL
author:         Ralph Metzler, Trent Piepho, Ben Pfaff, Christoph Bartelmus, Andrei Tanas
description:    Infra-red receiver driver for serial ports.
suserelease:    SLE15-SP4
srcversion:     389CCC5980EB109B740F2B3
depends:        rc-core
supported:      no
retpoline:      Y
intree:         Y
name:           serial_ir
vermagic:       5.14.21-150400.24.46-default SMP preempt mod_unload modversions 
sig_id:         PKCS#7
signer:         SUSE Linux Enterprise Secure Boot CA
sig_key:        ED:87:85:B7:8F:FC:12:7F
sig_hashalgo:   sha256
signature:      19:00:A5:A2:02:CC:7E:F7:8A:9D:A0:0C:79:E7:87:52:F0:C7:F3:85:
                7C:82:36:86:42:BE:30:EE:69:33:2B:44:92:98:A8:10:24:A5:6E:A2:
                30:12:A3:CE:81:B2:B5:47:C1:E6:1B:CC:7F:33:C3:F5:58:0D:2D:6D:
                F7:22:61:35:A4:E1:59:42:BA:00:36:BE:D2:32:1A:4C:CE:2F:DB:A1:
                F5:C1:38:98:F7:05:61:AD:1F:3A:34:5B:04:9A:F3:28:61:AD:2A:DF:
                9C:BE:57:93:72:0F:FE:3F:4E:E7:39:CD:B6:A5:E3:70:E3:5A:10:D6:
                41:C9:39:2A:25:40:FE:8A:FD:D6:1E:B0:55:7F:98:AD:6E:34:B9:64:
                1D:93:8E:46:CA:F1:F9:4D:37:71:38:53:BD:D5:7B:B4:0A:43:DC:38:
                3E:41:77:B2:8A:71:F9:D6:2B:DB:4E:63:3F:AF:F7:94:7C:89:25:7B:
                37:DD:7E:0A:78:E4:E3:08:FD:9C:D1:AD:6D:57:45:A4:B9:3A:8C:9B:
                B1:14:C2:1C:D3:12:7D:0C:B3:C2:FF:59:86:0F:49:68:78:14:FC:7B:
                19:90:37:E6:9F:92:5A:67:3B:58:1D:AF:C9:60:5A:D9:4D:57:A6:19:
                E6:00:8E:34:02:25:E2:10:C2:2E:5B:2D:13:32:37:AC
parm:           type:Hardware type (0 = home-brew, 1 = IRdeo, 2 = IRdeo Remote, 3 = AnimaX, 4 = IgorPlug (int)
parm:           io:I/O address base (0x3f8 or 0x2f8) (int)
parm:           iommap:physical base for memory mapped I/O (0 = no memory mapped io) (ulong)
parm:           ioshift:shift I/O register offset (0 = no shift) (int)
parm:           irq:Interrupt (4 or 3) (int)
parm:           share_irq:Share interrupts (0 = off, 1 = on) (bool)
parm:           sense:Override autodetection of IR receiver circuit (0 = active high, 1 = active low ) (int)
parm:           txsense:Sense of transmitter circuit (0 = active high, 1 = active low ) (bool)
parm:           softcarrier:Software carrier (0 = off, 1 = on, default on) (bool)

Mit

worker:/ # ls -l /dev/lirc*
crw-rw---- 1 root lirc 240, 0 May 16 18:04 /dev/lirc0

zappelt was. Prima, auf geht's.

worker:/ # ir-ctl --features
Receive features /dev/lirc0:
 - Device can receive raw IR
 - Resolution 250 microseconds
 - Can set receiving timeout min:1 microseconds max:1250000 microseconds
Send features /dev/lirc0:
 - Device can send raw IR
 - Set carrier
 - Set duty cycle
worker:/ # xmode2 -Hdefault --device=/dev/lirc0

Mit ., 1, 2, 5 kann die Zeitbasis eingestellt werden.

worker:/ # irrecord --disable-namespace -Hdefault -d/dev/lirc0
Warning: Running as root.
Using driver default on device /dev/lirc0

irrecord -  application for recording IR-codes for usage with lirc
Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)

This program will record the signals from your remote control
and create a config file for lircd.

A proper config file for lircd is maybe the most vital part of this
package, so you should invest some time to create a working config
file. Although I put a good deal of effort in this program it is often
not possible to automatically recognize all features of a remote
control. Often short-comings of the receiver hardware make it nearly
impossible. If you have problems to create a config file READ THE
DOCUMENTATION at https://sf.net/p/lirc-remotes/wiki

If there already is a remote control of the same brand available at
http://sf.net/p/lirc-remotes you might want to try using such a
remote as a template. The config files already contains all
parameters of the protocol used by remotes of a certain brand and
knowing these parameters makes the job of this program much
easier. There are also template files for the most common protocols
available. Templates can be downloaded using irdb-get(1). You use a
template file by providing the path of the file as a command line
parameter.

Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to  <lirc@bartelmus.de> so it can be made available to others.

Press RETURN to continue.

Checking for ambient light  creating too much disturbances.
Please don't press any buttons, just wait a few seconds...

No significant noise (received 0 bytes)

Enter name of remote (only ascii, no spaces) :ME
Using ME.lircd.conf as output filename

Now start pressing buttons on your remote control.

It is very important that you press many different buttons randomly
and hold them down for approximately one second. Each button should
generate at least one dot but never more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have
been generated.

Press RETURN now to start recording.
................................................................................
Got gap (8971 us)}

Please keep on pressing buttons like described above.
Signal too long
Creating config file in raw mode.
Signals are pulse encoded.
Signal length is 0
Unknown encoding

Please enter the name for the next button (press <ENTER> to finish recording)
ONOFF

Now hold down button "ONOFF".
Segmentation fault (core dumped)

Jetzt seh ich wieder 5-jaehrige Schimpansen. Grrr!

Wechsel zu Raspberry Pi OS (64 Bit)

Da ich das Gefuehl bei openSuSE nicht los geworden bin an verschiedenen Baustellen zu arbeiten. Habe mich kurzerhand entschieden auf Raspberry Pi OS Bullseye zu wechseln. Mal schauen.

Nach der Installation von "allen" lirc-Paketen gab das Log von aptitude (cat /var/log/apt/history) folgendens aus: (NB: Zur besseren Lesbarkeit nachformatiert.

Start-Date: 2022-02-25  18:12:43
Commandline: packagekit role='install-packages'
Requested-By: pi (1000)
Install: 
liblirc0:arm64 (0.10.1-6.3), 
xfonts-75dpi:arm64 (1:1.0.4+nmu1.1, automatic), 
lirc:arm64 (0.10.1-6.3), 
libportaudio2:arm64 (19.6.0-1.1, automatic), 
libusb-0.1-4:arm64 (2:0.1.12-32, automatic), 
lirc-compat-remotes:arm64 (0.9.0-1.1), 
lirc-doc:arm64 (0.10.1-6.3), 
xfonts-encodings:arm64 (1:1.0.4-2.1, automatic), 
python3-yaml:arm64 (5.3.1-5, automatic), 
xfonts-utils:arm64 (1:7.7+6, automatic), 
lirc-x:arm64 (0.10.1-6.3), 
gir1.2-vte-2.91:arm64 (0.62.3-1, automatic)
End-Date: 2022-02-25  18:13:07

Die nicht direkt mit Namen 'LIRC' in Zusammenhang stehenden Pakete ergeben sich wohlmoeglich durch Abhaengigkeiten.

Die Aktivierung in der config.txt, erstmal nur das Empfangen, ging ohne Probleme und nach dem reboot hatte ich auch ein /dev/lirc0.

cat /dev/lirc0 

zeigte auch eine Reaktion beim Drücken einer Fernbedienungstaste. Nun kann es ans Einlesen gehen. Dazu dient irrecord.

NAME
       irrecord - IR-codes recording tool for usage with LIRC

SYNOPSIS
       irrecord [-f] [-n] [-H driver] [-d device] [file]

       irrecord -a <file> Analyse a raw_codes config file, trying to convert it to a regular configuration.

       irrecord -l List valid button names.

       irrecord --help | --version

irrecord -l zeigt die moeglichen Button Names. Da ich ich hier eindeutige Namen der Fernbedienung nutze, schalte ich die vorgegeben Namen mit der Option -n aus.

i@raspberrypi:~ $ ir-ctl --features
Receive features /dev/lirc0:
 - Device can receive raw IR
 - Can report decoded scancodes and protocol
 - Receiving timeout 60000 microseconds
 - Can set receiving timeout min 1 microseconds, max 1250000 microseconds
Send features /dev/lirc0:
 - Device cannot send
pi@raspberrypi:~ $

Bei Versuchen die Fernbedienungen einzulesen, ist zum wiederholten Male folgende Fehlermeldung aufgetaucht:

Sorry, something
went wrong.

Da leider keine genau Aussage darueber getroffen wird was 'wrong' ist, muss ich einen Schritt zurueck.

cat /dev/lirc0

liefert eine Ausgabe. OK.

  • mode2 liefert eine Ausgabe.
  • smode2 existiert nicht und
  • xmode2 bricht mit Fehlermeldung (Font not found) ab.

Also ab in den Quellcode und was soll ich sagen, ich bin schockiert. Ich wundere mich, dass xmode2 ueberhaupt mal richtig lief.
Um den Quellcode zu analysieren habe ich die lirc-Quellen installiert. Dazu die auskommentierten SRC-Repositories eingebunden.

sudo vi /etc/apt/sources.list
sudo vi /etc/apt/sources.list.d/raspi.list
sudo apt update
apt-get source lirc (NB:apt-src gibt es nicht (mehr))

In xmode2.cpp stehen gleich schon irrefuehrende Dinge.

Usage: xmode2 [-t (ms/div)] , default division is 5 ms/div   ????? default ist 0,05 ms/div
compile: gcc -o xmode2 xmode2.c -L/usr/X11R6/lib -lX11

Abgesehen davon, dass das Programm xmode2.cpp heiszt, kann das so nicht (mehr) funktionieren. Auch die Versionsnummer und das Datum gibt zu denken.

Bei der Dokumentation fehlt mir hier der Hinweis auf die Version. Eine richtig brauchbare Doku findet man hier Der Fehler mit dem unauffindbaren Font ist schnell gefunden.

char font1_name[] = "-misc-fixed-*-r-*-*-12-*-*-*-*-*-iso8859-1";

Hardcodiert. Den Font gibt es bei mir nicht! Grrrr! Wer macht den sowas? 5-jaehrige Schimpansen (Danke @AkkuDoktor)

QAD Workaround(Patch):

char font1_name[] = "fixed";

Dann der naechste Klopper. Da ich zum Testen im LIRCSRC-Pfad arbeite, muss ich zwangslaeufig die Position der lirc_options.conf angeben. Bei der Option --options-file ist in der Usage/Help das Gleichheitszeichen vergessen worden!

--options-file=/etc/lirc/lirc_options.conf

Und dennoch kommt eine Fehlermeldung:

xmode2: unrecognized option '--options-file=/etc/lirc/lirc_option.conf'

Erst war mir gar nicht klar, welcher Programmteil diese Fehlermeldung produziert. Obwohl man schoen erkennen kann, dass in der Funktion options_load und dann parse_O_arg in lirc_options.c der Option -O, bzw. --options-file eine Sonderbehandlung zu gute kommt. Die auch funktioniert. Wird die Fehlermeldung durch die weitere "normale" Optionsbehandlung in parse_options ausgeloest, das es dort keine Option -O gehen darf! Also entweder man integriert die -O-Sonderbehandlung in parse_options oder man loescht nach erfolgreicher Sonderbehandlung die -O-Option aus argv heraus.

QAD Workaround(Patch)

	const char* const optstring =  "g:hvdD:U:H:t:mrA:O:"; // in parse_options bei mir Zeile 186 xmode2.cpp

und

        case 'O':
           break;

in der switch-Anweisung.

Nach den Anpassungen und Kompilieren konnte ich z.B. mit

xmode2 --options-file=/etc/lirc/lirc_options.conf -Dinfo --device=/dev/lirc0 --driver=default

das Programm erfolgreich starten.

Dann zeigte sich aber ein Verhalten, dass bei ueberlaufendem Fenster nichts mehr angezeigt wurde. Das Umschalten der TimeDiv funktionierte zwar, aber die 0,05 ms/div erhielt ich nur zum Programmstart. Die Wahl der TimeDIV empfinde ich als zu umstaendlich.

Links

Heimat von IRScrutinizer [1][2] So richtig stabil kommt mich das Programm aber auch nicht vor. Mehrfach java.Exceptions!

Wenn ich schon mal dabei bin. Vielleicht gibt's einen neuen Empfaenger.[3]

Global Cache scheint mir ein wenig ueberteuert.[4]

IRTrans ist auch nicht unbedingt ein Schnapper.[5]

IRToy ist nach meinem Geschmack, fairer Preis und super Doku:-), aber leider nicht mehr lieferbar?[6]

RCoid kann man ja mal probieren.[7]Ist jedenfalls bei der Entwicklung noch aktuell und auf dem richtigen Weg.[8]

Request for Comments

Loading comments...