Хабрахабр

Как я реанимировал устройство (JTAG-эмулятор BH-USB-560v2) через U-Boot

Однако статья может быть полезна тем, кто пытается реанимировать что-нибудь на базе одноплатника с Linux, имея ограниченные ресурсы и информацию. У меня есть сомнения, что JTAG-эмулятор для отладки процессоров фирмы Texas Instruments — настолько распространённое устройство, чтобы его реанимация была бы кому-то интересна. Можно рассматривать это как некоторый практикум работы с U-Boot.

Blackhawk USB560v2

Для семейства процессоров фирмы Texas Instruments используются адаптеры, называемые JTAG-эмуляторами. Тот, кто занимался отладкой программ для встраиваемых систем, знает, что для подключения к процессорам нужно использовать специальные устройства.

В моём парке помимо прочих значится Blackhawk USB560v2. Их существует множество, и от разных производителей. И вот однажды она перестала работать без видимых на то причин. Надо признаться, не самая дешёвая железка.

Моргал светодиод, но в состояние "готово к использованию" не переходил. Всё произошло в один прекрасный день, девайс просто перестал загружаться и определяться по USB.

Однако моё устройство в этот режим переходить отказывалось, до этапа USB нумерации не доходило, и поэтому возможности перепрошить штатной утилитой не было. У этого устройства есть занятный документированный режим: после 10-15 неудачных загрузок оно должно было перейти в специальный режим (safe mode), который позволил бы его перепрошить. Переписка со службой поддержки ни к чему не привела: по технике помогать они мне отказались, предложив лишь отправить (за свой счёт) девайс им в США на диагностику и ремонт.

Ничего не оставалось, как приступить к самостоятельной починке.

На хосте установлен Ubuntu, некоторые использованные утилиты входят в дистрибутив, некоторые устанавливаются через apt.

image

На плате расположены: Разбираем, смотрим на плату.

54 мм, так ещё и контакты были подписаны. Особенно порадовал заботливо офомленный разъём UART, который мало того, что был разведён под стандартную гребёнку 2. Такого я не встречал уже давно, максимум пятачки на плате, да ещё и с ничего не значащими маркировками типа TP1 и т.п.

