Пример восстановления роутера через JTAG (ar724x)
Примечание: Список роутеров на которых должен работать основной конфигурационный файл для OpenOCD, на самом деле, может быть намного больше (практически все процессоры AR724x). Однако для каждой платформы1) необходим соответствующий, собственный загрузчик, измененный таким образом, чтобы можно было его загружать из SDRAM памяти - без потери функциональности.
Аппаратная часть
JTAG на процессоре
→ port.jtag Распиновка EJTAG v3.1 интерфейса на AR724x, выглядит следующим образом:
JTAG Common Name | AR724x Pin | Разъем EJTAG на DIR-615 Ex |
---|---|---|
| 79 | |
TDI | 81 | |
TDO | 82 | |
TMS | 84 | |
TCK | 85 | |
| 93 |
Если отсутствует маркировка отсчета ножек процессора на плате, то можно воспользоваться такой ориентировкой:
Подключение к JTAG
Примечание: Отладка и тестирование (для написания этой инструкции) производилось с исправным загрузчиком, поэтому необходимо было на время отключить флеш-память устройства (CS0⇒3.3V), чтобы процесс инициализации и загрузки устройства прервался(в загрузчике может быть инструкция отключения JTAG порта для освобождения GPIO линии).
EJTAG_SEL пин - AR7240/ AR7241/AR7242 учитывая то, что на многих устройствах не выведен EJTAG разъем - логическое состояние этого пина не имеет особой роли на работу JTAG протокола. Достаточно прервать загрузку устройства с флеш-памяти, описанным выше способом. А если учитывать то, что Вы читаете эту инструкцию - скорее всего, Ваше устройство и так не загружается должным образом.
RST пин - AR7240/ AR7241/AR7242 полностью сбрасывает процессор, т.е. в том числе записанные регистры инициализации процессора, это состояние равносильно отключению питания от устройства – поэтому, этот пин мы тоже не будем использовать.
→ port.jtag.cables Подключение, как правило, производится через специальный JTAG адаптер. Это могут быть простые и дешевые USB-JTAG адаптеры, так и старые адаптеры на основе параллельного порта (LPT) для компьютера - как правило, такие адаптеры самодельные.
В примере, представленном в этом разделе, подключение производилось через старый и медленный JTAG адаптер для LPT порта – Wiggler(без буфера). Конструкция этого адаптера чрезвычайно проста.
Программная часть
Программная часть содержит список программ, которые понадобятся в процессе отладки и восстановления через интерфейс JTAG. Также, эта часть содержит список используемых команд OpenOCD и конфигурационный файл для процессоров AR724x.
Программы для работы с JTAG
- OpenOCD2) - Как собрать OpenOCD для Windows в среде Linux OS, Как собрать OpenOCD для Windows в среде Windows OS(на русском).
Также можно воспользоваться последней стабильной версией OpenOCD, собранной для Windows (программа включает в себя практически все JTAG адаптеры).
- PuTTY –
telnet
консоль. Эта консоль также используется для подключения к роутеру через последовательный порт.
- init-ar7240.cfg - конфиг. файл для программы OpenOCD и Вашего устройства (конфиг. файл, необходимо скопировать в папку программы OpenOCD как target/init-ar7240.cfg).
- 8Muboot_RAM_version.bin - загрузчик, который можно запустить в SDRAM памяти через JTAG (спасибо участнику форума OpenWRT с ником tthrx)
- backup.bin - условный загрузчик или другой фрагмент данных флеш-памяти, который необходимо восстановить.
Примечание: Учтите, что в загрузчике хранится информация о MAC адресе 3) и PIN коде4) устройства. Следует также знать, что используемый art раздел с EEPROM информацией для чипа беспроводной связи, должен соответствовать чипу беспроводной связи восстанавливаемого устройства.
Например: art раздел роутера MR3420(WiFi Chip: AR9287) не подойдет к роутеру MR3220(WiFi Chip: AR9285) и наоборот.
Используемые команды OpenOCD
reset
В примере представленном в этом разделе, команда используется как - определение идентификатора и состояние устройства, не более. Обычно, при выполнении этой команды задействуется пин nSRST, но в нашем случае RST пин - не одно и то же.
halt
Переводит процессор в режим отладки (прием команд).
reset init
После выполнения этой команды, будет выполнен скрипт для этого события (заключенного в фигурные скобки), который находится в конфиг. файле (отправка команд в процессор).
dump_image <имя файла> <стартовый адрес в области памяти или флешки> <размер>
Эта команда сохраняет дамп из памяти/флешки устройства в файл. Команда может быть выполнена до инициализации процессора и памяти устройства. Для чтения флеш-памяти, используйте адрес 0x9f000000
load_image <имя файла> <адрес в области только памяти> <формат файла>
Эта команда загружает файл в память устройства. Команда должна выполнятся после инициализации процессора и памяти устройства.
resume <адрес в области памяти или флешки>
Эта команда запускает загрузчик, аналог go в uboot’е
init-ar7240.cfg
# Atheros AR724x MIPS 24Kc SoC. # tested on AP99 reference board # # configure file for AR7200 boards (32/64 MB ram) # this settings format for OpenOCD was changed/taken from source of settings for OCD Commander # source: http://www.cpx.cz/dls/wpe72_WPE72NX_MMJ5N26E/wp72_loader_jtag.zip adapter_nsrst_delay 100 jtag_ntrst_delay 100 reset_config trst_only separate ;# or use only "reset_config none" set CHIPNAME ar724x jtag newtap $CHIPNAME cpu -irlen 5 -ircapture 0x1 -irmask 0x1f -expected-id 1 set TARGETNAME $CHIPNAME.cpu target create $TARGETNAME mips_m4k -endian big -chain-position $TARGETNAME $TARGETNAME configure -event reset-init { # WAR for the bug#55574: Set the CKE (bit 7 in DDR_CONFIG2 register) # to low initially mww 0xB8000004 0x99D10628 # set PLL mww 0xb8050000 0x00040828 # update PLL mww 0xb8050008 0x1 sleep 10 mww 0xb8050008 0x0 # disable flash remap mww 0xbf000004 0x43 # DDR mww 0xb8000000 0xC7BC8CD0 mww 0xB8000004 0x9DD0E6A8 mww 0xB8000010 0x00000008 mww 0xB8000008 0x00000133 sleep 10 mww 0xB8000010 0x00000001 mww 0xB800000C 0x00000000 mww 0xB8000010 0x00000002 mww 0xB8000010 0x00000008 mww 0xB8000008 0x00000033 mww 0xB8000010 0x00000001 mww 0xB8000014 0x00004F10 mww 0xB8000018 0x000000FF mww 0xB800001C 0x00000007 mww 0xB8000020 0x00000007 # # UART Test # mww 0xB8040028 0x000480FA mww 0xB802000C 0x00000083 mww 0xB8020000 0x0000006D mww 0xB8020004 0x00000000 mww 0xB802000C 0x00000003 mww 0xB8020008 0x00000001 mww 0xB8020000 0x00000030 mww 0xB8020000 0x00000031 mww 0xB8020000 0x00000032 mww 0xB8020000 0x00000033 mww 0xB8020000 0x00000034 mww 0xB8020000 0x00000035 mww 0xB8020000 0x00000036 mww 0xB8020000 0x00000037 mww 0xB8020000 0x00000038 mww 0xB8020000 0x00000039 mww 0xB8020000 0x0000000D mww 0xB8020000 0x0000000A } # setup working area somewhere in RAM $TARGETNAME configure -work-area-phys 0xa0600000 -work-area-size 0x20000 # serial SPI capable flash # flash bank <driver> <base> <size> <chip_width> <bus_width>
Пример восстановления
Восстановление условного загрузчика u-boot и art раздела, на роутере MR3220(4M) в операционной системе Windows. При желании, таким же образом, дополнительно, можно прошить firmware образ или целиком всю флеш-память - fullflash.
- Распаковываем собранную версию “openocd-0.5.0.zip” в удобную для нас папку.
- Перемещаем или копируем из папки
bin
(папка расположена в корневой директории OpenOCD), все содержимое в корневую директорию OpenOCD.
- Создаем файл
ar724x.bat
(можно использовать любое другое имя) в той же корневой директории OpenOCD со следующим содержимым:
openocd-0.5.0.exe -f interface/parport.cfg -f target/init-ar7240.cfg pause
Если Вы используете другой JTAG адаптер, то название parport.cfg должно быть изменено на соответствующее название конфигурационного файла для Вашего JTAG адаптера.
- Подключаем JTAG к компьютеру и отключенному роутеру.
- Подключаем UART к компьютеру и отключенному роутеру, также следует открыть PuTTY (программа должна быть настроена на параллельный порт Вашего компьютера с соответствующими настройками для Вашего роутера).
Работа с программой OpenOCD
- Запускаем ar724x.bat, практически сразу можно включить роутер, цель обнаружить идентификатор
0x00000001
(стандартный идентификатор процессоров Atheros):D:\Free\OpenOCD\0.5.0>openocd-0.5.0.exe -f interface/parport.cfg -f target/init-ar7240.cfg Open On-Chip Debugger 0.5.0 (2012-04-06-14:30) Licensed under GNU GPL v2 For bug reports, read http://openocd.berlios.de/doc/doxygen/bugs.html Warn : Adapter driver 'parport' did not declare which transports it allows; assuming legacy JTAG-only Info : only one transport option; autoselect 'jtag' parport port = 0x378 6000 kHz adapter_nsrst_delay: 100 jtag_ntrst_delay: 100 none separate 131072 Info : clock speed 500 kHz Info : JTAG tap: ar724x.cpu tap/device found: 0x00000001 (mfg: 0x000, part: 0x0000, ver: 0x0) Info : accepting 'telnet' connection from 4444
Если не получилось определить идентификатор сразу, попробуйте перейти к следующему пункту и набрать в консоли “
reset
”. Если все равно программа не определяет идентификатор процессора, то нужно проверить подключение кабеля JTAG на возможные ошибки, также причина неполадок может заключаться в длине используемого кабеля.
- Если все прошло успешно, необходимо запустить консоль
telnet
или еще одно окно PuTTY используя адрес127.0.0.1:4444
, после подключения в консоли должна отобразится строка ввода:Open On-Chip Debugger >
- Дальше необходимо ввести команды:
> reset JTAG tap: ar724x.cpu tap/device found: 0x00000001 (mfg: 0x000, part: 0x0000, ver: 0x0) >
Эта команда не должна влиять на состояние процессора, т.к. RST мы не используем. Однако команда очередной раз определяет идентификатор и состояние процессора.
> halt target state: halted target halted in MIPS32 mode due to debug-request, pc: 0xbfc03860 >
Эта команда переводит процессор из состояния “running”, в состояние “halted” - в этом состоянии, процессор принимает команды от оператора.
> reset init JTAG tap: ar724x.cpu tap/device found: 0x00000001 (mfg: 0x000, part: 0x0000, ver: 0x0) target state: halted target halted in MIPS32 mode due to debug-request, pc: 0xbffd0ac0 >
Инициализация основного скрипта в конфигурационном файле init-ar7240.cfg. В данном случае, скрипт послал группу команд заключенных в фигурные скобки для события
init
. После этого мы можем полноценно работать с процессором и памятью устройства.
> load_image backup_uboot.bin 0x81000000 bin 131072 bytes written at address 0x81000000 downloaded 131072 bytes in 12.250000s (10.449 KiB/s) > load_image backup_art.bin 0x81020000 bin 65536 bytes written at address 0x81020000 downloaded 65536 bytes in 5.440000s (11.765 KiB/s) > load_image 8Muboot_RAM_version.bin 0x80000000 bin 262144 bytes written at address 0x80000000 downloaded 262144 bytes in 21.639999s (11.830 KiB/s) >
Заранее загружаем куда-нибудь в память, загрузчик u-boot и art раздел – позже, эти данные необходимо будет скопировать на флеш-память.
Основное, что мы делаем - мы загружаем 8Muboot_RAM_version.bin загрузчик в область памяти 0x80000000 – загрузчик был скомпилирован с привязкой к этому адресу.
Примечание: Возможно обойтись только загрузчиком 8Muboot_RAM_version.bin (в области памяти 0x80000000) - используя этот загрузчик, можно прошить флеш-память с помощью tftp метода.
Следует знать особенности tftp, в этом загрузчике:- Для доступа к загрузчику, в консоли необходимо успеть ввести tt
- IP адрес компьютера, при этом, должен быть - 192.168.1.23 (или воспользуйтесь командой
setenv
, чтобы изменить значениеserverip
).
- Следующая команда, запустит загрузчик из области SDRAM памяти, одновременно с этим процессом, должна быть запущена еще одна консоль PuTTY, настроенная на последовательный порт:
resume 0x80000000
Загрузчик попытается загрузить firmware из флеш-памяти, чтобы не допустить провала (и как следствие, перезагрузки роутера) - когда в окне появится надпись “Autoboot in ..” нужно быстро написать в консоли tt.
Работа в загрузчике U-boot
Заключительный этап восстановления происходит через загрузчик U-Boot. Необходимо стереть рабочую область флеш-памяти, а потом скопировать ранее записанные данные на флеш-память устройства.
Это можно сделать следующим образом:
AR7241# erase 0x9f000000 +0x20000 Erase Flash from 0x9f000000 to 0x9f01ffff in Bank # 1 First 0x0 last 0x1 sector size 0x10000 Erased 2 sectors AR7241#
Стираем область во флеш-памяти для загрузчика u-boot.
AR7241# cp 0x81000000 0x9f000000 0x20000 Copy to Flash... write addr: 9f000000 done AR7241#
Копируем из области SDRAM памяти, ранее записанный u-boot загрузчик, во флеш-память.
AR7241# erase 0x9f3F0000 +0x10000 Erase Flash from 0x9f3f0000 to 0x9f3fffff in Bank # 1 First 0x3f last 0x3f sector size 0x10000 Erased 1 sectors AR7241#
Стираем область во флеш-памяти для art раздела (флеш-память 4M).
AR7241# cp 0x81020000 0x9f3F0000 0x10000 Copy to Flash... write addr: 9f3f0000 done AR7241#
Копируем из области SDRAM памяти, ранее записанный art раздел, во флеш-память.
Загрузчик для SDRAM и исходные коды можно найти в этом разделе форума.
Расширенные логи работы с программой и используемый материал можно найти на форуме.
Дополнительная информация
Универсальный загрузчик Myloram для устройств Compex на базе процессоров AR71xx и AR724x. Загрузчик может работать на устройствах сторонних производителей с этими процессорами. Описание восстановления устройств в соответствующей инструкции по ссылке.