Portál AbcLinuxu, 30. dubna 2025 10:10

Programování hardware přes JTAG opensource nástroji

22.12.2015 00:59 | Přečteno: 2855× | programování | Výběrový blog | poslední úprava: 24.12.2015 00:11

Když se člověk trochu věnuje hardware a embedded systémům, pod rukama mu projdou různé desky. Nástroje od výrobců nebývají vždy ideální a často nebývá verze pro Linux nebo programování desky nelze naskriptovat. Malý přehled debugování, flashování a "unbrickování" přes JTAG adaptéry v Linuxu.

O JTAG adaptérech

Když jsem flashoval poprvé ddwrt před roky do Asus wl500g, byla tam pro mě mysteriózní poznámka "pokud to bricknete, unbrickněte to JTAG adapterem", která mě dost znervózňovala než router nenabootoval s novým firmware. Tehdy mi nic neříkala. Ale postupně jsem zjistil, jak se s JTAG adaptery zachází.

Jak takový JTAG adapter vypadá - zde jsou moje dva nejoblíbenější z důvodu jejich univerzality (jinak jich mám tak minimálně 5): Pozor na používání software původních výrobců s čínskými klony, tento software vám velmi rád klon brickne. Už jsem jednou unbrickoval samotný JTAG adaptér, protože jinak by to nebylo dost meta :-) Vevnitř byl opět ARM procesor implementující JTAG adaptér.

Jako JTAG může posloužit i třeba Raspberry Pi, ale osobně jsem z té bitbang implementace přes GPIO moc dobrý pocit neměl. Někdy to fungovalo, někdy tak úplně ne.

JTAG ve skutečnosti definuje jenom "transportní vrstvu", po které se posílají různé instrukce. Jenom mít JTAG adaptér nestačí, člověk k tomu musí mít konfigurák pro daný hardware, nebo ten konfigurák napsat podle datasheetu. Pokud máte konfigurák, máte téměř vyhráno. Pokud ne, lze to podle definice podobného hardware a datasheetu nějak ohackovat a napsat, ale může to být dost náročné.

Softwarové nástroje

Tyto tři nástroje jsou nejužitečnější pro flashování/unbrickování a hardwarové debugování: OpenOCD funguje v zásadě na všechny běžné singlecore ARMy. Multicore podporováno oficiálně není, ale povedlo se mi rozchodit OpenOCD+GDB na Armada 385, což je dual-core ARM. Funguje debugování jen jednoho jádra, ale na kernelové a bootovací záseky to stačí. ARMy na mobilech jsou multicore, ale hlavně musíte z datasheetu napsat ten konfigurák (nevím, zda jsou vůbec jednoduše získatelné).

Rozchodit to na různých ARM procesorech je s návodem relativně jednoduché. K GDB můžete použít na debugování IDE jako Qt Creator, cokoliv co podporuje remote GDB.

Flashování je vyzkoušeno i pro Lattice CPLD. Mělo by to jít i pro Xilinx FPGA, ale vyzkoušení jsem se ještě nedostal.

Programování MIPS by mělo fungovat taky, ale výrobci routrů mají jeden nehezký zvyk: často fyzicky přerušují spojení na desce k JTAG konektoru ve výrobních sériích a dělají další psí kusy.

UrJTAG

Z příkladu Lattice CPLD výše je vidět dvě komponenty, které potřebujete k flashnutí zařízení: BSDL soubor popisující hardware a SVF program bitbangující jednotlivé piny. Bez BSDL se obejdete, pokud UrJTAG zná zařízení nativně - nese si jistou malou databázi zařízení sebou. Jinak se musí z webu výrobce stáhnout BSDL. SVF soubor vám musí vygenerovat nějaký nástroj a tady se často bez programu od výrobce neobejdete. Navíc UrJTAG rozparsuje jenom SVF revizi D a současná je myslím revize E. Když exportujete, hledejte magický checkbox, kterým řeknete, že chcete revizi D.

Příklad flashnutí přes Jlink:

jtag> cable jlink
J-Link initial read failed, don't worry (result=0)
Vref = 3.352 TCK=1 TDI=0 TDO=1 TMS=0 TRES=1 TRST=1
J-Link JTAG Interface ready
jtag> bsdl path /path/to/bsdl/
jtag> detect
IR length: 4
Chain length: 1
Device Id: 01001001011101000100000000111111 (0x4974403F)
  Filename:     /path/to/bsdl/ATxmega192A3_v3.bsd
jtag> svf data_compiled.svf progress stop

Osobně doporučuji použít UrJTAG jenom když OpenOCD nestačí. UrJTAG je mnohem víc nízkoúrovňový.

ATxmega přes Jlink adaptér

Tohle jde mnohem snáze vyřešit, pokud máte AVR Dragon adaptér. Jenže já ho nemám zrovna po ruce a dostal jsem Chameleon 14443 na debugování. Chameleon je přístroj simulující bezkontaktní karty založené na standardu ISO 14443, např. Mifare Classic, Desfire. Je řízen procesorem ATxmega192a3.

