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

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

Blackhawk USB560v2

Вместо предисловия

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

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

Симптомы

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

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

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

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

Внешний осмотр

image

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

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

Приступим

Подключаем USB-UART (не забываем про уровень, он здесь 3.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.

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

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

Их немало

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 ${autokern}; 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

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

Из переменных окружения видно, что образ ядра лежит в NAND Flash со смещением 0x60000, при загрузке копируется по адресу 0x80700000 (согласно memory map процессора это адресное пространство внешней памяти DRAM) и загружается. Размер образа ядра, как видно из лога, составляет 1236292 байт. Я попробовал проделать это вручную. Предполагаем, что образ хранится в формате 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

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

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

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

tar -xf USB560v2_firmware_5.0.573.0.bin

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

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

Вторая серия

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

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.

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

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

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

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

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

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

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

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

FavoriteLoadingДобавить в избранное
Posted in Без рубрики

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

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