<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">\documentclass[]{article}

\usepackage[utf8]{inputenc}
\usepackage[hyphens]{url}
\usepackage{graphicx}
\usepackage{hhline}
%\usepackage[magyar]{babel}
\usepackage{amssymb}

\input{thesis-template-latex/src/include/packages}
\input{variables}
\input{thesis-template-latex/src/include/thesis-hu}
\input{thesis-template-latex/src/include/preamble}

\graphicspath{{./img/}}

%opening
\title{Logsys fejlesztőeszköz Linux környezetben}
\author{Csókás Bence Viktor}

\begin{document}

\pagenumbering{gobble}

\selectthesislanguage

%\maketitle
%\pagebreak
\include{thesis-template-latex/src/include/titlepage-tdk}

\pagenumbering{arabic}

\tableofcontents
\pagebreak

\begin{abstract}
A TDK munkám célja a tanszéki (és kari) oktatásban használt Logsys rendszer platformtámogatottságának kibővítése.

A XILINX ISE fejlesztőkörnyezet elérhető Linux alatt, azonban a Logsys Download Cable kezelése csak Windows alatt megoldott, a Logsys GUI nevű segédprogrammal. Mivel én kizárólag Linuxot használok, a Logsys eszköz használatához egy virtuális gépet fenn kellett volna tartanom.

Munkám során ezt a segédprogramot fejtettem vissza, majd az így szerzett tapasztalataimmal egy platformfüggetlen, LibUSB alapú eszközmeghajtót hoztam létre. Az eszköz kezelésére és a meghajtóprogram tesztelésére egy parancssori példaprogramot írtam. A programot teszteltük több Linux disztribúción (Ubuntu, Arch, Mint, Fedora), macOS-en és Haiku-n is.

A példaprogram jelenleg képes a letöltőkábel automatikus detektálására, a tápellátás biztosítására, a JTAG interfészen a csatlakoztatott FPGA (vagy más programozható eszköz) detektálására és a konfigurációs kód letöltésére. Ezen felül az órajel kimenet és a RESET beállítására, az eszköz állapotleíróinak (vonalak állapota, kifolyó áramerősség, túláramvédelem küszöbértéke, aktív átviteli mód stb.) lekérdezésére. Ezenfelül a driver fel van készítve néhány további funkcióra is, amik a parancssori példaprogramba még nem kerültek beépítésre: ilyen a BitBang I/O kezelés, USART és SPI adatátvitel. Ezen funkciók tesztelésére szintén írtam kisebb példaprogramokat.

A jövőbeni továbbfejlesztés során a következő hiánypótlásokat lehetne eszközölni: Logsys GUI reprodukálása, a nem dokumentált átviteli módok (I\textsuperscript{2}C, további 2 vagy többvezetékes programozói interfészek) támogatása, az USART átvitelhez TTY (TeleTYpe, karakteres kimeneti eszköz) létrehozása, valamint a MiniRISC nevű softcore CPU hardveres debuggerének kezelése.

A projektben hivatkozom Raikovich Tamás diplomatervére, valamint Wacha Gábor és Kiss Benedek programkódjaira.
\end{abstract}
\pagebreak

\selectenglish
\begin{abstract}
The goal of my work is to extend the platform support of the Logsys toolchain, currently in use in education at the department and the faculty.

XILINX’s ISE is already available on Linux, but use of the Logsys Download Cable requires running a Windows-only utility program, called Logsys GUI. As I use Linux exclusively, running such a program would have required that I maintain a VM.

During my work, I reverse engineered this tool and created a platform-independent, LibUSB-based driver. For using and testing of the driver, I created a command-line program, that ran successfully on a handful of Linux distros (Ubuntu, Arch, Mint, Fedora), along with macOS and Haiku.

The program is capable of recognizing automatically the download cable, provide power supply, detecting and identifying the FPGA (or other programmable device) on the JTAG chain and downloading the configuration code onto it. Above these it ensure the controlling of the RST pin, the setting of the internal square wave generator's clock frequency, getting device status (the state of the lines, output current, reverse current tolerance, active serial data transfer mode etc.). On top of that, the driver supports additional features not yet utilized by this program, such as BitBang I/O, USART, SPI. For these features I wrote smaller test snippets.

In the future, the following improvements could be made: reproducing the Logsys GUI, supporting the non-documented transfer modes (I\textsuperscript{2}C and other 2 or more wire programming protocol), adding a TTY for USART transfers, and supporting the MiniRISC softcore CPU's hardware debugger.

In the project I reference Tamás Raikovich's thesis draft and make use of code written by Gábor Wacha and Benedek Kiss.
\end{abstract}
\pagebreak
\selectthesislanguage

\section{A Logsys rendszer}
A TDK munkám alapja (előzménye, ha úgy tetszik) a kari oktatásban használt, a Méréstechnika és Információs Rendszerek tanszék által kifejlesztett Logsys fejlesztői környezet. Ez a rendszer 3 részre bontható:
\begin{itemize}
	\item a programozható eszközt tartalmazó kártyára (az én esetemben ez egy Logsys-BLOXES Spartan-3E Board nevű FPGA kártya),
	\item a letöltőkábelre (Logsys Development Cable, a továbbiakban LDC néven is fogom hivatkozni),
	\item illetve a számítógépen futó szoftverre.
\end{itemize}

\paragraph{FPGA kártya}
A LOGSYS Spartan-3E FPGA kártya egy egyszerű felépítésű, elsősorban kezdő felhasználók számára
készült FPGA kártya \cite{LS-Sp3E}. A kártyán található a programozandó céleszköz, az őt támogató áramkörök (tápellátás biztosítása, kvarc oszcillátor, jumperek, a konfigurációt tároló flash stb.) valamint az általa használt perifériák.

