Skip to content
Snippets Groups Projects
Commit 8562f543 authored by bence98's avatar bence98
Browse files

Formázás

parent 8b2a09c5
Branches
No related tags found
No related merge requests found
......@@ -128,13 +128,13 @@ Az ötlet a következő volt: futtassuk a Windowsos programot egy VM-ben (Window
\begin{figure}[h] \label{fig:vm}
\centering
\includegraphics[width=300px]{vm}
\includegraphics[width=250px]{vm}
\caption{A mérési elrendezés}
\end{figure}
Azonban akadt egy kis probléma: néha a VM-en belül nem lehetett megnyitni a JTAG interfészt. Ezért kénytelen voltam egy régi Windows XP-re telepíteni a Logsys toolchaint és a WireSharkot. Azonban a Windowsos WireShark nem támogatja az USB folyam lehallgatását, így erre egy újabb segédprogramot, az USBPcap-et kellett telepítenem. De végül sikerült elegendő mérési adatot összegyűjtenem, ami alapján el tudtam kezdeni a Logsys GUI és az LDC közti protokoll felderítését.
A protokoll visszafejtését kezdetben szisztematikus teszteléssel végeztem: elindítottam a WireShark (vagy az USBPcap) csomagelkapását, megnyomtam egy gombot a Logsys GUI-n, leállítottam a csomagelfogást, és kielemeztem. Ezzel a módszerrel sikeresen megfejtettem az alap funkciók (tápfeszültség állítása, aszinkron reset, adatátviteli módok be-/kikapcsolása, JTAG lánc le\textit{tap}ogatása). Azonban bizonyos funkciókat nem lehetett ily módon megfejteni (ilyenek tipikusan az adatátvitelek, így például az egyik legfontosabb funkció, a JTAG interfészen keresztüli FPGA konfiguráció).
A protokoll visszafejtését kezdetben szisztematikus teszteléssel végeztem: elindítottam a WireShark (vagy az USBPcap) csomagelkapását, megnyomtam egy gombot a Logsys GUI-n, leállítottam a csomagelfogást, és kielemeztem. Ezzel a módszerrel sikeresen megfejtettem az alap funkciók (tápfeszültség állítása, aszinkron reset, adatátviteli módok be-/kikapcsolása, JTAG lánc letapogatása). Azonban bizonyos funkciókat nem lehetett ily módon megfejteni (ilyenek tipikusan az adatátvitelek, így például az egyik legfontosabb funkció, a JTAG interfészen keresztüli FPGA konfiguráció).
Így a későbbiekben nekiálltam a Logsys GUI "hagyományos" úton történő visszafejtésének is (decompile az ILSpy nevű program segítségével), amivel kiegészíthettem hiányos ismereteimet. Emellett időközben Raikovich Tamástól kaptam egy PDF-et, amiben leírja a (csomagelkapásból megfejthetetlen, bináris adatfolyamként érkező) struktúrák kiosztását. Ezenfelül fejlesztés közben jómagam is kutattam az Interneten további dokumentáció után, így akadtam például Wacha Gábor Qt alapú Logsys GUI-rekreációjára, aminek forráskódját készségesen rendelkezésemre bocsájtotta.
......@@ -161,8 +161,9 @@ A saját implementációm hivatkozásánál a fájlok nevei és a sorszámok a k
\subsubsection{Státusz lekérése}
A Logsys GUI működése közben figyeli az LDC állapotleíróit (kimeneti feszültségek, kifolyó áram, túláram védelem bitje stb.), ezeket az információkat másodpercenként többször is lekérdezi az eszköztől.
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{Lekérdezés}\\ \hhline{|=|=|}
irány & IN\\ \hline
......@@ -210,8 +211,9 @@ A tápfeszültséget lehet be- illetve kikapcsolni, a túláram- és visszáram
Tápfeszültség állapota:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|l|}
\hline
\textit{Művelet} & \textit{Lekérdezés} & \textit{Beállítás}\\ \hhline{|=|=|=|}
irány & IN & OUT\\ \hline
......@@ -233,8 +235,9 @@ Az IN kérés egy egybájtos logikai értéket (bool) ad vissza.
\noindent Túláramvédelem:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|l|l|l|}
\hline
\textit{Művelet} & \textit{Lekérdezés} & \textit{Beállítás 450 mA-ra} & \textit{Beállítás 700 mA-ra} & \textit{Beállítás 950 mA-ra}\\ \hhline{|=|=|=|=|=|}
irány & IN & OUT & OUT & OUT\\ \hline
......@@ -255,10 +258,13 @@ Az IN kérés egy 0-2 közötti számot ad vissza, ami a 450, 700 illetve 950 mA
\vspace{1em}
\pagebreak % FIXME
Áramerősség-mérés korrekciós faktorai:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\noindent\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{Lekérdezés}\\ \hhline{|=|=|}
irány & IN\\ \hline
......@@ -295,8 +301,9 @@ Az IN kérés által visszaadott struktúrát nem implementáltam, de a követke
Visszáram-tolerancia
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
\underline{URB Control blokk:}
\noindent\noindent\begin{tabular}{|l|l|l|}
\hline
\textit{Művelet} & \textit{Lekérdezés} & \textit{Beállítás}\\ \hhline{|=|=|=|}
irány & IN & OUT\\ \hline
......@@ -317,8 +324,11 @@ Az IN kérés egy 10 bites, fixpontos kettes komplemens számot ad vissza, az OU
\subsubsection{Aktív átviteli mód lekérdezése}
Új adatátviteli mód megnyitása előtt célszerű megnézni, hogy van-e ütközés a korábban megnyitottakkal (bár ilyen esetben az LDC jelzi, hogy nem nyitható meg az átvitel). Az éppen aktív átviteli módot a következőképp kérdezhetjük le:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\pagebreak % FIXME
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{Lekérdezés}\\ \hhline{|=|=|}
irány & IN\\ \hline
......@@ -339,10 +349,11 @@ A visszaadott bájt jelzi az aktív átviteli módot (és 0 ha nincs megnyitva e
A kétféle JTAG módról a JTAG-ot tárgyaló fejezetben írok. Az egyes átviteli módok megnyitása/lezárása a róluk szóló fejezetben leírt kérésekkel történik.
\subsubsection{Órajel generálás}
Ha a CLK lábat nem használja egyetlen megnyitott átvitel sem, az LDC beépített négyszögjel-generátorának köszönhetően ki tudunk adni rajta egy órajelet.
Ha a CLK lábat nem használja egyetlen megnyitott átvitel sem, az LDC beépített négyszögjel-generátorának köszönhetően ki tudunk adni rajta egy órajelet (0,2 Hz és 8MHz között).
\underline{URB Control blokk:}
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|l|}
\noindent\begin{tabular}{|l|l|l|l|}
\hline
\textit{Művelet} & \textit{Leállítás} & \textit{Lekérdezés} & \textit{Beállítás}\\ \hhline{|=|=|=|=|}
irány & IN & IN & IN\\ \hline
......@@ -362,8 +373,9 @@ Leállításkor és elindításkor a sikerességet jelző (S) logikai változót
\subsubsection{Aszinkron reset}
Ha nincs a RST lábat használó átvitel megnyitva, lehetőségünk van aszinkron bitbang módban vezérelni.
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|l|l|}
\hline
\textit{Művelet} & \textit{Alacsonyra állítás} & \textit{Magasba állítás} & \textit{Lekérdezés}\\ \hhline{|=|=|=|=|}
irány & IN & IN & IN\\ \hline
......@@ -382,8 +394,9 @@ Az első és talán legfontosabb implementált átviteli mód a JTAG. Ez a 0. in
A JTAG megnyitásához két Control blokkot kell kiadnunk:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|l|}
\hline
\textit{Művelet} & \textit{JTAG inicializálás} & \textit{Adatátvitel megnyitása}\\ \hhline{|=|=|=|}
irány & IN & OUT\\ \hline
......@@ -403,8 +416,9 @@ Megnyitott JTAG átvitel közben fel tudjuk deríteni a JTAG láncot (\textit{Bo
Az átvitel bezárásához a következő kérést használjuk:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{JTAG bezárás}\\ \hhline{|=|=|}
irány & OUT\\ \hline
......@@ -434,10 +448,13 @@ Visszaolvasás módban működik pl. a Boundary Scan, mert ott az eszköz ID cod
\vspace{1em}
\pagebreak % FIXME
\noindent Az ellenőrzést a következő kéréssel végezzük:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{JTAG bezárás}\\ \hhline{|=|=|}
irány & IN\\ \hline
......@@ -451,8 +468,9 @@ Visszaolvasás módban működik pl. a Boundary Scan, mert ott az eszköz ID cod
A módot megnyitott átvitel esetén is átválthatjuk:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|l|}
\hline
\textit{Művelet} & \textit{Lekérdezés} & \textit{Beállítás}\\ \hhline{|=|=|=|}
irány & IN & OUT\\ \hline
......@@ -509,6 +527,8 @@ TMS írás visszaolvasás módban:
2. oktett & \multicolumn{8}{c|}{kiírandó TMS bitek}\\\hline
\end{tabular}
\pagebreak % FIXME
TMS írás ellenőrzés módban:
\noindent\begin{tabular}{|l|c|c|c|c|c|c|c|c|}
......@@ -544,14 +564,14 @@ RUNTEST ellenőrzés módban:
4. oktett & \multicolumn{8}{c|}{pulzusok száma}\\\hline
\end{tabular}
Ebben a módban TCK vonalra a megadott számú órajelpulzust lehet kiküldeni és a TMS vonal értéke a \textit{TMS} bit lesz.\cite{RT-dipterv} Ez a RUNTEST SVF parancsoknál hasznos. Ezt a módot nem használom, mivel a libxsvf elabsztrahálja előlem a RUNTEST parancsot.
Ebben a módban TCK vonalra a megadott számú órajelpulzust lehet kiküldeni és a TMS vonal értéke a \textit{TMS} bit lesz.\cite{RT-dipterv} Ez a RUNTEST SVF parancsoknál hasznos. Ezt a módot nem használom, mivel a libxsvf elfedi előlem a RUNTEST parancsot.
Ellenőrzés módban a számítógépnek ugyanannyi bájtot kell visszaolvasnia, mint amennyit elküldött.
A visszaolvasott bájtok közül csak minden második a hasznos TDO adat, a többi bájt értéke 0.\cite{RT-dipterv}
\noindent\textbf{FPGA konfigurációs fájlok}
A libxsvf-nek köszönhetően SVF és XSVF formátumú fájlokat képes a program natívan kezelni. Azonban a BIT (és JED) formátumok nem nyíltak, így azok kezeléséhez a Xilinx egyik segédprogramjával (iMPACT) át kell konvertálnom SVF-re. (ugyanezt teszi egyébként a Logsys GUI is).
A libxsvf-nek köszönhetően SVF és XSVF formátumú fájlokat képes a program natívan kezelni. Azonban a BIT (és JED) formátumok nem nyíltak, így azok kezeléséhez a Xilinx egyik segédprogramját használva (iMPACT) át kell konvertálnom SVF-re (ugyanezt teszi egyébként a Logsys GUI is).
A segédprogrammal való kommunikációhoz a libc \texttt{popen} metódusát használom, ami a Unix pipe-okat használja (a Logsys GUI pedig temporális fájlokat hoz létre ugyanerre a célra). Azonban az iMPACT-nak nem lehet megmondani, hogy ne hozzon létre logfájlt, így hogy ne szemetelje tele a munkakönyvtárat, a szubprocessz elindítása előtt átlépek a \texttt{/tmp} könyvtárba, ami Unix-szerű rendszereken általában bárki által írható és nem perzisztens tároló. Ennek következtében azonban elveszítjük a relatív útvonalak használatának lehetőségét (hiszen mappát váltunk, és az így a \texttt{/tmp}-hez képest értelmeződne).
......@@ -575,8 +595,9 @@ Az adatátvitel történhet 8, 4, 2 vagy 1 MHz-es órajel mellett, ezenfelül t
Az átvitel a következő két kéréssel nyitható meg:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|l|}
\hline
\textit{Művelet} & \textit{Inicializálás} & \textit{Átvitel indítása}\\ \hhline{|=|=|=|}
irány & IN & OUT\\ \hline
......@@ -620,8 +641,9 @@ Ezt a műveletsort végzi el nekünk a \texttt{logsys\_spi\_cmd} függvény.
Az átvitel bezárásához a következő kérést használjuk:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{SPI bezárás}\\ \hhline{|=|=|}
irány & OUT\\ \hline
......@@ -651,8 +673,9 @@ Az USART (Universal Synchronous/Asynchronous Receive \& Transmit) adatátvitelle
Az átvitel indítása a következő kérésekkel történik:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|l|l|}
\hline
\textit{Művelet} & \textit{Inicializálás} & \textit{Órajel megadása} & \textit{Vonali kódolás beállítása}\\ \hhline{|=|=|=|=|}
irány & IN & OUT & OUT\\ \hline
......@@ -672,8 +695,9 @@ A portra való írás egy egyszerű Bulk átvitellel történik a 0x05-ös végp
Az átvitelt ezzel a kéréssel zárhatjuk be:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{Bezárás}\\ \hhline{|=|=|}
irány & OUT\\ \hline
......@@ -685,10 +709,11 @@ Az átvitelt ezzel a kéréssel zárhatjuk be:
\vspace{1em}
Illetve lehetőségünk van a soros port képességeinek lekérésére (minimális és maximális baudráta, órajel stb.)
Illetve lehetőségünk van a soros port képességeinek lekérésére (minimális és maximális baud\-ráta, órajel stb.)
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{Képességek lekérdezése}\\ \hhline{|=|=|}
irány & IN\\ \hline
......@@ -728,8 +753,9 @@ A LDC képes a MISO, MOSI, CLK, RST és IOREF lábait használva szinkron BitBan
Az LDC vezérli a MOSI, CLK és RST lábakat, és a CLK fel- illetve lefutó éleire mintavételezi ezeket és a MISO lábat. Az órajel elindításához és az adatátvitel megkezdéséhez a következő két kérést kell elküldenünk:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|l|}
\hline
\textit{Művelet} & \textit{Inicializálás} & \textit{Átvitel indítása}\\ \hhline{|=|=|=|}
irány & IN & OUT\\ \hline
......@@ -745,8 +771,9 @@ Az IN által visszaadott bájt jelzi a kérés sikerességét, és 0, ha már eg
Az órajel-frekvenciát adatátvitel közben is megváltoztathatjuk:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{Órajel változtatás}\\ \hhline{|=|=|}
irány & OUT\\ \hline
......@@ -766,14 +793,15 @@ Az órajel-frekvenciát adatátvitel közben is megváltoztathatjuk:
mező & (00CR OI00) & (00cr oi00)\\ \hline
\end{tabular}
\noindent, ahol az első oktett a CLK felfutó, a második a lefutó élén vett értékek és C=CLK, R=RST, O=MOSI és I=MISO.
Az első oktett a CLK felfutó, a második a lefutó élén vett értékek és C=CLK, R=RST, O=MOSI és I=MISO.
\vspace{1em}
Az átvitelt lezárni pedig a következőképpen lehet:
\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
\underline{URB Control blokk:}
\noindent\begin{tabular}{|l|l|}
\hline
\textit{Művelet} & \textit{Átvitel bezárása}\\ \hhline{|=|=|}
irány & OUT\\ \hline
......@@ -855,7 +883,7 @@ A függvény feladata "összevárni" a homogén adatokat (legfeljebb 8-at), majd
A TMS írás feltétele, hogy a TDI "Don't Care" legyen (a kódban -1), a TMS pedig 0 vagy 1. A \texttt{dbit} egy ring countert valósít meg, ami az éppen írandó bitet jelöli ki. A \texttt{data} tárolja a kiírandó adatot, a \texttt{chk} a várt TDO értékeket, a \texttt{cmask} pedig a TDO maszkot.
Amíg a TMS írás feltétele fennáll, \texttt{data}-ban eltároljuk a kiírandó TMS értéket (a \texttt{dbit} által kijelölt biten), valamint ha TDO nem "Don't Care", akkor őt eltárojluk \texttt{chk}-ben és bebillentjük \texttt{cmask} megfelelő bitjét.
Amíg a TMS írás feltétele fennáll, \texttt{data}-ban eltároljuk a kiírandó TMS értéket (a \texttt{dbit} által kijelölt biten), valamint ha TDO nem "Don't Care", akkor őt eltároljuk \texttt{chk}-ben és bebillentjük \texttt{cmask} megfelelő bitjét.
Ha már összegyűjtöttünk 8 TCK pulzust, vagy már nem TMS írás történik, akkor \texttt{bulk\_out}-ban létrehozunk egy keretet a kiszámított értékek számára.
......@@ -863,7 +891,7 @@ Ha már összegyűjtöttünk 8 TCK pulzust, vagy már nem TMS írás történik,
A TDI írás feltétele, hogy a TDI 0 vagy 1 legyen, a TMS pedig az utolsó bit kivételével 0 (az utolsó bitnél lehet más is, az lesz az 1. bájt 6. bitje, lást \ref{ssssec:JTAG xfer}/JTAG adatátvitel). A \texttt{dbit} itt is az éppen írandó bitet jelöli ki. A \texttt{data} tárolja a kiírandó adatot, a \texttt{chk} a várt TDO értékeket, a \texttt{cmask} pedig a TDO maszkot. Különbség csupán a \texttt{tmsAfter} változó jelenléte.
Amíg a TDI írás feltétele fennáll, \texttt{data}-ban eltároljuk a kiírandó TDI értéket (a \texttt{dbit} által kijelölt biten), valamint ha TDO nem "Don't Care", akkor őt eltárojluk \texttt{chk}-ben és bebillentjük \texttt{cmask} megfelelő bitjét.
Amíg a TDI írás feltétele fennáll, \texttt{data}-ban eltároljuk a kiírandó TDI értéket (a \texttt{dbit} által kijelölt biten), valamint ha TDO nem "Don't Care", akkor őt eltároljuk \texttt{chk}-ben és bebillentjük \texttt{cmask} megfelelő bitjét.
Ha már összegyűjtöttünk 8 TCK pulzust, vagy már nem TDI írás történik, esetleg elértünk egy TDI+TMS íráshoz (ami csak a TDI írás utolsó bitjeként szerepelhet), akkor \texttt{bulk\_out}-ban létrehozunk egy keretet a kiszámított értékek számára.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment