Olimex SAM9-L9260 Kjell Enblom

Embedded Linux på Olimex SAM9-L9260

Kjell Enblom

22 Mars 2011

Copyright \begin{matrix}c \\ ◯ \end{matrix} 2011 Kjell Enblom. This document is covered by the GNU Free Documentation License, Version 1.1 or later.

Olimex SAM9-L9260

Kjell Enblom

Presentationen

Denna presentation, dokumentation och exempelkod finns på http://www.lysator.liu.se/˜ kjell-e/embedded/olimex/SAM9-L9260/

Presentationen finns även på: http://www.lysator.liu.se/˜ kjell-e/tekla/linux/dokument.html

Olimex SAM9-L9260

Kjell Enblom

Introduktion till inbyggda system

• SAM9-L9260 är ett utvecklingskort för inbyggda system.

• Inbyggda system är datorer som sitter inbyggda i apparater; tvättmaskiner, mikrovågsugnar, bilar, digitalboxar för TV, mobiltelefoner, handdatorer, varuautomater etc.

• Inbyggda system har oftast begränsade resurser som t.ex. relativt liten mängd minne, ingen hårddisk, litet flashminne, långsammare CPU än i moderna arbetsstationer och servrar etc.

• Inbyggda system kan t.ex. ha en mängd med I/O-portar, exempelvis för serieportar, I^{2}C-bussar, I^{2}S-bussar, CAN-bussar etc.

• Inbyggda system kan sakna minnesskydd.

• Många riktigt små inbyggda system saknar operativsystem.

Olimex SAM9-L9260 Kjell Enblom

Olimex SAM9-L9260

Olimex SAM9-L9260

Kjell Enblom

Introduktion till Olimex SAM9-L9260

• Avsikten med denna introduktion är att lära sig så pass mycket om Olimexkortet att man snabbt kan komma igång och börja labba med detta kort.

• Innehåll:

• Introduktion till kortet

• Grunderna i bootloadern U-Boot

• Korskompilera busybox

• Bygga klart root-filsystemet

• Korskompilera Linuxkärnan

• Boota med NFS-rootfilsystem

• Programutveckling

Olimex SAM9-L9260 Kjell Enblom

Introduktion till Olimex SAM9-L9260

Data i korthet:

• ARM9 (Atmel AT91SAM9260 mikrokontroller med ARM926EJ-S CPU)

• 64 MB SDRAM

• 512 MB NAND-flash

• JTAG-anslutning

• Plats för SD/MMC-kort.

• Ethernetanslutning

• Serieport (9-pol DSUB)

• USB host och USB device

• Tryckknapp

• Styrbara lysdioder

• U-Boot boot-loader

• JFFS2-rootfilsystem med Debian på en del av flashminnet

Olimex SAM9-L9260 Kjell Enblom

Introduktion till Olimex SAM9-L9260

Olimex SAM9-L9260 Kjell Enblom

Introduktion till Olimex SAM9-L9260

Olimex SAM9-L9260 Kjell Enblom

Spänningsmatning och serieportskonsol

• Olimex SAM9-L9260 ska matas med 5v DC.

• Serieporten är inställd på 115200 bps 8 databitar ingen paritet.

• För att ansluta serieporten till en annan dator behövs en nollmodemkabel som korsar bland annat stiften 2 och 3.

• Nollmodemkabel (9-pol hona-hona) finns att köpa på välsorterade elektronikbutiker som t.ex. Clasohlsson.

• USB till serieport finns även det att köpa på välsorterade elektronikbutiker.

Olimex SAM9-L9260 Kjell Enblom

Blockschema för AT91SAM9260

Olimex SAM9-L9260 Kjell Enblom

Minneslayout

Olimex SAM9-L9260 Kjell Enblom

Grunderna i U-Boot

• Bootloadern på Olimexkortet är Das U-Boot (U-Boot).

• Olimexkortet använder serieportskonsol på vilken den kommunicerar i 115200 bps, 8 databitar, ingen paritet.

• Anslut serieporten och starta t.ex. kermit eller picocom.

• Exempel:

picocom -b 115200 /dev/ttyUSB0

• Anslut ström till kortet.

• Innan U-Boot har hunnit börja boota tryck på någon tangent. U-Boot har en timeout på 3 sekunder som standard på detta kort.

• Alla inställningar inklusive timeout lagras i variabler i U-Boot.

Olimex SAM9-L9260 Kjell Enblom