\begin{figure}[h]
	\centering
	\includegraphics[width=300px]{LS-Sp3E}
	\caption{A Logsys-BLOXES Spartan-3E FPGA kártya, csatlakoztatva az LDC-hez}
\end{figure}

\paragraph{LDC}
A fejlesztői kábel az USB porton keresztül kapcsolja össze a célrendszert a PC-vel. Biztosít konfigurációs, vezérlési (órajel és reset jel) és soros kommunikációs interfészt és rendelkezik 5V-os tápfeszültség kimenettel is \cite{LS-beagy-fejl}. Az eszköz működéséről részletesebben a \ref{sec:LS USB}. fejezetben írok.

\begin{figure}[h]
	\centering
	\includegraphics[width=200px]{LS-LDC}
	\caption{Az LDC202-es sorozatszámú Logsys Download Cable fejlesztői kábel}
\end{figure}

\paragraph{Logsys GUI}
Az LDC-vel való kommunikációt a Logsys GUI nevű szoftver valósítja meg. Ez a program és az eszközmeghajtók Windows operációs rendszert igényelnek \cite{LS-beagy-fejl}. A program segítségével az elkészült konfigurációt a céleszközre (jelen esetben a Spartan-3E FPGA-ra) tölthetjük, a LDC JTAG interfészét felhasználva.

\begin{figure}[h]
	\centering
	\includegraphics[width=300px]{LS-GUI}
	\caption{A Logsys GUI, miután csatlakoztattuk az LDC-t egy USB porthoz}
\end{figure}

