Установка Linux Kernel и rootfs через TFTP

Здесь будет представлен метод заливки ядра linux и rootfs на модуль через TFTP.

Описание приведено на примере модуля VAR-SOM-OM37.

Установка tftp

Необходимо установить TFTP на рабочий компьютер по этой инструкции

Установка kermit

В консоли на рабочем компьютере выполняем:

sudo apt-get install ckermit

Подготовка образов ядра и rootfs

Для теста можно взять готовое ядро из (относительно корня Variscite CD):

VAR-SOM-OM35_VAR-SOM-OM37_VAR-SOM-AM35\Software\Linux_Release_9\pre-built_images\VAR-SOM-OM37_VAR-SOM-OM35\uImage

и готовый rootfs из (относительно корня Variscite CD):

VAR-SOM-OM35_VAR-SOM-OM37_VAR-SOM-AM35\Software\Linux_Release_9\pre-built_images\VAR-SOM-OM37_VAR-SOM-OM35\FS\rootfs_om37.jffs2

эти файлы надо скопировать в /tftpboot

Выход в коммандную строку u-boot

В консоли нужно выполнить скрипт:

#!/usr/bin/kermit
set line /dev/ttyS1
set FLOW auto
set speed 115200
set serial 8n1
SET CARRIER-WATCH Off
connect

Затем включить модуль. После того как на экране появится надпись:

Hit any key to stop autoboot: X

нажать ENTER.

Обновление среды u-boot

В консоли в другом окне выполнить:

DEBUG_PORT="/dev/ttyS1"
TFTP_DIR="/tftpboot"
KERNEL_FILE="uImage"
ROOTFS_FILE="rootfs_om37.jffs2"
TARGET_IP="192.168.0.105"
TARGET_MAC="F8:DC:7A:00:00:00"
CMD_SLEEP="0.1"
KERNEL_SIZE_MAX_HEX=0x300000
ROOTFS_SIZE_MAX_HEX=0xAE03000

KERNEL_SIZE=$(stat -c %s $TFTP_DIR/$KERNEL_FILE)
ROOTFS_SIZE=$(stat -c %s $TFTP_DIR/$ROOTFS_FILE)
KERNEL_SIZE_HEX=0x$(printf %.8X $KERNEL_SIZE)
ROOTFS_SIZE_HEX=0x$(printf %.8X $ROOTFS_SIZE)
ROOTFS_SIZE_ALIGNED=$(((($ROOTFS_SIZE + 0x1000 - 1) / 0x1000) * 0x1000))
ROOTFS_SIZE_ALIGNED_HEX=0x$(printf %.8X $ROOTFS_SIZE_ALIGNED)
HOST_IP=$(/sbin/ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')
HOST_NETMASK=$(/sbin/ifconfig | grep 'Mask:'| grep -v '127.0.0.1' | cut -d: -f4 | awk '{ print $1}')
HOST_GATEWAY=$(ip route show dev eth0 | grep via | cut -d\  -f3)

echo "Setting MAC address..."
echo "setenv ethaddr $TARGET_MAC" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "Setting IP address..."
echo "setenv ipaddr $TARGET_IP" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "Setting Server IP address..."
echo "setenv serverip $HOST_IP" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "Setting netmask..."
echo "setenv netmask $HOST_NETMASK" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "Setting gateway..."
echo "setenv gatewayip $HOST_GATEWAY" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "Defining commands..."
echo "setenv rf_blank_ram_kernel mw.b 0x81600000 0xff $KERNEL_SIZE_MAX_HEX" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_blank_ram_rootfs mw.b 0x81600000 0xff $ROOTFS_SIZE_MAX_HEX" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_er_kernel nand erase 0x280000 0x400000" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_er_rootfs nand erase 0x780000" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_get_kernel tftp 0x81600000 $KERNEL_FILE" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_get_rootfs tftp 0x81600000 $ROOTFS_FILE" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_wr_kernel nandecc bch4_sw\; nand write.i 0x81600000 0x280000 $KERNEL_SIZE_MAX_HEX" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_wr_rootfs nandecc bch4_sw\; nand write.i 0x81600000 0x780000 $ROOTFS_SIZE_ALIGNED_HEX" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_kernel run rf_blank_ram_kernel\; run rf_er_kernel\; run rf_get_kernel\; run rf_wr_kernel" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_rootfs run rf_blank_ram_rootfs\; run rf_er_rootfs\; run rf_get_rootfs\; run rf_wr_rootfs" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv rf_all run rf_kernel\; run rf_rootfs" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv bootargs mem=80M@0x80000000 mem=128M@0x88000000 console=ttyS2,115200n8 noinitrd root=/dev/mtdblock4 rw rootfstype=jffs2 ethaddr=$TARGET_MAC ip=$TARGET_IP::$HOST_GATEWAY:$HOST_NETMASK consoleblank=0" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "setenv bootcmd nand read.i 0x80000000 0x280000 $KERNEL_SIZE_MAX_HEX\; bootm 0x80000000" > $DEBUG_PORT
sleep $CMD_SLEEP
echo "saveenv" > $DEBUG_PORT

Строки в начале нужно поменять соответствующим образом. TARGET_IP - IP адрес модуля, должен быть из той же подсети что и IP адрес компьютера, на котором крутится tftp сервер, иначе модуль не сможет скачать ядро и rootfs.

Загрузка ядра и rootfs

Теперь надо вернуться в консоль с u-boot'ом и выполнить там:

run rf_all

Нужно подождать пока закачаются и запишутся в NAND флеш ядро и rootfs, затем выполнить:

boot

В результате будет запущено Linux ядро.

howto/linux-kernel-rootfs.txt · Последние изменения: 2015/02/16 09:21 — admin@focusgrp.ru
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki