Rockbox auf dem iPod Video

Rocken ohne Blobs

Die Installation des freien Betriebssystems Rockbox ist an sich kinderleicht, ein praktischer graphischer Installationsassistent erledigt das für die meisten MP3-Player auf Knopfdruck. Dies setzt aber einerseits voraus, dass das fragliche Gerät (bzw. sein Speichermedium) noch funktioniert, und ist andererseits etwas gar unabenteuerlich. Wir wollen uns darum heute anschauen, wie man Rockbox sozusagen «von Hand» auf einen iPod installiert und dabei gänzlich auf proprietäre Software verzichten kann.

Der eigentliche Beweggrund, warum ich mich näher mit dem Thema auseinandersetzen wollte, war der bevorstehende Ausfall der Festplatte in meinem iPod Video. Als Ersatz besorgte ich mir einen iFlash-CF um neu eine CompactFlash-Karte als Speichermedium verwenden zu können. Nachdem ich den Adapter eingebaut hatte, musste ich feststellen, dass der iPod mit der neuen Speicherkarte nichts anfangen konnte und ich diese zuerst mit iTunes initialisieren musste. Da ich auf meinem PC weder iTunes, noch das dazu nötige Windows installiert haben will, machte ich mich auf die Suche nach einem besseren Weg, die CF-Karte in Betrieb zu nehmen.

Hinweis: In diesem Artikel verwende ich /dev/sdX als Gerätenamen für meine Speicherkarte und /tmp/ipod als Build-Verzeichnis. Diese Werte lassen sich in den folgenden Feldern anpassen:

/dev/

Die erwähnten Werte sollten danach im restlichen Text automatisch ersetzt werden.

Grosse Sektoren

Im Anschluss an die hier beschriebenen Basteleien, bin ich auf ein interessantes Phänomen gestossen: Die Flashkarte funktioniert in einem meiner iPods tadellos, im anderen, äusserlich identischen Gerät jedoch nicht. Wie sich herausstellt, wurden verschiedene, leicht unterschiedliche iPods unter der selben Produktbezeichnung vertrieben.

Der Unterschied liegt in der Adressierung der Sektoren auf der Festplatte – diese sind entweder 512 oder 2048 Bytes gross; das Rockbox-Wiki weiss mehr dazu. Die hier beschriebene Vorgehensweise funktioniert momentan nur auf Geräten mit 512-Byte grossen Sektoren.

Um herauszufinden, welche Sektorgrösse ein Gerät verwendet, kann man den ipodpatcher von Rockbox verwenden. Mit diesem Gerät sollte es klappen:

$ ./ipodpatcher -l ipodpatcher 45a9b54f24-191202 (C) Dave Chapman 2006-2009 This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [INFO] Scanning disk devices... [INFO] Read XML info (4 bytes) [INFO] Ipod found - Photo/Color ("winpod") - /dev/sdc [INFO] Reading partition table from /dev/sdc [INFO] Sector size is 512 bytes […]

Mit diesem nicht:

$ ./ipodpatcher -l ipodpatcher 45a9b54f24-191202 (C) Dave Chapman 2006-2009 This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [INFO] Scanning disk devices... [INFO] Read XML info (9692 bytes) [INFO] Ipod found - Photo/Color ("winpod") - /dev/sdc [INFO] Reading partition table from /dev/sdc [INFO] Sector size is 2048 bytes […]

Rockbox

Rockbox, für die, die es nicht kennen, ist ein ein freies Betriebssystem für MP3-Player. Es läuft auf unzähligen verschiedenen Geräten und bietet allerlei Funktionen, die weit über das hinausgehen, was die Geräte normalerweise unterstützen. Für mich besonders relevant ist die Unterstützung für Dateien in den Formaten Ogg Vorbis und FLAC. Bei einigen Geräten, wie z.B. dem iPod, ist es mit der originalen Software zudem recht mühsam, Musik drauf zu kopieren – mit Rockbox kein Problem, da sich die Geräte nun als ganz normaler USB-Massenspeicher am PC melden.

Quellen beziehen

Wenn wir Rockbox nicht über den einfachen automatischen Installer installieren wollen, müssen wir in einem ersten Schritt den Quellcode beziehen. In den folgenden Beispielen verwende ich das Verzeichnis /tmp/ipod für die einzelnen Zwischenschritte:

