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í
|
| 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.
Tiskni
Sdílej:
Komentáře
Vložit další komentář
22.12.2015 08:39
R
Re: Programování hardware přes JTAG opensource nástroji
22.12.2015 10:09
tom
Re: Programování hardware přes JTAG opensource nástroji
23.12.2015 22:47
Roman Došek | skóre: 17
| blog:
flare
Re: Programování hardware přes JTAG opensource nástroji
Založit nové vlákno •
Nahoru
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.