Je wilt meer uit jouw Dreambox halen? Zelf een image bakken of een programma schrijven? Lees dan dit artikel.
Eerder heb ik al een artikel geschreven over het Compileren van software voor een device waar OpenWrt op draait.
Nu is de Dreambox dus aan de beurt om zelfgeschreven software te ‘draaien’. De Dreambox is een ontvanger van (gecodeerde) digitale televisie en radio. Er is keuze uit diverse tuners. Zo bestaan er tuners voor satelietontvangst (DVB-S), kabelontvangst (DVB-C) en ontvangst van antenne’s die op land zijn geplaatst (DVB-T). In Nederland is dit laatste bekend onder de merknaam Digitenne. Ook hebben veel Dreamboxen een harddisk ‘aan boord’ zodat programma’s opgenomen kunnen worden.
De basis van de Linux-distributie op de Dreambox is een speciale versie van OpenEmbedded, namelijk OpenDreambox. Zoals de naam al doet vermoeden is dit een OpenSource-project.
Aanbevolen: Lees ook het artikel How to compile software for VU Plus (Vu+) dat in het engels beschrijft hoe men een HelloWorld-applicatie voor de VU+ Solo2 kan maken.
Voorbereidingen
Laten we snel beginnen met het systeem in orde te maken zodat we ons HelloWorld-programma kunnen compileren. Installeer allereerst de benodigde packages om software te kunnen compileren op de computer. Denk onder andere aan: git en python. Meer informatie hierover is te vinden via de links onderaan dit artikel (OpenEmbedded).
- Maak nu een directory aan voor OpenDreambox:
mkdir ~/OpenDreambox
- Ga in deze directory staan:
cd ~/OpenDreambox
- Haal de Makefile op voor OpenDreambox-1.6:
wget "http://git.opendreambox.org/?p=obi/makefile-opendreambox.git;a=blob_plain;f=Makefile-opendreambox-1.6;hb=HEAD" -O Makefile-opendreambox-1.6
- Pas het target platform aan in de Makefile. Voor de Dreambox 7025 is dit:
MACHINE ?= dm7025
Configureer de Dreambox-toolchain en software development kit (SDK)
Je gaat nu een hele image bouwen dit is inclusief alle toolchain programma’s, kernel en packages. Ook worden gedurende dit proces nieuwe bestanden van het Internet gedownload. Dit proces zal lange tijd duren!
make -f Makefile-opendreambox-1.6 image
Opmerking: Na het compileren staat de NFI-file (NAND Flash Image) op de volgende lokatie: dm7025/build/tmp/deploy/images/dreambox-image-dm7025-XXXXXXXX.nfi
Deze image is op de gebruikelijke manier te installeren op de Dreambox. Dit gaat echter buiten de scope van dit artikel.
HelloWorld-package
Maak nu een directory-structuur aan voor het HelloWorld-package:
mkdir dm7025/openembedded/recipes/myhelloworld mkdir dm7025/openembedded/recipes/myhelloworld/files
HelloWorld-programma schrijven
Nu schrijven we een simpel HelloWorld-programma dat de tekst “Hello world!” naar standaard uitvoer (stdout) stuurt: dm7025/openembedded/recipes/myhelloworld/files/helloworld.c
#include <stdio.h> int main(int argc, char** argv){ printf("Hello world!\n\n"); return 0; }
Daarnaast maken we een README-file met informatie over de applicatie: dm7025/openembedded/recipes/myhelloworld/files/README.txt
Readme-file voor de HelloWorld-applicatie.
Bitbake-recept
Bitbake is een tool die op de welbekende ‘make’-tool lijkt. Bitbake is uitermate handig voor maken van packages voor embedded Linux waarbij de source met een cross compiler gebouwd moet worden.
Nu leer je hoe je een simpel Bitbake-recept moet maken voor het HelloWorld-package. Plaats het onderstaande in het bestand: dm7025/openembedded/recipes/myhelloworld/myhelloworld_0.1.bb
DESCRIPTION = "HelloWorld programma" PR = "r0" SRC_URI = "file://helloworld.c \ file://README.txt" do_compile() { ${CC} ${CFLAGS} ${LDFLAGS} ${WORKDIR}/helloworld.c -o helloworld } do_install() { install -m 0755 -d ${D}${bindir} ${D}${docdir}/myhelloworld install -m 0755 ${S}/helloworld ${D}${bindir} install -m 0644 ${WORKDIR}/README.txt ${D}${docdir}/myhelloworld }
Van boven naar beneden zien we: de beschrijving van het package, de versie (r0), de source bestanden, de commandline om helloworld te compileren met de crosscompiler en de instructies die uitgevoerd worden bij het installeren van dit package.
Compileren en packagen
- Ga naar de directory dm7025/build:
cd dm7025/build/
- Source nu de file env.source:
source env.source
Met dit commando worden een aantal environment-variabelen gezet, waaronder het path naar Bitbake, path naar de openembedded source files en het path naar de cross compiler.
- Voer nu het volgende commando uit om te beginnen met compileren en het package te maken:
bitbake -b ../openembedded/recipes/myhelloworld/myhelloworld_0.1.bb
Na enkele ogenblikken verschijnt het HelloWorld-package op de volgende lokatie:
tmp/deploy/ipk/mipsel/myhelloworld_0.1-r1a_mipsel.ipk
Opmerking: We kunnen controleren of de ‘helloworld’-binary inderdaad voor de Dreambox is gecompileerd en niet voor het systeem waarop we aan het compileren zijn.
Let op de uitvoer van het commando:file tmp/work/mipsel-oe-linux/myhelloworld-0.1-r1/myhelloworld-0.1/helloworldELF 32-bit LSB executable, MIPS, MIPS32 version 1, dynamically linked (uses shared libs)Vragen we nu deze gegevens op van het commando ‘file’ op het systeem waar we OpenDreambox aan het bouwen zijn:
file `which file`dan zien we:
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs)De processor van de Dreambox heeft immers een MIPS-architectuur, van de build-machine is de architectuur van de processor: x86
HelloWorld-package installeren en testen op de Dreambox
Laten we nu het package dan ook daadwerkelijk op de Dreambox installeren.
- Eerst zullen we met secure copy (scp) de package file op de Dreambox plaatsen:
scp tmp/deploy/ipk/mipsel/myhelloworld_0.1-r0a_mipsel.ipk root@ip-adres-van-dreambox:/tmp/
- Log nu in op de Dreambox als root en voer het volgende commando uit:
opkg install /tmp/myhelloworld_0.1-r0a_mipsel.ipk
- Voer het HelloWorld-programma uit:
helloworld
Let op de uitvoer van dit programma!
…Hello world! … dat hadden we nou niet verwacht.