]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Diploma thesis text.
authorRostislav Lisovy <lisovy@gmail.com>
Sat, 23 Apr 2011 13:10:11 +0000 (15:10 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Sat, 23 Apr 2011 13:10:11 +0000 (15:10 +0200)
doc/diploma_thesis/text/dip_text.tex
doc/diploma_thesis/text/lisovy_dip.tex

index 8ec5bc6766b2d5117f5b71e7e7d06d3f8b1d3ebc..7c3107eae20ec6621ce43d3ed3a98d7f82a66eb9 100644 (file)
@@ -8,23 +8,30 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Úvod}
 \section{Motivace, cíl}
-Zadání této práce vzešlo z akademického prostředí a reaguje na nedostatek studijních materiálů v českém jazyce pro začátečníky, popisujících vývoj ovladačů (v tomto případě PCI zařízení) pro operační systém GNU/Linux.
+Zadání této práce vzešlo z akademického prostředí a reaguje na nedostatek studijních materiálů v českém jazyce pro začátečníky, popisující vývoj ovladačů (v tomto případě PCI zařízení) pro operační systém GNU/Linux.
 
-Text popisuje základní aspekty práce s PCI zařízeními v jádře Linux a uvádí dva konkrétní způsoby implementace ovladače zařízení PCI. Text obsahuje pouze nezbytné množství teorie, která je podložená četnými příklady pro snadnější pochopení čtenářem. Pro čtenáře neznalého psaní programů těsně svázaných s hardwarem se snažím názorně vysvětlit základní principy a úskalí tohoto druhu programování. V případě dalšího zájmu o problematiku může čtenář sáhnout po knize \cite{devicedriver}.
+Text popisuje základní aspekty práce s PCI zařízeními v jádře Linux a uvádí dva konkrétní způsoby implementace ovladače zařízení PCI -- tzv. UIO a Comedi ovladač. Text obsahuje pouze nezbytné množství teorie, která je podložena četnými příklady pro snadnější pochopení. Pro čtenáře neznalého psaní programů těsně svázaných s hardwarem, jsou názorně vysvětleny základní principy a úskalí tohoto druhu programování.
+%V případě dalšího zájmu o problematiku může čtenář sáhnout po knize \cite{devicedriver}.
 
-Kromě samotného popisu vývoje PCI ovladačů je cílem práce částečně implementovat funkce karty Humusoft MF624 do emulačního programu Qemu tak, aby si případný zájemce mohl vše vyzkoušet, aniž by fyzicky vlastnil hardware.
+Jako ukázková zařízení na sběrnici PCI byly zvoleny karty Humusoft MF624 a MF614. Podrobně je popsána jejich funkce, včetně způsobu obsluhy ovladačem. Tyto karty byly zvoleny z důvodu snadno pochopitelného způsobu obsluhy.
+  
+Výsledkem práce by měly být, kromě popisu vývoje PCI ovladačů, i ovladače typu UIO a Comedi podporující základní funkce (A/D, D/A převodníky a digitální vstupy a výstupy) karet Humusoft MF614 a MF624, které by mohly posloužit jako jednoduché ukázkové ovladače.
+
+Pro maximální možné zhodnocení návodů je cílem práce implementovat některé funkce karty Humusoft MF624 do emulačního programu Qemu tak, aby bylo možné popsané postupy implementace ovladačů vyzkoušet i bez fyzického přístupu ke kartě. (FIXME)
 
 \section{Dostupné materiály}
-V českém jazyce dosud vyšla pouze jedna tištěná kniha, která se zabývá problematikou vývoje pro jádro Linux. Jedná se o knihu \cite{jadrosystemu} od Lukáše Jelínka. Je dělena do 3 základních částí:
+V českém jazyce dosud vyšla pouze jedna tištěná kniha, která se zabývá problematikou programování v prostředí jádra Linux. Jedná se o knihu Jádro systému Linux \cite{jadrosystemu} od Lukáše Jelínka. Je dělena do 3 základních částí:
 \begin{itemize}
 \item \textit{Vnější rozhraní jádra}
 \item \textit{Vývoj ovladačů}
 \item \textit{Pohled dovnitř jádra}
 \end{itemize}
 
