Сброка toolchain для ARM и запуск Linux на AT91RM9200.

Итак, начнем

Для начала установим переменные окружения для сборки toolchain-а:

	export TARGET=arm-linux
export PREFIX=/usr/local/arm
export SYSROOT=${PREFIX}/sysroot
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin

Создаем каталоги для сборки:

	mkdir /usr/local/arm
cd /usr/local/arm
mkdir src

 В каталог /usr/local/arm/src будем класть все пакеты для сборки.

Создадим каталог для сборки

	mkdir /usr/local/arm/src/BUILD

 в нем будем производить сборку всего toolchain-а, чтобы не трогать родные каталоги пакетов

binutils

Распакуем binutils:

	bunzip2 -c binutils-2.16.1.tar.bz2 | tar xv

 Создадим каталог для сборки binutils:

	mkdir /usr/local/arm/src/BUILD/binutils-2.16.1

 В созданном каталоге делаем:

	../../binutils-2.16.1/configure --prefix=${PREFIX} --target=${TARGET} \
    --with-sysroot=${SYSROOT} 2>&1 | tee configure.out

 Собираем и инсталируем binutils:

	make 2>&1 | tee make.out
make install 2>&1 | tee -a make.out

 Заголовочники (include) ядра

Распаковываем ядро и накатываем требуемые патчи:

	bunzip2 -c linux-2.6.16.tar.bz2 | tar xv
ln -s linux-2.6.16 linux

Далее я накатывал патч 2.6.16-at91.patch от maxim (http://maxim.org.za/at91_26.html) Также накладываем остальные патчи, которые необходимо (я приложил в комплект свой патч для работы с RTL8102B(L) MII и для поддержки I2C-шных часов DS1307. последний пока сам не пробовал)

Делаем конфиг для требуемой платформы. У меня это так:

	make at91rm9200dk_defconfig
make include/linux/version.h

На ошибки внимания не обращаем.

Теперь копируем include-файлы:

	mkdir -p ${SYSROOT}/usr/include
cp -a ${PREFIX}/src/linux/include/linux ${SYSROOT}/usr/include/linux
cp -a ${PREFIX}/src/linux/include/asm-arm ${SYSROOT}/usr/include/asm
cp -a ${PREFIX}/src/linux/include/asm-generic ${SYSROOT}/usr/include/asm-generic

 GCC для сборки glibc

Сборка GCC будет осуществляться в два этапа - вначале промежуточная версия для сборки glibc, потом уже финальная версия.

Распакуем исходники GCC:

	bunzip2 -c gcc-3.4.6.tar.bz2 | tar xv

Накатываем все патчи из patches/gcc.

Создаем каталог для сборки:

	mkdir /usr/local/arm/src/BUILD/gcc-3.4.6-stage1

В созданном каталоге выполняем:

	../../gcc-3.4.6/configure \
    --prefix=${PREFIX} --target=${TARGET} --enable-languages=c \
    --with-sysroot=${SYSROOT} --without-fp --with-softfloat-support=internal \
    --with-newlib --disable-threads --disable-shared --enable-static \
    --with-inhibit-libc --with-float=soft 2>&1 | tee configure.out

Собираем и инсталируем GCC:

	make 2>&1 | tee make.out
make install 2>&1 | tee -a make.out

glibc

распаковываем glibc:

	bunzip2 -c glibc-2.3.6.tar.bz2 | tar xv

заходим в каталог glibc-2.3.6 и распаковываем linux-threads:

	bunzip2 -c ../glibc-linuxthreads-2.3.6.tar.bz2 | tar xv

накатываем патчи из patches/glibc.

Создаем каталог для сборки:

	mkdir /usr/local/arm/src/BUILD/glibc-2.3.6

В созданном каталоге выполняем:

	BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar \
    RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld \
    ../../glibc-2.3.6/configure --prefix=/usr --build=i386-unknown-linux \
    --host=arm-linux --target=arm-linux --without-fp \
    --without-__thread --enable-add-ons=linuxthreads \
    --with-headers=${SYSROOT}/usr/include 2>&1 | tee configure.out

Ставим на сборку glibc и идем пить пиво (собирается оооочень долго):

	make 2>&1 | tee make.out
make install_root=${SYSROOT} install

GCC

Создаем каталог для сборки:

	mkdir /usr/local/arm/src/BUILD/gcc-3.4.6

В созданном каталоге выполняем:

	../../gcc-3.4.6/configure \
    --prefix=${PREFIX} --target=${TARGET} --enable-languages=c,c++ \
    --with-sysroot=${SYSROOT} --without-fp --with-softfloat-support=internal \
    --enable-threads=posix --with-float=soft 2>&1 | tee configure.out

Собираем и инсталируем GCC:

	make 2>&1 | tee make.out
make install 2>&1 | tee -a make.out

Ядро

Тут все тривиально - как при сборке ядра под компьютер:

	cd ${PREFIX}/src/linux
make Image
make modules
make INSTALL_MOD_PATH=${SYSROOT} modules_install 

Не забываем поковырять arch/arm/mach-at91rm9200/ на предмет своей переферии. Там все очень просто (я даже сам удивился!!!). Разобраться во всем можно за час.

Расскажу тока пару своих исслодований:

1. Кол-во используемых uart-ов описывается в arch/arm/mach-at91rm9200/board-dk.c: