Столкнулся с такой проблемой. Не работает Wi-Fi точка Extreme Networks Altitude AP450.
Не видно ее по радио (SSID), не включается Ethernet-порт (и при Power over Ethernet-подключении, и с внешним блоком питания). Что хорошо: есть признаки жизни, при загрузке загорается первый светодиод зеленым цветом - и на этом всё. В документации такой случай (LED1 Solid Green) не описан.
Традиционный ход в таких случаях - собрать максимум информации по проблеме и открывать тикет у производителя. Я попробовал разобраться сам, т.к. точка нужна была срочно.
К счастью, у AP450 имеется консольный порт (
Serial Port) с разъемом RJ45. А значит, достаточно консольного кабеля (коих у нас столько, что можно благотворительно раздавать), подключаемся COM-портом или переходником USB-COM и получаем текстовую консоль устройства на скорости 9600 бит/с или выше. Экспериментально (а затем и чтением документации) находится скорость 115200.
Перезагрузив точку, увидим по консоли, что загрузчик живой, но:
U-Boot 1.2.0.05 (Mar 26 2008 - 16:44:22)
Primary Image
DRAM: 128 MB
Flash: 16 MB
In: serial
Out: serial
Err: serial
Net: eth0
Hit any key to stop autoboot: 2 ... 1 ... 0
### JFFS2 loading 'boot_kernel.img' to 0x80400000
Scanning JFFS2 FS: ... done.
### JFFS2 load complete: 2732 bytes loaded to 0x80400000
## Checking Image at 80400000 ...
Image Name: Boot ROM Script
Created: 2007-11-01 17:00:32 UTC
Image Type: PowerPC Linux Script (uncompressed)
Data Size: 2668 Bytes = 2.6 kB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
## Executing script at 80400000
check for watchdog, limit=3...
check for reset by watchdog...
no watchdog...
bSaveEnviron=0 image_order=secondary primary
### JFFS2 loading 'secondary.gz.uImage' to 0x80500000
### JFFS2 load complete: 3098725 bytes loaded to 0x80500000
ready to boot kernel, starting watchdog...
## Booting image at 80500000 ...
Image Name: Linux Kernel Image
Created: 2009-04-25 0:19:30 UTC
Image Type: MIPS Linux Kernel Image (gzip compressed)
Data Size: 3098661 Bytes = 3 MB
Load Address: 80060000
Entry Point: 80246000
Verifying Checksum ... Bad Data CRC
boot failed - stopped watchdog
### JFFS2 loading 'primary.gz.uImage' to 0x80500000
### JFFS2 load complete: 2612177 bytes loaded to 0x80500000
ready to boot kernel, starting watchdog...
## Booting image at 80500000 ...
Image Name: Linux Kernel Image
Created: 2008-09-14 5:31:36 UTC
Image Type: MIPS Linux Kernel Image (gzip compressed)
Data Size: 2612113 Bytes = 2.5 MB
Load Address: 80060000
Entry Point: 80246000
Verifying Checksum ... Bad Data CRC
boot failed - stopped watchdog
ERROR: Cannot boot either kernel image, dropping to interactive shell.
Boot->
Что это означает по-русски?
1. После включения микрокод системной платы передал управление на загрузчик U-Boot, прочитав его из первого сектора встроенной флешки.
2. Загрузчик в соответсвии со своими настройками (которые хранятся там же на флеше) прочитал вспомогательный код boot_kernel.img и запустил его.
3. Вспомогательный код находит на флешке образ операционной системы (secondary.gz.uImage), копирует его в RAM, проверяет корректность и контрольную сумму, после чего передает ему управление.
4. На шаге проверки контрольной суммы и обрывается загрузка: оба образа ОС, сохраненные во флеше (secondary.gz.uImage, primary.gz.uImage) оказываются битыми - "
Verifying Checksum ... Bad Data CRC".
5. В итоге получаем "
ERROR: Cannot boot either kernel image, dropping to interactive shell."
6. Дружелюбное приглашение "
Boot->" как бы намекает - сделайте что-нибудь.
Наша задача: имея живой загрузчик восстановить операционную систему. Поскольку обе прошивки битые, то восстановление работоспособности AP потребует следующих 3 шагов:
- Найти прошивку;
- Затолкнуть ее в устройство (в RAM или Flash);
- Запустить ее.
Этап 1. Образ ОС.
1.1 На сайте производителя стягиваем A450-V5R1.10310.3.img:
1.2 Распаковываем его как bzip2-архив:
Этот файл назовем boot.img и попробуем с ним загрузиться.
1.3 Но сначала сравним наш получившийся файл boot.img с образом из флеш (primary.gz.uImage).
Как это сделать? К флешке прямого доступа нет. Но образ с флешки уже оказался в RAM, как видно в лога выше:
### JFFS2 loading 'primary.gz.uImage' to 0x80500000
Воспользуемся командой чтения памяти (md = memory dislay):
Boot-> md 0x80500000
80500000: 27051956 02cf3b82 48cca1b8 0027db91 '..V..;.H....'..
80500010: 80060000 80246000 5de703fc 05050201 .....$`.].......
80500020: 4c696e75 78204b65 726e656c 20496d61 Linux Kernel Ima
80500030: 67650000 00000000 00000000 00000000 ge..............
80500040: 1f8b0808 b7a1cc48 0003766d 6c696e75 .......H..vmlinu
80500050: 782e6269 6e00ec7d 0f745b57 99e7f7fe x.bin..}.t[W....
80500060: d8561295 3ebb6aaa 3629969c 2759b486 .V..>.j.6)..'Y..
80500070: 518bda9a 41d017c9 495d08e0 76c31096 Q...A...I]..v...
80500080: ce8cea24 25b0dd3d ee1286ec 4ee828b6 ...$%..=....N.(.
80500090: 92baa058 060278d9 cc41752c d714d972 ...X..x..Au,...r
805000a0: 4b4a0d93 8249d2e2 61bb4bd8 e99ee9e9 KJ...I..a.K.....
805000b0: 74c03419 da619843 8002eebf bcfd7df7 t.4..a.C......}.
805000c0: be27cb92 95041838 67dae61c f7e9ddef .'.....8g.......
805000d0: deef7edf 77bffbfd b9f7be5b 229a25f9 ..~.w......[".%.
805000e0: f7dabfd7 febdf6ef 55fe2fae a71bdb1f ........U./.....
805000f0: b69f3533 fa4ea248 b0f44d32 bcca679e ..53.N.H..M2..g.
Сравнивая с картинкой boot.img (вверху) находим небольшое отличие: строка Linux Kernel Image в нашем файле смещена дальше от начала, т.е. boot.img содержит дополнительный заголовок.
Если на следующем этапе записать наш файл в память по тому же адресу 0x80500000 и запустить, то получили бы ошибку:
Boot-> bootm
## Booting image at 80500000 ...
Bad Magic Number
1.4 Нужно либо обрезать лишний заголовок в нашем файле, либо оставить и учесть это смещение в будущем при записи в RAM. Арифметика говорит, что немодифицированный boot.img нужно будет писать по адресу 0x804FFE00.
Этап 2. Заталкивание образа ОС в коробочку.
Изучая CLI и просматривая
мануал по U-Boot находим, что поддерживается загрузка по консоли (115200 бит/с), TFTP (на скорости сети), из флеш.
Выберем загрузку с TFTP как самый оперативный способ. Консоль - медленно; флеш - нужно разобрать коробочку и скорее всего флешка окажется неподходящего форм-фактора.
Считаем, что в U-Boot командами printenv и setenv уже выставлены сетевые настройки (я же использовал DHCP, чтобы заодно указать адрес TFTP-сервера и имя файла). Также в сети (на ноуте) запущен TFTP-сервер.
2.1 Чтобы поднять Ethernet-порт, надо инициировать сетевую активность с самой точки.
Boot-> ping 192.168.1.97
Using eth0 device
ping failed; host 192.168.1.97 is not alive
Первый пинг неудачен, медленно поднимается сетевой интерфейс, зато последующие в порядке.
Boot-> ping 192.168.1.97
Using eth0 device
host 192.168.1.97 is alive
2.2 Загружаем образ в RAM по TFTP
Если переменные окружения выставлены, достаточно набрать "tftp". Если нет, то полный синтаксис:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
Берем вычисленный выше адрес. Получается:
Boot-> tftp 804ffe00 192.168.1.97:boot.img
Using eth0 device
TFTP from server 192.168.1.97; our IP address is 192.168.1.20
Filename 'boot.img'.
Load address: 0x804ffe00
Loading: *.#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
##########################################
done
Bytes transferred = 5534818 (547462 hex)
Этап 3. Запуск
3.1 Проверяем, что у нас оказалось в RAM по 0x80500000. Точно что и требовалось:
Boot-> md 80500000
80500000: 27051956 02cf3b82 48cca1b8 0027db91 '..V..;.H....'..
80500010: 80060000 80246000 5de703fc 05050201 .....$`.].......
80500020: 4c696e75 78204b65 726e656c 20496d61 Linux Kernel Ima
80500030: 67650000 00000000 00000000 00000000 ge..............
80500040: 1f8b0808 b7a1cc48 0003766d 6c696e75 .......H..vmlinu
80500050: 782e6269 6e00ec7d 0f745b57 99e7f7fe x.bin..}.t[W....
80500060: d8561295 3ebb6aaa 3629969c 2759b486 .V..>.j.6)..'Y..
80500070: 518bda9a 41d017c9 495d08e0 76c31096 Q...A...I]..v...
80500080: ce8cea24 25b0dd3d ee1286ec 4ee828b6 ...$%..=....N.(.
80500090: 92baa058 060278d9 cc41752c d714d972 ...X..x..Au,...r
805000a0: 4b4a0d93 8249d2e2 61bb4bd8 e99ee9e9 KJ...I..a.K.....
805000b0: 74c03419 da619843 8002eebf bcfd7df7 t.4..a.C......}.
805000c0: be27cb92 95041838 67dae61c f7e9ddef .'.....8g.......
805000d0: deef7edf 77bffbfd b9f7be5b 229a25f9 ..~.w......[".%.
805000e0: f7dabfd7 febdf6ef 55fe2fae a71bdb1f ........U./.....
805000f0: b69f3533 fa4ea248 b0f44d32 bcca679e ..53.N.H..M2..g.
3.2 Проверим целостность образа
Boot-> iminfo 80500000
## Checking Image at 80500000 ...
Image Name: Linux Kernel Image
Created: 2008-09-14 5:31:36 UTC
Image Type: MIPS Linux Kernel Image (gzip compressed)
Data Size: 2612113 Bytes = 2.5 MB
Load Address: 80060000
Entry Point: 80246000
Verifying Checksum ... OK
3.3 При желании можно выполнить последовательность команд загрузочного скрипта (boot_kernel.img), благо его код присутствует в самой прошивке:
3.4 Передаем управление на загруженный код
Boot-> bootm 0x80500000
## Booting image at 80500000 ...
Image Name: Linux Kernel Image
Created: 2008-09-14 5:31:36 UTC
Image Type: MIPS Linux Kernel Image (gzip compressed)
Data Size: 2612113 Bytes = 2.5 MB
Load Address: 80060000
Entry Point: 80246000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
Starting kernel ...
Linux version 2.6.15--LSDK-7.0.0.335 (root@mismbldv06) (gcc version 3.4.4) #2 Sun Sep 14 01:31:25 EDT 2008
flash_size passed from bootloader = 16
<...>
init started: BusyBox v1.6.0 (2008-09-14 01:26:Algorithmics/MIPS FPU Emulator v1.5
52 EDT) multi-call binary
starting pid 14, tty '': '/etc/rc.d/rcS'
Jan 1 00:00:06 syslogd started: BusyBox v1.6.0
Jan 1 00:00:06 kernel: klogd started: BusyBox v1.6.0 (2008-09-14 01:26:52 EDT)
<...>
3.5 Как видно, система стартовала нормально. Далее точка доступа благополучно по сети нашла контроллер (систему централизованного управления) и выполнила полезную работу: стянула с него свежую прошивку и сохранила во флеш. Молодец!
(none) mips #2 Sun Sep 14 01:31:25 EDT 2008
(none) login:
*************************
Reboot issued due to: Software Image Upgrade
*************************
После перезагрузки wifi-точка запустилась исправно и теперь стабильно работает.
Вот так коробочка вернулась к жизни. А загрузчик U-Boot в целом произвел весьма приятное впечатление!
P.S. Справочно, printenv с коробочки:
Boot-> printenv
bootcmd=run boot_flash
bootdelay=2
baudrate=115200
ipaddr=192.168.1.20
serverip=192.168.1.1
gatewayip=192.168.1.1
netmask=255.255.255.0
PB44_CONFIG1_ADDR=0xBFE80000
PB44_CONFIG1_SIZE=0x40000
PB44_CONFIG2_ADDR=0xBFEC0000
PB44_CONFIG2_SIZE=0x40000
WATCHDOG_LIMIT=3
MOSTRECENTKERNEL=1
BOOT_KERNEL=primary
BOOT_BOOTROM=unknown
SERVICEATTRS=ac_manager,ru_manager
VERSIONBASE=0
REGION=NA
mtdparts=mtdparts=ar7100-nor0:256K(BootBAK)ro,256K(BootPRI),14336K(FS),256K(CFG1),256K(CFG2),256K(NVRAM1),256K(NVRAM2),256K(RSVD1),256K(RSVD2)
static_bootargs=console=ttyS0,115200n81 mem=130560K panic=30 ro
boot_flash=order="img bak"; for script in ${order}; do if fsload 0x80400000 boot_kernel.${script}; then if imi 0x80400000; then autoscr 0x80400000; exit; fi; fi; done; echo ERROR: Problem with boot script, dropping to interactive shell
ethact=eth0
DEFAULT_SETTING=0
CURR_VER=U-Boot 1.2.0.05 (Mar 26 2008 - 16:44:22)
MODEL=A450
SERIAL#=1000008299080291
ethaddr=00:04:96:3A:38:96
RADIOADDR0=00:04:96:3A:97:E0
RADIOADDR1=00:04:96:3A:97:E8
HW_RELEASE=3
MB81_CTL_VER=2
MB82_CTL_VER=3
SERVICETYPE=extreme
AC_HOSTNAME=ext-summitwm-connect-1
APSK=0225CEB33E7586566DF2C97EE14F48AEAB8400E4C5240F22A500B9260D76242378
WATCHDOG_COUNT=0
stdin=serial
stdout=serial
stderr=serial
mem=130560k
ver=U-Boot 1.2.0.05 (Mar 26 2008 - 16:44:22)
filesize=27dbd1
bootargs=mtdparts=ar7100-nor0:256K(BootBAK)ro,256K(BootPRI),14336K(FS),256K(CFG1),256K(CFG2),256K(NVRAM1),256K(NVRAM2),256K(RSVD1),256K(RSVD2) BOOT_BOOTROM="U-Boot 1.2.0.05 (Mar 26 2008 - 16:44:22)" BOOT_KERNEL=primary console=ttyS0,115200n81 mem=130560K panic=30 ro
WDOG_TIMER=0xffffffff
TEMP=0x00000000