Kodi auf dem Banana Pi Pro mit Infrarot Fernbedienung

  • ACHTUNG: Dieses Howto ist in einem mehrstündigen Prozess entstanden, und das Endergebnis wird von mir seitdem jeden Tag verwendet, seit 05.2018
  • Deswegen können natürlich trotzdem Tipp-Fehler enthalten sein, es ist mehr als Hinweis zu verstehen, was man tun muss
  • wenn es Config-Dateien zum Download gibt, dann werden die von mir 1:1 so verwendet. Garantie, dass es klappt, gibt es natürlich trotzdem keine
  • Ohne das BananaPi-Kochbuch hätte ich das nie hinbekommen, da stehen weitere Eigenheiten detailliert beschrieben

Folgendes Image downloaden und verwenden:

Armbian_5.38_Bananapipro_Ubuntu_xenial_default_3.4.113_desktop.7z

  • Nur der in diesem Image vorhandene Kernel hat Video-/3D-Beschleunigung
  • Vielleicht gibt es einmal einen neueren Kernel, der auch 3D-Beschleunigung unterstützt, siehe
  • Image auf die Karte schreiben: die SD-Karte mit dem Linux-PC verbinden, via dmesg schauen, als welches Gerät es erkannt wird
dmesg
[...]
[302631.665357] sd 10:0:0:1: [sdg] 30537728 512-byte logical blocks: (15.6 GB/14.6 GiB)
[302631.676330]  sdg: sdg1

Das Image entpacken und mit dd auf die Karte schreiben:

# 7z x Armbian_5.38_Bananapipro_Ubuntu_xenial_default_3.4.113_desktop.7z
# dd if=Armbian_5.38_Bananapipro_Ubuntu_xenial_default_3.4.113_desktop.img of=/dev/sdg
  • Karte in den Banana Pi (Pro) einstecken, mit Bildschirm und Tastatur verbinden, warten bis gebootet
  • erster login
  • Beachte:
bananapi pro login: root
Password: 1234

changing password, 
current password: 1234
new UNIX password: bananapi
Retype new UNIX password: bananapi
  • Nach Login einen normalen Benutzer anlegen
new user: chrissie
password: bananapi
  • Jetzt eine IP via dhcp beziehen
# dhclient eth0
  • Oder das Netzwerk hier in der Text-Datei konfigurieren
# vi /etc/network/interfaces
# /etc/init.d/networking restart
  • reboot, kucken ob X org server geht
  • Feststellung mit top: unattended-upgr braucht 100% CPU-Leistung
# top 
  • unattendet upgrade deaktivieren: Dazu die Datei /etc/apt/apt.conf.d/20auto-upgrades so aendern:
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";

alternativ 20auto-upgrades downloaden

  • kodi installieren
apt-get update
apt-get install kodi kodi-pvr-iptvsimple
  • kodi starten, es erscheint dieser Fehler
/usr/lib/arm-linux-gnueabihf/kodi/kodi-xrandr: failed to get size of gamma for output default
terminate called after throwing an instance of std::logic_error
what(): basic_string::__M_construct null not valid
Aborted
  • System von Hand hart aktualisieren, es wird eine neuerer X-Server verwendet, dieser Fehler ist dann verschwunden
# apt-get update
# apt-get upgrade
329 packets
  • in Kodi: Soundkarten output auf hdmi stellen System > Settings > Audio Output Device: sunxi-sndhdmi
  • simple PVR client enablen & configuren mit irgendeiner URL bei addons > my addons
  • System > Settings > TV > General> Enabled (x)
  • Add-On: PVR IPTV Simple Client [Enable]

Bug1: internes Wifi crashed

  • direkt beim Booten crashed das interne Wifi-Kernel-Modul, race condition?
  • dadurch umgehen, indem man das Modul blacklistet:
vi /etc/modprobe.d/blacklist.conf

[...]
blacklist ap6211
[...]

alternativ blacklist.conf downloaden

  • danach neu starten