-Jednotlivá témata jsou popsána pouze stručně (kniha je koncipována spíše jako příručka než jako učebnice) a pro studenta nižšího ročníku, neznalého vývoje jaderných ovladačů zařízení nemá příliš velký přínos.
+Jednotlivá témata jsou popsána pouze stručně (kniha je koncipována spíše jako příručka než jako učebnice) a pro studenta, neznalého vývoje jaderných ovladačů zařízení nemá příliš velký přínos.
+
+Za nejpřínosnější knihu, zabývající se problematikou jaderného programování, považuji anglicky psanou knihu Linux Device Drivers \cite{devicedriver} od autorů Jonathan Corbet, Alessandro Rubini a Greg Kroah-Hartman. Tato kniha podrobně vysvětluje jak obecné principy a funkce používané u jaderných ovladačů, tak i způsob implementace ovladačů zařízení konkrétních typů.
 
-Za nejpřínosnější knihu, zabývající se psaním ovladačů pro Linux, považuji anglicky psanou knihu \cite{devicedriver} od autorů Jonathan Corbet, Alessandro Rubini a Greg Kroah-Hartman. Knihu je možné stáhnout zdarma ve formátu PDF\footnote{\url{http://lwn.net/Kernel/LDD3/}}.
+Knihu je možné stáhnout zdarma ve formátu PDF\footnote{\url{http://lwn.net/Kernel/LDD3/}}.
 
 \begin{figure}[h!]
        \begin{center}
@@ -60,7 +67,7 @@ Prvním způsobem, jak změnit stav GPIO pinu (ať už nastavení, zda se má je
 \begin{figure}[h!]
        \begin{center}
        \includegraphics[width=130mm]{img/gpio.pdf}
-       \caption{Registr odpovídající GPIO pinům. Změnou tohoto registru je možné měnit chování GPIO pinů}
+       \caption{Registr odpovídající GPIO pinům. Změnou hodnoty tohoto registru je možné měnit chování nebo stav GPIO pinů}
        \label{gpio_pins}
        \end{center}
 \end{figure}
@@ -97,11 +104,11 @@ PCI (\textit{Peripheral Component Interconnect}) je standard paralelní sběrnic
 Komunikace mezi zařízeními připojenými na sběrnici a procesorem zajišťuje tzv. \textit{PCI most} (PCI bridge). Propojení více nezávislých sběrnic v jednom počítači jsou zajištěny také PCI mosty.
 
 \subsection{Historie}
-V roce 1990 začala práce na specifikaci PCI v laboratořích firmy Intel. První specifikace definující jak komunikační protokol, tak vzhled konektoru a slotu, byla zveřejněna 30. dubna 1993 (jedná se o PCI 2.0). PCI sběrnice se poté začala objevovat v počítačích architektury PC XT a PowerPC.
+V roce 1990 začala práce na specifikaci PCI v laboratořích firmy Intel. První specifikace definující jak komunikační protokol, tak vzhled konektoru a slotu, byla zveřejněna 30. dubna 1993 (jedná se o PCI 2.0). PCI sběrnice se poté začala objevovat v počítačích architektury IBM PC a PowerPC.
 
 V pozdějších letech se původní standard dočkal vylepšení -- zvýšení šířky paralelní sběrnice z 32 bitů na 64 bitů a zrychlení z 33 MHz na 66 Mhz a výše. Tyto pokročilejší verze se však příliš neujaly.
 \subsection{Konektory}
-Pro spojení mezi kartou a sběrnicí je potřeba pouze konektor na straně sběrnice -- tzv. slot. V závislosti na napájecím napětí (3,3 V nebo 5 V) jsou na kartách klíčovací zářezy -- tyto zářezy znemožňují zasunutí \textit{napěťově} nekompatibilní karty do slotu. Jsou však karty, které mají tyto zářezy oba, díky čemuž může být karta použita v libovolném slotu (Obr. \ref{pci}).
+Pro spojení mezi kartou a sběrnicí je potřeba pouze konektor na straně sběrnice -- tzv. slot. V závislosti na napájecím napětí (3,3 V nebo 5 V) jsou na kartách klíčovací zářezy -- tyto zářezy znemožňují zasunutí \textit{napěťově} nekompatibilní karty do slotu. Jsou však karty, které mají tyto zářezy oba, díky čemuž může být karta použita v libovolném slotu (obr. \ref{pci}).
 
 \begin{figure}[h!]
        \begin{center}
@@ -771,7 +778,7 @@ Když již alokovaná paměť není potřeba, je nutné ji voláním \texttt{kfr
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Ovladače PCI zařízení}\label{pci_driv}
-\ibox{Jako nejlepší reference jednotlivých funkcí slouží zdrojové kódy jádra. Pro prohlížení zdrojových kódů jádra mohu doporučit online \textit{The Linux Cross Reference} -- \\
+\ibox{Jako nejlepší reference jednotlivých funkcí slouží zdrojové kódy jádra. Pro jejich prohlížení existuje šikovný online nástroj \textit{The Linux Cross Reference} -- \\
 \url{http://lxr.linux.no/linux/}.}
 
 Ovladače PCI zařízení jsou ve většině případů kompilovány jako jaderné moduly, dynamicky načítané za běhu jádra. Takový modul je možné buď načíst ručně, pomocí příkazu \texttt{insmod} (se zadanou absolutní cestou) nebo, nachází-li se v adresáři \texttt{/lib/modules/\$(uname -r)/} a je součástí seznamu \texttt{modules.dep}\footnote{Tento seznam je aktualizován pomocí příkazu \texttt{depmod}.} (v témže adresáři), je možné ho načíst pomocí příkazu \texttt{modprobe} (kde se jako parametr předá pouze název modulu bez koncovky \texttt{.ko}). Druhá varianta se týká všech ovladačů standardně zkompilovaných s jádrem.
@@ -958,7 +965,16 @@ Příklad jak takové funkce mohou vypadat:
 \section{UIO ovladač}
 V případě, že je vytvářen ovladač pro linuxové jádro, mělo by být rozhodnuto, kterého subsystému se stane součástí -- např. zda jde o jednoduché znakové zařízení, síťovou kartu nebo zvukovou kartu. Tato volba určí, kterou sadu pomocných funkcí bude moci ovladač používat a jakým způsobem bude zpřístupněno zařízení do uživatelského prostoru.
 
-V případě, že jde o PCI zařízení, které nelze snadno zařadit do žádné kategorie (jedná-li se například o neobvyklou průmyslovou kartu), je možné vytvořit tzv. UIO (\textit{Userspace I/O}) ovladač. Tento ovladač se skládá ze dvou částí: jednoduchého jaderného modulu a aplikace v uživatelském prostoru. 
+V případě, že zařízení nelze snadno zařadit do žádné kategorie (jedná-li se například o neobvyklou průmyslovou PCI kartu), je možné vytvořit tzv. UIO (\textit{Userspace I/O}) ovladač. Tento ovladač se skládá ze dvou částí: jednoduchého jaderného modulu a aplikace v uživatelském prostoru (viz diagram ma obrázku \ref{uio_diagram}).
+
+\begin{figure}[h!]
+       \begin{center}
+       \includegraphics[width=150mm]{img/uio.pdf}
+       \caption{Diagram znázorňující funkci UIO ovladače}
+       \label{uio_diagram}
+       \end{center}
+\end{figure}
+
 
 Mezi jeho hlavní výhody patří to, že v jádře je obsažena pouze malá obecná část, která zpřístupňuje zdroje zařízení do uživatelského prostoru (její implementace je poměrně snadná). Druhou částí je aplikace v uživatelském prostoru, která přistupuje k jednotlivým zdrojům karty a tvoří hlavní logiku ovladače. Většina vývoje tedy probíhá v uživatelském prostoru, čímž klesá riziko narušení stability jádra.
 
@@ -1106,7 +1122,7 @@ mf624_BAR2 += (BAR2_phys_addr & (sysconf(_SC_PAGESIZE) - 1));
 Jelikož se jedná o paměť zařízení, je potřeba i v uživatelském prostoru k této paměti přistupovat pomocí speciálních funkcí. Ty jsou popsány v kapitole \ref{iofce}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%\newpage
+\newpage
 \section{Comedi ovladač}
 Kromě popsaných výhod UIO ovladače jsou zde i nevýhody. Jednou z nich je pomalejší odezva než v případě plnohodnotného jaderného ovladače. Další nevýhodou je neexistence knihovny v uživatelském prostoru, která by poskytovala jednotné API pro přístup k zařízení (v případě UIO ovladače je potřeba vytvořit pro každé zařízení specifický program).
 
@@ -1192,6 +1208,7 @@ Třetí parametr obsahuje ukazatel na strukturu popisující danou \textit{instr
 \texttt{CR\_CHAN()}, které vrací číslo zvoleného kanálu.
 \end{description}
 
+FIXME parametr data[0] a data[1]
 
 \subsection{Funkce \texttt{detach}}
 Tato funkce je volána jak v případě ukončení funkce ovladače, tak v případě, že funkce \textit{attach} neproběhla v pořádku. Proto je potřeba rozlišit, které zdroje ovladače již byly úspěšně naalokovány a mají být uvolněny.
@@ -1205,11 +1222,7 @@ Pro správnou funkci konkrétního Comedi ovladače je nejprve potřeba načíst
 
 V případě, že proběhlo načtení modulu a spuštění funkce \textit{attach} bez problémů, měl by se ve složce \texttt{/dev} objevit nový soubor odpovídající načtenému ovladači zařízení -- comedi0\footnote{Pro názornost je uveden konkrétní příklad, v případě načtení více ovladačů budou odpovídající soubory číslovány od 0 výše.} K tomuto souboru je poté možné pomocí knihovních funkcí Comedilib přistupovat.
 
-Pro přístup k zařízení je potřeba zavolat na soubor \texttt{/dev/comedi0} funkci \texttt{comedi\_open()}. Ta vrací ukazatel datového typu \texttt{comedi\_t}, reprezentujícího dané zařízení. K němu je možné přistupovat pomocí funkcí\\
-\texttt{comedi\_data\_read()},\\
-\texttt{comedi\_data\_write()},\\
-\texttt{comedi\_dio\_read()},\\
-\texttt{comedi\_dio\_write()}.
+Pro přístup k zařízení je potřeba zavolat na soubor \texttt{/dev/comedi0} funkci \texttt{comedi\_open()}. Ta vrací ukazatel datového typu \texttt{comedi\_t}, reprezentujícího dané zařízení. K němu je možné přistupovat pomocí funkcí: \texttt{comedi\_data\_read()}, \texttt{comedi\_data\_write()}, \texttt{comedi\_dio\_read()}, \texttt{comedi\_dio\_write()}.
 
 První dvě slouží pro zápis/čtení A/D a D/A převodníků, zatímco poslední dvě slouží pro přístup k digitálním vstupům/výstupům.
 Prvním parametrem všech funkcí je ukazatel na \texttt{comedi\_t}. Druhým je číslo \textit{podzařízení}. Třetí parametr určuje kanál (t.j. např. který z osmi A/D převodníků má být čten). Posledním parametrem je ukazatel na proměnnou, kam mají být zapsána přečtena data nebo hodnota, která má být zapsána.
@@ -1274,9 +1287,9 @@ Poté je již možné spustit příkaz
 
 
 \subsection{Použití}
-Zkompilovaný binární soubor se nachází v adresáři \texttt{i386-softmmu}. Nejnutnější parametr při spuštění je \texttt{-hda}, který uvádí cestu k souboru reprezentující \textit{obraz} spouštěného systému.
+Zkompilovaný binární soubor se nachází v adresáři \texttt{i386-softmmu}. Nejnutnější parametr při spuštění je \texttt{-hda}, který uvádí cestu k souboru reprezentujícím \textit{obraz} spouštěného systému.
 
-V případě správně zkompilované virtuální karty MF624, je možné ji spustit zadáním parametru \texttt{-device mf624}. Po spuštění je v příkazové řádce vypsáno číslo TCP/IP portu, na kterém virtuální karta MF614 naslouchá. Tento port slouží k připojení klientského programu, který má na starosti vykreslování výstupních a nastavování vstupních hodnot karty (možná implementace je popsána v kapitole \ref{qt_gui_ch}. V případě neexistence klientského software je možné se připojit pomocí programu \texttt{telnet}.
+V případě správně zkompilované virtuální karty MF624, je možné ji spustit zadáním parametru \texttt{-device mf624}. Po spuštění je v příkazové řádce vypsáno číslo TCP/IP portu, na kterém virtuální karta MF624 naslouchá. Tento port slouží k připojení klientského programu, který má na starosti vykreslování výstupních a nastavování vstupních hodnot karty (možná implementace je popsána v kapitole \ref{qt_gui_ch}). V případě neexistence klientského software je možné se k virtuální kartě připojit pomocí programu \texttt{telnet}.
 
 Příklad spuštění:
 \begin{verbatim}
@@ -1286,6 +1299,21 @@ Příklad spuštění:
     Client connected
 \end{verbatim}
 
+Příklad ovládání vstupů a zobrazování výstupů karty pomocí aplikace \texttt{telnet}:
+\begin{verbatim}
+$ telnet localhost 55555
+  Trying ::1...
+  Trying 127.0.0.1...
+  Connected to localhost.
+  Escape character is '^]'.
+  DA1=9.998779
+  DOUT=255.000000
+  DOUT=0.000000
+  DA1=5.000000
+  ^]
+  telnet> Connection closed.
+\end{verbatim}
+
 \section{Qt grafiké rozhraní}\label{qt_gui_ch}
 Pro komunikaci s virtuální kartou MF624 bylo implementováno jednoduché grafické rozhraní, které má na starosti vykreslování hodnot výstupů karty (nastavovaných ovladačem běžícím v operačním systému virtualizovaném Qemu) a posílání nastavovaných vstupních hodnot zpět virtuální kartě.
 
@@ -1300,13 +1328,13 @@ Grafická aplikace je vytvořena za pomoci grafického knihovny Qt. V případě
     $ make
 \end{verbatim}
 
-Použití aplikace by mělo být intuitivní. Položky, u kterých není možné měnit jejich hodnotu jsou záměrně pouze pro čtení.
+Použití aplikace by mělo být intuitivní. Položky, u kterých není možné měnit jejich hodnotu, jsou záměrně pouze pro čtení (zobrazují výstupní hodnoty).
 
 
 \begin{figure}[h!]
        \begin{center}
-       \includegraphics[width=90mm]{img/qt_gui.png}
-       \caption{(FIXME aktualni verzi). Vzhled grafické aplikace pro ovládání vstupů a výstupů virtuální karty MF624}
+       \includegraphics[width=100mm]{img/qt_gui.png}
+       \caption{Vzhled grafické aplikace pro ovládání vstupů a výstupů virtuální karty MF624}
        \label{qt_gui}
        \end{center}
 \end{figure}
index 31a579b2428736f27a2518f3df3d87d07131f409..62b4a99ae32a568f26766ad1df21043c97d819f9 100644 (file)
@@ -207,9 +207,7 @@ FIXME
 
 Cílem této práce je vysvětlit základní principy komunikace ovladače operačního systému s hardwarem. Pro názornost jsou v práci popsány postupy implementace UIO a Comedi ovladače pro měřící kartu Humusoft MF624 pro operační systém GNU/Linux.
 
-Součástí této práce je i implementace základních funkcí (DAC, ADC, DIO) karty Humusoft MF624 do emulátoru Qemu, aby si případný zájemce mohl popsané postupy vyzkoušet, aniž by vlastnil potřebný hardware.
-
-Od čtenáře se očekává základní znalost používání operačního systému GNU/Linux, dobrá znalost programovacího jazyka C a základní znalost anglického jazyka.
+Součástí této práce je i implementace základních funkcí (D/A, A/D převodníky, digitální vstupy a výstupy) karty Humusoft MF624 do emulátoru Qemu, aby si případný zájemce mohl popsané postupy vyzkoušet, aniž by vlastnil potřebný hardware.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  Obsah / Table of Contents