% \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}
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ří:
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í
\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}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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í}