Poškodením bootloadera na základnej doske môjho routera sa mi ho podarilo soft-bricknúť. Bootloader je zvyčajne prvá sada softvérových inštrukcií, ktorú základná doska vykoná po zapnutí. Soft-brick znamená, že zariadenie sa nespustí, ale dá sa oživiť, teda de-bricknúť.

Postup de-brickovania závisí od krokov, ktoré spôsobili poškodenie. Nahradenie poškodených inštrukcií bootloadera správnymi môže zariadenie opäť spustiť, za predpokladu, že nič iné nebolo poškodené.

Na základných doskách bez väčšieho dôrazu na priestorové obmedzenia – do tejto kategórie patrí takmer celá spotrebná elektronika s výnimkou mobilných telefónov – môže byť program bootloadera uložený na ľahko identifikovateľnom flash čipe. Mnohé také flash čipy používajú rovnaký fyzický obal s bežným rozložením pinov. To je výhodné pre výrobcu, pretože pripojenie čipu k programátoru vyžaduje len špecializovaný kliešťový nástroj a zapísanie firmvéru do zariadenia si vyžaduje len minimálne úsilie. Programátor v tomto kontexte je ďalšie zariadenie, ktoré prekladá súbor na disku na nízkoúrovňové elektronické impulzy, ktorým čip rozumie – v tomto scenári uloží program do nevolatilnej pamäte.

Ale toto nastavenie nie je výhodné len pre výrobcu. V skutočnosti je to výhodné aj pre každého používateľa odhodlaného modifikovať alebo rozšíriť funkcionalitu takéhoto zariadenia. Motívov je veľa. Oprava chyby, zvýšenie bezpečnosti zariadenia, zníženie obáv o súkromie zariadenia alebo úplne iné využitie zariadenia.

Raspberry Pi ako programátor #

Mnohí ľudia dnes majú odložené Raspberry Pi niekde v zásuvke. A samozrejme sa dá repurposovať ako programátor v mnohých situáciách, pretože sa môže pochváliť mnohými periférnymi zariadeniami, či už vysokoúrovňovými ako Ethernet a Wi-fi na pripojenie k počítaču, alebo nízkoúrovňovými ako UART, I2C a SPI na pripojenie čipu na druhej strane.

Čip, s ktorým som pracoval, bol Winbond W25Q64.V, 64Mb čip komunikujúci cez SPI, bežná súčiastka na trhu, ktorú okrem TP-link routerov nájdete aj v notebookoch ThinkPad.

Buď odkomentujte riadok v /boot/config.txt:

device_tree_param=spi=on

Alebo použite raspi-config GUI dostupné z AUR:

sudo raspi-config

Interfacing options > SPI > Yes

Na mojom zariadení bol potrebný reboot:

sudo systemctl reboot