Debugování přes OpenOCD házelo segfaulty, až jsem zjistil, že některé funkce nejsou implementovány v OpenOCD pro tuto architekturu a hází NULL, jehož dereference způsobí segfault. Debugování debuggeru je taky sranda.

Pro tento procesor nešlo z webu Atmelu stáhnout fungující BSDL, tak jsem musel trocha "čarovat" s magickými konstantami. Musí se v BSDL upravit pro ATxmega konstanta IDCODE odpovídající procesoru:
attribute IDCODE_REGISTER of ATxmega192A3 : entity is
  "0100" &
  "1001011101000100" &
  "00000011111" &
  "1";

Bohužel co se týče SVF Atmelí vlastní nástroje (avrsvf) segfaultí a jsou navíc jen pro Windows. Vygenerované SVF není kompletní. Nicméně někdo napsal nástroj, co z hex obrazu generuje SVF pro ATxmega. A generuje SVF novější revize, bez zdrojáků.

Zde jsem chtěl mít rozluštění, ale zatím není (kromě toho počkat si na AVR Dragon). UrJTAG ještě podporuje různé jiné typy programování flash na procesoru, ale to se mu nejdříve musí vysvětlit mapování paměti atd. Ale mít univerzální JTAG zařízení místo speficických programátorů je prostě lepší :-)

Závěr

Pokud vás zajímá hardware, budete na tom mnohem lépe, pokud použijete lépe standardizované architektury jako ARM. S ním to fakt funguje jako po másle a nebudete závislý na nástrojech výrobce. Ostatní architektury lze rozchodit, ale může to být dost práce.        

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

22.12.2015 05:12 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Odpovědět | Sbalit | Link | Blokovat | Admin
Jo já si udělal vlastní protokol pro programování FPGA. Funguje jako TCP server/klient, takže funguje na libovolném stroji s ethernetem. FPGA s ním naprogramuju skoro dvakrát rychleji než jejich XVCD protokol (ten házel segfaulty v xilinx debuggeru). Samozřejmě je na GPIO :-D.
Intel meltdown a = arr[x[0]&1]; karma | 帮帮我,我被锁在中国房
22.12.2015 08:40 Analphabet
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Kde najdem zdrojaky ?
22.12.2015 15:47 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Chystal jsem se napsat blog :-/. Ale já jsem hodně pomalej na psaní. Klidně ho můžu někam nahrát, ale není to finální verze protokolu (je to napevno udělaný pro Xilinx parport emulaci) a ten zdroják něco jako formátování kódu neslyšel ani náhodou. Chystal jsem se udělat plugin do openocd, ale zatím to chcíplo na značné nekompatibilitě.
22.12.2015 08:39 R
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Odpovědět | Sbalit | Link | Blokovat | Admin
Najjednoduchsi JTAG adapter je unbuffered wiggler - 5 odporov na paralelnom porte. OpenOCD to podporuje.
limit_false avatar 22.12.2015 13:58 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
A jak se to používá? Přes USB-parport redukci nebo normální parport na desktopu?

Vím, že původní JTAG adaptery byly právě takhle jednoduché, ale dnes už paralelní port na počítačích defaultně není.

BTW CodeWarrior TAP JTAG adaptér od Freescale má v sobě ARM na kterém běží embedded linux. Povedlo se mi to i dumpnout komplet, protože jsme zkoušeli nějak rozběhnout to jako remote GDB. Právě ten CodeWarrior měl dost podivné bugy, které ale zabraňovali použít to na seriózní debugování (například nešlo maskovat na mpc85xx idle interrupt, což byla výrobci známá chyba).
When people want prime order group, give them prime order group.
22.12.2015 14:52 R
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Cez klasicky paralelny port. Mohlo by to fungovat aj cez nejaky USB prevodnik, ale musel by skutocne vytvarat paralelny port a nie USB tlaciaren.
Josef Kufner avatar 22.12.2015 16:37 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Takové paralelní porty do USB ale prakticky neexistují.

V dnešní době je nejlepší pořídit USB programátor s malým AVR uvnitř, které z jedné strany řeší USB a z druhé SPI pro jednočip – např. toto. Má to dokonce propojku, která když se propojí, tak to jde připojit k druhému programátoru a přeprogramovat.
Hello world ! Segmentation fault (core dumped)
mirec avatar 22.12.2015 17:18 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji

USB má priveľkú latenciu na to, aby dokázalo ovládať rozumnou rýchlosťou paralelný port. Raz som nemal poruke žiaden AVR programátor, chcel som si nahrať aspoň jednoduchý asp programátor do AVR ktorých mám v šuflíku hŕbu a bolo to cez USB hub utrpenie.

LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
Josef Kufner avatar 22.12.2015 17:33 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
To je celkem šílené, ale svým způsobem krásné využití USB hubu :-D
Hello world ! Segmentation fault (core dumped)
23.12.2015 00:00 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
OMG a já si maximálně blikal myší :-D. Akorát FPGA (32Mbit) bych tímhle programovat půl roku :-D.
mirec avatar 23.12.2015 08:29 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji

Je to šialené, ale nie je to najpomalší programátor, ktorý som zostrojil. V ten istý deň som vyrobil programátor s RS232 prevodníku (z toho čo som našiel doma, nečakal som, že nájdem tú správnu zenerovú diódu ale nakoniec som všetko potrebné našiel doma). USB má hnusne vysokú latenciu, neznášam ich protokol a neznášam výrobcov, ktorí z notebookov odstránili express card rozhranie.

LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
Dreit avatar 23.12.2015 13:14 Dreit | skóre: 15 | blog: Dreit a jeho dračí postřehy | Královehradecký kraj
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji

Tak to jsem ještě nežral O_O  Ale vzpomněl jsem si na tohle - http://tuxgraphics.org/electronics/200705/article07052.shtml, kapitola "Solving the chicken and egg problem"

Nope
23.12.2015 18:37 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Nejvtipnější je, když si člověk na PIC32MX nahraje firmware přes JTAG, kterej ten JTAG zakáže :-D.

Jinak bootstrapping je dobrej taky pro flashování firmware čipu pro FPGA. Ten je napojenej na dedikované piny, co umí jenom načíst data při power on (pak jsou GPIO). Programování funguje tak, že tam ofiko programátor nahraje hardware, co implementuje SPI řadič a až pomocí něj přes ty GPIO piny tu flash naprogramuje :-D.
Dreit avatar 23.12.2015 13:15 Dreit | skóre: 15 | blog: Dreit a jeho dračí postřehy | Královehradecký kraj
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji

Skoro bych se vsadil, že uvnit bude USBasp

Nope
Josef Kufner avatar 23.12.2015 14:22 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Ano, je. Více či méně zprasený, podle toho, jaký kousek chytneš a jaký firmware to zrovna má. Pořídil jsem si dva a oba jsem musel přeprogramovat aby to fungovalo s avrdude. Vzhledem k tomu, že jiný programátor jsem neměl, tak jsem měl o zábavu postaráno.
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 23.12.2015 14:25 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
... co je fajn, je to hliníkové pouzdro. Ten oficiální vypadá, že kryt nemá a asi bych se bál, že to přijde při přenášení k úhoně.
Hello world ! Segmentation fault (core dumped)
22.12.2015 15:40 tom
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
A jak se to používá? Přes USB-parport redukci nebo normální parport na desktopu?

Vím, že původní JTAG adaptery byly právě takhle jednoduché, ale dnes už paralelní port na počítačích defaultně není.

Muj laptop s i7 ho ma, staci na to myslet pri nakupu.
22.12.2015 16:09 R
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Viem, ze dock k Latitude E ma paralelny port (a tiez seriovy a dva PS/2). Existuje nieco dalsie?
23.12.2015 09:57 tom
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Jo, paralelni port pro ExpressCard.
22.12.2015 15:44 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
openocd může použít /dev/ppdev XOR porty. A na USB by to jet mělo. V obou případech to bude super pomalý, protože parport dá tak 100kHz TCK. Hlavně když máš USB, tak už můžeš rovnou FTDI.
22.12.2015 15:49 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
To může blbnout, na LPT jsem míval i 4V a navíc většina mých JTAG věcí je stejně na 3.3V.
22.12.2015 16:04 R
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Moze, ale mne sa to celkom osvedcilo - ozivil som tym par mrtvych tlaciarni Samsung. Maju vlastny ARM procesor Jupiter4E.
22.12.2015 10:09 tom
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Odpovědět | Sbalit | Link | Blokovat | Admin
Pouzivam v Linux komerecni Trace32 a jsem vcelku spokojen.
22.12.2015 16:02 BFU
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
+1
23.12.2015 22:47 Roman Došek | skóre: 17 | blog: flare
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Odpovědět | Sbalit | Link | Blokovat | Admin
Kromě OpenOCD existuje také PyOCD, který funguje jako drop-in replacement za OpenOCD, nebo ho lze použít i přímo z Pythonu.

Zmíněný QtCreator také v posledních verzích obsahuje BareMetal plugin, ve kterém je přímo podpora pro STLink a OpenOCD(PyOCD) a lze přes to velmi jednoduše ARMy programovat. Na buildování projektu je pak možné použít QMake(ale ten potřebuje fake Qt instalaci), CMake nebo QBS(který se mi zatím libí nejvíc). Zatím jsem s tím zkoušel vytvořit projekt pro STM32F4Discovery který používal CMSIS, STM32-HAL a µOS++. Jediné co mi zatím nefungovalo byl semihosting ale strávil jsem nad tím jen málo času... Kdyby byl zájem, tak o tom mohu něco sepsat. ;-)
24.12.2015 16:51 Václav Vanc | skóre: 14
Rozbalit Rozbalit vše Re: Programování hardware přes JTAG opensource nástroji
Ahoj, u mne by zájem byl... :)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.