Эта статья рассчитана на то что вы имеете плату mini2440 c уже установленным загрузчиком u-boot
Если вы до сих пор его не установили то рекомендую ознакомиться со статьями
mini2440 Установка загрузчика u-boot в NAND
mini2440 смена загрузчика в NOR флеше
Приступаем
производим загрузку в режиме NAND (этот режим мы используем практически всегда когда не указано обратного, режим NOR загрузки требуется обычно для исправления ошибочных секторов в NAND флешке)
сначала мы потренируемся запускать готовое ядро которое можно найти на диске комплекта mini2440 по пути images/linux/zImage_T35
Особенность заключается в том что u-boot хранит запускаемые образы в специальных контейнерах которые содержат запись о том что за содержимое в нем находится и контрольную сумму для защиты от сбойных блоков в NAND.
Именно поэтому мы берём утилиту mkimage из каталога tools дистрибутива u-boot
(если у вас его ещё нету то получим : $ cd ~/mini2440;mkdir u-boot;cd u-boot; git clone
исходим из того что ядро в формате zImage (zImage_T35) лежит у нас к каталоге ./images
делаем из него контейнер u-boot:
calculate mini2440 # ./mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d ./images/zImage_T35 ./images/uImage_T35
Image Name:
Created: Wed Jul 7 01:45:30 2010
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2517028 Bytes = 2458.04 kB = 2.40 MB
Load Address: 30008000
Entry Point: 30008000
теперь файл ./images/uImage_T35 готов к отправке на mini2440
отправляем его:
calculate mini2440 # dfu-util -a 0 -D ./images/uImage_T35 -R
dfu-util - (C) 2007-2008 by OpenMoko Inc.
This program is Free Software and has ABSOLUTELY NO WARRANTY
dfu-util does currently only support DFU version 1.0
Opening USB Device 0x0000:0x0000...
Claiming USB DFU Runtime Interface...
Determining device status: state = appIDLE, status = 0
Device really in Runtime Mode, send DFU detach request...
Resetting USB...
Opening USB Device...
Found Runtime: [0x1457:0x511b] devnum=119, cfg=0, intf=0, alt=0, name="RAM 0x32000000"
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Transfer Size = 0x1000
bytes_per_hash=50341
Starting download: [##################################################] finished!
state(2) = dfuIDLE, status(0) = No error condition is present
Done!
Resetting USB to switch back to runtime mode
теперь ядро у нас находится в RAM mini2440 по адресу 0x32000000
его нужно поместить в свой раздел:
MINI2440 # nand erase kernel
NAND erase: device 0 offset 0x60000, size 0x500000
Erasing at 0x540000 -- 100% complete.
OK
MINI2440 # nand write.e 0x32000000 kernel 0x300000
обращаю внимение здесь .e - признак обхода bad блоков
NAND write: device 0 offset 0x60000, size 0x300000
3145728 bytes written: OK
Всё ядро расположено на своем месте
осталось сделать его автоматически запускаемым:
MINI2440 # run set_bootargs_nand
MINI2440 # setenv bootcmd 'nboot.e kernel ; bootm'
MINI2440 # saveenv
можно перезапускать устройство и наблюдать в консоли примерно следующее:
Loading from NAND 128MiB 3,3V 8-bit, offset 0x60000
Image Name:
Created: 2010-07-06 21:45:30 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2517028 Bytes = 2.4 MB
Load Address: 30008000
Entry Point: 30008000
## Booting kernel from Legacy Image at 32000000 ...
Image Name:
Created: 2010-07-06 21:45:30 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2517028 Bytes = 2.4 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux................................................................................................................................................................... done, booting the kernel.
Теперь опишу как самостоятельно собрать ядро
исходим из соображения что у нас уже собран пакет для кросс компиляции armv4tl-softfloat-linux-gnueabi
сборка которого будет описана в разделе подготовки рабочего места на линуксе для разработчика
Вожможно это лишнее, но уточню что все нижеследующие операции производятся на x86 системе
cd ~/mini2440
mkdir kernel ; cd kernel
git clone
cd sources
mkdir -p ../kernel-bin
mkdir -p ../modules
CROSS_COMPILE=armv4tl-softfloat-linux-gnueabi- ARCH=arm make O=../kernel-bin/ INSTALL_MOD_PATH=../modules/ mini2440_defconfig
Базовая конфигурация не оптимальна, рекомендую взять соответствующий вашей конфигурации файл с диска комплекта , каталог linux
внутри архива linux-2.6.32.2-mini2440-20100113.tgz лежат оптимизированные конфиги например config_mini2440_n35
я их вытащил сюда:
для чего мы вообще затеяли сборку ? возможно хотели что то изменить в стандартном конфиге, делаем это и выходим с сохранением
CROSS_COMPILE=armv4tl-softfloat-linux-gnueabi- ARCH=arm make O=../kernel-bin/ INSTALL_MOD_PATH=../modules/ menuconfig
далее собираем ядро и и модули копируем в отдельное расположение ( каталог modules уровнем выше ):
CROSS_COMPILE=armv4tl-softfloat-linux-gnueabi- ARCH=arm make O=../kernel-bin/ INSTALL_MOD_PATH=../modules/
CROSS_COMPILE=armv4tl-softfloat-linux-gnueabi- ARCH=arm make O=../kernel-bin/ INSTALL_MOD_PATH=../modules/ modules_install
готово само ядро мы отлавливаем каталогом выше : kernel-bin/arch/arm/boot/zImage
ну и модули там же в каталоге modules (их нужно скопировать в корень рутовой файловой системы mini2440)
не забываем zImage перед загрузкой на mini2440 запаковать как было описано выше