# reboot
  • jetzt kann man das Modul von Hand laden
# modprobe ap6211
  • und es funktioniert auch
# dmesg
[...]
[  135.443706] [ap6211] Firmware up: op_mode=0x0001, Broadcom Dongle Host Driver mac=98:3b:16:e9:6c:36
[  135.461025] [ap6211] Firmware version = wl0: Mar 10 2014 14:59:50 version 5.90.195.89.18 FWID 01-b13c09c7
[  135.464100] [ap6211] Chip: a962 Rev 1 Pkg 9

# ifconfig
[...]
wlan0     Link encap:Ethernet  HWaddr 00:90:4c:11:22:33
[...]
  • um diesen Vorgang permanent zu machen, in /etc/rc.local dies hinzufügen:
[...]
# By default this script does nothing.

sleep 5; modprobe ap6211

exit 0

alternativ rc.local downloaden. Achtung - diese Version von rc.local enthält das auskommentiert, weil ich hier einen Bananapi ohne Pro verwende, der keine interne WiFi-Karte hat. Ich habe es aber mit einem getestet. Deshalb ist das hier auskommentiert, genauso wie das mit dem Gateway, das ich jetzt wohl doch nicht mehr gebraucht habe. Dafür ist das mit dem lircd drin, das wird später besprochen. Einfach Datei ansehen und denken!

  • Achtung! die beim Pro vorhandene interne Wifi-Karte ist so langsam, dass es für ein Streaming eh nicht reicht. Deshalb sollte man es beim blacklisten belassen, und ein USB-Wifi-Modul verwenden. Dies ist hier nur der Vollständigkeit halber erwähnt.

Bug2: Wifi-USB geht nicht

  • Es wird ein Wifi-USB-Stick verwendet mit dem empfohlenen Chipsatz 2580
  • folgender Fehler erscheint:
[...]
[  944.529335] usbcore: registered new interface driver rt2800usb
[ 1005.163497] phy3 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
[...]
  • alle Firmwares aus git clonen, die wichtige richtige umkopieren:
# git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
# cp rt2870.bin /lib/firmware/

alternativ rt2870.bin downloaden

  • Jetzt die Events watchen, dazu folgendes eingeben und schauen, was beim Aus-/Wiedereinstecken des USB-Sticks passiert:
# udevadm monitor --property
  • Es fehlt irgendein Skript oder irgendetwas klappt nicht. Deshalb das Skript per wget laden und umkopieren:
wget https://raw.githubusercontent.com/msekletar/udev/master/extras/firmware/firmware.sh
cp firmware.sh /lib/udev
chmod 755 /lib/udev/firmware.sh

alternativ firmware.sh downloaden

  • Jetzt stellt man fest, dass es immer noch nicht geht, mann muss eine udev-Regel editieren: /lib/udev/rules.d/50-firmware.rules
# stub for immediately telling the kernel that userspace firmware loading
# failed; necessary to avoid long timeouts with CONFIG_FW_LOADER_USER_HELPER=y
#SUBSYSTEM=="firmware", ACTION=="add", ATTR{loading}="-1"
SUBSYSTEM=="firmware", ACTION=="add", RUN+="firmware.sh --firmware=$env{FIRMWARE} --devpath=$env{DEVPATH}"

alternativ 50-firmware.rules downloaden

  • mit
# reboot

neu starten, huch, es geht jetzt:

# ifconfig
[...]

wlx7cdd901d63cb Link encap:Ethernet  HWaddr 7c:dd:90:1d:63:cb  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[...]

# dmesg:
[...]

[  173.237800] Registered led device: rt2800usb-phy1::radio
[  173.242351] Registered led device: rt2800usb-phy1::assoc
[  173.251511] Registered led device: rt2800usb-phy1::quality
[  212.394061] ADDRCONF(NETDEV_UP): wlx7cdd901d63cb: link is not ready
[  306.550771] wlx7cdd901d63cb: authenticate with 80:2a:a8:d7:d1:fe
[  306.603112] wlx7cdd901d63cb: send auth to 80:2a:a8:d7:d1:fe (try 1/3)
[  306.609799] wlx7cdd901d63cb: authenticated
[  306.647584] wlx7cdd901d63cb: associate with 80:2a:a8:d7:d1:fe (try 1/3)
[  306.667489] wlx7cdd901d63cb: RX AssocResp from 80:2a:a8:d7:d1:fe
(capab=0x431 status=0 aid=1)
[  306.716286] ADDRCONF(NETDEV_CHANGE): wlx7cdd901d63cb: link becomes ready
[  306.719199] wlx7cdd901d63cb: associated
[  317.426175] wlx7cdd901d63cb: no IPv6 routers present

Bug3: Network-Manager ist kacke

  • Jetzt die Entscheidung: Network-Manager verwenden, WLAN bequem auswählen:
# nmtui-conect
                +------------------------------------------------+              
                |                                                |              
                | +-------------------------------+              |              
                | | Wired                         | <Deactivate> |              
                | | * Wired connection 1        ? |              |              
                | |   eth0                      ? |              |              
                | |                               |              |              
                | | Wi-Fi                       ? |              |              
                | | * qayxsw              **    ? |              |              
                | |   FRITZ!Box 7312      *     ? |              |              
                | |   Telekom_FON         *     ? |              |              
                | |   Vodafone Hotspot    *     ? |              |              
                | |                             ? |              |              
                | |                               | <Quit>       |  
                | +-------------------------------+              |              
                |                                                |              
                +------------------------------------------------+
  • schauen, ob das dann geht, mit ifconfig und ping:
root@bananapipro:~# ifconfig
[...]
wlx000f55a60a77 Link encap:Ethernet  HWaddr 00:0f:55:a6:0a:77  
          inet addr:10.1.1.136  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20f:55ff:fea6:a77/64 Scope:Link
[...]
  • weitere Befehle für den Network-Manager, nur der Vollständigkeit halber:
# nmtui-connect SSID

# nmcli con show

# nmcli con mod "Wired connection 1"
  ipv4.addresses "HOST_IP_ADDRESS"
  ipv4.gateway "IP_GATEWAY"
  ipv4.dns "DNS_SERVER(S)"
  ipv4.dns-search "DOMAIN_NAME"
  ipv4.method "manual"
  • Problem: bei mir gab es mit dem installierten network-manager tearing unter kodi. Es wird irgendwie alles, vermutlich durch ständige Hintergrund-Prozesse, verlangsamt, so dass man nicht wirklich fernsehschauen kann.

  • deshalb Network-Manager entfernen,

# apt-get remove network-manager network-manager-gnome

und das Netzwerk und Wifi von Hand konfigurieren:

Datei: /etc/wpa_supplicant/wpa_supplicant.conf

network={
    ssid="qayxsw"
    psk="asdf1234"
}

Datei: /etc/network/interfaces

# Wired adapter #1
#auto eth0
allow-hotplug eth0
no-auto-down eth0
iface eth0 inet dhcp
metric 10

auto wlx000f55a60a77
allow-hotplug wlx000f55a60a77
iface wlx000f55a60a77 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
metric 20

alternativ wpa_supplicant.conf downloaden alternativ interfaces downloaden

  • nach dem Reboot spinnt das Gateway immer noch, trotz die IP per DHCP gezogen werden konnte. Ich habe keine Ahnung, deshalb hart dieser Eintrag in /etc/rc.local
#!/bin/sh -e
#
# rc.local
#

/sbin/route add default gw 10.1.1.1

Update: habe ich jetzt nicht mehr gebraucht, der Fehler ist nicht mehr aufgetreten. Erwähnung nur der Vollständigkeit halber!

Booten, Netzwerk über Wifi, starten von Kodi sollte nun gehen. Dann weiter. Sonst nochmals nachdenken und überarbeiten
  • Infrarot in Betrieb nehmen

