Compileren software voor Dreambox

Spread the love

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).

  1. Maak nu een directory aan voor OpenDreambox:
    mkdir ~/OpenDreambox
  2. Ga in deze directory staan:
    cd ~/OpenDreambox
  3. 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
  4. 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

  1. Ga naar de directory dm7025/build:
    cd dm7025/build/
  2. 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.

  3. 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/helloworld
ELF 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.

  1. 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/
  2. Log nu in op de Dreambox als root en voer het volgende commando uit:
    opkg install /tmp/myhelloworld_0.1-r0a_mipsel.ipk
  3. Voer het HelloWorld-programma uit:
    helloworld

Let op de uitvoer van dit programma!

…Hello world! … dat hadden we nou niet verwacht.

Zie ook

Leave a comment