$ mkdir /tmp/ipod ; cd /tmp/ipod $ git clone git://git.rockbox.org/rockbox $ cd rockbox

Jetzt sind wir soweit, dass wir mit dem Kompilieren anfangen können.

Cross-Compiler

Als erstes brauchen wir einen Cross-Compiler, der Rockbox für die ARM-Architektur des iPod kompilieren kann; Rockbox bringt praktischerweise alles dazu notwendige mit. Wir fangen damit an, zu definieren, wo unsere Daten hingeschrieben werden:

$ export RBDEV_DOWNLOAD=/tmp/ipod/archives $ export RBDEV_PREFIX=/tmp/ipod/target $ export RBDEV_BUILD=/tmp/ipod/build

Danach starten wir das Skript, welches den Cross-Compiler kompiliert:

$ cd tools/ $ ./rockboxdev.sh Download directory : /tmp/ipod/archives (set RBDEV_DOWNLOAD or use --download= to change) Install prefix : /tmp/ipod/target (set RBDEV_PREFIX or use --prefix= to change) Build dir : /tmp/ipod/build (set RBDEV_BUILD or use --builddir= to change) Make options : (set MAKEFLAGS or use --makeflags= to change) Restart step : (set RBDEV_RESTART or use --restart= to change) Target arch : (set RBDEV_TARGET or use --target to change) Select target arch: s - sh (Archos models) m - m68k (iriver h1x0/h3x0, iaudio m3/m5/x5 and mpio hd200) a - arm (ipods, iriver H10, Sansa, D2, Gigabeat, etc) i - mips (Jz47xx and ATJ-based players) r - arm-app (Samsung ypr0) x - arm-linux (Generic Linux ARM: Samsung ypr0, Linux-based Sony NWZ) y - mips-linux (Generic Linux MIPS: AGPTek Rocker) separate multiple targets with spaces (Example: "s m a" will build sh, m68k and arm)

Nun wählen wir a («arm») als Architektur und lassen alles durchkompilieren; auf meinem klapprigen alten Core 2 Duo dauert das etwa eine Viertelstunde.

Wenn alles geklappt hat, können wir den Cross-Compiler in unseren Pfad aufnehmen, damit ihn das restliche Build-System bei Bedarf findet:

$ export PATH=$PATH:/tmp/ipod/target/bin/

Somit haben wir alles, um Rockbox selbst zu kompilieren.

Rockbox selbst

Wir fangen damit an, uns ein Verzeichnis für die generierten Daten zu erstellen:

$ cd /tmp/ipod/rockbox $ mkdir build ; cd build

Danach können wir aus einer langen Liste von Geräten unseren iPod auswählen. Glücklicherweise ist sie ziemlich selbsterklärend:

$ ../tools/configure Using temporary directory /tmp Enter target platform: ==Archos== ==iriver== ==Apple iPod== 0) Player/Studio 10) H120/H140 20) Color/Photo 1) Recorder 11) H320/H340 21) Nano 1G 2) FM Recorder 12) iHP-100/110/115 22) Video 3) Recorder v2 13) iFP-790 23) 3G […]

Wir wählen Option 22.

Platform set to ipodvideo Build (N)ormal, (A)dvanced, (S)imulator, (B)ootloader, (C)heckWPS, (D)atabase tool, (W)arble codec tool: (Defaults to N)

Dann wählen wir N für ein «normales» Build.

Normal build selected Using source code root directory: /tmp/ipod/rockbox Using arm-elf-eabi-gcc 4.4.4 (404) Using arm-elf-eabi-ld 2.20.1.20100303 Detected make GNU Make 4.2.1 Automatically selected arch: arm (ver 4) Created Makefile

Nun ist alles bereit und wir können mit dem eigentlichen Kompilieren loslegen:

$ make

Das dauert wieder eine Weile, bei mir gut 12 Minuten, wobei ich zur Zeit einen Patch für GCC benötige, sonst kommt es zu Fehlern beim Kompilieren. Danach lassen wir uns ein Archiv mit den benötigten Rockbox-Dateien erstellen:

$ make tar

