Hacking an Android TV stick, the sequel

jeremy@rk3066:~$ uname -a
Linux rk3066 3.0.36-rt58 #1 SMP PREEMPT RT Thu Jul 4 13:18:23 CEST
2013 armv7l GNU/Linux

Managed to compile and run a real-time kernel on the Android TV stick with the RK3066 SoC. Packaged the latest version of amSynth (1.4.0 which has been released recently), installed it, fired up JACK and amSynth and so far no xruns, nothing. And this is with -p64!

jackd -P84 -p32 -t2000 -dalsa -dhw:Device -n3 -p64 -r44100 -s -P

I should measure the latency of the $2 USB audio interface I’m using to find out what the total latency of this set-up is. Well, at least I got the system latency for usage with softsynths like amSynth down to 64/44100*2=3ms. Now that’s a usable situation.

jeremy@rk3066:~$ lsusb | grep -i c-media
Bus 002 Device 006: ID 0d8c:000e C-Media Electronics, Inc. Audio Adapter (Planet
UP-100, Genius G-Talk)
jeremy@rk3066:~$ cat /proc/asound/cards 0 [RK29RK1000 ]: RK29_RK1000 - RK29_RK1000 RK29_RK1000 1 [HDMI ]: ROCKCHIP_HDMI - ROCKCHIP HDMI ROCKCHIP HDMI 2 [Device ]: USB-Audio - Generic USB Audio Device Generic USB Audio Device at usb-usb20_host-1.1, full speed

A big pro of this stick is that it suffers less from SD card corruption than my RPi. Yesterday evening I wrecked up yet another SD card when testing my RPi with a real-time kernel, it’s getting a bit cumbersome. Speaking of real-time kernels, it was quite some work to apply the RT patchset to the RockChip kernel source. Had to add stuff by hand and when I finally got everything in place it wouldn’t compile. But I managed to solve all the build errors. After flashing the kernel image the TV stick wouldn’t boot of course, it hung at some point. But I quickly saw that the issue was with the SD card reader and that it was similar to the SD card reader issue on the RPi for which I found a workaround. So I added an #ifdef clause to the RockChip SD card reader driver, recompiled, reflashed and wham, it continued booting. Now I have to clean up my build directory and get a usable diff of it against the pristine RK3066 kernel sources.

Hacking an Android TV stick, the sequel

Zelf een real-time kernel bouwen voor Ubuntu 12.04

De real-time kernel uit de PPA van Alessio Bogani liep bij mij nog wel eens vast dus heb ik er zelf een gebouwd met de meest recente 3.2 kernel en bijbehorende RT patchset. En dit draait een stuk stabieler, nog geen lockups gehad.

Een eigen kernel bouwen is gelukkig nog steeds niet zo heel moeilijk, met Ubuntu kun je zelfs heel gemakkelijk pakketten maken met behulp van de make-kpkg utility. Na wat googlen kwam ik onderstaande handleiding tegen en simpeler kan het bijna niet.

Installeer de benodigde pakketten:

sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev

Download de kernel sources en de RT patchset:

mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget -c http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.28.tar.bz2
wget -c
http://www.kernel.org/pub/linux/kernel/projects/rt/3.2/patch-3.2.28-rt42.patch.bz2

Pak de kernel sources uit en patch deze met de RT patchset:

tar xjvf linux-3.2.28.tar.bz2
cd linux-3.2.28
patch -p1 < <(bunzip2 -c ../patch-3.2.28-rt42.patch.bz2)

Nu moet je de kernel nog configureren. De gemakkelijkste manier is om een bestaande kernel config te nemen, deze staan in de /boot directory van je systeem. Kopieer een config naar je werkdirectory en gebruik deze als uitgangspunt:

cp /boot/config-$(uname -r) .config

Dit commando kopieert de kernel config van de kernel die je op dat moment gebruikt. Je kunt ook de config van een andere kernel gebruiken, bijv. die van de Ubuntu lowlatency kernel aangezien deze al geoptimaliseerd is voor Linux audio toepassingen. De volgende stap is om een kernel config aan te maken met full preemption ingeschakeld aan de hand van de gekopieerde kernel config:

make oldconfig