# apt-get install lirc lirc-x xinput evtest
  • fuer xte
apt-get install xautomation
  • testen: evtest aufrufen, auf der auf NEC-Protokoll, z. B. LG Geräte verwenden das, gestellten Infrarot-Fernbedienung von Schwaiger einige Tasten drücken
  • Ich verwende die Schwaiger UFB4801
  • mein Grundig-Fernseher geht dort mit Code 6202, für Kodi habe ich dort den LG Sat Receiver 4247 programmiert, auf DVD den LG DVD Player 6922
  • auf die Tasten des DVD Players habe ich irexec Funktionen gemappet, so dass man den Mauszeiger steuern kann. So kann man auch ohne angesteckte Maus im Notfall was tun.
root@bananapipro:/home/chrissie# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:	axp20-supplyer
/dev/input/event1:	sunxi-ir
Select the device event number [0-1]
1

[...]
Testing ... (interrupt to exit)
Event: time 1526827956.852202, type 1 (EV_KEY), code 1 (KEY_ESC), value 1
Event: time 1526827956.852221, -------------- SYN_REPORT ------------

CTRL-C quits
---

Bug: es bleibt einem lirc leider nicht erspart

  • grundsätzlich würde es ja gehen, heißt das. Es werden Tasten gesendet. Leider kann man dieses EV_KEY so nicht mit Kodi verwenden. Wenn jemand dazu was einfällt, kann er mir das mitteilen
  • deshalb das disablen
# xinput disable sunxi-ir
  • Devices checken:
# cat /proc/bus/input/devices
[...]
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-ir"
P: Phys=RemoteIR/input1
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=sysrq rfkill kbd event1 
B: PROP=0
B: EV=100003
B: KEY=ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe
[...]
  • udev rules anpassen
root@bananapipro:/etc/udev/rules.d# cat 10-local.rules 
KERNEL=="event*",ATTRS{phys}=="RemoteIR/input1",SYMLINK+="input/ir"

alternativ 10-local.rules downloaden

  • udev-Regel sofort aktivieren
# udevadm trigger
  • ir muss jetzt als udev-device erscheinen:
root@bananapipro:/etc/udev/rules.d# ls /dev/input/
by-id  by-path  event0  event1  event2  event3  ir  mice  mouse0
  • Namespaces checken
irrecord -l 
  • Wenn jetzt alles plausibel ist, können die Fernbedienungs-Tasten mit irrecord aufgezeichnet werden. Dazu irrecord starten, und sinvolle Tasten der Reihe nach drücken: Welche das sind, damit ist man weitgehend frei, es empfiehlt sich aber irgendwelche in der licrd-Community verankerten Standards zu folgen.
# irrecord -H devinput -d /dev/input/ir my_config.cfg

[...]

Hold down an arbitrary button.
................................................................................
Found gap length: 39973
Now enter the names for the buttons.

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

Now hold down button "KEY_1"

[...]
  • Es wird eine vcr.cfg erstellt, hier muss man Dinge löschen:
begin remote

  name  vcr.cfg
  bits           56
  eps            30
  aeps          100

  one             0     0
  zero            0     0
  pre_data_bits   8
  pre_data       0x0
  gap          39973
  toggle_bit_mask 0x0

      begin codes
          KEY_1                    0x01000100000001 0x000000BEDCE405
          KEY_2                    0x01000200000001 0x000000BEDCE405
          KEY_3                    0x01000300000001 0x000000BEDCE405
          KEY_4                    0x01000400000001 0x000000BEDCE405
          KEY_5                    0x01000500000001 0x000000BEDCE405

-----------------------------------------------------^^ delete second hex codes in each line!
[...]
  • diese Datei umkopieren nach: /etc/lirc/lircd.conf

alternativ lircd.conf downloaden

  • evtl Datei /etc/lirc/hardware.conf
# /etc/lirc/hardware.conf
#
DRIVER="devinput"
DEVICE="/dev/input/ir"