Grunderna i U-Boot

• Skriv help eller ? för att lista alla kommandon.

• Det går även att skriva help kommando för att få mer hjälp om ett specifikt kommando.

• printenv visar alla variabler och deras värden.

U−Boot> p r i n t e n v
e t h a d d r=3a : 1 f : 3 4 : 0 8 : 5 4 : 5 0
b o o t d e l a y=3
b a u d r a t e =115200
b o o t a r g s=mem=64M c o n s o l e=ttyS0 ,115200 r o o t=/dev / mtdblock1 rw r o o t f s t y p e=j f f s 2
bootcmd=cp . b 0xD0040000 0 x22200000 0x001BC124 ; bootm 0 x22200000
s t d i n=s e r i a l
s t d o u t=s e r i a l
s t d e r r=s e r i a l
e t h a c t=macb0
Environment s i z e : 250/16892 b y t e s

Olimex SAM9-L9260 Kjell Enblom

Grunderna i U-Boot

• Olimexkortet kan ladda filer från USB-minne, från en tftp-server, från flash etc.

• USB anges på följande sätt:

• usb 0 anger första USB-enheten med fat-filsystem (vfat).

• fatls <interface> <dev[:part]> [directory] - listar filer.

• fatload <interface> <dev[:part]> <addr> <filename> [bytes] - laddar en fil.

• addr är en minnessadress.

• Exempel:

fatls usb 0

• Exempel:

fatload usb 0 0x22600000 romfs.img

Olimex SAM9-L9260 Kjell Enblom

Grunderna i U-Boot

• För att kunna accessa USB-minnen måste man först aktivera USB-stödet.

• USB startas med usb start

• USB-stödet stoppas igen med usb stop

• USB-partitioner visas med usb part

• help usb ger mer hjälp om vad man kan göra med USB i U-Boot.

• Exempel på att ladda en fil:

fatload usb 0 0x22200000 vmlinux.uImage

Olimex SAM9-L9260

Kjell Enblom

Grunderna i U-Boot

• tftpboot [loadAddress] [[hostIPaddr:]bootfilename] - laddar en fil från en tftp-server och lägger den på angiven minnesadress.

• Exempel:

tftpboot 0x22200000 192.168.0.1:/linux-install/olimex/vmlinux.bin

• Exempel 2 (variabeln serverip är satt i detta exempel): tftpboot 0x22200000 /linux-install/olimex/vmlinux.bin

• bootm addr [arg ...] - bootar med det som finns på minnesadress addr.

• Exempel:

bootm 0x22200000 Exempel med argument: bootm 0x22200000 0x22600000

Kjell Enblom

Grunderna i U-Boot

• run var [...] - Kör kommandona i variabeln var.

• Exempel:

• Anta att variabeln tftp boot innehåller följande: tftpboot 0x22600000 192.168.0.1:/linux-install/olimex/romfs.img; tftpboot 0x22200000 192.168.0.1:/linux-install/olimex/vmlinux.bin; bootm 0x22200000 0x22600000

• run tftp boot

• Det går att betrakta variabeln som ett shellscript som man kör.

Olimex SAM9-L9260

Kjell Enblom

Grunderna i U-Boot

• Ändra innehåll på en variabel görs med:

setenv variabel värde

• Exempel:

setenv bootargs ’mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2’

• Det går att spara alla variablers innehåll till flash med saveenv

• ping host skickar pingpaket till angiven host. Exempel: ping 192.168.0.1

Olimex SAM9-L9260

Kjell Enblom

Grunderna i U-Boot

• Standardalternativet för U-Boot är att köra innehållet i variabeln bootcmd, d.v.s. utföra run bootcmd

• För Olimex-kortet innebär det att den kopierar kärnan från flash från adress 0xD0040000 till RAM till adress 0x22200000, 0x001BC124 bytes.

• Därefter bootar den från adress 0x22200000.

• Med U-boot går det att flash om den flash som finns på kortet.

Olimex SAM9-L9260

Kjell Enblom

U-Boot - U-Boot-filer

• För att kunna använda filer i U-Boot måste dessa filer ha en U-Boot header.

• För att skapa filer i U-Boots format med en header använder man programmet mkimage som följer med U-Boot.

• Exempel för ett komprimerat rootfilsystem:

mkimage -n ’Simple Ramdisk Image’ -A arm -O linux -T ramdisk -C gzip -d ramdisk.image.gz initramfs