Je kunt alle prompts wegklikken met Enter, behalve de prompt welk Preemption Model je wilt gebruiken. Selecteer daar 5 (Fully Preemtible Kernel):

Preemption Model
> 1. No Forced Preemption (Server) (PREEMPT_NONE)
  2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
  3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT__LL) (NEW)
  4. Preemptible Kernel (Basic RT) (PREEMPT_RTB) (NEW)
  5. Fully Preemptible Kernel (RT) (PREEMPT_RT_FULL) (NEW)
choice[1-5]: 5 <Enter>

Workaround voor https://bugs.launchpad.net/ubuntu/+source/kernel-package/+bug/602405:

sed -rie 's/echo "+"/#echo "+"/' scripts/setlocalversion

Nu kun je de kernel gaan bouwen:

make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg
--initrd --revision=0 kernel_image kernel_headers

Als het bouwen klaar is (kan een tijd duren) kun je de kernel pakketjes installeren:

cd ..
sudo dpkg -i linux-{headers,image}-3.2.28-rt42_0_*.deb

Rebooten, nieuwe real-time kernel selecteren in je bootloader (GRUB) en je systeem zou nu moeten booten met de net gebouwde real-time kernel.

Zelf een real-time kernel bouwen voor Ubuntu 12.04

Homestudio migratie

Migratie voorloopt voorspoedig. Bijna alles draait weer en het systeem voelt weer lekker fris en fruitig aan. Enige echte lastpost is de real-time kernel die ik heb geïnstalleerd, die wil nog wel eens vastlopen (kernel panics). Maar dat komt waarschijnlijk omdat het al een oudere versie is (zo te zien 3.2.14-rt24, recentste versie is 3.2.19-rt30). Zal dus de lowlatency kernel moeten gebruiken, nog niet uitgebreid getest maar ik denk dat dat wel goed komt. Dan kan ik ook zonder problemen de plug-ins gebruiken van het Distrho project. Die maken bijna allemaal gebuik van het Juce framework en dat framework is voor zover ik het heb begrepen niet helemaal real-time safe zoals dat heet. Oftewel, plug-ins gebaseerd op dat framework doen het niet goed met een real-time kernel en kunnen zelfs je systeem laten crashen.

Homestudio migratie

Homestudio migreren naar Precise

De Arch install die ik draaide naast good ol’  Lucid gaat toch plaats maken voor Precise. Arch is cool maar gewoon te veel werk voor mij. Ook kreeg ik de font rendering niet goed en na een update waarna yaourt niet meer werkte heb ik Arch niet meer opgestart.

Op mijn studio PC ga ik ook LXDE gebruiken. Heb een minimal install gedaan en vervolgens lubuntu-core geïnstalleerd. FFADO erop en de real-time kernel van Alessio Abogani en dat lijkt goed te draaien dus ga de boel nu verder inrichten. Hou jullie op de hoogte van de vorderingen.

Homestudio migreren naar Precise

LinuxMusicians Wiki update

Ben de System Configuration pagina van de LinuxMusician Wiki wat aan het bijwerken. Paragraaf toegevoegd over rtirq en het gebruik van het setpci commando voor het instellen van de latency van PCI devices. Verder wat spul geüpdate en wat dode links aangepast of verwijderd. En wat aandacht besteed aan de nieuwe RT patchset voor de 3.0 kernel en de threadirqs boot optie voor kernels >= 2.6.39.

LinuxMusicians Wiki update

Realtime patchset zo goed als stabiel?

Het ziet er naar uit dat de realtime patchset voor de 3.0 kernel zo’n beetje uitontwikkeld is. Gisteren is 3.0.8-rt22 gereleased en het aantal fixes is minimaal. Ook geeft de hoofdontwikkelaar aan verder te willen gaan met 3.2 zodra de 3.0 patchset echt goed stabiel is. Binnenkort zelf maar eens een 3.0 realtime kernel brouwen voor mijn Oneiric installatie. Ja, heb 11.10 geïnstalleerd op m’n notebook en ook al is Unity waarschijnlijk niet echt bruikbaar voor een Linux audio systeem was mijn eerste indruk positief (en mijn meissie was helemaal enthousiast, die wilde gelijk ook zo’n zijbalk). Op m’n nieuwe werkplek heb ik het inmiddels ook geïnstalleerd, tenminste, heb na een minimale install het lubuntu-desktop pakket erop gezet. Heb een paar keer naar AVLinux gekeken en vond dat er erg goed en werkbaar uitzien dus draai nu ook een LXDE desktop op het werk en vooralsnog bevalt het prima.

