U-Boot

Предыдущая  Содержание  Следующая  V*D*V

Загрузчик второго уровня. Копирует кусок данных из указанного ему места из энергонезависимой памяти в ОЗУ. Так как он считает, что это запакованный образ Linux, он его распаковывает и запускает. Образ ядра должен быть предварительно запакован в понятный формат для U-Boot с помощью утилиты mkimage. U-Boot позволяет производить загрузку образов через ftp, а также менять параметры запуска из командной строки, что удобно в момент отладки системы, когда требуется часто пересобирать ядро, файловую систему.

 

Используем U-Boot 1.3.4 + патч от linux4sam.

http://www.denx.de/wiki/U-Boot/SourceCode

http://www.at91.com/linux4sam/bin/view/Linux4SAM/U-Boot

 

wget ftp://ftp.denx.de/pub/u-boot/u-boot-x.x.x.tar.bz2

tar xvjf u-boot-x.x.x.tar.bz2

cd u-boot-x.x.x

wget http://www.linux4sam.org/twiki/pub/Linux4SAM/U-Boot/u-boot-x.x.x-exp.diff

# или, в зависимости от версии u-boot, проверить директорию FTP:

wget ftp://www.linux4sam.org/pub/uboot/u-boot-x.x.x-exp/u-boot-x.x.x-exp.diff

# наложить заплатку на оригинальный u-boot:

cat u-boot-x.x.x-exp.diff | patch -p1

 

 

Список переменных: http://www.denx.de/wiki/view/DULG/UBootEnvVariables

Адаптация кода

Проверить стартовый адрес в /u-boot/board/at91sam9260ek/config.mk. Он должен совпадать с адресом, указанным в Bootstrap (JUMP_ADDRESS).

 

TEXT_BASE = 0x23F00000

 

Установить размер памяти, рабочие частоты в /include/configs/at91sam9260.h:

 

#define AT91C_MAIN_CLOCK                200000000

#define AT91C_MASTER_CLOCK        10000000

#define PHYS_SDRAM_SIZE                0x04000000  /* 64 megs */

 

Понизить при необходимости частоту SPI (согласовать с Bootstrap):

 

#define AT91C_SPI_CLK        4800000

 

Задать параметры запуска в соответствующей секции (или во всех).

Для JFFS2:

 

 #define CONFIG_BOOTARGS                "mem=64M console=ttyS0,115200 "        \

                         "root=/dev/mtdblock1 "        \

                                 "rw rootfstype=jffs2"

 

Для UBIFS:

 

 #define CONFIG_BOOTARGS                "mem=64M console=ttyS0,115200 "        \

                         "root=ubi:rootfs ubi.mtd=rootfs "        \

                                 "rootfstype=ubifs rootflags=bulk_read,chk_data_crc rw"

 

Для ramfs:

 

 #define CONFIG_BOOTARGS                "mem=64M console=ttyS0,115200"

 

Для ramfs и монтировании UBIFS файловой системы:

 

 #define CONFIG_BOOTARGS                "mem=64M console=ttyS0,115200 ubi.mtd=rootfs"

 

 

Обратить внимание на параметр:

 

#define CONFIG_BOOTCOMMAND        "cp.b 0xD0042000 0x22000000 0x210000; bootm"

 

0xD0042000 = адрес, где находится образ ядра. См. Логическая карта памяти.

0x210000 = 2162688 = максимальный размер образа ядра Linux.

0x22000000 = 32 M = адрес загрузки образ ядра, зависит от объёма установленной памяти.

 

Установить адрес микросхемы физического интерфейса Ethernet в cpu/arm926ejs/at91sam9/ether.c:

 

macb_eth_initialize(0, (void *)AT91SAM9260_BASE_EMAC, 0x01);

Компилятор

Используется EABI компилятор. http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite.

Используется не новее 2007q1-21. Причина: непонятное увеличение размера скомпилированного файла.

Компиляция

В Makefile определить путь к компилятору (около 130 строки):

 

CROSS_COMPILE=arm-none-eabi-

 

Для запуска Linux из Dataflash сделать файл следующего содержания и запустить:

 

#!/bin/sh

export PATH=/<path to toolchain>/arm-2007q1/bin:${PATH}

 

make ARCH=arm distclean

make at91sam9260ek_dataflash_cs1_config

make ARCH=arm CROSS_COMPILE=arm-none-eabi-

 

Для запуска Linux из Nandflash сделать файл следующего содержания и запустить:

 

#!/bin/sh

export PATH=/<path to toolchain>/arm-2007q1/bin:${PATH}

 

make ARCH=arm distclean

make at91sam9260ek_nandflash_config

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

 

Результат сборки: /<path to u-boot>/board/at91sam9260ek/dataflash/u-boot.bin ~150 Кб.

Утилита mkimage для упаковки ядра Linux: /<path to u-boot>/tools/mkimage ~40 кБ. mkimage.zip.

 

Внимание!

размер файла не должен превышать параметр IMG_SIZE, указанный в Bootstrap.

 

Смотри также

How can I access U-Boot environment variables in Linux?

http://www.denx.de/wiki/view/DULG/HowCanIAccessUBootEnvironmentVariablesInLinux

Using Watchdog on Stamp9G20 or PortuxG20

http://www.armbedded.eu/node/169

 

Предыдущая  Содержание  Следующая