• För linuxkärnan är det enklast att se till att mkimage finns med i PATH och sedan kompilera kärnan med make ARCH=arm uImage

• Därefter kan filerna laddas enligt beskrivningarna nedan.

Kjell Enblom

U-Boot - boota från USB

• Om man har ett USB-minne med två filer, en fil innehållandes en kärna och en fil med ett rootfilsystem i, då kan man boota på följande sätt.

• Starta först USB-stödet, ladda in root-filsystemet, ladda kärnan och slutligen kör igång kärnan med adressen till rootfilsystemet som argument.

• usb start

• fatload usb 0 0x22200000 vmlinux.bin

• fatload usb 0 0x22600000 romfs.img

• bootm 0x22200000 0x22600000

• Notera att USB-minnet måste innehålla ett VFAT-filsystem.

• Det går även att göra usbboot. Se manualen till U-Boot för mer detaljer.

Olimex SAM9-L9260

Kjell Enblom

U-Boot - boota via tftp

• För att ladda filerna från en tftp-server och boota från dessa filer behövs en fungerande tftp-server med de aktuella filerna och en fungerande ethernetförbindelse.

• Nedan visas inställningarna för en tftp-server som startas från xinetd.

s e r v i c e t f t p

{

s o c k e t t y p e  = dgram
p r o t o c o l  = udp
w a i t  = y e s
u s e r  = r o o t
s e r v e r  = / u s r / s b i n / i n . t f t p d
s e r v e r a r g s  = −s / t f t p b o o t
d i s a b l e  = no
p e r s o u r c e  = 11
cps  = 100 2
f l a g s  = IPv4

}

• tftp-servern ovan chrootas till katalogen /tftpboot

Kjell Enblom

U-Boot - boota via tftp

• Filerna i följande exempel är placerade i katalogen /tftpboot/linux-install/olimex/ på host-datorn.

• Tftp-servern har här IP-adress 192.168.0.1.

• Olimexkortet är target.

• Här laddas först filen med root-filsystemet, därefter laddas kärnan och slutligen startas kärnan med adressen till root-filsystemet som argument.

• dhcp

• tftpboot 0x22200000 192.168.0.1:/linux-install/olimex/vmlinux.bin

• tftpboot 0x22600000 192.168.0.1:/linux-install/olimex/romfs.img

• bootm 0x22200000 0x22600000

Olimex SAM9-L9260

Kjell Enblom

busybox

• busybox är den schweiziska armekniven för inbyggda system.

• busybox består av en programbinär som implementerar många funktioner: sh, ls, rm, mv, ps etc.

Olimex SAM9-L9260

Kjell Enblom

busybox

• Med busybox har man en programbinär /bin/busybox som implementerar fler funktioner.

• För varje funktion sätts sedan upp hårda eller mjuka länkar som pekar på busybox.

• Vilka funktioner som busybox ska innehålla bestäms vid kompilering.

Olimex SAM9-L9260

Kjell Enblom

Kompilera busybox

• Se till att du har ett toolchain installerat och att den finns med i din PATH.

• Ladda hem källkoden till busybox från http://www.busybox.net/.

• Packa upp källkoden och gå ner i katalogen där den hamnade. Ex: tar xvfj busybox-1.18.3.tar.bz2; cd busybox-1.18.3

• Starta busybox konfiguration med make ARCH=arm menuconfig

Olimex SAM9-L9260 Kjell Enblom

Kompilera busybox

Olimex SAM9-L9260

Kjell Enblom

Kompilera busybox

• Notera att man bör sätta toolchain prefix under ’Busybox Settings’→’Build Options’→’Cross Compiler prefix’

• För t.ex. arm-none-linux-gnueabi-gcc blir prefix arm-none-linux-gnueabi-

• Om man inte har tänkt att lägga in libfiler på sitt målsystem eller vill att busybox ska vara oberoende av libfiler måste busybox länkas statiskt vid kompilering.

• För att länka busybox statiskt gå in på ’Busybox Settings’→’Build Options’ och välj ’Build BusyBox as a static binary’.

• Konfigurera färdigt busybox och avsluta och spara.

• Kompilera med make ARCH=arm

• Installera slutligen med make ARCH=arm install

Olimex SAM9-L9260

Kjell Enblom

Kompilera busybox

• Nu finns ett rootfilträd i katalogen install.

• Var rootfilträdet ska installeras går att ställa in när man konfigurerar busybox. ’Busybox Settings’→’Installation Options’→’BusyBox installation prefix’

• Ett alternativ kan vara att sätta den till /export/embedded/dinuser/root/

Olimex SAM9-L9260

Kjell Enblom

Kompilera busybox

• Ett alternativ till att ge ARCH=arm på kommandoraden och sätta toolchain prefix i konfigurationen är att använda kommandoskalsvariablerna ARCH och CROSS COMPILE

• Exempel:

export ARCH=arm export CROSS COMPILE=arm-none-linux-gnueabi-

• Därefter kan man konfigurera, kompilera och installera med: make menuconfig make make install

Olimex SAM9-L9260

Kjell Enblom

bygga klart rootfilsystemet

• Det som saknas i rootfilsystemet för att det ska vara komplett är devicefiler och eventuella libfiler.

• Devicefiler skapas med mknod (som root). Exempel: mknod rootfilesystem/dev/console c 5 1

• Här skapas console som är en character device med major numer 5 och minor numer 1.

• Det är major number som knyter ihop device-filen och drivrutinen som hanterar den.

Olimex SAM9-L9260

Kjell Enblom

bygga klart rootfilsystemet

• De devicefiler som behövs är åtminstone följande: console, null, ttyS0

• Nedan skapas dessa och några till. Här står vi i det nya root-filsystemet när följande kommandon körs.

mknod dev / c o n s o l e c 5 1
mknod dev / n u l l c 1 3
mknod dev / t t y c 5 0
mknod dev / t t y 0 c 4 0
mknod dev / t t y 1 c 4 1
mknod dev / t t y S 0 c 4 64
mknod dev /random c 1 8
mknod dev /urandom c 1 9
mknod dev /mtd1 c 90 2
mknod dev / mtdblock1 b 31 1

Olimex SAM9-L9260

Kjell Enblom

bygga klart rootfilsystemet

• För att hitta libfilerna till ett toolchain så att dessa kan installeras i katalogen lib i rootfilsystemet kan man köra kompilatorn och ge följande flagga och argument till den - -print-file-name libc.so.6

• Exempel:

arm-none-linux-gnueabi-gcc - -print-file-name libc.so.6 • Sök efter libfilerna och kopiera sedan dessa. Exempel:

[ d i n u s e r e @ v o l a c ] $ arm−none−l i n u x −gnueabi−gcc −p r i n t −f i l e −name l i b c . so . 6
/home/ d i n u s e r / b i n / c o d e s o u r c e r y−armgcc −2009q1/ b i n / . .
/arm−none−l i n u x −g n u e a b i / l i b c / l i b / l i b c . so . 6
[ d i n u s e r e @ v o l a c ] $ cp −a /home/ d i n u s e r / b i n / c o d e s o u r c e r y−armgcc −2009q1/ b i n / . . /
arm−none−l i n u x −g n u e a b i / l i b c / l i b / e x p o r t /embedded/ d i n u s e r / r o o t /

Olimex SAM9-L9260 Kjell Enblom

bygga klart rootfilsystemet

• När systemet bootar startas init som den första processen om man inte anger någonting annat till kärnan.

• Till den busybox init som vi använder här behövs en enkel /etc/inittab som talar om för init vad den ska göra vid boot.

: : s y s i n i t : / e t c / i n i t . d/ rcS
t t y S 0 : : respawn : / s b i n / g e t t y 115200 t t y S 0
: : r e s t a r t : / s b i n / i n i t
: : shutdown : / b i n /umount −a −r

• Vid boot kör init först /etc/init.d/rcS

• Därefter startar den /sbin/getty på ttyS0 som ger en loginprompt på serieporten.

• Vid restart ska init starta om sig.

• Vid shutdown ska alla filsystem avmonteras.

Olimex SAM9-L9260 Kjell Enblom

bygga klart rootfilsystemet

• /etc/inittab anropar här /etc/init.d/rcS där den i sin tur

monterar filsystem och startar loggning, tjänster etc.

#! / b i n / sh
echo ” mounting / proc ”
mount −t proc proc / proc
echo ” mounting /tmp”
mount −t tmpfs tmpfs /tmp
echo ” mounting / s y s ”
mount −t s y s f s s y s f s / s y s
echo ” S t a r t i n g system l o g g e r ”

k l o g d s y s l o g d

# l o a d module l e d 1
modprobe l e d 1
# S t a r t s s h daemon d r o p b e a r
/ u s r / l o c a l / s b i n / d r o p b e a r
hostname my−t i n y−arm−system

Olimex SAM9-L9260

Kjell Enblom

bygga klart rootfilsystemet

• I exemplet på föregående bild förutsattes att katalogerna /proc /sys och /tmp existerar.

• Om man inte har skapat dessa måste det göras.

• Gör följande på host-systemet/utvecklingsdatorn för att skapa dem mkdir /export/embedded/dinuser/root/{proc,sys,tmp}

• Det kan även vara trevligt att ha katalogen /var/log för loggfiler mkdir -p /export/embedded/dinuser/root/var/log

Olimex SAM9-L9260

Kjell Enblom

bygga klart rootfilsystemet

• Om man har ett rootfilsystem som är komplett förutom att det saknar devicefiler då går det att skapa en image-fil med root-filsystem inklusive devicefiler, som icke root, med genext2fs.

• genext2fs finns på http://genext2fs.sourceforge.net/

# F i l e d e v i c e t a b l e . t x t
# name t y p e mode u s e r  group  major  minor  s t a r t  i n c  count
/ dev  d  755  0  0  −  −  −  −  −
/ dev /mem c  640  0  0  1  1  0  0  −
/ dev / t t y c  666  0  0  5  0  0  0  −
/ dev / t t y c  666  0  0  4  0  0  1  5
/ dev / c o n s o l e c 666  0  0  5  1  0  0  −
/ dev / n u l l c  666  0  0  1  3  0  0  −
/ dev /random c 666  0  0  1  8  0  0  −
/ dev /urandom c 666  0  0  1  9  0  0  −
/ dev / t t y S c  666  0  0  4  64  0  1  2
/ dev /mtd c  666  0  0  90  0  0  2  2
/ dev / mtdblock b 666  0  0  31  0  0  1  2
# Ovan s k a p a s bland annat k a t a l o g e n / dev
# en c h a r a c t e r d e v i c e / dev /mem med major number 1 och minor number 1
# en t t y med major 5 , minor 0 ,
# 5 t t y e r t t y 0 − t t y 4 med major 4 med
# minor number f r å n 0 − 4 ,
# t v å mtd , mtd0 och mtd1 med major 90 och minor 0 r e s p e k t i v e 2 ,
# t v å b l o c k d e v i c e s mtdblock , mtdblock0 , mtdblock1 med major number 31
# och minor number 0 r e s p e k t i v e 1 .

Olimex SAM9-L9260

Kjell Enblom

bygga klart rootfilsystemet

• En image-fil skapas med genext2fs -b 4096 -d rootfilesystem -D devicetable.txt -e 0 initramfs.img

• Här skapas en fil på 4096 blocks (4MB) där innehållet i filträdet rootfilesystem kopieras in i image-filen.

• Devices skapas enligt vad som är definierat i devicetable.txt.

• Resultatet skrivs till initramfs.img

• Om innehållet i rootfilesystem tillsammans med devices inte fyller upp 4MB kommer resten av image-filen att bestå av nollor.

• För att kunna använda denna fil till U-Boot måste en U-Boot header läggas till med mkimage. Exempel: mkimage -n ’Ramdisk Image’ -A arm -O linux -T ramdisk -C none -d initramfs.img initramfs.uImage

Olimex SAM9-L9260

Kjell Enblom

korskompilera linuxkärnan

• För att kunna korskompilera kärnan behöver man sätta variablerna ARCH och CROSS COMPILE.

• Detta kan göras i Makefilen högst upp i källkodsträdet till kärnan.

• Alternativt kan man sätta dem i kommandoskalet på samma sätt som för busybox.

• För att konfigurera och kompilera kärnan blir det då: make menuconfig make uImage

Olimex SAM9-L9260

Kjell Enblom

korskompilera linuxkärnan

• Det går även att sätta variablerna på kommandoraden till make. Exempel: make ARCH=arm CROSS COMPILE=arm-none-linux-gnueabi-menuconfig

• Respektive make ARCH=arm CROSS COMPILE=arm-none-linux-gnueabi- uImage

• Kopiera kärnan som finns i arch/arm/boot/uImage och lägg kopian i tftp-katalogen så att den finns tillgänglig via tftp.

Olimex SAM9-L9260

Kjell Enblom

korskompilera linuxkärnan

• Kärnmoduler kompileras med: make modules

• För att installera kärnmodulerna måste variabeln INSTALL MOD PATH sättas till var modulerna ska installeras.

• Denna kan sättas på kommandoraden eller i Makefile högst upp i källkodsträdet till kärnan.

• Lämpligt är att peka på root-katalogen som skapades vid kompilering och installation av busybox.

Olimex SAM9-L9260

Kjell Enblom

korskompilera linuxkärnan

• Sätta variabeln i kommandoskalet görs med export IN-STALL MOD PATH=/export/embedded/dinuser/root/

• Sätt variabeln i Makefilen görs genom att lägga till raden INSTALL MOD PATH = /export/embedded/dinuser/root/ .

• Notera att det måste göras före det att variabeln MODLIB sätts i makefilen då denna använder INSTALL MOD PATH.

# INSTALL MOD PATH s p e c i f i e s a p r e f i x to MODLIB f o r module d i r e c t o r y
# r e l o c a t i o n s r e q u i r e d by b u i l d r o o t s . This i s not d e f i n e d i n the
# m a k e f i l e but the argument can be p a s s e d to make i f needed .

#

INSTALL MOD PATH = / e x p o r t /embedded/ d i n u s e r / r o o t /
MODLIB = $ (INSTALL MOD PATH)/ l i b / modules /$ (KERNELRELEASE)
e x p o r t MODLIB

Olimex SAM9-L9260 Kjell Enblom

Boota med NFS-rootfilsystem

• NFS står för Network File System.

• Med NFS kan ett filträd ligga på en dator och monteras in i filträdet på en annan dator över nätet.

Olimex SAM9-L9260

Kjell Enblom

Boota med NFS-rootfilsystem

• Att montera rootfilsystemet över NFS är väldigt praktiskt vid programutveckling.

• Kortet behöver inte flashas om eller bootas om för att installera programvara.

• Program och även kärnmoduler installeras i filträdet på NFS-servern och finns omedelbart tillgängliga på target-systemet.

Olimex SAM9-L9260

Kjell Enblom

Boota med NFS-rootfilsystem

• För att kunna boota med rootfilsystemet monterat från en NFS-server behöver man göra några inställningar i Linuxkärnan.

• Starta konfigurationen av kärnan och gå till ’Networking’→’Networking options’ och aktivera ’TCP/IP-stöd’, ’kernel level autoconfiguration’.

Olimex SAM9-L9260

Kjell Enblom

Boota med NFS-rootfilsystem

• Gå till ’File systems’→’Network File Systems’ och aktivera ’NFS file system support’, ’Provide NFSv3 client support’, ’Root file system on NFS’.

Olimex SAM9-L9260

Kjell Enblom

Boota med NFS-rootfilsystem

• Kompilera kärnan och lägg den färdiga kärnan i tftp-katalogen så att target-systemet kan ladda in kärnan via tftp.

• För att kunna boota med NFS-rootfilsystem behöver man skicka med NFS-server etc som argument till kärnan.

• Ex:

setenv bootargs ’mem=64M root=/dev/nfs rw console=ttyS0,115200N8 nfsroot=192.168.0.1:/export/embedded/dinuser/root/,proto=tcp ip=192.168.0.62:192.168.0.1:192.168.0.1:255.255.255.0:olimex:eth0:off’ Olimex SAM9-L9260

Kjell Enblom

Boota med NFS-rootfilsystem

• Nedan visas en nedklippt skärmdump på en boot med nfs-rootfilsystem.

• Här får kortet först en dynamisk IP-adress och därefter laddas kärnan från en tftp-server.

U−Boot> dhcp
macb0 : l i n k up , 10Mbps h a l f −d u p l e x ( l p a : 0 x0020 )
BOOTP b r o a d c a s t 1
DHCP c l i e n t bound to a d d r e s s 1 9 2 . 1 6 8 . 0 . 6 2
Using macb0 d e v i c e
TFTP from s e r v e r 1 9 2 . 1 6 8 . 0 . 1 0 ; our IP a d d r e s s i s 1 9 2 . 1 6 8 . 0 . 6 2
Filename ’ p x e l i n u x . 0 ’ .
Load a d d r e s s : 0 x22200000
Loading : #

done