#Chosen Remote Control
REMOTE="None"
REMOTE_MODULES=""
REMOTE_DRIVER="devinput"
REMOTE_DEVICE="/dev/input/ir"
REMOTE_SOCKET=""
REMOTE_LIRCD_CONF=""
REMOTE_LIRCD_ARGS=""

#Chosen IR Transmitter
TRANSMITTER="None"
TRANSMITTER_MODULES=""
TRANSMITTER_DRIVER=""
TRANSMITTER_DEVICE=""
TRANSMITTER_SOCKET=""
TRANSMITTER_LIRCD_CONF=""
TRANSMITTER_LIRCD_ARGS=""

[...]

alternativ hardware.conf downloaden

Bug: falsche Pfade im lirc Paket

  • weiss der Maintainer, wird in Zukunft behoben
  • nach jedem Booten muss dieses Directory angelegt werden:
# mkdir -p /var/run/lirc
  • lircd testen via irw: einfach tasten auf der Fernbedienung drücken
# lircd --nodaemon -H devinput -d /dev/input/event3 &
[1] 6066
 lircd-0.9.0[6066]: lircd(devinput) ready, using /var/run/lirc/lircd

# irw
lircd-0.9.0[6066]: accepted new client on /var/run/lirc/lircd
lircd-0.9.0[6066]: initializing '/dev/input/event3'
0001001200000001 00 KEY_OK lircd.conf
0001001200000001 00 KEY_OK lircd.conf
0001001200000001 01 KEY_OK lircd.conf
0001001200000001 02 KEY_OK lircd.conf
0001001200000001 00 KEY_OK lircd.conf
0001000100000001 00 KEY_1 lircd.conf
0001000100000001 00 KEY_1 lircd.conf
[...]
  • dauerhaftes enablen:
# systemctl enable lirc
  • folgende Einträge in /etc/rc.local, um den Pfad anzulegen und trotz systemctl lircd richtig zu starten
mkdir -p /var/run/lirc/
/usr/sbin/lircd -H devinput -d /dev/input/ir
  • jetzt irxevent und irexec testen: als normaler User als daemon starten, und irgendwas auf der Fernbedienung drcken, es muss irgenwas passieren.
irxevent -d
irexec -d
  • folgende Dateien verwenden
lircd.conf -> /etc/lircd.conf
lircrc -> /home/chrissie/.lircrc

alternativ lircrc downloaden

  • autostart dateien & kodi tv key list für lircd sowie playlist installieren:

So startet kodi automatisch, wenn der Banana Pi hochfährt.

Hinweis: in der Playlist settings.xml, die ihr hier laden könnt, sind natürlich Fantasie-Einträge

  • gen.xml kann man innerhalb von Kodi aufzeichnen. So kann man Tasten von der Fernbedienung, die über lircd kommen, auf Kodi Funktionen ummappen.
/home/chrissie/start-kodi.sh
/home/chrissie/.config/autostart/start_kodi.desktop
/home/chrissie/.kodi/userdata/keymaps/gen.xml
/home/chrissie/.kodi/userdata/addon_data/pvr.iptvsimple/settings.xml

hier start-kodi.sh downloaden

hier start_kodi.desktop downloaden

hier gen.xml downloaden

hier settings.xml downloaden

  • dies so tun: umkopieren via scp vom Linux-PC aus, geht natürlich auch anders, das kann man auch mit den anderen config-dateien tun, sie auch als root auf das Gerät kopieren
scp start-kodi.sh chrissie@10.1.1.130:
scp start_kodi.desktop chrissie@10.1.1.130:~/.config/autostart/
scp settings.xml chrissie@10.1.1.130:~/.kodi/userdata/addon_data/pvr.iptvsimple/
scp gen.xml chrissie@10.1.1.130:~/.kodi/userdata/keymaps/
  • start-kodi.sh muss executable sein:
$ chmod 755 start-kodi.sh
  • Fertig - der Lohn der Mühen