]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Diploma thesis text.
authorRostislav Lisovy <lisovy@gmail.com>
Wed, 20 Apr 2011 00:58:31 +0000 (02:58 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Wed, 20 Apr 2011 00:58:31 +0000 (02:58 +0200)
doc/diploma_thesis/text/dip_text.tex

index ee0263e66d4f6b3b2a1e3ef91cd4d80cc5afba56..ec94f88f796fd71ad225cdf59bb4cdc4da062a56 100644 (file)
@@ -3,6 +3,7 @@
 % \caption{} bez tečky na konci
 % \item[] a \item s tečkou na konci
 % odsazování zdrojáků
+% parametry funkce. Většinou nejsou, ale u prvních výskytů by se hodily
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Úvod}
@@ -664,7 +665,7 @@ i pro Subdevice ID).
 
 Tato struktura se -- pro nástroje v uživatelském prostoru vytvářející seznamy ovladačů -- exportuje pomocí makra \texttt{MODULE\_DEVICE\_TABLE(pci, mf624\_pci\_id)}, kde první parametr určuje typ zařízení a druhý je ukazatel na seznam typu \texttt{struct pci\_device\_id}.
 
-\subsection{Struktura \texttt{struct pci\_driver}}
+\subsection{Struktura \texttt{struct pci\_driver}}\label{pci_reg}
 Pro to, aby mohl se mohl ovladač PCI zařízení stát součástí jaderného PCI subsystému, je potřeba ho do zaregistrovat. To se provede voláním funkce \texttt{pci\_register\_driver()}, které se jako parametr předá ukazatel na strukturu \texttt{struct pci\_driver}. 
 
 Tato struktura obsahuje základní informace o ovladači -- základní proměnné a ukazatele na funkce. Mezi hlavní položky patří:
@@ -815,7 +816,7 @@ V případě, že jde o PCI zařízení, které nelze snadno zařadit do žádn
 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živateské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.
 
 \subsection{Jaderný modul}
-Jaderný modul UIO ovladače by měl obsahovat:
+Jaderný modul UIO ovladače PCI zařízení by měl obsahovat:
 \begin{itemize}
 \item Funkci volanou PCI subsystémem při registraci ovladače
 \item Volání funkcí pro namapování regionů zařízení
@@ -838,7 +839,6 @@ Mezi její hlavní položky patří:
 \item[\texttt{const char *version}]~\\Verze ovladače v textové podobě.
 \item[\texttt{struct uio\_mem mem[MAX\_UIO\_MAPS]}]~\\Pole struktur obsahujících informace o regionech PCI zařízení mapovaných do paměťového prostoru (bude podrobně vysvětleno dále).
 \item[\texttt{struct uio\_port port[MAX\_UIO\_PORT\_REGIONS]}]~\\Pole struktur obsahujících informace o regionech PCI zařízení mapovaných do vstupně-výstupního prostoru (bude podrobně vysvětleno dále).
-%\item[\texttt{}]
 \end{description}
 
 \subsubsection{Struktura \texttt{struct uio\_mem} a \texttt{struct uio\_port}}\label{uio_mem_port}
@@ -960,45 +960,79 @@ Jelikož se jedná o paměť zařízení, je potřeba i v uživatelském prostor
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \newpage
 \section{Comedi ovladač}
-UIO ovladač dává uživateli možnost využít 100 \% všech funkcí zařízení -- daní za to je pomalejší odezva než v případě plnohodnotného jaderného ovladače.
+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).
+
+Pro ovladače měřících karet (které disponují základními funkcemi) existuje v Linuxu subsystém -- tzv. Comedi (Control and Measurement Device Interface).
+
+Comedi se skládá ze tří částí:
+
+\begin{description}
+\item[Comedi] -- jsou jednotlivé nízkoúrovňové ovladače zařízení, včetně hlavního ovladače \texttt{comedi}, který poskytuje základní funkce.
+\item[Comedilib] -- je knihovnou v uživatelském prostoru, která poskytuje jednotné rozhraní pro ovládání jednotlivých zařízení. 
+\item[Kcomedilib] -- je jaderný modul, který poskytuje stejné rozhraní jako Comedilib v uživatelském prostoru. Používá v případě potřeby ovládat zařízení v reálném čase.
+\end{description}
+
 
-Pro ovladače měřících karet existuje v Linuxu subsystém -- tzv. Comedi (Control and Measurement Device Interface).
 \subsection{Registrace ovladače}