Po reboote sa uistite, že existuje výstup^[https://www.raspberrypi-spy.co.uk/2014/08/enabling-the-spi-interface-on-the-raspberry-pi/]:

lsmod | grep spi_

Zariadenia umiestnené na /dev/spidev* by mali byť dostupné:

ls /dev/spidev*

Raspberry Pi 3 ponúka dva hardvérové SPI porty, SPI0 ako spidev0.0 a SPI1 ako spidev0.1.

crw------- 1 root root 153, 0 Mar 15 16:07 /dev/spidev0.0
crw------- 1 root root 153, 1 Mar 15 16:07 /dev/spidev0.1

Všimnite si, že porty sú v skupine root a budú vyžadovať oprávnenia na použitie.

Zapojenie #

Tabuľka zapojenia pre použitý flash čip. Pre SOIC-8 flash čip možno túto tabuľku znovu použiť, keďže mnohé také čipy sú pinovo kompatibilné. Väčšina návodov vrátane tohto predpokladá použitie SPI0.

Flash PinFlash MeaningPi SPI0Pi SPI1Pi Meaning
1CS2436CS0
2DO2135MISO
3WP17173V3
4GND2525GND
5DI1938MOSI
6CLK2340SCLK
7HOLD17173V3
8VCC17173V3

Inštalácia flashromu #

flashrom je nástroj na identifikáciu, čítanie, zápis, overovanie a mazanie flash čipov. Je navrhnutý na flashovanie BIOS/EFI/coreboot/firmware/optionROM obrazov na základných doskách, kartách sieťových/grafických/úložných radičov a rôznych iných programátorových zariadeniach. ^[https://flashrom.org/Flashrom]

flashrom je dostupný v Arch community repozitároch:

sudo pacman -S flashrom

Overte inštaláciu spustením flashrom:

Please select a programmer with the —programmer parameter. Valid choices are:
dummy, ft2232_spi, serprog, buspirate_spi, dediprog, developerbox, pony_spi, linux_mtd, linux_spi, usbblaster_spi, pickit2_spi, ch341a_spi, digilent_spi, stlinkv3_spi.

S Pi bude fungovať programátor linux_spi:

flashrom -p linux_spi

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Using default 2000kHz clock. Use ‘spispeed’ parameter to override.
No SPI device given. Use flashrom -p linux_spi:dev=/dev/spidevX.Y
Error: Programmer initialization failed.

Je zrejmé, že nástroj ponúka užitočné tipy na používanie, kompletný parameter programátora vyzerá takto:

flashrom -p linux_spi:dev=/dev/spidev0.0

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Using default 2000kHz clock. Use ‘spispeed’ parameter to override.
linux_spi_init: failed to open /dev/spidev0.0: Permission denied
Error: Programmer initialization failed.

Poznámka k oprávneniam #

Na Debian-based Raspberry Pi distribúcii by stačilo pridať používateľa do skupiny spi a znovu sa prihlásiť. Na Archlinux ARM taká skupina predvolene neexistuje a /dev/spidev* vlastní root. Na použitie SPI portov buď použite sudo flashrom alebo alarm udev pravidlá.

Použitie flashromu #

Sondujte čip a uistite sa, že zapojenie a nastavenie sú správne:

flashrom -p linux_spi:dev=/dev/spidev0.0

Ak je nastavenie správne, čip je rozpoznaný:

Found Winbond flash chip “W25Q64.V” (8192 kB, SPI) on linux_spi.

Niekedy sa rozpozná viacero definícií čipov^[https://openwrt.org/toh/tp-link/archer_mr200#unbricking_your_router]:

Found Macronix flash chip “MX25L6405” (8192 kB, SPI) on linux_spi.
Found Macronix flash chip “MX25L6405D” (8192 kB, SPI) on linux_spi.
Found Macronix flash chip “MX25L6406E/MX25L6408E” (8192 kB, SPI) on linux_spi.
Found Macronix flash chip “MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F” (8192 kB, SPI) on linux_spi.

Multiple flash chip definitions match the detected chip(s): “MX25L6405”, “MX25L6405D”, “MX25L6406E/MX25L6408E”, “MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F”
Please specify which chip definition to use with the -c option.

Ak to nastane, pomôžte mu vybrať správny typ čipu, môže byť napísaný na fyzickom obale:

flashrom -p linux_spi:dev=/dev/spidev0.0 -c MX25L6405D

Found Macronix flash chip “MX25L6405D” (8192 kB, SPI) on linux_spi.:w

Keď sú formalitíy vybavené, uložte obsah flash do súboru (v prípade potreby zadajte parameter -c):

flashrom -p linux_spi:dev=/dev/spidev0.0 -r original.bin

Found Winbond flash chip “W25Q64.V” (8192 kB, SPI) on linux_spi. Reading flash… done.

Upozornenie: Nasledujúci príkaz prepíše obsah flash čipu, čo môže potenciálne zbrickovať/poškodiť vaše zariadenie.

Zapíšte obsah flash zo súboru do flash:

flashrom -p linux_spi:dev=/dev/spidev0.0 -w new.bin

Found Winbond flash chip “W25Q64.V” (8192 kB, SPI) on linux_spi.
Reading old flash chip contents… done.
Erasing and writing flash chip… Erase/write done.
Verifying flash… VERIFIED.

Ak je obsah nového súboru platná sada inštrukcií so správnymi dátami, prípadne bootloader, zariadenie by sa teraz malo spustiť, ak to bol váš cieľ.

Toto je 27. príspevok #100daystooffload.