User Tools

Site Tools


Navigation Menu

Off-Board build-environment for ARM

To compile your own image you have to build a toolchain able to produce binary files that can run on the Netus G20. It's powered by a ARM926EJ-S™ ARM® Thumb® Processor, which means that you have to prepare a (cross)compiler for ARMV5TE architecture. Although it's possible to compile a lot of packages on the SKU itself, it's far more convenient and faster to compile the packages on a more powerful system

Prepare HBT-Environment

To improve structure and reduce the risk of of contaminating the host with wrong arch builds 3 environments will be created, a bit like a matroska doll.

  • The Host
  • The Build container
  • The Target container

GCC 4.5.1 ARM Options

Base Structure

mkdir -p /vault/virtual/icaros/base

It's recommended to use a 64 bit version, when your host is running on 64bit.

cd /vault/virtual/icaros/base
wget http://ftp.uni-erlangen.de/pub/mirrors/gentoo/releases/amd64/current-stage3/stage3-amd64-20101118.tar.bz2
wget http://ftp.uni-erlangen.de/pub/mirrors/gentoo/snapshots/portage-latest.tar.bz2

create support scripts:

The $BEROOT variable:

export BEROOT=/vault/virtual/icaros/armv5te-softfloat-linux-gnueabi/

Create a new Build-Environment container

From here on you should be able to use copy&paste

mkdir $BEROOT
cd $BEROOT
cp $BEROOT/../base/stage3-amd64-20101118.tar.bz2 $BEROOT
cp $BEROOT/../base/portage-latest.tar.bz2 $BEROOT
tar xfjpv stage3-amd64-20101118.tar.bz2 -C $BEROOT
tar xfvj portage-latest.tar.bz2 -C $BEROOT/usr

little helper to easily enter the build-env in the future

vi $BEROOT/bin/chroot-setup
#!/bin/bash
echo "Setting up BE-ROOT environment"
env-update && source /etc/profile
export SYSROOT="/usr/armv5te-softfloat-linux-gnueabi"
cd $HOME
exec /bin/bash

Change the permission to make it execuatble

chmod 0700 $BEROOT/bin/chroot-setup

for more comfort your can change your bash prompt to see that you're chrooted

echo "export PS1=\"\[\033[01;31m\][BE-CHROOT]\[\033[01;34m\] \W $\[\033[00m\] \"" >> $BEROOT/etc/bash/bashrc

your gentoo base system is now almost ready to enter

cp -L /etc/resolv.conf $BEROOT/etc/
mount -t proc proc $BEROOT/proc
mount -o rbind /dev $BEROOT/dev

chroot

chroot ${EGROOT} /bin/chroot-setup

Update & Preparation of the Build-Environment

emerge --sync

Prepare the make.conf of the build-environment

CFLAGS="-O2 -pipe"
CXXFLAGS="${CFLAGS}"
CHOST="x86_64-pc-linux-gnu"
MAKEOPTS="-j6"
 
USE=""
 
GENTOO_MIRRORS="http://ftp.uni-erlangen.de/pub/mirrors/gentoo \
                http://linux.rz.ruhr-uni-bochum.de/download/gentoo-mirror"
 
PORTDIR_OVERLAY=/usr/local/portage

Create the local portage overlay

mkdir /usr/local/portage
mkdir /etc/portage

emerge crossdev

setting up portage to choose latest crossdev

nano /etc/portage/package.keywords

content

sys-devel/crossdev **

Finally emerge the crossdev tools

emerge -av portage-utils crossdev dev-embedded/u-boot-tools

build crossdev chain

Now it's start to set up the toolchain

USE=-* crossdev -t armv5tejl-softfloat-linux-gnueabi

The above didnt work in any combination, changing the target to armv5te-softfloat-linux-gnueabi however worked with default values like a charm. Need to test if the compiled code will work in the AT91 and if there are other complications.

crossdev -v -t armv5te-softfloat-linux-gnueabi

The output will hopefully look similar to this:

 * crossdev version:      @CDEVPV@
 * Host Portage ARCH:     amd64
 * Target Portage ARCH:   arm
 * Target System:         armv5te-softfloat-linux-gnueabi
 * Stage:                 4 (C/C++ compiler)
 
 * binutils:              binutils-[latest]
 * gcc:                   gcc-[latest]
 * headers:               linux-headers-[latest]
 * libc:                  glibc-[latest]
 
 * PORTDIR_OVERLAY:       /usr/local/portage
 * PORT_LOGDIR:           /var/log/portage
 * PORTAGE_CONFIGROOT:    
 
 * Forcing the latest versions of {binutils,gcc}-config/gnuconfig ...   [ ok ]
 * Emerging cross-binutils ...                                          [ ok ]
 * Emerging cross-linux-headers-quick ...                               [ ok ]
 * Emerging cross-glibc-headers ...                                     [ ok ]
 * Emerging cross-gcc-stage1 ...                                        [ ok ]
 * Emerging cross-linux-headers ...                                     [ ok ]
 * Emerging cross-glibc ...                                             [ ok ]
 * Emerging cross-gcc-stage2 ...                                        [ ok ]