\paragraph{XILINX ISE}
A konfigurációs fájl előállításához a XILINX ISE nevű fejlesztőkörnyezetet kellett használni, ami elérhető mind Windows, mind Linux operációs rendszereken, bár a telepítése egy kissé nehézkes. Mivel néhány hallgatótársam is érdeklődött a Linux alatti fejlesztés iránt, létrehoztam egy weboldalt (\url{http://users.hszk.bme.hu/~cb1719/xil-lin.php}), amin a legfrissebb eredményeimet tudták követni e téren.

\begin{figure}[h]
	\centering
	\includegraphics[width=300px]{Xil-Lin}
	\caption{A XILINX ISE 14.6 futása Linuxon}
\end{figure}

A XILINX ISE működésre bírása után már csak a Logsys GUI (illetve a hozzá tartozó driver) volt az egyetlen, ami nem volt elérhető Linuxon \cite{Xil-Lin}.

\begin{figure}[h] \label{fig:cb1719}
	\centering
	\includegraphics[width=300px]{cb1719}
	\caption{Az elkészült weboldal}
\end{figure}

\pagebreak
\section{Reverse engineering}
Mivel a tanszék nem adta ki a forráskódokat, a platformfüggetlenítéshez először vissza kellett fejtenem az eredeti, Windowsos programot, illetve drivert. Ez nehéz feladatnak bizonyult, hiszen jobbára semmit nem tudtam a felépítéséről, azonban egy remekül sikerült összeállítással képes voltam elkezdeni.

Az ötlet a következő volt: futtassuk a Windowsos programot egy VM-ben (Windows guest), és a Linux hoston fogjuk el az USB adatforgalmat! Ez az ötlet remekül működött; a hoston WireShark \cite{wireshark} segítségével el tudtam kapni az USB csomagokat (USB Request Block, URB), amit ezek után kézzel fejtettem vissza.

\begin{figure}[h] \label{fig:vm}
	\centering
	\includegraphics[width=300px]{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ó).

Í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.

% TODO: adat -&gt; tudás
Ennek a három adathalmaznak (a csomagelkapások, a visszafejtett forráskód és a dokumentáció) az összevetésével teljesebb képem alakult ki az adatátviteli protokollról.

A visszafejtett protokoll leírását a \ref{sec:LS USB}. fejezet taglalja.

Ezzel az ismerettel neki is álltam a saját programom fejlesztésének. Az USB kommunikáció megvalósítására a LibUSB nevű, cross-platform keretrendszert alkalmaztam. Linuxos berkekben az USB kezelést javarészt ezen az API-n keresztül valósítják meg. A Windowsos segédprogramban ezt a funkciót a kernel driver látta el.

Az FPGA konfiguráció fájlok (Serial Vector Format, SVF) kezeléséhez szükségem volt még egy függvénykönyvtárra, ez a Clifford Wolf által fejlesztett libxsvf (\url{http://www.clifford.at/libxsvf/}). A Logsys GUI-ban ennek az analógiája az \textit{SVF.dll}.

\pagebreak
\section{Logsys USB kommunikációs protokoll} \label{sec:LS USB}
Az LDC USB-azonosítója (Vendor ID : Product ID) \textit{03eb:f0ff}. Az USB eszköz két interfészt tartalmaz: a 0. interfészen található egy OUT/IN endpoint-pár (0x01, 0x82) a JTAG és SPI adatok átvitelére, illetve egy másik endpoint-pár (0x03 és 0x84) az I\textsuperscript{2}C és BitBang I/O átvitelekhez. Az 1. interfészen található az USART átvitel OUT/IN endpoint-párja (0x05 és 0x86). Ennek a kiosztásnak technikai okai vannak, amiről részletesebben Raikovich Tamás diplomatervének \cite{RT-dipterv} "8.2 A funkciók megvalósítása" fejezetében olvashatunk.

A legtöbb funkció gyártóspecifikus Control kódokkal vezérelhető. Az adatátvitelek az USART IN (0x86) végpontját kivéve (ami Interrupt transzfert használ) Bulk átvitelekkel történik. Lejjebb leírom az egyes funkciókat és az őket megvalósító URB-ket.

Amennyiben a kérés valamilyen struktúrát vár/ad vissza, azt egy ofszet$\rightarrow$mező táblázattal jelzem, majd az egyes mezők leírása következik. A táblázatban a bitmezőket "(abcd efgh)" alakban reprezentálom.

A saját implementációm hivatkozásánál a fájlok nevei és a sorszámok a kód RC3 (Release Candidate 3) verziójára érvényesek!

\subsection{Control kérések}
\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|}
	\hline
	\textit{Művelet} &amp; \textit{Lekérdezés}\\ \hhline{|=|=|}
	irány &amp; IN\\ \hline
	bRequest &amp; 1\\ \hline
	wValue &amp; 0\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 12\\ \hline
\end{tabular}

A kérés egy struktúrát ad vissza, aminek a formátuma a következő:\\
\begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|c|}
	\hline
	ofszet &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 &amp; 6 &amp; 7 &amp; 8 &amp; 9 &amp; 10 &amp; 11 \\ \hline
	mező &amp; \multicolumn{2}{l|}{$U_{out}$} &amp; \multicolumn{2}{l|}{$U_{jtag}$} &amp; \multicolumn{2}{l|}{$U_{io}$} &amp; \multicolumn{2}{l|}{$I_{out,fine}$} &amp; \multicolumn{2}{l|}{$I_{out}$} &amp; (0000 0ROV) &amp; (0E\textsubscript{2}E\textsubscript{1}S~R\textsubscript{st}C\textsubscript{2}C\textsubscript{1}J) \\ \hline
\end{tabular}

\begin{itemize}
	\item $U_{out}$: A kimenő feszültséget (VCC pin) figyelő ADC nyers adata
	\item $U_{jtag}$: A JTREF lábon lévő feszültséget mérő ADC adata
	\item $U_{io}$: Az IOREF csatlakozásra eső feszültség ADC adata
	\item $I_{out,fine}$, $I_{out}$: A kifolyó áramerősséget vizsgáló két (finom és durva felbontású) ADC mért adatai
	\item V: A tápellátást biztosító láb (5V jelű) logikai szintje
	\item O: Túláramvédelem státuszbitje
	\item R: Visszáram védelem állapotbitje
	\item J: JTAG pinek (TDI, TDO, TCK, TMS) foglaltsága
	\item C\textsubscript{1}: CLK1 órajelgenerátor kihasználtsága
	\item C\textsubscript{2}: CLK1 négyszögjelgenerátor használtsága
	\item R\textsubscript{st}: RST láb foglaltsága
	\item S: Soros I/O vonalak használtsága
	\item E\textsubscript{1}, E\textsubscript{2}: A 0. interfész két endpoint-párjának foglaltsága
\end{itemize}

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Státusz lekérdezése: \texttt{logsys\_tx\_get\_status} függvény (\textit{src/shared/control.c:7})
	\item Struktúra kiosztása: \texttt{struct LogsysStatus} (\textit{include/logsys/common.h:16})
	\item Struktúra feldolgozása: \textit{include/logsys/status.h} által definiált interfész (implementáció a \textit{src/shared/status.c} fájlban)
\end{itemize}


\subsubsection{Tápfeszültség vezérlése}
A tápfeszültséget lehet be- illetve kikapcsolni, a túláram- és visszáram védelmi rendszer küszöbeit lekérdezni és átállítani. Ezek a funkciók mind a bRequest=2 kéréstípusba tartoznak.

\noindent\\Tápfeszültség állapota:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Lekérdezés} &amp; \textit{Beállítás}\\ \hhline{|=|=|=|}
	irány &amp; IN &amp; OUT\\ \hline
	bRequest &amp; 2 &amp; 2\\ \hline
	wValue &amp; 0 &amp; kívánt állapot\\ \hline
	wIndex &amp; 0 &amp; 0\\ \hline
	hossz &amp; 1 &amp; 0\\ \hline
\end{tabular}

Az IN kérés egy egybájtos logikai értéket (bool) ad vissza.

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Lekérdezés: \texttt{logsys\_tx\_get\_vcc} (\textit{include/logsys/control.h:35}, implementáció: \textit{src/shared/control.c:50})
	\item Állítás: \texttt{logsys\_tx\_set\_vcc} (\textit{include/logsys/control.h:35}, Implementáció: \textit{src/shared/control.c:50})
\end{itemize}

\noindent Túláramvédelem:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Lekérdezés} &amp; \textit{Beállítás 450 mA-ra} &amp; \textit{Beállítás 700 mA-ra} &amp; \textit{Beállítás 950 mA-ra}\\ \hhline{|=|=|=|=|=|}
	irány &amp; IN &amp; OUT &amp; OUT &amp; OUT\\ \hline
	bRequest &amp; 2 &amp; 2&amp; 2&amp; 2\\ \hline
	wValue &amp; 0x0100 &amp; 0x0100 &amp; 0x0101 &amp; 0x0102\\ \hline
	wIndex &amp; 0 &amp; 0 &amp; 0 &amp; 0\\ \hline
	hossz &amp; 1 &amp; 0 &amp; 0 &amp; 0\\ \hline
\end{tabular}
Az IN kérés egy 0-2 közötti számot ad vissza, ami a 450, 700 illetve 950 mA-es küszöböt jelenti. Ezeket egy enumerációba gyűjtöttem a kezelhetőség javításának érdekében.

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Lekérdezés: \texttt{logsys\_tx\_get\_pwr\_limit} (\textit{include/logsys/control.h:22}, implementáció: \textit{src/shared/control.c:31})
	\item Állítás: \texttt{logsys\_tx\_set\_pwr\_limit} (\textit{include/logsys/control.h:24}, Implementáció: \textit{src/shared/control.c:38})
	\item Enumeráció: \texttt{enum LogsysPwrLimit} (\textit{include/logsys/common.h:30})
\end{itemize}

\noindent Áramerősség-mérés korrekciós faktorai:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Lekérdezés}\\ \hhline{|=|=|}
	irány &amp; IN\\ \hline
	bRequest &amp; 2\\ \hline
	wValue &amp; 0x0200\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 21\\ \hline
