Produkty Novinky Články Návody Kontakty

Konfigurace OpenOCD

Vytvořili jsme spojení mezi USB portem osobního počítače a JTAG rozhraním mikrokontroléru LM3S800. Abychom mohli debugger plnohodnotně a pohodlně používat, musíme zprovoznit jeho softwarovou část. Hlavním stavebním kamenem bude software open source projektu OpenOCD.
Na obrázku 1.4 je rozkresleno blokové schéma propojení jednotlivých elementů debuggeru. Začneme konfigurovat jednotlivé bloky schématu směrem od procesoru.
Ladicí jednotka uvnitř procesoru je již hotová od výrobce. Její komunikační kanál se světem je JTAG rozhraní, které máme propojené přes obvod FT2232D na USB port počítače. Následuje USB ovladač pro komunikaci s obvodem FT2232D a program OpenOCD.
Program OpenOCD je spouštěn jako TCP/IP server. Konvertuje ladící a monitorovací příkazy na proud nul a jedniček, které jsou odesílány na vstup TDI rozhraní JTAG procesoru a zpět konveruje odpovědi z výstupu TDO. Proces OpenOCD je spuštěn jako TCP/IP server, který implementuje servery protokolů Telnet a GDB. Jakmile bude program OpenOCD zprovozněn, otestujeme obě rozhraní programy telnet a gdb.
obrázek debugger-software-connection
Obrázek 1.4 Propojení softwarových částí debuggeru

USB FT2232 driver

obrázek debugger-drivers
Obrázek 1.5 Ovladače FT2232 ve Windows7-64bit
Nainstalujeme ovladač pro USB zařízení FT2232, který je možné získat na webu firmy FTDIInformationhttp://www.ftdichip.com/FTDrivers.htm.
Na stránkách výrobce jsou k dispozici dva typy ovladačů, virtuální sériový port VCP (Virtual Com Port) a ovladač D2XX umožňující přímý přístup k obvodu FT2232. Potřebujeme komunikovat protokolem JTAG, a proto budeme používat ovladač D2XX pro přímou komunikaci s FT2232. Výrobce v dokumentaci uvádí postupy instalace pro různé operační systémy. Operační systém Windows 7 například automaticky stáhne ovladače z internetu a není třeba cokoli instalovat. Při úspěšné instalaci uvidíme nainstalované ovladače virtuálního sériového portu a zároveň ovladač pro konverzi protokolů.
Na obrázku je ukázka nainstalovaných ovladačů pro konverzi protokolů na systému Windows7-64bit (obr. 1.5).

OpenOCD

První verze OpenOCD byla původně vytvořena jako část diplomové práce Dominica Ratha, ale od té doby se proměnila v aktivní otevřený projekt podporovaný vývojáři z celého světa. Hlavním cílem OpenOCD je umožnit ladění, programování a zároveň sledování vnitřních stavů procesoru přímo v aplikaci. Na stránkách OpenOCDInformationhttp://openocd.sourceforge.net/ je ke stažení kompletní dokumentace programu.
OpenOCD podporuje řadu převodníků a velké množství procesorů a pro práci s konkrétním procesorem musí být správně nakonfigurován. Popíšeme si konfiguraci pro prototypovací desku BaseBoard s modulem LM3S800. Součástí OpenOCD je několik adresářů, ve kterých najdeme soubory s příponou cfg a tcl. Soubory s příponou cfg jsou konfigurační soubory OpenOCD a soubory s příponou tcl jsou složitější programy ve skriptovacím jazyku TCL. Budeme se zabývat pouze těmi adresáři, ve kterých budeme něco měnit.
Adresář bin obsahuje spustitelný soubor OpenOCD. Adresář interface obsahuje konfigurace pro různé variace a druhy převodníků USB-JTAG. Všechny konfigurační soubory mají příponu cfg. Pro prototypovací desku BaseBoard si v adresáři interface vytvoříme konfigurační soubor ucsimply.cfg.
​
interface ft2232
ft2232_vid_pid 0x0403 0x6010 
ft2232_device_desc "Dual RS232" 
ft2232_layout "usbjtag" 
ft2232_latency 2
​
První řádek definuje typ použitého rozhraní a specifikuje jméno driveru. Hodnoty identifikátorů ft2232_vid_pid identifikují dodavatele a výrobek (vendor ID a product ID). Pokud nejsou zadány, tak OpenOCD použije identifikátory výrobce obvodu. Hodnota ft2232_device_desc slouží jako popis převodníku. Hodnota ft2232_layout specifikuje, jak jsou k pinům obvodu FT2232 přiřazeny JTAG signály. Hodnota ft2232_latency udává zpoždění při čtení dat převodníku FT2232 z USB v milisekundách. Doporučená hodnota je 2ms, ale některé systémy ji mohou mít i delší.
V adresáři target vybereme cílový procesor, se kterým budeme komunikovat. Pracujeme s mikrokontrolérem LM3S800, použijeme proto soubor lm3s800.cfg.
Program OpenOCD se po spuštění pokusí najít soubor openocd.cfg z něhož si načte konfigurační údaje. Vytvoříme si takový soubor a umístíme ho do adresáře projektu.
​
# include uCSimply interface config 
source [find interface/ucsimply.cfg]
​
# include TARGET config 
source [find target/lm3s800.cfg]
​
# jtag speed 
jtag_khz 500
jtag_nsrst_delay 100
​
#LM3S800 Evaluation Board has only trst 
reset_config trst_only
​
Komentář začíná znakem #. Nejdříve definujeme soubor s konfigurací převodníku. Následuje specifikace jména konfiguračního souboru cílového procesoru. Hodnota jtag_khz nastaví komunikační frekvenci a jtag_nsrst_delay definuje zpoždění komunikačního rozhraní JTAG po resetu. Hodnota reset_config nastavuje způsob implementace resetu. Může nabývat hodnot trst_only což znamená reset JTAG rozhraní, srst_only reset celého procesoru nebo kombinace těchto voleb. V našem případě je implementován pouze reset JTAG rozhraní.
Nyní si otestujeme OpenOCD bez grafického rozhraní, pouze z příkazové řádky. Prototypovací deska je připojená na PC, napájení je zapnuté a JTAG signály procesorového modulu LM3S800 jsou připojené na výstupy obvodu FT2232D.
Nakopírujeme soubor openocd.cfg přímo k souboru bin\openocd.exe a ten spustíme z příkazové řádky. Pokud jsme postupovali správně, měli bychom vidět následující výstup:
​
Open On-Chip Debugger 0.4.0 (2011-12-27-20:30) 
Licensed under GNU GPL v2 
For bug reports, read         
      http://openocd.berlios.de/doc/doxygen/bugs.html 