3.0.8-rt22
Realtime patchset zo goed als stabiel?

JuJu perikelen

Heb me maar eens gewaagd aan het uitproberen van de nieuwe JuJu FireWire stack die de oude ieee1394 stack op termijn gaat vervangen. Dus nieuwste libraw1394 en FFADO versies geïnstalleerd, /etc/modules, /etc/modprobe.d/blacklist-firewire.conf en /etc/default/rtirq aangepast en sudo update-initramfs -u -k all gedraaid. Na een reboot wat projectjes opgestart en helaas, heel veel xruns. Als er goeie pakketjes zijn van de nieuwe 3.0 realtime kernel probeer ik het wel weer eens. Voorlopig blijf ik met de oude FireWIre stack werken.

JuJu perikelen

Nieuwe release RT patchset

Ook al zijn forced threaded interrupt handlers inmiddels onderdeel van de mainline kernel (vanaf 2.6.39), neemt niet weg dat er nog het nodige verbeterd kan worden aan de real-time performance van recentere kernels. Thomas Gleixner en co. hebben de aankomende release van de 3.0 kernel aangegrepen om met een nieuwe release van hun real-time patchset te komen. 3.0-rc7-rt0 is inmiddels beschikbaar en de eerste reacties zijn postief.

Nieuwe release RT patchset

Frisse start

Eindelijk mijn muziek PC gemigreerd naar Ubuntu 10.04 Lucid Lynx. Van de week is mijn nieuwe geluidskaart binnengekomen (een Focusrite Saffire Pro 40) en Jof van Tango Studio schoot me aan op IRC met de vraag of ik zijn real-time 2.6.33 kernel wilde proberen. Twee goeie redenen om te switchen. Ten eerste omdat ik de Saffire Pro 40 al uitgebreid heb kunnen testen onder 10.04 met mijn eigen FFADO pakketjes en ten tweede omdat ik met de kernel van Tango Studio de beschikking heb over de nouveau drivers voor mijn Nvidia kaart. Ben nu dus niet meer afhankelijk van die closed source drivers van Nvidia die de laatste tijd nogal wat problemen schijnen te geven in combinatie met recentere real-time kernels. Ook heb ik nu geen last meer van de devtmpfs bug die toch niet opgelost gaat worden aangezien de maintainer van de Ubuntu real-time kernel er mee gaat stoppen.

Had nog wel een raar probleempje met JACK. Kreeg iedere keer als ik bijv. Yoshimi of PHASEX opstartte de volgende melding:

ports used in attemped connection are not of the same data type

Dacht eerst dat het misschien aan JACK lag maar na op de LAU mailinglist gevraagd te hebben wat deze melding nou precies betekende had ik al snel een vermoeden dat het waarschijnlijk aan a2jmidid lag. De Saffire Pro 40 doet er namelijk een stuk langer over om op te komen dan de Pro 10 van de band. En met de Pro 10 werkt mijn a2jmidid opstartscriptje wel goed maar met de Pro 40 start a2jmidid op voordat de audio poorten opkomen. Dit heeft als gevolg dat veel applicaties die met de eerst twee beschikbare audio JACK input poorten willen verbinden (normaliter dus ook audio poorten) nu aan de a2jmidid JACK MIDI poorten worden geknoopt (dat zijn immers de als eerste aangemaakte input poorten). Oftewel, de applicatie probeert audio poorten met MIDI poorten te verbinden en vandaar de melding. Mijn opstartscriptje voor a2jmidid ziet er nu als volgt uit:

#!/bin/bash

while [ "$JACK_TEST" != "system" ]
do
JACK_TEST=$(jack_lsp 2>/dev/null | grep -m1 -e "system" | cut -d ":" -f 1)
sleep 2
done

a2jmidid -e &

exit

Werkt weer prima. Kan nog beter uiteraard want QjackCtl blijft nu hangen zo lang de while loop actief is, maar daar vind ik nog wel een elegantere oplossing voor.


Frisse start