В большом числе основанных на Linux портативных устройств и встраиваемых систем
(например, на телефонах на базе платформы Android), используется загрузчик
uBoot, который можно использовать для экстренной загрузки прошивки, в случае
мертвого зависания аппарата вследствие неудачной перепрошивки.
При попытке загрузки с подключенной через последовательный порт консолью, в
терминале можно увидеть примерно такую информацию:
U-Boot 2010.03-01161-gd91b0a9 (Apr 22 2010 - 03:24:41)
Marvell-GuruPlug
SoC: Kirkwood 88F6281_A0
DRAM: 512 MB
NAND: 512 MiB
In: serial
Out: serial
Err: serial
Net: egiga0, egiga1
88E1121 Initialized on egiga0
88E1121 Initialized on egiga1
Hit any key to stop autoboot: 3
При нажатии любой клавиши процесс продолжения загрузки будет прерван и на
экране появится приглашение для ввода команд:
Marvell>>
Для просмотра переменных окружения загрузчика вводим команду printenv:
Marvell>> printenv
bootcmd=${x_bootcmd_usb}; ${x_bootcmd_kernel}; setenv
bootargs ${x_bootargs} ${x_bootargs_root};
bootm 0x6400000;
bootdelay=3
baudrate=115200
x_bootcmd_usb=usb start
x_bootcmd_kernel=nand read.e 0x6400000 0x100000 0x400000
x_bootargs=console=ttyS0,115200
x_bootargs_root=ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs
ethaddr=02:50:43:16:d0:2b
ethact=egiga0
eth1addr=02:50:43:fb:31:71
bootargs=rootwait
stdin=serial
stdout=serial
stderr=serial
Environment size: 441/131068 bytes
и аккуратно сохраняем где-нибудь выведенные параметры, на всякий случай, чтобы
в дальнейшем можно было вернуться к первоначальным настройкам.
Изменение переменных окружения производится командой setenv, например,
установим IP-адреса для встроенного Ethernet-адаптера:
Marvell>> setenv ipaddr 192.168.1.55
Marvell>> setenv serverip 192.168.1.1
Marvell>> setenv netmask 255.255.255.0
Для сохранения изменений во Flash-память необходимо использовать команду saveenv.
Введя команду help можно посмотреть список доступных встроенных команд, а введя
"help имя_команды", посмотреть краткую справку о заданной команде. Подробнее с
командами uBoot можно познакомиться в этом или этом руководстве.
Наша задача, организовать для оживления аппарата загрузку ядра и корневой ФС.
Нам необходимо найти образ ядра (uImage), необходимых модулей с драйверами
(modules.tar.gz), образ ram-диска (initrd) и корневой ФС (rootfs.tar.gz). Как
правило данные файлы можно выделить из распространяемых производителем
обновлений прошивки или попытаться найти в сети, например, на сайтах
http://plugcomputer.org/ или http://sheeva-with-linux.com.
Некоторые типы устройств можно восстановить без лишних трудностей, например,
для встраиваемых систем Ionics Stratus в uBoot предусмотрена специальная
команда для быстрого восстановления прошивки через USB - достаточно скопировать
на USB Flash файлы uImage, modules.tar.gz, rootfs.tar.gz и initrd. После чего
в приглашении uBoot набрать:
run recover2
Для других устройств, таких как Guruplug, восстановление немного сложнее.
Копируем на USB Flash файлы uImage и modules.tar.gz, после чего в приглашении
uBoot выполняем команды:
usb start
fatload usb 0 0x00800000 uImage
nand erase clean 0x00100000 0x00400000
nand write.e 0x00800000 0x00100000 0x00400000
bootm 0x00800000 0x01100000
После чего перезагружаем устройство, входим под пользователем root и
распаковываем содержимое архива modules.tar.gz в корень:
cd /
tar xvf /mnt/modules.tar.gz
uBoot также способен считать ядро и initrd с SD-карты или по сети, используя
протокол tftp (tftp-сервер для большинства Linux-дистрибутивов представлен в
пакете tftpd).
Альтернативным путем восстановления работоспособности устройства является
использование готовых инструментариев. Например, программа ESIA
предоставляет удобный GUI-интерфейс для восстановления типовых устройств. Для
подключения необходимо установить свежую версию программы openocd, которая
позволяет задействовать JTAG-интерфейс, подключившись к устройству через
последовательный порт. Далее, нужно подгрузить драйвер ftdi_sio, указав
корректный идентификатор устройства (можно посмотреть командой lsusb):
sudo rmmod ftdi_sio
sudo modprobe ftdi_sio vendor=0x1c0c product=0x0102
Если программа ESIA не помогла, можно попробовать скрипты Sheevaplug Installer
и GuruPlug Installer.
|