\end{tabular}

Az IN kérés által visszaadott struktúrát nem implementáltam, de a következőképpen néz ki:\\
\begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
	\hline
	ofszet &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 &amp; 6 &amp; 7 &amp; 8 &amp; 9 &amp; 10 &amp; 11 &amp; 12 &amp; 13 &amp; 14 &amp; 15 &amp; 16 &amp; 17 &amp; 18 &amp; 19 &amp; 20\\ \hline
	mező &amp; H &amp; \multicolumn{4}{l|}{$c_{U_{out}}$} &amp; \multicolumn{4}{l|}{$c_{U_{jtag}}$} &amp; \multicolumn{4}{l|}{$c_{U_{io}}$} &amp; \multicolumn{4}{l|}{$c_{I_{out,fine}}$} &amp; \multicolumn{4}{l|}{$c_{I_{out}}$} \\\hline
\end{tabular}

\begin{itemize}
	\item H: hibajelző bájt, ha 0, akkor a kérés sikeres volt
	\item $c_{\dots}$: az alsó indexben feltüntetett mennyiséghez tartozó szorzótényező
\end{itemize}

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Lekérdezés: \texttt{logsys\_tx\_get\_pwr\_corr} (\textit{include/logsys/control.h:30}, implementáció: \textit{src/shared/control.c:42})
	\item Struktúra: nincs implementálva
\end{itemize}

\noindent Visszáram-tolerancia

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Lekérdezés} &amp; \textit{Beállítás}\\ \hhline{|=|=|=|}
	irány &amp; IN &amp; OUT\\ \hline
	bRequest &amp; 2 &amp; 2\\ \hline
	wValue &amp; 0x0300 &amp; 0x0300\\ \hline
	wIndex &amp; 0 &amp; új érték\\ \hline
	hossz &amp; 2 &amp; 0\\ \hline
\end{tabular}
Az IN kérés egy 10 bites, fixpontos kettes komplemens számot ad vissza, az OUT kérés ugyanebben a formátumban várja az adatot. A kódom elvégzi ezek és a lebegőpontos számábrázolás közti konverziót.

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Lekérdezés: \texttt{logsys\_tx\_get\_rev\_curr} (\textit{include/logsys/control.h:38}, implementáció: \textit{src/shared/control.c:54})
	\item Állítás: \texttt{logsys\_tx\_set\_rev\_curr} (\textit{include/logsys/control.h:40}, Implementáció: \textit{src/shared/control.c:62})
\end{itemize}

\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|}
	\hline
	\textit{Művelet} &amp; \textit{Lekérdezés}\\ \hhline{|=|=|}
	irány &amp; IN\\ \hline
	bRequest &amp; 3\\ \hline
	wValue &amp; 0\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 1\\ \hline
\end{tabular}

\noindent A visszaadott bájt jelzi az aktív átviteli módot (és 0 ha nincs megnyitva egyetlen átvitel sem). A lehetséges értékeket kigyűjtöttem egy enumerációba.

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Lekérdezés: \texttt{logsys\_tx\_get\_active\_func} (\textit{include/logsys/control.h:43}, implementáció: \textit{src/shared/control.c:67})
	\item Enumeráció: \texttt{enum LogsysFunction} (\textit{include/logsys/common.h:37})
\end{itemize}

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.

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Leállítás} &amp; \textit{Lekérdezés} &amp; \textit{Beállítás}\\ \hhline{|=|=|=|=|}
	irány &amp; IN &amp; IN &amp; IN\\ \hline
	bRequest &amp; 4 &amp; 4 &amp; 4\\ \hline
	wValue &amp; 0 &amp; 0 &amp; periódusregiszter (PR)\\ \hline
	wIndex &amp; 0x01 &amp; 0x02 &amp; előosztás (E), 0x00\\ \hline
	hossz &amp; 1 &amp; 4 &amp; 1\\ \hline
\end{tabular}

\noindent Leállításkor és elindításkor a sikerességet jelző (S) logikai változót kapjuk vissza. Lekérdezéskor pedig a következőt:\\
\begin{tabular}{|l|c|c|c|c|}
	\hline
	ofszet &amp; 0 &amp; 1 &amp; 2 &amp; 3\\ \hline
	mező &amp; S &amp; \multicolumn{2}{c|}{PR} &amp; E\\ \hline
\end{tabular}

\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|}
	\hline
	\textit{Művelet} &amp; \textit{Alacsonyra állítás} &amp; \textit{Magasba állítás} &amp; \textit{Lekérdezés}\\ \hhline{|=|=|=|=|}
	irány &amp; IN &amp; IN &amp; IN\\ \hline
	bRequest &amp; 5 &amp; 5 &amp; 5\\ \hline
	wValue &amp; 0 &amp; 0 &amp; 0\\ \hline
	wIndex &amp; 0x00 &amp; 0x01 &amp; 0x02\\ \hline
	hossz &amp; 1 &amp; 1 &amp; 1\\ \hline
\end{tabular}

\noindent Beállításnál a visszatérési érték 0, ha a RST láb használatban van, és &gt;0, ha sikerült a beállítás. Lekérdezésnél a RST logikai értékét kapjuk vissza.

\subsection{Átviteli módok}
\subsubsection{JTAG}
% TODO
Az első és talán legfontosabb implementált átviteli mód a JTAG. Ez a 0. interfész 0x01/0x82 enpoint-párját használja, valamint az LDC TDI, TDO, TMS, TCK és JTREF lábait. Ezen az interfészen keresztül lehetséges az LDC-hez illesztett elektronika konfigurálása és hibakövetése.

\noindent\\A JTAG megnyitásához két Control blokkot kell kiadnunk:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{JTAG inicializálás} &amp; \textit{Adatátvitel megnyitása}\\ \hhline{|=|=|=|}
	irány &amp; IN &amp; OUT\\ \hline
	bRequest &amp; 16 &amp; 18\\ \hline
	wValue &amp; JTAG mód &amp; 0\\ \hline
	wIndex &amp; 0 &amp; 0\\ \hline
	hossz &amp; 1 &amp; 0\\ \hline
