ru:toh:tp-link:tl-mr3420:debrick.using.jtag

Пример восстановления роутера через JTAG (ar724x)

Примечание: Список роутеров на которых должен работать основной конфигурационный файл для OpenOCD, на самом деле, может быть намного больше (практически все процессоры AR724x). Однако для каждой платформы1) необходим соответствующий, собственный загрузчик, измененный таким образом, чтобы можно было его загружать из SDRAM памяти - без потери функциональности.

Аппаратная часть

JTAG на процессоре

port.jtag Распиновка EJTAG v3.1 интерфейса на AR724x, выглядит следующим образом:

JTAG Common Name AR724x Pin Разъем EJTAG на DIR-615 Ex
EJTAG_SEL (не используем) 7914ти-пиновый EJTAG разъем
TDI 81
TDO 82
TMS 84
TCK 85
RST (не используем) 93

Если отсутствует маркировка отсчета ножек процессора на плате, то можно воспользоваться такой ориентировкой: Распиновка общая на всех процессорах AR724x


Подключение к 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

  • PuTTYtelnet консоль. Эта консоль также используется для подключения к роутеру через последовательный порт.
  • 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. Загрузчик может работать на устройствах сторонних производителей с этими процессорами. Описание восстановления устройств в соответствующей инструкции по ссылке.

1) Устройство с конкретной архитектурой, используемой NOR/NAND/DDR памятью, кол-вом индикаторов, кнопок, привязанность их к номерам GPIO, прочее. Например, здесь рассматривается платформа – AP99
2) При необходимости можно заменить на OCD Commander, но следует помнить, что там другой формат отправки регистров в процессор, поэтому конфиг. файл необходимо переделать под этот формат.
3) TP-Link: U-boot MAC offset 0x01fc00 (value in HEX format)
4) TP-Link: U-boot PIN offset 0x01fe00 (value in Dec format)
ru/toh/tp-link/tl-mr3420/debrick.using.jtag.txt · Last modified: 2014/01/15 01:38 (external edit)