+Pro správnou funkci je potřeba, aby byl ovladač ihned po načtení modulu (t.j. v \textit{init} funkci) zaregistrován, jak do PCI subsystému, tak do subsystému Comedi. Registrace mezi PCI zařízení je popsána v kapitole \ref{pci_reg}. Registrace mezi Comedi ovladače se provede voláním \texttt{comedi\_driver\_register(struct comedi\_driver *driver)}, kde jako parametr se předá ukazatel na strukturu \texttt{struct comedi\_driver}.
 
 \subsection{Struktura \texttt{struct comedi\_driver}}
-Tato struktura obsahuje ukazatele na funkce, které jsou zavolány při nahrání resp. uvolnění ovladače.
+Nejdůležitější položky, které tato struktura obsahuje jsou ukazatele na funkce volané při aktivaci Comedi ovladače.
+
 Položky struktury jsou:
 \begin{description}
 \item[\texttt{const char *driver\_name;}]~\\Obsahuje textový název ovladače.
 \item[\texttt{struct module *module;}]~\\Ukazatel na modul, kterému tato struktura náleží. Inicializuje se makrem \texttt{THIS\_MODULE}.
-\item[\texttt{int (*attach) (struct comedi\_device *, struct comedi\_devconfig *);}]~\\Ukazatel na funkci, která má být zavolána po načtení modulu
-\item[\texttt{int (*detach) (struct comedi\_device *);}]~\\Ukazatel na funkci, která má být zavolána při uvolňování modulu
+\item[\texttt{int (*attach) (struct comedi\_device *, struct comedi\_devconfig *);}]~\\Ukazatel na funkci, která má být zavolána při aktivaci ovladače.
+\item[\texttt{int (*detach) (struct comedi\_device *);}]~\\Ukazatel na funkci, která má být zavolána při deaktivaci ovladače.
 \end{description}
 
+Narozdíl od předchozích příkladů je v tomto případě tou hlavní \textit{inicializační} funkcí nikoliv funkce \texttt{probe()} volaná PCI subsystémem v případě, že se v systému nachází hardware, který umí ovladač obsloužit, ale funkce \texttt{attach()}, která je volána Comedi subsystémem v závislosti na tom, zda má být ovladač použit nebo ne.
 
-\subsection{Registrace struktury \texttt{struct pci\_device\_id}}
-V případě UIO ovladače, byla vytvořena struktura \texttt{struct pci\_driver}, jejíž jeden parametr byl ukazatel na strukturu \texttt{struct pci\_device\_id}. V případě Comedi ovladače se struktura \texttt{struct pci\_driver} nevytváří, proto je potřeba registrovat strukturu \texttt{struct pci\_device\_id} zvlášť.
+\subsection{Funkce \texttt{attach}}
+Funkce \texttt{attach} je volána v případě aktivace Comedi ovladače. \texttt{struct comedi\_subdevice}. Dříve než dojde na popis incializačních kroků je nutné vysvětlit názvosloví, které je u Comedi ovladačů používáno.
 
-\ibox{\texttt{MODULE\_DEVICE\_TABLE(type, struct pci\_device\_id* name);}}
+\begin{description}
+\item[Board] označuje konkrétní zařízení -- měřící kartu. Některé ovladače podporují celou sadu zařízení (např. od stejného výrobce).
+\item[Subdevice] je jedna z mnoha funkcí zařízení. V případě ovladače karty Humusoft MF614 budou implementovány 4 \textit{subdevices}: digitální vstupy, digitální výstupy, analogové vstupy, analogové výstupy.
+\end{description}
 
-Po inicializaci správnými hodnotami se pro registraci zavolá makro \texttt{MODULE\_DEVICE\_TABLE(type, name)}, kde se prvním parametrem určí, o jaké se jedná zařízení (v tomto případě \uv{pci}) a druhým parametrem se předá ukazatel na strukturu \texttt{struct pci\_device\_id}.
+Kromě obvyklých operací, jako je \textit{aktivace zařízení}, žádos o \textit{výhradní přístup} ke zdrojům zařízení a \textit{mapování} paměťových nebo I/O regionů, popsaných v kapitole \ref{pci_driv}, je nutné alokovat a inicializovat struktury \texttt{struct comedi\_subdevice}.
 
+\subsection{Struktura \texttt{struct comedi\_subdevice}}
+Každé podporované funcki zařízení/karty by měla odpovídat jedna struktura \texttt{struct comedi\_subdevice}. Hlavní položky, které struktura obsahuje:
 
-Příklad základní registrace zařízení:
-\begin{verbatim}
+\begin{description}
+\item[\texttt{int type}]~\\ Označuje druh \textit{podzařízení}. Na výběr jsou např. možnosti: 
+\texttt{COMEDI\_SUBD\_AI} (analogový vstup), \texttt{COMEDI\_SUBD\_AO} (analogový výstup), \texttt{COMEDI\_SUBD\_DI} (digitální vstup), \texttt{COMEDI\_SUBD\_DO} (digitální výstup).
 
-\end{verbatim}
+\item[\texttt{int subdev\_flags}]~\\ Označuje základní vlastnost podzařízení. Nejpoužívanější hodnoty: \texttt{SDF\_READABLE} (z podzařízení může být čteno), \texttt{SDF\_WRITABLE} (do podzařízení může být zapisováno).
 
-\subsection{Funkce \texttt{attach}}
-FIXME procházení všech karet
+\item[\texttt{int n\_chan}]~\\ Počet kanálů podzařízení (např. pro 8 digitálních vstupů bude tato hodnota 8).
+
+\item[\texttt{unsigned int maxdata}]~\\ Maximální hodnota, která může být do podzařízení zapsaána/čtena.
+\item[\texttt{const struct comedi\_lrange *range\_table}]~\\Označuje rozsah, ve kterém dané podzařízení měří (např. u A/D převodníku 0--10 V). K dispozici jsou definované struktury (staří pouze předat jejich ukazatel):\\
+\texttt{range\_digital},\\ \texttt{range\_bipolar10},\\ \texttt{range\_bipolar5},\\ \texttt{range\_unipolar10},\\ \texttt{range\_unipolar5}.\\ Jejich názvy jsou samovysvětlující.
+
+\item[\texttt{int (*insn\_read) ( ... );}]
+\item[\texttt{int (*insn\_write) ( ... );}]
+\item[\texttt{int (*insn\_bits) ( ... );}]
+\item[\texttt{int (*insn\_config) ( ... );}]
+\end{description}
+
+\ibox{\texttt{int alloc\_subdevices(struct comedi\_device *dev, unsigned int num\_subdevices)}}
+
+Alokace paměti pro struktury se provede voláním \texttt{alloc\_subdevices()}, které je poskytováno Comedi subsystémem. Prvním parametrem je předán ukazatel na strukturu \texttt{struct comedi\_device}, pro kterou má být alokace provedena. Alokovaná paměť je přístupná skrze proměnnou \texttt{subdevices} náležící struktuře \texttt{struct comedi\_device}. 
 
-\texttt{struct comedi\_subdevice}
+V případě dealokace zdrojů ovladače není potřeba tuto paměť dealokovat -- o uvolnění paměti se postará Comedi subsystém. 
+
+\subsection{Funkce pro čtení a zápis z/do podzařízení}
 
 \subsection{Funkce \texttt{detach}}
 
-\subsection{Struktura popisující vlastnosti zařízení}
-%Výše byly popsány struktury a funkce potřebné pro samotnou registraci Comedi ovladače. Dále je potřeba se zabývat 
-\subsection{Struktura pro privátní data}
+\subsection{Konfigurace z uživatelského prostoru}
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1019,13 +1053,15 @@ Testování správnosti funkce ovladačů probíhala přímo na hardware, za pom
 \vspace{1cm}
 Základní propojení na svorkovnici, které se osvědčilo, bylo:
 \begin{itemize}
-\item 2 $\times$ LED pro nejnižší bity DOUT
-\item 2 $\times$ 1k$\Omega$ rezistory mezi 5 V a nejnižšími bity DIN
+\item 2 $\times$ LED pro nejnižší a nejvyšší bit DOUT
+\item 2 $\times$ 1k$\Omega$ rezistory mezi 5 V a nejnižším a nejvyšším bitem DIN
 \item 2. bit DIN dynamicky spojován s GND nebo pomocí 1k$\Omega$ rezistoru s 5 V
 \item Měření multimetrem výstupní hodnoty z DAC (většinou DAC0 nebo DAC1)
 \item ADC0 spojen s GND, ADC1 spojen pomocí 1k$\Omega$ rezistoru s DAC0
 \end{itemize}
 
+~\\
+
 Konzistence jádra byla testována opětovným načítáním a uvolňováním jednotlivých ovladačů.
 
 \section{Qemu virtuální hardware, Qt grafické rozhraní}