3 В). Подключаем USB-UART (не забываем про уровень, он здесь 3. Запускаем minicom, получаем:

TI UBL Version: 1.13, Flash type: NAND Booting PSP Boot Loader PSPBootMode = NAND Starting NAND Copy... Initializing NAND flash... Manufacturer ID = 0x0000002C Device ID = 0x000000A1 Pages Per Block = 0x00000040 Number of Blocks = 0x00000400 Bytes Per Page = 0x00000800 Valid MagicNum found at block 0x00000001, page 0x00000008
NAND Boot success. DONE U-Boot 2010.12 (May 09 2012 - 13:10:23) Cores: ARM 257 MHz, DSP 513 MHz
DDR: 162 MHz
I2C: ready
DRAM: 256 MiB
NAND: 128 MiB
MMC: Bad block table found at page 65472, version 0x01
Bad block table found at page 65408, version 0x01
In: serial
Out: serial
Err: serial
Read USBID pin : DEVICE
Read boot progress legacy : 0
Read boot progress : 0
Write boot progress legacy : 0
Write boot progress : 0
Hit any key to stop autoboot: 0 Loading from NAND 128MiB 1,8V 8-bit, offset 0x60000 Image Name: Linux-2.6.10_mvl401-xds560 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1236292 Bytes = 1.2 MiB Load Address: 80008000 Entry Point: 80008000
NAND read from offset 60000 failed -74
** Read error
## Booting kernel from Legacy Image at 80700000 ... Image Name: Linux-2.6.10_mvl401-xds560 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1236292 Bytes = 1.2 MiB Load Address: 80008000 Entry Point: 80008000 Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!

Как видим, последовательность вполне стандартная: сначала грузится bootloader (TI UBL), затем U-Boot, который в свою очередь грузит ядро Linux.

Однако можно прервать загрузку и войти в консоль U-Boot. По логу очевидно, что что-то слетело во внутренней NAND Flash, при загрузке ядра Linux не сходится контрольная сумма.

Ознакомимся с доступными командами:

Их немало

U-Boot > help
? - alias for 'help'
askenv - get environment variables from stdin
base - print or set address offset
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
editenv - edit environment variable
eeprom - EEPROM sub-system
env - environment handling commands
exit - exit script
false - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print command description/usage
i2c - I2C sub-system
iminfo - print header information for application image
imxtract- extract a part of a multi-image
itest - return true/false on integer compare
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mdc - memory display cyclic
mii - MII utility commands
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mtest - simple RAM read/write test
mw - memory write (fill)
mwc - memory write cyclic
nand - NAND sub-system
nboot - boot from NAND device
nm - memory modify (constant address)
printenv- print environment variables
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
showvar - print local hushshell variables
sleep - delay execution for some time
source - run script from memory
test - minimal test like /bin/sh
true - do nothing, successfully
usb - USB sub-system
usbboot - boot from USB device
version - print monitor version

Посмотрим переменные окружения:

U-Boot > printenv autokern=0x60000
autoroot=/dev/mtdblock3
baudrate=115200
bootcmd=nboot 80700000 0 $; run setbootargsnand; bootm
setbootargsnand=setenv bootargs mem=64M console=ttyS0,${baudrate}n8 root=${autoroot} rw rootfstype=jffs2 ip=off
stderr=serial
stdin=serial
stdout=serial
ver=U-Boot 2010.12 (May 09 2012 - 13:10:23) Environment size: 338/16380 bytes

Первым делом я попытался отключить проверку и загрузиться с помощью команд U-Boot.

U-Boot > setenv verify n
U-Boot > boot

Продвинулся чуть дальше, но не намного:

## Booting kernel from Legacy Image at 80700000 ... Image Name: Linux-2.6.10_mvl401-xds560 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1236292 Bytes = 1.2 MiB Load Address: 80008000 Entry Point: 80008000 Loading Kernel Image ... OK
OK Starting kernel ... Uncompressing Linux................................................................................. crc error te

Дальше устройство виснет.

Размер образа ядра, как видно из лога, составляет 1236292 байт. Из переменных окружения видно, что образ ядра лежит в NAND Flash со смещением 0x60000, при загрузке копируется по адресу 0x80700000 (согласно memory map процессора это адресное пространство внешней памяти DRAM) и загружается. Предполагаем, что образ хранится в формате uImage, поэтому накидываем 64 байта на заголовок, получаем 1236356 байт = 0x12DD84: Я попробовал проделать это вручную.

U-Boot > nand read 80700000 60000 12dd84
U-Boot > iminfo ## Checking Image at 80700000 ... Legacy image found Image Name: Linux-2.6.10_mvl401-xds560 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1236292 Bytes = 1.2 MiB Load Address: 80008000 Entry Point: 80008000 Verifying Checksum ... Bad Data CRC

Я не придумал ничего лучше, как записать лог консоли с выводом памяти на экран, а затем преобразовать его в бинарный файл. Дальше мне захотелось выкачать дамп образа на компьютер, чтобы поиграться с ним.

Запускаем minicom с записью лога:

minicom -C orig-uImage.txt

Выводим содержимое памяти на экран:

U-Boot > md.b 80700000 12dd84

Выходим из minicom, редактируем лог, убрав лишние строчки, преобразуем в бинарник:

xxd -r -seek -0x80700000 orig-uImage.txt orig-uImage

Удаляем первые 64 байта, а затем делаем новый uImage: Мне захотелось перепаковать образ, чтобы он не выдавал ошибки контрольной суммы.

mkimage -A arm -T kernel -C none -a 80008000 -e 80008000 -n "Linux-2.6.10_mvl401-xds560" -d orig-uImage patched-uImage

Заливаем полученный файл обратно по протоколу YModem:

U-Boot > loady ## Ready for binary (ymodem) download to 0x80700000 at 115200 bps... C## Total Size = 0x0012dd84 = 1236356 Bytes
U-Boot > iminfo ## Checking Image at 80700000 ... Legacy image found Image Name: Linux-2.6.10_mvl401-xds560 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1236292 Bytes = 1.2 MiB Load Address: 80008000 Entry Point: 80008000 Verifying Checksum ... OK

Пробуем загрузиться, но также виснем на этапе распаковки ядра:

U-Boot > bootm
## Booting kernel from Legacy Image at 80700000 ... Image Name: Linux-2.6.10_mvl401-xds560 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1236292 Bytes = 1.2 MiB Load Address: 80008000 Entry Point: 80008000 Verifying Checksum ... OK Loading Kernel Image ... OK
OK Starting kernel ... Uncompressing Linux................................................................................. crc error te

Но хотя бы прокачали воркфлоу обмена файлами, уже неплохо. Вполне ожидаемо, на что тут можно было надеяться.

0. Всё, что у нас есть, это файл прошивки с сайта производителя, USB560v2_firmware_5. 0.bin. 573. Поэтому, признаюсь, я сорвался и написал производителю просьбу предоставить мне небитый uImage с тем, чтобы я его залил в устройство и загрузился с него, а потом уже смог бы перепрошить устройство штатной утилитой по USB. Я предполагал, что в этом файле содержится образ ядра, но разумно было бы ожидать, что файл зашифрован хотя бы простеньким ключом. Даже сослался на условия GPL (под которой распространяется Linux), по которым им не мешало бы в дополнение предоставить и исходные коды ядра.

И, о чудо, получилось! Сразу после отправки запроса я решил всё же попробовать распаковать файл прошивки, как простой архив.

tar -xf USB560v2_firmware_5.0.573.0.bin

То, что доктор прописал, образ ядра и корневая файловая система. После распаковки появилось два файла: uImage и rootfs.tar.gz.

Устройство успешно загрузилось в тот самый safe mode, я дал отбой тех. Осталось залить uImage в память устройства по YModem и запуститься, что я и сделал. поддержке производителя и, думая, что прошью устройство в следующий раз, спокойно отправился спать.

Устройство перестало успешно загружаться. Однако на следующий день меня ждал неприятный сюрприз. Что я только не перепробовал, получал ошибку:

INIT: PANIC: segmentation violation! sleeping for 30 seconds.

Длинный лог загрузки ядра

Starting kernel ... Uncompressing Linux................................................................................. done, booting thelLinux version 2.6.10_mvl2
CPU: ARM926EJ-Sid(wb) [41069265] revision 5 (ARMv5TEJ)
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets
CPU0: D cache: 8192 bytes, associativity 4, 32 byte lines, 64 sets
Machine: DaVinci EVM
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists
Kernel command line: mem=64M console=ttyS0,115200n8 root=/dev/mtdblock3 rw rootfstype=jffs2 ip=off
PID hash table entries: 512 (order: 9, 8192 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 64MB = 64MB total
Memory: 62080KB available (2118K code, 448K data, 136K init)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
spawn_desched_task(00000000)
desched cpu_callback 3/00000000
ksoftirqd started up.
desched cpu_callback 2/00000000
desched thread 0 started up.
NET: Registered protocol family 16
Registering platform device 'nor_davinci.0'. Parent at platform
Registering platform device 'nand_davinci.0'. Parent at platform
DaVinci I2C DEBUG: 12:46:30 Mar 29 2012
Registering platform device 'i2c'. Parent at platform
musb_hdrc: version 2.2a/db-0.4.8 [cppi-dma] [peripheral] [debug=0]
Registering platform device 'musb_hdrc'. Parent at platform
musb_hdrc: USB Peripheral mode controller at c4800000 using DMA, IRQ 12
JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc.
yaffs Mar 29 2012 12:46:15 Installing. Registering platform device 'davincifb.0'. Parent at platform
Console: switching to colour frame buffer device 90x30
Serial: 8250/16550 driver $Revision: 1.90 $ 2 ports, IRQ sharing disabled
Registering platform device 'serial8250'. Parent at platform
ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
io scheduler noop registered
io scheduler anticipatory registered
RAMDISK driver initialized: 1 RAM disks of 32768K size 1024 blocksize
Registering platform device 'ti_davinci_emac'. Parent at platform
TI DaVinci EMAC: MAC address is 00:00:00:04:12:64
TI DaVinci EMAC Linux version updated 4.0
TI DaVinci EMAC: Installed 1 instances.
netconsole: not configured, aborting
i2c /dev entries driver
elevator: using anticipatory as default io scheduler
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xa1 (Unknown NAND 128MiB 1,8V 8-bit)
Scanning device for bad blocks
Creating 8 MTD partitions on "nand_davinci.0":
0x00000000-0x00020000 : "params"
0x00020000-0x00060000 : "bootloader"
0x00060000-0x00260000 : "safekernel"
0x00260000-0x01260000 : "saferootfs"
0x01260000-0x01460000 : "kernel"
0x01460000-0x02860000 : "rootfs"
0x02860000-0x03860000 : "application"
0x03860000-0x03c60000 : "logging"
nand_davinci: hardware revision: 2.1
mice: PS/2 mouse device common for all mice
NET: Registered protocol family 2
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 4096 bind 8192)
NET: Registered protocol family 1
NET: Registered protocol family 17
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000016c: 0xffef instead
Empty flash at 0x00a237fc ends at 0x00a23800
Empty flash at 0x00c3b7d8 ends at 0x00c3b800
mtd->read(0x1f320 bytes from 0xec0ce0) returned ECC error
mtd->read(0x1fb8c bytes from 0xf20474) returned ECC error
VFS: Mounted root (jffs2 filesystem).
Freeing init memory: 136K
mtd->read(0x44 bytes from 0xf39da8) returned ECC error
mtd->read(0x988 bytes from 0xf39420) returned ECC error
mtd->read(0x44 bytes from 0xed8d20) returned ECC error
jffs2_get_inode_nodes(): Data CRC failed on node at 0x00ed8d20: Read 0xa8462b94, calculated 0xa03c90e8
mtd->read(0xa7e bytes from 0xed82a0) returned ECC error
jffs2_get_inode_nodes(): Data CRC failed on node at 0x00c3ad78: Read 0x31ac7e30, calculated 0xa52ecb11
jffs2_get_inode_nodes(): Data CRC failed on node at 0x00a22d9c: Read 0x31ac7e30, calculated 0xe9f89c4c
mtd->read(0x988 bytes from 0xf39420) returned ECC error
mtd->read(0xa7e bytes from 0xed82a0) returned ECC error
INIT: version 2.85 booting
INIT: PANIC: segmentation violation! sleeping for 30 seconds.
jffs2_get_inode_nodes(): Data CRC failed on node at 0x00a2ad10: Read 0x5fa921cc, calculated 0x5282f1d9
INIT: PANIC: segmentation violation! sleeping for 30 seconds.

Что ж, значит надо прошить и её. Я сделал вывод, что корневая файловая система так же повредилась.

При работе с NAND на всякий случай выравниваем размер образа до размера страницы NAND в большую сторону (где-то встречал такую рекомендацию), а размер страницы у нас составляет 1024 байта = 0x800 (см. Для начала запишем uImage в NAND, чтобы не грузить какждый раз через UART (надо признаться, на скорости 115200 файл даже размером в один мегабайт грузится ощутимое время). самый первый лог).

U-Boot > loady ...
U-Boot > nand erase 60000 12DC00
U-Boot > nand write 80700000 60000 12DC00

Из лога загрузки ядра выделяем полезную информацию:

Creating 8 MTD partitions on "nand_davinci.0":
0x00000000-0x00020000 : "params"
0x00020000-0x00060000 : "bootloader"
0x00060000-0x00260000 : "safekernel"
0x00260000-0x01260000 : "saferootfs"
0x01260000-0x01460000 : "kernel"
0x01460000-0x02860000 : "rootfs"
0x02860000-0x03860000 : "application"
0x03860000-0x03c60000 : "logging"

Осталось только понять, в каком формате. Значит корневую файловую систему надо записать в NAND со смещением 0x260000. Вспоминаем про переменные окружения U-Boot, в частности про вот эту строчку:

setbootargsnand=setenv bootargs mem=64M console=ttyS0,${baudrate}n8 root=${autoroot} rw rootfstype=jffs2 ip=off

По подсказке с Wiki от Texas Instruments делаем это (sudo нужен для tar, так без него выдаёт ошибки при запуске команды mknod): Значит, нам надо преобразовать наш rootfs.tar.gz, выуженный из файла прошивки, в формат JFFS2.

mkdir rootfs
sudo tar -xf rootfs.tar.gz -C rootfs
mkfs.jffs2 -n -r rootfs -e 16 -o rootfs.jffs2

Загружаем полученный файл в память устройство, а затем копируем в нужный участок NAND (размер также округляем до страницы):

U-Boot > loady ...
U-Boot > nand erase 260000 39f000
U-Boot > nand write 80700000 260000 39f000

Скрещиваем пальцы, перезагружаемся, ну теперь уж всё точно хорошо.

Очень длинный полный лог успешной загрузки

TI UBL Version: 1.13, Flash type: NAND
Booting PSP Boot Loader
PSPBootMode = NAND
Starting NAND Copy...
Initializing NAND flash...
Manufacturer ID = 0x0000002C
Device ID = 0x000000A1
Pages Per Block = 0x00000040
Number of Blocks = 0x00000400
Bytes Per Page = 0x00000800
Valid MagicNum found at block 0x00000001, page 0x00000008
NAND Boot success. DONE U-Boot 2010.12 (May 09 2012 - 13:10:23) Cores: ARM 257 MHz, DSP 513 MHz
DDR: 162 MHz
I2C: ready
DRAM: 256 MiB
NAND: 128 MiB
MMC: Bad block table found at page 65472, version 0x01
Bad block table found at page 65408, version 0x01
In: serial
Out: serial
Err: serial
Read USBID pin : DEVICE
Read boot progress legacy : 3
Read boot progress : 10
Write boot progress legacy : 2
Write boot progress : 9
Hit any key to stop autoboot: 0 Loading from NAND 128MiB 1,8V 8-bit, offset 0x1260000 Image Name: Linux-2.6.10_mvl401-xds560 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1235632 Bytes = 1.2 MiB Load Address: 80008000 Entry Point: 80008000
## Booting kernel from Legacy Image at 80700000 ... Image Name: Linux-2.6.10_mvl401-xds560 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1235632 Bytes = 1.2 MiB Load Address: 80008000 Entry Point: 80008000 Verifying Checksum ... OK Loading Kernel Image ... OK
OK Starting kernel ... Uncompressing Linux................................................................................. done, booting thelLinux version 2.6.10_mvl2
CPU: ARM926EJ-Sid(wb) [41069265] revision 5 (ARMv5TEJ)
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets
CPU0: D cache: 8192 bytes, associativity 4, 32 byte lines, 64 sets
Machine: DaVinci EVM
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists
Kernel command line: mem=64M console=ttyS0,115200n8 root=/dev/mtdblock5 rw rootfstype=jffs2 ip=off
PID hash table entries: 512 (order: 9, 8192 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 64MB = 64MB total
Memory: 62080KB available (2118K code, 448K data, 136K init)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
spawn_desched_task(00000000)
desched cpu_callback 3/00000000
ksoftirqd started up.
desched cpu_callback 2/00000000
desched thread 0 started up.
NET: Registered protocol family 16
Registering platform device 'nor_davinci.0'. Parent at platform
Registering platform device 'nand_davinci.0'. Parent at platform
DaVinci I2C DEBUG: 12:46:30 Mar 29 2012
Registering platform device 'i2c'. Parent at platform
musb_hdrc: version 2.2a/db-0.4.8 [cppi-dma] [peripheral] [debug=0]
Registering platform device 'musb_hdrc'. Parent at platform
musb_hdrc: USB Peripheral mode controller at c4800000 using DMA, IRQ 12
JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc.
yaffs Mar 29 2012 12:46:15 Installing. Registering platform device 'davincifb.0'. Parent at platform
Console: switching to colour frame buffer device 90x30
Serial: 8250/16550 driver $Revision: 1.90 $ 2 ports, IRQ sharing disabled
Registering platform device 'serial8250'. Parent at platform
ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
io scheduler noop registered
io scheduler anticipatory registered
RAMDISK driver initialized: 1 RAM disks of 32768K size 1024 blocksize
Registering platform device 'ti_davinci_emac'. Parent at platform
TI DaVinci EMAC: MAC address is 00:00:00:04:12:64
TI DaVinci EMAC Linux version updated 4.0
TI DaVinci EMAC: Installed 1 instances.
netconsole: not configured, aborting
i2c /dev entries driver
elevator: using anticipatory as default io scheduler
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xa1 (Unknown NAND 128MiB 1,8V 8-bit)
Scanning device for bad blocks
Creating 8 MTD partitions on "nand_davinci.0":
0x00000000-0x00020000 : "params"
0x00020000-0x00060000 : "bootloader"
0x00060000-0x00260000 : "safekernel"
0x00260000-0x01260000 : "saferootfs"
0x01260000-0x01460000 : "kernel"
0x01460000-0x02860000 : "rootfs"
0x02860000-0x03860000 : "application"
0x03860000-0x03c60000 : "logging"
nand_davinci: hardware revision: 2.1
mice: PS/2 mouse device common for all mice
NET: Registered protocol family 2
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 4096 bind 8192)
NET: Registered protocol family 1
NET: Registered protocol family 17
mtd->read(0x400 bytes from 0x0) returned ECC error
VFS: Mounted root (jffs2 filesystem).
Freeing init memory: 136K
INIT: version 2.85 booting
0
Mounting local filesystems: mount none on /var/log type tmpfs (rw,size=2M)
none on /var/lock type tmpfs (rw)
none on /var/run type tmpfs (rw)
INIT: Entering runlevel: 3
/etc/rc.d/rc3.d/S88davinci_mmc: 69: /usr/local/bin/sd_app: not found
Registering platform device 'mmc0.1'. Parent at platform : Supporting 4-bit mode
/etc/rc.d/rc3.d/S90fsemulator: 72: /usr/local/bin/sd_app: not found
bh560v2u gadget: Blackhawk USB560v2 System Trace Emulator, version: 1.00
bh560v2u gadget: using musb_hdrc, OUT ep1out IN ep1in
bh560v2u gadget: DTC-USB device attached to major/minor numbers 254 0
/etc/rc.d/rc3.d/S93dsplink: 69: /usr/local/bin/sd_app: not found
bh560v2u gadget: high speed config #1: High-speed configuration
dsplinkk: no version for "struct_module" found: kernel tainted.
DSPLINK Module (1.51) created on Date: Mar 29 2012 Time: 12:48:55
/etc/rc.d/rc3.d/S95fpgaprog: 72: /usr/local/bin/sd_app: not found
Device '/dev/mem' opened successfully.
Turned off Debug Clock
Turned off Trace Clock
FPGA erased successfully
FPGA data length=460284
Device '/dev/mem' opened successfully.
Programming FPGA: FPGA Image CRC=39550, FPGA programmed CRC=28013
Turned on Debug Clock
Turned on Trace Clock
Device #1 IDCODE is 020F30DD
configuring SRAM device(s)...
DONE
Exit code = 0... Success
/etc/rc.d/rc3.d/S96dtc_main: 70: /usr/local/bin/sd_app: not found MontaVista(R) Linux(R) Professional Edition 4.0.1 (0600980) (none) login: emac_control:4584[0]ioctl called when device is NOT open<3>ERROR: davinci_emac: eth0 error: Error 3000000E from EMAC TX Channel O)
SIOCSIFHWADDR: Input/output error Failed to reset boot progress: dtc_periph_lock.cpp(78) : timeout : /var/lock/i2c MontaVista(R) Linux(R) Professional Edition 4.0.1 (0600980) 00:00:00:04:12:64 login: root Welcome to MontaVista(R) Linux(R) Professional Edition 4.0.1 (0600980). login[825]: root login on `console' #

Но я лично для себя узнал немало нового о низкоуровневых вещах в процессе загрузки встраиваемого Linux, научился работать с консолью U-Boot. Да, итоговая процедура получилась не очень-то сложной, настоящего реверс-инжиниринга здесь в сущности немного.

Для обладателей Blackhawk USB560v2

После загрузки устройство предлагается залогиниться. Видно, что защитой ребята особо не заморачивались. Самое интересное содержится в директории /usr/local/bin. Логин root без пароля позволяет зайти под рутом и делать с устройством всё что угодно.

Но это уже совсем другая история.

Надеюсь, было интересно.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть