V sedmém pokračování našeho seriálu o platformě Zynq®-7000 Xilinx® All Programmable SoC a modulech SQM4 představíme možnosti softwarové knihovny FNET. S její pomocí vytvoříme aplikaci, která umožňuje plnohodnotnou síťovou i konzolovou komunikaci s uživatelem, a to i bez podpory operačního systému.
Na trhu je v dnešní době mnoho komunikačních knihoven, které řeší TCP/IP konektivitu v prostředí mikropočítačů a vestavěných (tzv. „embedded“) aplikacích. Na rozdíl od běžných PC platforem, kde dominují systémy Microsoft Windows, Linux a MAC OS a kde je softwarový přístup ke komunikačním rozhraním přesně definován, panuje na poli mikropočítačů v tomto ohledu relativní chaos. Nepřehledná situace je samozřejmě dána velkou rozmanitostí v potřebách a v požadavcích, které jsou na vestavěné aplikace kladeny. V těch výkonnějších aplikacích dnes téměř jistě najdeme pokročilé operační systémy, ať už to jsou přímo systémy Windows, nebo Linux upravené pro jednoúčelová zařízení, nebo QNX, Integrity, MQX a podobná komerční řešení. Na poli středních a menších aplikací je běžné, že komunikační knihovny jsou do jisté míry nezávislé na použitém operačním systému a dají se s nimi různě kombinovat. K přehlednosti pak nepřispívá ani rozmanitost mikroprocesorových technologií a opravdu široká škála typů síťových periferií, které je nutné podpořit. V minulosti byly v oblasti 8 a 16bitových platforem velmi populární projekty OpenTCP a micro IP (uIP), dnešnímu 32bitovému světu dominuje v oblasti open source zřejmě projekt lwIP, který je také oficiálně podporován ze strany firmy Xilinx a je k dispozici i pro platformu Zynq.
Projekt FNET původně vznikl jako TCP/IP řešení pro procesory společnosti Motorola a Freescale (dnes NXP). Již v roce 2010 byl projekt zpřístupněn veřejnosti na stránkách fnet.sourceforge.net pod velmi otevřenou licencí Apache V2, která umožňuje úpravy a změny s možností dále upravený kód šířit. FNET je ve srovnání s lwIP výkonnější, podporuje IPv4 i IPv6 komunikaci přes standardizované tzv. „socket“ rozhraní i bez nutnosti použít jakýkoliv operační systém. V rámci knihovny FNET je navíc k dispozici i jednoduchý interpret příkazové řádky přístupný přes sériovou linku a protokol Telnet. Na rozdíl od jiných řešení umožňuje FNET také zapisovat a číst vybrané části paměti přes protokol TFTP, takže lze velmi snadno zajistit zálohování a přepis vlastního firmware aplikace vzdáleným přístupem z PC.
Tyto unikátní vlastnosti nás přiměly k úpravě projektu FNET pro platformu Zynq a modul SQM4. Současné řešení, které je k dispozici zákazníkům na stránkách www.sqm4.com, vychází ze starší verze FNET 2.5, která pro potřeby běžných aplikací plně postačuje. Upravený FNET využívá periferní ovladače pro modul SQM4 a platformu Zynq vygenerované v rámci knihovny BSP, o které jsme psali v minulém čísle. V kódu FNET bylo nutné připravit podporu pro tyto periferie:
Na začátku našeho seriálu o platformě Zynq jsme si dali za úkol vytvořit aplikaci, která umožní pomocí registrů nastavit a řídit jednoduchý řadič displeje, syntetizovaný z jazyka Verilog v programovatelné logice. Hotový kód celé aplikace je samozřejmě k dispozici na stránkách www.sqm4.com. V porovnání s ukázkovým kódem Hello World, vygenerovaným v Xilinx SDK, je naše aplikace mírně propracovanější. Jelikož nepoužívá operační systém, musí během inicializace, poté co je z BSP spuštěna funkce main, zajistit správné nastavení cache, řadiče přerušení a tzv. OCM paměti, což je rychlá SRAM paměť přímo na čipu procesoru, ideální pro využití v rámci FNETu. Zní to asi složitě, ale každý z těchto úkonů je vlastně jen jednoduché volání příslušných ovladačů z BSP.
Příprava ovladače našeho syntetizovaného řadiče displeje je však již zcela v našich rukou a vygenerované BSP nám s ním příliš nepomůže – až na jednu maličkost. Bázové adresy bloků registrů všech syntetizovaných periferií, které jsou přiřazeny v nástroji Vivado, se v BSP objeví jako makro konstanty. Díky tomu najdeme pro řadič displeje konstantu XPAR_SDISP_0_BASEADDR, s hodnotou, kterou jsme modulu přiřadili. Přístup k registrům na dané adrese je již v jazyce C velmi standardní záležitost. Prostřednictvím struktury definované v obrázku 1 je možné registrům přiřadit výchozí hodnoty tak, jak je to patrné z obrázku 2. Jelikož jsou registry tvořeny z oddělených bitových polí, jsou pro lepší čitelnost použita pomocná makra, která provedou bitový posun uvedených konstant na správné místo v registru.
Po provedení inicializace platformy, všech potřebných ovladačů a knihovny FNET již nic nebrání aplikačnímu kódu vstoupit do nekonečné smyčky hlavního (a jediného) procesu. Jelikož se plně spoléháme na řízení aplikace prostřednictvím sériové a/nebo Telnet konzole, kterou má plně pod kontrolou knihovna FNET, je vlastně jediným úkolem hlavní smyčky volat servisní rutinu fnet_poll_services, která obslouží vstupy a spustí servisní funkce v případě, že uživatel na konzoli zadá smysluplný příkaz.
V aplikaci jsme pro FNET nastavili interpret příkazové řádky tak, aby při zadání příkazu „disp“ na konzoli vyvolal C funkci sh_disp_cmd s příslušnými parametry argc a argv tak, jak je to známé ze základů jazyka C. Funkce má navíc k dispozici také parametr desc, který je možné použít pro znakový výstup do uživatelovy konzole, ať už je použita sériová komunikace, nebo Telnet terminál.
Funkce sh_disp_cmd má za úkol nastavit správně barvu vzoru generovaného řadičem displeje. Kód funkce je až hloupě jednoduchý; porovnává známé názvy barev „red“, „green“, „blue“ a další s vloženým parametrem a nastavuje barvu pomocí zápisu do registru „bkgnd“. Kód také rozpoznává další klíčová slova jako např. „on“, „off“ a „inv“ a upravuje chování řadiče prostřednictvím řídicího registru „ctrl“. Ti z vás, kteří sledovali definici naší periferie i v minulých číslech, dokáží jistě odhadnout, jaké bude chování displeje poté, co uživatel zadá příkaz „disp“ s příslušnými parametry.
Knihovna FNET podporuje také služby webového serveru s aktivními stránkami a propojením na volání uživatelských funkcí. Je až překvapivě jednoduché připravit vestavěné webové stránky, jejichž prostřednictvím může uživatel funkci na řízení barvy displeje volat přímo z internetového prohlížeče.
Zjednodušený kód funkce je zobrazen na obrázku 3. Jistě vás napadne, jak jej upravit a přidat podporu dalších barev, resp. nastavit libovolnou barvu přes číselnou hodnotu jednotlivých RGB složek.
Dokončením řídicí aplikace jsme po roce završili své úsilí přiblížit platformu Zynq čtenářům a uživatelům, kteří přicházejí spíše ze světa jednoduchých aplikací s mikrokontroléry a kteří by rádi využili potenciál nejmodernějších produktů v oblasti programovatelné logiky i složitějších procesorových jednotek. V seriálu jsme se nemohli vyhnout mnoha zjednodušením a příklady kódu byly často možná až příliš stručné na to, aby byl výklad technicky rigorózní. Věříme však, že jsme uspěli s představením základních myšlenek a postupů práce s platformou Zynq a s modulem SQM4.
V příštím čísle seriál ukončíme a shrneme nástroje použité při práci s platformou Zynq. Také doporučíme literaturu vhodnou k dalšímu studiu této pokročilé technologie. Přineseme také fotografie a více informací o dalších modulech z rodiny SQM4, která kromě platformy Zynq pokrývá i další populární jednočipové mikropočítače a mikrokontroléry vhodné pro nasazení v průmyslových i hobby projektech.