\end{tabular}

\noindent Ha az első kérés logikai hamisat ad vissza, megszakítjuk a műveletet. A "JTAG mód" paraméter leírása lejjebb található.

Megnyitott JTAG átvitel közben fel tudjuk deríteni a JTAG láncot (\textit{Boundary Scan}), ehhez egy tapasztalati úton talált "mágikus sorozatot" kell leadnunk a 0x01 Bulk végponton, erre a \texttt{logsys\_jtag\_scan} függvény használható.

\noindent\\Az átvitel bezárásához a következő kérést használjuk:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{JTAG bezárás}\\ \hhline{|=|=|}
	irány &amp; OUT\\ \hline
	bRequest &amp; 17\\ \hline
	wValue &amp; 0\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 0\\ \hline
\end{tabular}

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Megnyitás: \texttt{logsys\_jtag\_begin} (\textit{include/logsys/jconf.h:6}, implementáció: \textit{src/shared/jctrl.c:6})
	\item Lezárás: \texttt{logsys\_jtag\_end} (\textit{include/logsys/jconf.h:8}, implementáció: \textit{src/shared/jctrl.c:28})
	\item Lánc felderítés: \texttt{logsys\_jtag\_scan} (\textit{include/logsys/jconf.h:13}, implementáció: \textit{src/shared/jctrl.c:32})
\end{itemize}

\noindent\textbf{JTAG módok}

A LDC kétféle módban tudja a JTAG interfészt kezelni:

\begin{itemize}
	\item Visszaolvasás mód: ebben a módban a kiadott TDI értékekre kapott TDO választ visszaküldi USB transzferen keresztül a számítógépnek
	\item Ellenőrzés mód: ekkor a számítógép a TDI-vel együtt a várt TDO értékeket is elküldi, majd a transzfer után egy Control blokkal lekérdezi, hogy történt-e hiba (várttal nem egyező TDO érték)
\end{itemize}

\noindent Az ellenőrzést a következő kéréssel végezzük:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{JTAG bezárás}\\ \hhline{|=|=|}
	irány &amp; IN\\ \hline
	bRequest &amp; 20\\ \hline
	wValue &amp; 0\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 1\\ \hline
\end{tabular}

\noindent\\\\A módot megnyitott átvitel esetén is átválthatjuk:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Lekérdezés} &amp; \textit{Beállítás}\\ \hhline{|=|=|=|}
	irány &amp; IN &amp; OUT\\ \hline
	bRequest &amp; 19 &amp; 19\\ \hline
	wValue &amp; 0 &amp; JTAG mód\\ \hline
	wIndex &amp; 0 &amp; 0\\ \hline
	hossz &amp; 1 &amp; 0\\ \hline
\end{tabular}

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Ellenőrzés: \texttt{logsys\_jtag\_check\_error} (\textit{include/logsys/jconf.h:19}, implementáció: \textit{src/shared/jctrl.c:73})
	\item Enumeráció: \texttt{enum LogsysJtagMode} (\textit{include/logsys/common.h:42})
	\item Mód lekérdezése: \texttt{logsys\_jtag\_get\_mode} (\textit{include/logsys/jconf.h:15}, implementáció: \textit{src/shared/jctrl.c:62})
	\item Mód beállítása: \texttt{logsys\_jtag\_set\_mode} (\textit{include/logsys/jconf.h:17}, implementáció: \textit{src/shared/jctrl.c:69})
\end{itemize}

\noindent\textbf{JTAG adatátvitel}

A TDI/TDO/TMS értékek megadása a 0x01/0x82 endpoint-párra küldött Bulk transzferekkel történik, egy speciális csomagformátumban:

% TODO jtag_packet

\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 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). Valamint mivel a terminálból olvasáskor a parancsok paramétereit szóközzel választom el, problémás a szóközt tartalmazó útvonalak használata. Speciális esetként beletettem, hogy az aposztrófok vagy idézőjelek közötti szóköz ne törje az argumentumlistát, de pl. nem támogatom a "\texttt{\textbackslash~}" formátumú escape-lést. Valamint ha egy útvonal tartalmaz aposztrófot ÉS idézőjelet IS, akkor nem reprezentálható.

\noindent\textbf{Implementáció}
\begin{itemize}
	\item SVF letöltése: \texttt{logsys\_jtag\_dl\_svf} (\textit{include/logsys/jconf.h:25}, implementáció: \textit{src/shared/jconf.c:202})
	\item XSVF letöltése: \texttt{logsys\_jtag\_dl\_xsvf} (\textit{include/logsys/jconf.h:20}, implementáció: \textit{src/shared/jconf.c:206})
	\item BIT (vagy JED) konvertálása: \texttt{logsys\_conv\_bit2svf} (\textit{include/logsys/jconf.h:35}, implementáció: \textit{src/shared/jconf.c:210})
\end{itemize}

\subsubsection{SPI}
Az LDC képes SPI (Serial Peripheral Interface) master módban működni (a csatlakoztatott programozható eszköz lesz a slave), a MISO, MOSI, CLK, RST és IOREF lábakat használva. Így egyszerű (az USART-nál könnyebben implementálható) soros adatátviteli összeköttetést tudunk létesíteni a számítógép és a fejlesztői kártya közt. Valamint a Logsys FPGA kártyákon található flash csipek is SPI interfészen írhatók, illetve ezen keresztül tudják az FPGA-t is konfigurálni.

Az implementációt a flash chipek felprogramozását végző Windowsos segédprogram (Logsys FLASH\cite{LS-flash}) visszafejtéséből nyertem. A RC3 verziónak nem része, a következő kiadásban fogom megjelentetni.