At this point the cross toolchain is successfully installed, usually you can proceed without the next step but better to be safe than sorry, check if the toolchain works, simply launch:

[EG-CHROOT] ~ $ armv5te-softfloat-linux-gnueabi-gcc --version
armv5te-softfloat-linux-gnueabi-gcc (Gentoo 4.5.1-r1 p1.3, pie-0.4.5) 4.5.1
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

set up the target infrastructure

Next set up the target infrastructure

mkdir ${SYSROOT}/etc
cp /etc/make.globals "${SYSROOT}/etc"
mkdir -p "${SYSROOT}/etc/portage/profile"

Prepare the make.conf of the target-environment

nano ${SYSROOT}/etc/make.conf
#
# make.conf for Netus G20 ARM Embedded System
#
 
CHOST=armv5tejl-softfloat-linux-gnueabi
CBUILD=i686-pc-linux-gnu
ROOT=/usr/local/${CHOST}/
ARCH="arm"
 
MAKEOPTS="-j8"
ACCEPT_KEYWORDS="~x86 arm ~arm"
CFLAGS="-Os -pipe -march=armv5t -mtune=arm926ej-s -fomit-frame-pointer -I${ROOT}/usr/include/ -I${ROOT}/include/"
CXXFLAGS="${CFLAGS}"
LDFLAGS="-L${ROOT}/usr/lib -L${ROOT}/lib"
 
 
USE="${ARCH} zlib bindist make-symlinks minimal"
 
 
PKG_CONFIG_PATH="${ROOT}/usr/lib/pkgconfig/"
FEATURES="-collision-protect sandbox buildpkg noman noinfo nodoc"
PORTDIR_OVERLAY="/usr/local/portage"
PKGDIR=${ROOT}/packages/
PORTAGE_TMPDIR=${ROOT}/tmp/
PORTAGE_WORKDIR_MODE=2775
PORTAGE_ECLASS_WARNING_ENABLE=0
CLEAN_DELAY=0
EPAUSE_IGNORE=1
EBEEP_IGNORE=1
 
GENTOO_MIRRORS="http://ftp.uni-erlangen.de/pub/mirrors/gentoo \
                http://linux.rz.ruhr-uni-bochum.de/download/gentoo-mirror"
 
VIDEO_CARDS=""
INPUT_DEVICES=""

original:

lrwxrwxrwx 1 root root 30 Nov 22 08:18 /usr/armv5te-softfloat-linux-gnueabi/etc/make.profile → /usr/portage/profiles/embedded

ln -s /usr/portage/profiles/default/linux/arm/10.0/ "${SYSROOT}/etc/make.profile"

xkmake: A cross kernel make wrapper

nano /bin/xkmake 
#!/bin/sh
exec make ARCH="arm" CROSS_COMPILE="armv5te-softfloat-linux-gnueabi-" INSTALL_MOD_PATH="${SYSROOT}" "$@"

Kernel

USE="-* minimal unicode" armv5te-softfloat-linux-gnueabi-emerge -pv gentoo-sources
cd /usr/armv5te-softfloat-linux-gnueabi/usr/src/linux
wget http://www.acmesystems.it/foxg20/download/linux/linux-2.6.35.4-foxg20-patches
patch -p1 < linux-2.6.35.4-foxg20-patches
 
patching file arch/arm/mach-at91/board-foxg20.c
patching file arch/arm/mach-at91/Kconfig
patching file arch/arm/mach-at91/Makefile

Download example Kernel configuration file:

$ wget http://www.acmesystems.it/foxg20/download/linux/linux-2.6.35.4-foxg20-config
$ mv linux-2.6.35.4-foxg20-config .config

Download the makefile (with minus m) useful to simplify the compiling command:

$ wget http://www.acmesystems.it/foxg20/download/linux/linux-2.6.35.4-foxg20-makefile
$ mv linux-2.6.35.4-foxg20-makefile makefile

to get pps working

Device drivers -> PPS support
* Enable high-resolution timestamps
* Enable 'ktimer' and 'line discipline' as modules

otherwise ldattach: cannot set line discipline: Invalid argument

create sd card

tune2fs -c 0 -i 0 /dev/xyz

Why not jffs2 or ubifs

What about file systems like jffs2 and ubifs, which are aware of flash card wearing? SD cards, according to SanDisk specs, should have wear leveling logic, which controls the number of writes and remaps blocks as needed. Wear-aware file systems might actually play against the logic of the card and are usually not recommendable.

Software

gpsd-2.95

before emerging chrony:

cd /usr/include/
wget "http://gitweb.enneenne.com/?p=pps-tools;a=blob_plain;f=timepps.h;h=d2628d2d061ea2a3623e57990d9ada62623773cf;hb=master" -O timepps.h
cd /usr/include/linux
wget http://projects.qi-hardware.com/index.php/p/qi-kernel/source/file/jz-2.6.35/include/linux/pps.h

chrony-1.24

setserial

localhost ~ # setserial /dev/ttyS1 low_latency
localhost ~ # ldattach 18 /dev/ttyS1 
[  419.370000] new PPS source atmel_serial1 at ID 0
[  419.370000] PPS source #0 "/dev/ttyS1" added