Das sollte nach ein paar Sekunden fertig sein. An sich haben wir jetzt alles, was der iPod braucht und bei einem anderen MP3-Player wären wir fertig. Leider macht uns Apple das Leben unnötig schwer und verlangt, dass die Daten in einem speziellen Format auf der CF-Karte landen. Die Rockbox-Leute haben aber ein Programm geschrieben, welches das für uns erledigt und aus den generierten Daten ein iPod-kompatibles Image erstellt:

$ ../tools/scramble -ipod5g rockbox.bin sdX1.img

Das war dann auch schon alles, unsere Images sind jetzt bereit.

Die CompactFlash-Karte

Software zu kompilieren ist ja für sich schon ein spannendes Erlebnis, in diesem Fall würden wir das Resultat aber gerne auch produktiv einsetzen. Ich verwende dazu eine CompactFlash-Karte, mit entsprechenden Adaptern von iFlash kann man aber auch SD-Karten oder sogar eine mSATA-SSD einbauen.

Partitionen

Wenn man die Speicherkarte von iTunes initialisieren lässt, werden zwei Partitionen erstellt: eine erste, auf der das Betriebssystem und allerlei anderer Kram von Apple unterkommt, und eine zweite für die Musik. iTunes verwendet dabei 80 MB für die erste Partition – das können wir besser.

Das Image das wir oben erstellt haben ist nämlich alles, was auf die erste Partition muss, die Grösse der Partition hängt also lediglich von der Grösse des Images ab. Wir lesen diese folgendermassen aus:

$ stat -c %s sdX1.img 825740

Mein Image ist also 825740 Bytes gross. Bei einer Blockgrösse von 512 Bytes heisst das, wir brauchen insgesamt 825740 / 512 = 1613 Blöcke auf der Speicherkarte. Es wäre wohl schlau, die Partition ein wenig grösser zu machen, damit wir in Zukunft problemlos neuere Rockbox-Versionen installieren können, auch wenn diese ein paar Bytes grösser sein sollten. Für das Beispiel werde ich aber mit der kleinstmöglichen Partition arbeiten.

Am Anfang der Speicherkarte brauchen wir noch etwas Platz für den MBR und so, der iPod erwartet die erste Partition bei Sektor 63. Um die Partitionen zu erstellen, verwende ich sfdisk, weil sich das so schön mit Skripten steuern lässt. Das Skript für unsere Karte sieht in etwa so aus:

label: dos unit: sectors start=63, size=1613, type=0 start=1676, type=b

Falls die erste Partition grösser sein soll, muss der Anfang der zweiten Partition entsprechend nach hinten verschoben werden.

Wir speichern das Skript als /tmp/sdX.script und führen es mit sfdisk aus (dieser Befehl muss als root ausgeführt werden):

# sfdisk /dev/sdX < /tmp/sdX.script Checking that no-one is using this disk right now ... OK […] The partition table has been altered. Syncing disks.

Wenn alles geklappt hat, haben wir nun die gewünschten zwei Partitionen auf der Karte. Wir können uns die neue Partitionstabelle anzeigen lassen:

$ sfdisk -l /dev/sdX […] Device Boot Start End Sectors Size Id Type /dev/sdX1 63 1675 1613 806.5K 0 Empty /dev/sdX2 1676 7847279 7845604 3.8G b W95 FAT32

Damit wären wir dann bereit, die Karte zu füllen.

Daten drauf

Für die erste Partition haben wir oben ein Image erstellt. Dieses können wir nun (auch wieder als root) mit dd auf die Karte schreiben:

# dd if=sdX1.img of=/dev/sdX1

Auf der zweiten Partition erstellen wir ein FAT32-Dateisystem und entpacken die Tar-Datei darauf. Das geht dann (nochmals als root) so:

# mkfs.vfat -F 32 /dev/sdX2 # mount /dev/sdX2 /mnt/ipod # tar -C /mnt/ipod/ -xf rockbox.tar # umount /mnt/ipod

Tadaa. Soll heissen, das war auch schon alles; die Speicherkarte ist jetzt bereit für den Einsatz im iPod.

Wer nicht nur Sokoban spielen möchte, für den ist jetzt der Zeitpunkt gekommen, noch ein wenig Musik auf den iPod zu laden. Die Bilder lassen erahnen, dass eines meiner nächsten Projekte der Einbau eines neuen Displays sein dürfte.