500 kHz 
jtag_nsrst_delay: 100 
trst_only separate trst_push_pull 
Info : device: 4 "2232C" 
Info : deviceID: 67330064 
Info : SerialNumber: A 
Info : Description: Dual RS232 A 
Info : clock speed 500 kHz 
Info : JTAG tap: lm3s800.cpu tap/device found: 0x2ba00477 (mfg: 0x23b, part: 0xb a00, ver: 0x2) 
Info : lm3s800.cpu: hardware has 6 breakpoints, 4 watchpoints
​
Výpis zobrazí skutečnou konfiguraci OpenOCD a informace o počtu breakpointů a watchpointů. Breakpoint je místo v paměti programu, kde se má naše aplikace zastavit. Watchpoint zastaví program pokud čte nebo zapisuje do námi definované proměnné.

GDB a Telnet klient

Jak již bylo uvedeno v předchozím textu, OpenOCD vytvoří po spuštění dva TCP/IP servery a sice server Telnet a server GDB.
Telnet server v programu OpenOCD naslouchá na portu 4444. Program telnet má systém Windows ve svých předinstalovaných programech nebo můžeme použít třeba program Putty. V dokumentaci OpenOCD jsou popsány všechny příkazy, které lze použít při komunikaci s OpenOCD přes rozhraní Telnet. Program telnet lze spustit z příkazové řádky takto:
​
telnet localhost 4444
​
Podrobněji si vyzkoušíme příkazy debuggeru GDB, které později využijeme i v grafickém vývojovém prostředí. GDB server v OpenOCD naslouchá na portu 3333. Pro komunikaci s GDB serverem použijeme program arm-none-eabi-gdb.exe od CodeSourcery. Přesuneme se do pracovního adresáře projektu a z příkazové řádky spustíme program arm-none-eabi-gdb.exe. Po jeho spuštění se dostaneme do konzole v níž můžeme zadávat příkazy pro OpenOCD jako při komunikaci přes telnet rozhraní. Jen je před nimi nutné uvést slovo monitor. Ostatní příkazy jsou určeny pro GDB.
​
# připojí GDB klienta k serveru OpenOCD
target remote localhost:3333
​
# reset a zastavení procesoru
monitor reset halt 
​
# pauza 500ms
monitor wait 500 
​
# softwarový reset a zastavení cpu
monitor soft_reset_halt 
​
# nahraje program do paměti programu
monitor flash write_image erase ./Debug/blink-led.elf
​
# nastaví breakpoint na funkci main
thbreak main  
​
# spustí procesor
continue
​
Nejprve připojíme gdb klienta k serveru OpenOCD příkazem target s uvedením hosta a portu, na kterém OpenOCD naslouchá. Je zřejmé, že OpenOCD a gdb klient nemusí běžet na stejném počítači.
Další příkaz resetuje a zastaví procesor. Příkaz monitor flash nejprve celou paměť smaže a následně zapíše program. Cesta k souboru s příponou elf je brána relativně k adresáři projektu.
Tyto příkazy opíšeme do konzole a jednotlivě spustíme. Dostaneme procesor do stavu, kdy bude mít nahraný program ve Flash paměti a bude zastaven na začátku funkce main. Když napíšeme příkaz continue, program se spustí.