Здесь будет представлен метод заливки ядра linux и rootfs на модуль через TFTP.
Описание приведено на примере модуля VAR-SOM-OM37.
Необходимо установить TFTP на рабочий компьютер по этой инструкции
В консоли на рабочем компьютере выполняем:
sudo apt-get install ckermit
Для теста можно взять готовое ядро из (относительно корня 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
В консоли нужно выполнить скрипт:
#!/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.
В консоли в другом окне выполнить:
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.
Теперь надо вернуться в консоль с u-boot'ом и выполнить там:
run rf_all
Нужно подождать пока закачаются и запишутся в NAND флеш ядро и rootfs, затем выполнить:
boot
В результате будет запущено Linux ядро.