Az adatátvitel történhet 8, 4, 2 vagy 1 MHz-es órajel mellett, ezenfelül többféle módot támogat, amit nem sikerült visszafejtenem. Az adatok átviteléhez a 0x01/0x82-es Bulk endpoint-párt használja.

\noindent\\Az átvitel a következő két kéréssel nyitható meg:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Inicializálás} &amp; \textit{Átvitel indítása}\\ \hhline{|=|=|=|}
	irány &amp; IN &amp; OUT\\ \hline
	bRequest &amp; 32 &amp; 34\\ \hline
	wValue &amp; $freq$ &amp; 0\\ \hline
	wIndex &amp; mód &amp; 0\\ \hline
	hossz &amp; 1 &amp; 0\\ \hline
\end{tabular}

A $freq$ mezőben jobbról 0, 1, 2 vagy 3 db 1-es bit lép be attól függően, hogy a CLK frekvenciát 8, 4, 2 vagy 1 MHz-en akarjuk használni. Az IN kérés a sikerességet adja vissza.

\noindent\\Ezután az adatátvitel egy 5 bájtos header kiküldésével kezdődik a 0x01-es USB végponton:

\noindent\begin{tabular}{|l|c|c|c|c|c|}
	\hline
	ofszet &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4\\ \hline
	mező &amp; \multicolumn{4}{l|}{Adatblokk hossza} &amp; 0x01\\ \hline
\end{tabular}

Majd pedig az adatblokk következik, ugyanezen a végponton:

\noindent\begin{tabular}{|l|c|c|}
	\hline
	ofszet &amp; 0 &amp; 1 \dots \\ \hline
	mező &amp; parancs &amp; adatok\\ \hline
\end{tabular}

Majd a 0x82-es végpontról szintén Bulk átvitellel visszaolvassuk a státuszkódot és a vett adatokat:

\noindent\begin{tabular}{|l|c|c|}
	\hline
	ofszet &amp; 0 &amp; 1 \dots \\ \hline
	mező &amp; státusz &amp; adatok\\ \hline
\end{tabular}

\noindent Ezt a műveletsort végzi el nekünk a \texttt{logsys\_spi\_cmd} függvény.

\noindent\\Az átvitel bezárásához a következő kérést használjuk:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{SPI bezárás}\\ \hhline{|=|=|}
	irány &amp; OUT\\ \hline
	bRequest &amp; 33\\ \hline
	wValue &amp; 0\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 0\\ \hline
\end{tabular}

\noindent\textbf{Implementáció}
(nem része a RC3-as verziónak. A sorszámok a \texttt{644e061\-53c1351cc038acfa3bf2212f86500aa48}-as commitra értendőek)
\begin{itemize}
	\item Megnyitás: \texttt{logsys\_spi\_begin} (\textit{include/logsys/serio.h:124}, implementáció: \textit{src/shared/serio.c:67})
	\item Lezárás: \texttt{logsys\_spi\_end} (\textit{include/logsys/serio.h:126}, implementáció: \textit{src/shared/serio.c:73})
	\item Parancs küldés: \texttt{logsys\_spi\_cmd} (\textit{include/logsys/serio.h:129}, implementáció: \textit{src/shared/serio.c:77})
	\item SPI órajel: \texttt{enum LogsysSpiSpeed} (\textit{include/logsys/serio.h:53})
	\item SPI mód (tartalma ismeretlen): \texttt{enum LogsysSpiMode} (\textit{include/logsys/serio.h:61})
	\item SPI parancsok: \texttt{enum LogsysSpiCmd} (\textit{include/logsys/serio.h:64})
\end{itemize}

\subsubsection{USART}
Az USART (Universal Synchronous/Asynchronous Receive \&amp; Transmit) adatátvitellel általános célú full duplex soros kapcsolatot létesíthetünk a számítógép és a céleszköz között. Az LDC képes hardveresen kezelni az USART átviteleket, a MOSI (TX), MISO (RX), CLK (csak USRT mód esetén) és IOREF lábakon keresztül.

\noindent\\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|}
	\hline
	\textit{Művelet} &amp; \textit{Inicializálás} &amp; \textit{Órajel megadása} &amp; \textit{Vonali kódolás beállítása}\\ \hhline{|=|=|=|=|}
	irány &amp; IN &amp; OUT &amp; OUT\\ \hline
	bRequest &amp; 49 &amp; 53 &amp; 54\\ \hline
	wValue &amp; USRT mód &amp; periódusregiszter &amp; kódolás\\ \hline
	wIndex &amp; 0 &amp; 0 &amp; paritásbitek\\ \hline
	hossz &amp; 1 &amp; 0 &amp; 0\\ \hline
\end{tabular}

\noindent Az IN által visszaadott bájt a kérés sikerességét jelzi. A vonali kódolás paramétereinek beállítására enumerációkat hoztam létre.

A portra való írás egy egyszerű Bulk átvitellel történik a 0x05-ös végponton. Olvasás esetén azonban figyeljünk arra, hogy a 0x86-os endpointról való olvasás első bájtja egy státuszbájt! Ez a státusz egy bitmező, jelentése a \texttt{LogsysUsartStatus} enumerációban található.

\noindent\\Az átvitelt ezzel a kéréssel zárhatjuk be:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Bezárás}\\ \hhline{|=|=|}
	irány &amp; OUT\\ \hline
	bRequest &amp; 50\\ \hline
	wValue &amp; 0\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 0\\ \hline
\end{tabular}

\noindent\\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.)

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Képességek lekérdezése}\\ \hhline{|=|=|}
	irány &amp; IN\\ \hline
	bRequest &amp; 48\\ \hline
	wValue &amp; 0\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 24\\ \hline
\end{tabular}

\noindent Ez egy ilyen struktúrát ad vissza:

\noindent\begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
	\hline
	ofszet &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 &amp; 6 &amp; 7 &amp; 8 &amp; 9 &amp; 10 &amp; 11 &amp; 12 &amp; 13 \dots 21 &amp; 22 &amp; 23\\\hline
	mező &amp; \multicolumn{4}{c|}{órajel} &amp; előosztás &amp; \multicolumn{4}{c|}{min. baud/s} &amp; \multicolumn{4}{c|}{max. baud/s}  &amp; &amp; major verzió &amp; minor verzió \\\hline
\end{tabular}

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Megnyitás: \texttt{logsys\_usart\_begin} (\textit{include/logsys/serio.h:103}, implementáció: \textit{src/shared/serio.c:36})
	\item Lezárás: \texttt{logsys\_usart\_end} (\textit{include/logsys/serio.h:105}, implementáció: \textit{src/shared/serio.c:49})
	\item Beolvasás: \texttt{logsys\_usart\_getstr} (\textit{include/logsys/serio.h:114}, implementáció: \textit{src/shared/serio.c:53})
	\item Kiírás: \texttt{logsys\_usart\_putstr} (\textit{include/logsys/serio.h:121}, implementáció: \textit{src/shared/serio.c:63})
	\item Vonali kódolás: \texttt{enum LogsysUsartEncoding} (\textit{include/logsys/serio.h:41})
	\item Paritás: \texttt{enum LogsysUsartParity} (\textit{include/logsys/serio.h:48})
	\item USART képességek: \texttt{logsys\_usart\_get\_caps} (\textit{include/logsys/serio.h:100}, implementáció: \textit{src/shared/serio.c:32}), \texttt{struct LogsysUsartCaps} (\textit{include/logsys/serio.h:30})
	\item Státuszkódok: \texttt{enum LogsysUsartStatus} (\textit{include/logsys/serio.h:21})
\end{itemize}

\subsubsection{BitBang soros I/O}
A LDC képes a MISO, MOSI, CLK, RST és IOREF lábait használva szinkron BitBang típusú soros adatátvitelre. Ezzel szinte bármilyen adatátviteli protokoll szimulálható, azonban legfeljebb ~1 kHz-es órajel mellett (a nagy USB adatforgalom miatt).

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|}
	\hline
	\textit{Művelet} &amp; \textit{Inicializálás} &amp; \textit{Átvitel indítása}\\ \hhline{|=|=|=|}
	irány &amp; IN &amp; OUT\\ \hline
	bRequest &amp; 96 &amp; 98\\ \hline
	wValue &amp; periódusregiszter &amp; 0\\ \hline
	wIndex &amp; előosztás &amp; 0\\ \hline
	hossz &amp; 1 &amp; 0\\ \hline
\end{tabular}

Az IN által visszaadott bájt jelzi a kérés sikerességét, és 0, ha már egy másik átvitel használja valamelyik kivezetést. Az órajel-frekvenciát adatátvitel közben is megváltoztathatjuk:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Órajel változtatás}\\ \hhline{|=|=|}
	irány &amp; OUT\\ \hline
	bRequest &amp; 99\\ \hline
	wValue &amp; periódusregiszter\\ \hline
	wIndex &amp; előosztás\\ \hline
	hossz &amp; 0\\ \hline
\end{tabular}

Átvitelt kezdeményezni egy 0x03 endpointra küldött \texttt{LogsysSerialLines} struktúrával lehet, majd a 0x84 végpontból olvasható ugyanilyen formátumban a mintavételezett érték. A szükséges bitmaszkokat az \texttt{enum LogsysSerialPin} tartalmazza. A struktúra kiosztása:

\noindent\begin{tabular}{|l|l|l|}
	\hline
	ofszet &amp; 0 &amp; 1 \\ \hline
	mező &amp; (00CR OI00) &amp; (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 átvitelt lezárni pedig a következőképpen lehet:

\noindent\textbf{URB Control blokk:}\\
\begin{tabular}{|l|l|}
	\hline
	\textit{Művelet} &amp; \textit{Átvitel bezárása}\\ \hhline{|=|=|}
	irány &amp; OUT\\ \hline
	bRequest &amp; 97\\ \hline
	wValue &amp; 0\\ \hline
	wIndex &amp; 0\\ \hline
	hossz &amp; 0\\ \hline
\end{tabular}

\noindent\textbf{Implementáció}
\begin{itemize}
	\item Megnyitás: \texttt{logsys\_serial\_begin} (\textit{include/logsys/serio.h:90}, implementáció: \textit{src/shared/serio.c:7})
	\item Órajel változtatás: \texttt{logsys\_serial\_change\_clk} (\textit{include/logsys/serio.h:92}, implementáció: \textit{src/shared/serio.c:17})
	\item Lezárás: \texttt{logsys\_serial\_end} (\textit{include/logsys/serio.h:94}, implementáció: \textit{src/shared/serio.c:22})
	\item Átvitel: \texttt{logsys\_serial\_send} (\textit{include/logsys/serio.h:97}, implementáció: \textit{src/shared/serio.c:26})
	\item Vonalak állapota: \texttt{enum LogsysSerialLines} (\textit{include/logsys/serio.h:10})
	\item Bitmaszkok: \texttt{enum LogsysSerialPin} (\textit{include/logsys/serio.h:18})
\end{itemize}

\subsection{A driver felépítése}
% TODO
Maga a meghajtóprogram a \texttt{liblogsys-drv.so.0.0.1} osztott függvénykönyvtárban van. A hagyományos driverekkel ellentétben nem kernel objektum, hanem dinamikus library. Ezáltal a lehető legkisebb jogosultsági szinten, az őt éppen belinkelő alkalmazás szintjén fut, ami biztonsági szempontból előnyös. Továbbá nem kell minden kernelfrissítéskor újrafordítani, sőt, egyáltalán a Linux kernel megléte sem feltétel. Így bármilyen, LibUSB-t és libc-t tartalmazó platformon fordítható, például macOS-en.

Azonban ennek az alacsony jogosultságnak következtében nem tehetek meg néhány dolgot, pl. nem tudok device node-ot létrehozni a soros port számára, így azt is függvényhívásos interfészen keresztül kell használni.

A függvénykönyvtár a \textit{src/shared} mappa fájljaiból fordul, valamint tartalmazza a libxsvf-et (hiszen az statikusan linkelt).

% TODO féjlok

% TODO JTAG, libxsvf

\subsection{A parancssori alkalmazás felépítése}
A konzolos teszt alkalmazás a \texttt{logsys-test} fájlnevet viseli. A programon belül különféle parancsokat adhatunk ki, amiket az LDC végre fog hajtani.

A program egyszerre pontosan egy csatlakoztatott LDC-t képes használni, és nem kezeli az LDC futás közbeni eltávolítását.

A program forráskódja a \textit{src/test/usbtest.c}.

% TODO parancsok

A parancsok felépítése a következő: \texttt{kategória operáció [argumentumok]}. Az egyes kategóriák leírása következik lejjebb.

\subsubsection{\texttt{status}}
Ennek a kategóriának nincsenek operációi. Kiadáskor kiírja az LDC állapotát táblázatba formázva.

\subsubsection{\texttt{clk}}
\textbf{Operációk:}
\begin{itemize}
	\item \texttt{status}: Órajel kimenet állapota
	\item \texttt{start &lt;freq&gt;}: Órajel elindítása \texttt{&lt;freq&gt;} Hz-en
	\item \texttt{stop}: Órajel kikapcsolása
\end{itemize}

\subsubsection{\texttt{pwrlim}}
\textbf{Operációk:}
\begin{itemize}
	\item \texttt{get}: Túláram védelem küszöbértékének és a mérési korrekciós tényezőknek a lekérdezése.
\end{itemize}

\subsubsection{\texttt{vcc}}
\textbf{Operációk:}
\begin{itemize}
	\item \texttt{get}: 5V kimenet állapota
	\item \texttt{on}: 5V bekapcsolása
	\item \texttt{off}: 5V kikapcsolása
\end{itemize}

\subsubsection{\texttt{rst}}
\textbf{Operációk:}
\begin{itemize}
	\item \texttt{get}: RST kimenet állapota
	\item \texttt{on}: RST bekapcsolása
	\item \texttt{off}: RST kikapcsolása
\end{itemize}

\subsubsection{\texttt{jtag}}
\textbf{Operációk:}
\begin{itemize}
	\item \texttt{scan}: JTAG Boundary Scan
\end{itemize}

\subsubsection{\texttt{conf}}
\textbf{Operációk:}
\begin{itemize}
	\item \texttt{&lt;formátum&gt; &lt;fájl&gt;}: Konfiguráció letöltése. A \texttt{&lt;formátum&gt;} lehet \texttt{svf}, \texttt{xsvf}, \texttt{bit} vagy \texttt{jed}.
\end{itemize}

\subsubsection{\texttt{quit}}
Hatására a program kilép.

\subsection{További tesztprogramok}

A parancssori példaprogram nem fedi le a driver teljes függvénykészletét, így a kimaradó műveletek tesztelésére további tesztprogramok érhetőek el a \textit{src/test} mappában.

\subsubsection{hotplug-test}
Ez a program az USB hotplug eseménykezelést teszteli. LDC bedugásakor "\texttt{Logsys connected}", kihúzásakor "\texttt{Logsys disconnected}" üzenetet ír a képernyőre.

A program forráskódja a \textit{src/test/hotplug.c}.

\subsubsection{serio-test}
Ez a program a BitBang soros I/O funkciót teszteli. Minden 3. órajelütemben felhúzza a MOSI, minden 5.-ben a RESET jelet, majd visszaolvassa a vonalak állapotát és formázva kiírja a terminálba.

A program forráskódja a \textit{src/test/sio\_fb.c}.

\subsubsection{usart-test}
Ez a program az LDC USART átvitelét teszteli. A soros portra kiküld egy tesztüzenetet, majd beolvassa a rá kapott választ.

A program forráskódja a \textit{src/test/uarttest.c}.

\subsection{Lehetőségek a továbbfejlesztésre}

% TODO

\pagebreak
\begin{thebibliography}{Források}
	\bibitem{LS-beagy-fejl} LOGSYS – Beágyazott rendszerek fejlesztői környezete\\
	Fehér Béla, Raikovich Tamás, Laczkó Péter\\
	\url{http://logsys.mit.bme.hu/sites/default/files/page/2009/09/logsys_beagyazott_rendszerek_fejlesztoi_kornyezete.pdf}
	
	\bibitem{LS-Sp3E} LOGSYS SPARTAN-3E FPGA KÁRTYA FELHASZNÁLÓI ÚTMUTATÓ\\
	\url{http://logsys.mit.bme.hu/sites/default/files/page/2009/09/LOGSYS_SP3E_FPGA_Board.pdf}
	
	\bibitem{RT-dipterv} Hatékony alkalmazásfejlesztés FPGA környezetben\\
	Raikovich Tamás\\
	
	\bibitem{wireshark} USB Capture Setup\\
	WireShark Wiki\\
	\url{https://wiki.wireshark.org/CaptureSetup/USB}
	
	\bibitem{Xil-Lin} XILINX ISE telepítése és használata
	Linux (64 bit) alatt\\
	Csókás Bence Viktor\\
	\url{http://users.hszk.bme.hu/~cb1719/dlc/Xilinx_Linux.pdf}
	
	\bibitem{LS-flash} Logsys FLASH\\
	\url{http://logsys.mit.bme.hu/sites/default/files/page/2009/09/LogsysFLASH_20121015.zip}
\end{thebibliography}
\end{document}
</pre></body></html>