Bytes t r a n s f e r r e d = 13936 (3670 hex )
U−Boot> t f t p b o o t 0 x22200000 1 9 2 . 1 6 8 . 0 . 1 : uImage−SAM9L9260−NFS−withoutLED
macb0 : l i n k up , 10Mbps h a l f −d u p l e x ( l p a : 0 x0020 )
Using macb0 d e v i c e
TFTP from s e r v e r 1 9 2 . 1 6 8 . 0 . 1 ; our IP a d d r e s s i s 1 9 2 . 1 6 8 . 0 . 6 2
Filename ’ uImage−SAM9L9260−NFS−withoutLED ’ .
Load a d d r e s s : 0 x22200000
Loading : #################################################################

done

Bytes t r a n s f e r r e d = 2853924 (2 b8c24 hex )

Olimex SAM9-L9260 Kjell Enblom

Boota med NFS-rootfilsystem

• Fortsättning...

• Här sätts kärnparametrar och därefter startas kärnan.

U−Boot> s e t e n v ’ b o o t a r g s mem=64M r o o t=/dev / n f s rw
c o n s o l e=ttyS0 ,115200N8
n f s r o o t = 1 9 2 . 1 6 8 . 0 . 1 : / e x p o r t / o l i m e x / sam9l9260 / r o o t / , p r o t o=tcp
i p=dhcp ’
U−Boot> bootm 0 x22200000
## Booting k e r n e l from Legacy Image at 22200000 …
Image Name :  Linux −2.6.31− rc3−olimex−with−n f s
Image Type : ARM Linux K e r n e l Image ( uncompressed )
Data S i z e :  2853860 Bytes = 2 . 7 MB
Load Address : 20008000
Entry P o i n t : 20008000
V e r i f y i n g Checksum … OK
Loading K e r n e l Image … OK

OK

S t a r t i n g k e r n e l …
Uncompressing Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Linux v e r s i o n 2.6.31 − rc3−olimex−with−nfs−without−l e d ( k j e l l −e @ h j u l b e n . e i s . semcon . com) ( gcc v e r s i o n 4 . 3 . 3 ( S o u r c e r y G++ L i t e 2009 q1 −203) ) #8 PREEMPT Mon Sep 20 1 1 : 5 8 : 3 2 CEST 2010
CPU: ARM926EJ−S [ 4 1 0 6 9 2 6 5 ] r e v i s i o n 5 (ARMv5TEJ) , c r =00053177
CPU: VIVT data cache , VIVT i n s t r u c t i o n cache
Machine : Olimex SAM9−L9260

Olimex SAM9-L9260 Kjell Enblom

Boota med NFS-rootfilsystem

• Fortsättning...

r t c−at91sam9 a t 9 1 r t t . 0 : h c t o s y s : u n a b l e to r e a d the hardware c l o c k
IP−C o n f i g : Complete :
d e v i c e=eth0 , addr = 1 9 2 . 1 6 8 . 0 . 6 2 , mask = 2 5 5 . 2 5 5 . 2 5 5 . 0 , gw = 1 9 2 . 1 6 8 . 1 1 0 . 1 ,
h o s t=olimex , domain=, n i s−domain=(none ) ,
b o o t s e r v e r = 1 9 2 . 1 6 8 . 0 . 1 , r o o t s e r v e r = 1 9 2 . 1 6 8 . 0 . 1 , r o o t p a t h=
Looking up p o r t o f RPC 100003/2 on 1 9 2 . 1 6 8 . 0 . 1
Looking up p o r t o f RPC 100005/1 on 1 9 2 . 1 6 8 . 0 . 1
VFS : Mounted r o o t ( n f s f i l e s y s t e m ) on d e v i c e 0 : 1 3 .
F r e e i n g i n i t memory : 128K
eth0 : l i n k up (10/ H a l f )
mounting / proc
mounting /tmp
mounting / s y s
S t a r t i n g system l o g g e r
Du har kommit t i l l min t i n y−l i n u x .
my−t i n y−arm−system l o g i n : r o o t
Password :

# Olimex SAM9-L9260

Kjell Enblom

Programutveckling

• För att kunna utveckla program till SAM9-L9260 behövs ett toolchain.

• Några exempel på toolchains är:

codesourcery-armgcc-2009q1, toolchain byggt med hjälp av crosstool-ng, Ångström toolchain, snapgear, buildroot m.fl.

• Make är praktisk att ha men inte nödvändig.

• Något standardbibliotek, glibc, eglibc, newlib, dietlibc etc. måste man ha.

• Oftast brukar standardbiblioteken följa med i det toolchain man använder.

Olimex SAM9-L9260 Kjell Enblom

Programutveckling

• Med make är det enklare att korskompilera sina program.

• Exempel på en enkel Makefile.

CROSS COMPILE ?= arm−none−l i n u x −gnueabi−
INSTALLDIR ?= / e x p o r t /embedded/ d i n u s e r / r o o t /
AS  = $ (CROSS COMPILE) as
LD  = $ (CROSS COMPILE) l d
CC  = $ (CROSS COMPILE) gcc
CPP  = $ (CC) −E
AR  = $ (CROSS COMPILE) a r
NM  = $ (CROSS COMPILE)nm
STRIP  = $ (CROSS COMPILE) s t r i p
OBJCOPY  = $ (CROSS COMPILE) o b j c o p y
OBJDUMP  = $ (CROSS COMPILE) objdump
CFLAGS = −Wall −p e d a n t i c −g
LDFLAGS = −s t a t i c
program : program . o
$ (CC) $ˆ $ (LDFLAGS) −o $@
c l e a n :
\rm −f program ∗. o ∗˜
i n s t a l l : program
cp program $ ( INSTALLDIR )/ u s r / b i n /

Olimex SAM9-L9260 Kjell Enblom

Programutveckling

• Sedan är det bara att köra make för att korskompilera programmet.

[ k j e l l −e @ h j u l b e n t e s t p r o g r a m ] $ make
arm−none−l i n u x −gnueabi−gcc −Wall −p e d a n t i c −g −c −o program . o program . c
arm−none−l i n u x −gnueabi−gcc program . o −s t a t i c −o program

• Installera programmet med make install

• Mer om make går att läsa på http://www.linux.se/forum/viewtopic.php?f=13&t=35266

• Mer om gcc finns att läsa på http://www.linux.se/forum/viewtopic.php?f=13&t=35265

• Mer om libfiler finns att läsa på http://www.linux.se/forum/viewtopic.php?f=13&t=35267

Olimex SAM9-L9260 Kjell Enblom

Programutveckling - I/O

• Accessa hårdvara och I/O måste göras från kernel space.

• Lämpligtvis skriver man en device driver som gör att hårdvaran är tillgänglig från user space via en device-fil.

• I/O är minnesmappad på Olimex SAM9-L9260.

Olimex SAM9-L9260 Kjell Enblom

Inköpslista

Om du tänker skaffa ett eget Olimex SAM9-L9260-kort behövs följande:

• Olimex SAM9-L9260 utvecklingskort (finns att köpa på http://www.lawicel-shop.se/).

• Spänningsaggregat/batterieliminator 5V DC med plus på mittstiftet.

• USB till serieportsadapter.

• Nollmodemkabel 9pol hona-hona.

• Nätverkssladd (TP-kabel).

• SD-kort.

• USB-minne.

• USB-sladdar, för att kunna ansluta kortet som en deviceenhet till en dator respektive för att kunna ansluta olika enheter till Olimexkortet.

Olimex SAM9-L9260

Kjell Enblom

Böcker

• Linux Device Drivers, 3rd edition, Alessandro Rubini, O’Reilly online-version finns på http://lwn.net/Kernel/LDD3/ (pdf)

• Building Embedded Linux Systems, Second Edition, Philippe Gerum, Karim Yaghmour, Jon Masters, Gilad Ben-Yossef, August 2008, O’Reilly.

• Programming Embedded Systems: With C and GNU Development Tools, 2nd Edition, Michael Barr och Anthony Massa, 2006, O’Reilly.

• Designing Embedded Hardware, John Catsoulis, 2005, O’Reilly.

• Embedded Linux Primer A Practical Real-World Approach 2nd ed, Christopher Hallinan, 2010, Prentice Hall.

Olimex SAM9-L9260 Kjell Enblom

Länkar

• Manual till U-Boot, http://www.denx.de/wiki/DULG/Manual

• Embedded Linux Developer Forum, http://www.ucdot.org/

• SparkFun Electronics, http://forum.sparkfun.com/

• Busybox, http://www.busybox.net

• Linux på SAM, http://www.at91.com/linux4sam/bin/view/Linux4SAM/

• Linux on ARM Wiki, http://www.linux-arm.com/

• Arm, http://www.arm.com/

• crosstool-ng, http://freshmeat.net/projects/crosstool-ng/ • Ångström toolchain,

http://www.angstrom-distribution.org/toolchains/

Olimex SAM9-L9260 Kjell Enblom

Frågor

• Frågor?

Olimex SAM9-L9260 Kjell Enblom