]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Diploma thesis text.
authorRostislav Lisovy <lisovy@gmail.com>
Sun, 24 Apr 2011 16:47:28 +0000 (18:47 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Sun, 24 Apr 2011 16:47:28 +0000 (18:47 +0200)
doc/diploma_thesis/text/dip_text.tex
doc/diploma_thesis/text/lisovy_dip.tex

index a9cb9c13cf2ea77103b41e3504e470f5087d813f..3cdc1edb06de06cc70c7a8cd8220583d52b06e68 100644 (file)
@@ -734,11 +734,12 @@ V jádře Linux je kromě funkcí specifických pro práci se zařízením urči
 
 \subsection{Funkce \texttt{printk()} pro vypisování ladících zpráv}
 \ibox{\texttt{int printk(const char *s, ...)};}
+
 V kapitole \ref{kern_mod} již byla zmíněna funkce \texttt{printk()} v základní verzi, přirovnaná k funkci \texttt{printf()} z uživatelského prostoru. Kromě \textit{obyčejného} vypisování textu do logu jádra podporuje tato funkce navíc \textit{nastavení úrovně důležitosti} zprávy a speciální \textit{formátovací řetězce}.
 
 Nastavení úrovně důležitosti zprávy se provede vložením \textit{nastavovacího} makra \textbf{před} samotný řetězec obklopený uvozovkami. Možné druhy zpráv jsou (od nejkritičtější po nejméně důležitou):
 \begin{description}
-\item[\texttt{KERN\_EMERG}]~\\Zpráva nejvyšší úrovně. Většinou předchází neodvratnému pádu jádra.
+\item[\texttt{KERN\_EMERG}]~\\Zpráva nejvyšší důležitosti. Většinou předchází neodvratnému pádu jádra.
 \item[\texttt{KERN\_ERR}]~\\Informace o vzniklé chybě (např. při informování o špatné funkci hardware).
 \item[\texttt{KERN\_WARNING}]~\\Upozornění o nezávažné chybě.
 \item[\texttt{KERN\_INFO}]~\\Informační zpráva (např. od ovladače zařízení o úspěšném spuštění).
@@ -764,10 +765,10 @@ Příklad nastavení typu zprávy a použití formátovacího řetězce:
 
 
 \subsection{Funkce \texttt{kzalloc()} pro alokaci paměti}
-Problematika alokace paměti v prostředí jádra Linux je velice rozsáhlá. Pomocí speciálních funkcí je možné alokovat celé paměťové stránky nebo FIXME velkou oblast ve virtuálním paměťovém prostoru.
+Problematika alokace paměti v prostředí jádra Linux je velice rozsáhlá. Pomocí speciálních funkcí je možné alokovat logickou paměť, velké bloky virtuální paměti nebo celé paměťové stránky.
 
 \ibox{\texttt{void *kzalloc(size\_t size, gfp\_t flags);}}
-Základní funkce pro alokaci malé paměťové oblasti (např. pro strukturu obsahující privátní data ovladače) je \texttt{kzalloc()}. Prvním parametrem je velikost alokované paměti (maximálně však 128 KB (FIXME)), druhým je příznak určující o jaký druh alokace se jedná. Nejuniverzálnější možností je \texttt{GFP\_KERNEL}.
+Základní funkce pro alokaci malé paměťové oblasti (např. pro strukturu obsahující privátní data ovladače) je \texttt{kzalloc()}. Prvním parametrem je velikost alokované paměti (maximálně však 128 KB), druhým je příznak určující o jaký druh alokace se jedná. Nejuniverzálnější možností je \texttt{GFP\_KERNEL}.
 
 Nově alokovaná paměť je vždy vynulována.
 
@@ -797,12 +798,12 @@ Když již alokovaná paměť není potřeba, je nutné ji voláním \texttt{kfr
 
 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.
 
-V případě, že se v systému objeví nové PCI zařízení, je jádrem informován subsystém v~uživatelském prostoru, který má na starosti správu \textit{hotplug} zařízení (např. \textit{udev}), o tomto zařízení. Hotplug subsystém (v uživatelském prostoru) poté na základě informací od jádra, jako je Vendor ID a Device ID , rozhodne, který ovladač má být pro dané zařízení načten. Seznam, dle kterého se rozhodne, který ovladač bude načten je v souboru \texttt{/lib/modules/\$(uname -r)/modules.pcimap}.
+V případě, že se v systému objeví nové PCI zařízení, je jádrem informován subsystém v~uživatelském prostoru, který má na starosti správu \textit{hotplug} zařízení (např. \textit{udev}). Tento subsystém poté na základě získaných informací, jako je Vendor ID a Device ID, rozhodne, který ovladač má být pro dané zařízení načten. Seznam, dle kterého je ovladač vybírán, je v souboru \texttt{/lib/modules/\$(uname -r)/modules.pcimap}.
 
-Každý ovladač by měl tedy obsahovat informaci o tom, pro které zařízení je určen. To je uvedeno ve struktuře \texttt{struct pci\_device\_id}.
+Proto, aby mohl být ovladač součástí výše popsaného seznamu, musí ve struktuře \texttt{struct pci\_device\_id} obsahovat informaci o tom, pro které zařízení je určen.
 
 \subsection{Struktura \texttt{struct pci\_device\_id}}\label{pci_dev_id}
-Struktura \texttt{struct pci\_device\_id} slouží k identifikaci, pro která zařízení je ovladač určen. Mezi hlavní položky struktury patří \texttt{vendor}, \texttt{device}, \texttt{subvendor}, \texttt{subdevice} (typu \texttt{\_\_u32}) -- jejichž hodnota odpovídá stejnojmenným registrům v konfiguračním prostoru PCI zařízení. Jelikož může být ovladač napsán pro více zařízení, je tato struktura inicializována jako prvek pole, které je zakončeno prvkem prázdným. Různé způsoby inicializace mohou vypadat následovně:
+Struktura \texttt{struct pci\_device\_id} slouží k identifikaci, pro která zařízení je ovladač určen. Mezi hlavní položky struktury patří \texttt{vendor}, \texttt{device}, \texttt{subvendor}, \texttt{subdevice} (typu \texttt{\_\_u32}) -- jejichž hodnota odpovídá hodnotě stejnojmenných registrů v konfiguračním prostoru daného PCI zařízení. Jelikož může být ovladač napsán pro více zařízení, je tato struktura inicializována jako prvek pole, které je vždy zakončeno prázdným prvkem. Různé způsoby inicializace mohou vypadat následovně:
 
 \begin{verbatim}
   1 |  #define PCI_VENDOR_ID_HUMUSOFT          0x186c
@@ -834,14 +835,14 @@ 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}}\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}. 
+Pro to, aby se mohl ovladač PCI zařízení stát součástí jaderného PCI subsystému, je potřeba ho do něj 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ří:
+Tato struktura obsahuje základní informace o ovladači. Mezi hlavní položky patří:
 \begin{description}
 \item[\texttt{const char name*}]~\\Název ovladače. Tento název by měl být unikátní mezi všemi ovladači PCI zařízení. Většinou je totožný s názvem modulu.
 \item[\texttt{const struct pci\_device\_id *id\_table}]~\\Pole struktur popisujících, pro která zařízení je ovladač vytvořen (viz kap. \ref{pci_dev_id}).
 \item[\texttt{int (*probe) (struct pci\_dev *dev, const struct pci\_device\_id *id)}]~\\Ukazatel na funkci, která je volána PCI subsystémem, v případě, že je přítomno zařízení, pro které je tento ovladač vytvořen.
-\item[\texttt{void (*remove) (struct pci\_dev *dev)}]~\\Ukazatel na funkci, která je volána poté, co je tento ovladač odstraňován ze seznamu ovladačů aktuálně používaných PCI subsystémem.
+\item[\texttt{void (*remove) (struct pci\_dev *dev)}]~\\Ukazatel na funkci, která je volána poté, co je tento ovladač odstraňován ze seznamu ovladačů aktuálně používaných PCI subsystémem nebo v případě, že dochází k uvolnění modulu.
 \end{description}
 
 Příklad, jak může být struktura \texttt{pci\_driver} inicializována a následně zaregistrována:
@@ -865,7 +866,7 @@ Prvním parametrem funkce předává PCI subsystém ukazatel na strukturu \textt
 
 \ibox{\texttt{pci\_enable\_device(struct pci\_dev *dev);}}
 
-V rámci inicializace ovladače je nejprve potřeba zavolat funkci \texttt{pci\_enable\_device()} -- ta se postará o inicializaci karty na úrovni hardware -- např.: přiřazení linky přerušení, zresetování registrů karty a její probuzení. Poté je již možné začít přistupovat ke zdrojům zařízení.
+V rámci inicializace ovladače je nejprve potřeba zavolat funkci \texttt{pci\_enable\_device()} -- ta se postará o inicializaci karty na úrovni hardware -- např. přiřazení linky přerušení, zresetování registrů karty a její probuzení. Poté je již možné začít přistupovat ke zdrojům zařízení.
 
 \subsection{Přístup ke zdrojům karty}
 Jak bylo popsáno v kapitole \ref{pci_conf}, PCI zařízení může využívat až 6 paměťových nebo vstupně-výstupních regionů (označovaných jako \textit{zdroje} karty). Jejich alokace do paměťového nebo I/O prostoru počítače je zajištěna dynamicky PCI mostem. Pro přístup do regionů si musí ovladač zařízení zjistit jejich adresu a vyžádat si u operačního systému \textit{výlučný přístup}. 
@@ -904,7 +905,7 @@ Tato funkce by se měla postarat o úklid všech naalokovaných prostředků. M
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Přístup k paměti zařízení}\label{iofce}
-Poté co se ovladači podařilo získat přístup ke zdrojům zařízení, je nutné využít speciálních volání pro zápis/čtení do/z těchto zdrojů.
+Poté co se ovladači podařilo získat přístup ke zdrojům zařízení, je nutné (důvody jsou popsány dále v textu) využít speciálních volání pro zápis/čtení do/z těchto zdrojů.
 
 \subsection{Vstupně-výstupní adresní prostor}
 Stejně jako program v jazyku symbolických instrukcí využívá pro přístup k vstupně-výstupnímu adresnímu prostoru (tj. I/O portům) zvláštní instrukce, je nutné využít speciální funkce v programech psaných ve \textit{vyšších} programovacích jazycích. V případě čtení jsou v~jádře k dispozici tři volání:
@@ -927,12 +928,12 @@ Pro zápis je možné využít volání:
 
 Třetí písmeno, stejně jako u funkcí pro čtení, značí o kolika-bitový přístup se jedná.
 
-Funkce se stejným \textit{prototypem} jsou k dispozici i v uživatelském prostoru (potřebný hlavičkový soubor je \texttt{<sys/io.h>}).
+Funkce se stejným \textit{prototypem} jsou k dispozici i v uživatelském prostoru (potřebný hla\-vičkový soubor je \texttt{<sys/io.h>}).
 
 \subsection{Paměťový adresní prostor}
-I přesto, že se k přístupu k paměti zařízení mapované do paměťového adresního prostoru používá virtuální adresa, stejně jako k přístupu do operační paměti, není možné k paměti zařízení přistupovat přímo \textit{přes ukazatel}. Důvodem je to, že buď překladač (při kompilaci) nebo procesor (za běhu) zoptimalizují\footnote{Tyto optimalizace, v~případě přístupu k operační paměti, urychlují vykonávání programu, aniž by negativně ovlivnily jeho funkci. V případě zápisu/čtení do/z registrů, u kterých mohou tyto operace vyvolávat tzv. \textit{side effects}, již může dojít k nesprávné funkci programu.
+I přesto, že se k přístupu k paměti zařízení mapované do paměťového adresního prostoru používá virtuální adresa (stejně jako v případě přístupu do operační paměti), není možné k paměti zařízení přistupovat přímo \textit{přes ukazatel}. Důvodem je to, že buď překladač (při kompilaci) nebo procesor (za běhu) zoptimalizují\footnote{Tyto optimalizace, v~případě přístupu k operační paměti, urychlují vykonávání programu, aniž by negativně ovlivnily jeho funkci. V případě zápisu/čtení do/z registrů, u kterých mohou tyto operace vyvolávat tzv. \textit{side effects}, již může dojít k nesprávné funkci programu.
 
-Příklad optimalizace: V programu se do jedné paměťové buňky ihned po sobě zapíší dvě různé hodnoty, poté se výsledná hodnota přečte -- optimalizace možná u klasického programu je taková, že se ve skutečnosti provede pouze druhý zápis, protože ten první nemá žádný efekt (hodnota je ihned přepsána druhým zápisem). V~případě přístupu do registru zařízení může zápis například spouštět převod A/D převodníků -- po optimalizaci se však provede pouze jednou, nikoliv dvakrát.} sekvenci zápisů/čtení do/z paměti zařízení takovým způsobem, že se výsledek bude lišit od toho, jak to bylo v programu zamýšleno.
+Příklad optimalizace: V programu se do jedné paměťové buňky ihned po sobě zapíší dvě různé hodnoty, poté se výsledná hodnota přečte -- optimalizace možná u klasického programu je taková, že se ve skutečnosti provede pouze druhý zápis, protože ten první nemá žádný efekt (hodnota je ihned přepsána druhým zápisem). V~případě přístupu do registru zařízení může zápis například spouštět převod A/D převodníků -- po optimalizaci se však provede pouze jednou, nikoliv dvakrát.} sekvenci zápisů/čtení do/z paměti zařízení takovým způsobem, že se výsledek může lišit od toho, jak to bylo v programu zamýšleno.
 
 Těmto optimalizacím lze nejsnáze zabránit použitím volání pro čtení:
 
@@ -969,7 +970,7 @@ Příklad jak takové funkce mohou vypadat:
   2 |  {
   3 |      *(volatile uint32_t*) ptr = val;
   4 |  }
-  5 |  static inline int32_t mf624_read32(uint32_t *ptr)
+  5 |  static inline uint32_t mf624_read32(uint32_t *ptr)
   6 |  {
   7 |      return (volatile uint32_t) *ptr;
   8 |  }
@@ -978,7 +979,7 @@ Příklad jak takové funkce mohou vypadat:
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \newpage
 \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 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 USB zařízení. Tato volba určí, kterou sadu pomocných funkcí bude moci ovladač používat a jakým způsobem bude zařízení zpřístupněno do uživatelského 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živatel\-ském prostoru (viz diagram ma obrázku \ref{uio_diagram}).
 
@@ -991,22 +992,24 @@ V~případě, že zařízení nelze snadno zařadit do žádné kategorie (jedn
 \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.
+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. Druhou částí je aplikace v~uživatel\-ské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 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 Inicializaci struktury \texttt{struct uio\_info} a registraci do UIO subsystému
+       \begin{itemize}
+       \item Volání funkcí pro namapování regionů zařízení
+       \item Inicializaci struktury \texttt{struct uio\_info} a registraci do UIO subsystému
+       \end{itemize}
 \item Funkce pro \textit{úklid} a uvolnění regionů karty
 \end{itemize}
 
-Většina z těchto úkonů již byla popsána v kapitole \ref{pci_driv} a jsou zcela standardní pro jakýkoliv ovladač PCI zařízení. Co nebylo dosud popsáno je pouze úkon \textit{registrace do UIO subsystému}.
+Většina z těchto úkonů již byla popsána v kapitole \ref{pci_driv} a jsou zcela standardní pro jaký\-koliv ovladač PCI zařízení. Co nebylo dosud popsáno je pouze úkon \textit{registrace do UIO subsystému}.
 
 \ibox{\texttt{int uio\_register\_device(struct device *parent, struct uio\_info *info);}}
 
-Registrace UIO ovladače se provede zavoláním funkce \texttt{uio\_register\_device()}, které se jako první parametr předá ukazatel na \textit{rodiče} struktury \texttt{struct pci\_dev} -- tj. ukazatel na její položku \texttt{dev}. Důvod je ten, že ovladač typu UIO může být vytvořen i pro jiná zařízení než ta na sběrnici PCI.
+Registrace UIO ovladače PCI zařízení se provede zavoláním funkce \texttt{uio\_register\_device()}, které se jako první parametr předá ukazatel na \textit{rodiče} struktury \texttt{struct pci\_dev} -- tj. ukazatel na její položku \texttt{dev}. Důvod je ten, že ovladač typu UIO může být vytvořen i pro jiná zařízení než ta na sběrnici PCI.
 Druhý parametr předá ukazatel na strukturu \texttt{struct uio\_info}.
 
 \subsubsection{Struktura \texttt{struct uio\_info}}
@@ -1016,28 +1019,28 @@ Mezi její hlavní položky patří:
 \begin{description}
 \item[\texttt{const char *name}]~\\Název ovladače. Většinou se shoduje s názvem modulu.
 \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ěťo\-vé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{struct uio\_mem mem[MAX\_UIO\_MAPS]}]~\\Pole struktur obsahujících informace o regionech zařízení mapovaných do paměťo\-vého prostoru (bude vysvětleno dále).
+\item[\texttt{struct uio\_port port[MAX\_UIO\_PORT\_REGIONS]}]~\\Pole struktur obsahujících informace o regionech zařízení mapovaných do vstupně-výstupního prostoru (bude vysvětleno dále).
 \end{description}
 
 \subsubsection{Struktura \texttt{struct uio\_mem} a \texttt{struct uio\_port}}\label{uio_mem_port}
-Tyto struktury obsahují informace o regionech zařízení. Které (a kolik) z těchto dvou struktur budou inicializovány záleží na tom, zda karta mapuje regiony do paměťového nebo vstupně-výstupního prostoru.
+Tyto struktury obsahují informace o regionech zařízení. Které (a kolik) z těchto dvou struktur budou inicializovány záleží na tom, zda zařízení mapuje regiony do paměťového nebo vstupně-výstupního prostoru.
 
 Struktura \texttt{struct uio\_mem} obsahuje položky:
 \begin{description}
 \item[\texttt{const char *name}]~\\Textový popis daného regionu (viditelný z uživatelského prostoru).
-\item[\texttt{unsigned long addr}]~\\Fyzická adresa regionu získaná voláním \texttt{pci\_resource\_start()}.
-\item[\texttt{unsigned long size}]~\\Délka regionu. Nejsnáze získaná voláním \texttt{pci\_resource\_len()}.
+\item[\texttt{unsigned long addr}]~\\Fyzická adresa regionu. V případě PCI zařízení získána voláním \texttt{pci\_resource\_start()}.
+\item[\texttt{unsigned long size}]~\\Délka regionu. V případě PCI zařízení nejsnáze získána voláním \texttt{pci\_resource\_len()}.
 \item[\texttt{int memtype}]~\\Typ paměti. Pro fyzickou paměť na zařízení se použije \texttt{UIO\_MEM\_PHYS}.
-\item[\texttt{void \_\_iomem *internal\_addr}]~\\Virtuální adresa získaná voláním \texttt{pci\_ioremap\_bar()}.
+\item[\texttt{void \_\_iomem *internal\_addr}]~\\Virtuální adresa. V případě PCI zařízení získána voláním \texttt{pci\_ioremap\_bar()}.
 \end{description}
 
 Struktura \texttt{struct uio\_port} obsahuje položky:
 \begin{description}
 \item[\texttt{const char *name}]~\\Textový popis daného regionu (viditelný z uživatelského prostoru).
-\item[\texttt{unsigned long start}]~\\Fyzická adresa regionu získaná voláním \texttt{pci\_resource\_start()}.
-\item[\texttt{unsigned long size}]~\\Délka regionu. Nejsnáze získaná voláním \texttt{pci\_resource\_len()}.
-\item[\texttt{int porttype}]~\\Typ portu. Pro porty na architektuře IA-32 se použije \texttt{UIO\_PORT\_X86}.
+\item[\texttt{unsigned long start}]~\\Fyzická adresa regionu. V případě PCI zařízení  získána voláním \texttt{pci\_resource\_start()}.
+\item[\texttt{unsigned long size}]~\\Délka regionu. V případě PCI zařízení nejsnáze získána voláním \texttt{pci\_resource\_len()}.
+\item[\texttt{int porttype}]~\\Typ portu (tj. vstupně-výstupní paměti). Pro porty na architektuře IA-32 se použije \texttt{UIO\_PORT\_X86}.
 \end{description}
 
 ~\\
@@ -1065,6 +1068,7 @@ Příklad, jak taková jednoduchá inicializace struktury \texttt{struct uio\_in
  19 |  uio_register_device(&dev->dev, info);
  20 |  pci_set_drvdata(dev, info);
 \end{verbatim}
+\vspace{1cm}
 
 \ibox{\texttt{void pci\_set\_drvdata(struct pci\_dev *pdev, void *data);}}
 
@@ -1092,24 +1096,26 @@ Poté, co je jaderná část UIO ovladače úspěšně zkompilována a zavedena
 \end{itemize}
 
 \subsubsection{Obsah složky \texttt{/sys/class/uio/uio0}}
-Tato složka obsahuje soubory převážně pouze pro čtení. Obsahuje podsložku \texttt{maps}, ve které se nachází pro každý region PCI zařízení mapovaný do paměti (zpřístupněný jaderným ovladačem) složka obsahující soubory popisující tyto regiony (Soubor \texttt{addr} obsahuje fyzickou adresu regionu; \texttt{name} slovní pojmenování; \texttt{size} velikost regionu).
+Tato složka obsahuje soubory převážně pouze pro čtení. Obsahuje podsložku \texttt{maps}, ve které se nachází pro každý region zařízení mapovaný do paměti (zpřístupněný jaderným ovladačem) složka obsahující soubory popisující tyto regiony (Soubor \texttt{addr} obsahuje fyzickou adresu regionu; \texttt{name} slovní pojmenování; \texttt{size} velikost regionu).
 
 V případě, že jsou zpřístupněny regiony zařízení, které jsou mapovány do vstupně-výstupního adresního prostoru, nacházejí se jednotlivé podsložky a soubory popisující regiony ve složce \texttt{portio}.
 
 \subsubsection{Soubor \texttt{/dev/uio0}}
-Tento soubor tvoří rozhraní mezi jaderným subsystémem UIO a uživatelským prostorem. Skrze něj je přistupováno k regionům karty. K souboru se přistupuje pomocí volání \texttt{mmap()}.
+Tento soubor tvoří rozhraní mezi jaderným subsystémem UIO a uživatelským prostorem. Skrze něj je přistupováno k regionům zařízení. K souboru se přistupuje pomocí funkce \texttt{mmap()}.
 
 \ibox{\texttt{void *mmap(void *addr, size\_t length, int prot, int flags, int fd, off\_t offset);}}
 
 Tato funkce slouží k \textit{namapování} souboru nebo zařízení do operační paměti. V případě, že je funkce zavolána na soubor, proběhne-li vše správně, návratová hodnota bude obsahovat ukazatel do paměti, kam je možné přistu\-povat k obsahu souboru pomocí ukazatelové aritmetiky -- stejně, jako by to byla paměť.
  
+Popis jednotlivých parametrů:
+
 \begin{description}
-\item[Parametr \texttt{addr}]~\\V případě, že není nulový, určí na jakou adresu by měla být paměť mapována.
-\item[Parametr \texttt{length}]~\\ Udává velikost mapované paměti v násobcích velikosti paměťové stránky. 
-\item[Parametr \texttt{prot}]~\\ Obsahuje příznaky definující, zda bude mapovaná paměť pro čtení/zápis, apod.
-\item[Parametr \texttt{flags}]~\\ Pomocí příznaku určuje, zda se mají změny zapisovat pouze do \textit{lokální kopie} (příznak \texttt{MAP\_PRIVATE}) nebo zda mají být zapisovány do původního souboru/zařízení (příznak \texttt{MAP\_SHARED}).
-\item[Parametr \texttt{fd}]~\\ Obsahuje \textit{filedescriptor} na zařízení, které má být namapováno (v tomto případě file\-desc\-riptor vrácený voláním \texttt{open("/dev/uio0", ... );}).
-\item[Parametr \texttt{offset}]~\\ Určuje, zda se daný soubor/zařízení začne mapovat od posunuté adresy. V případě UIO ovladače je možné jako offset používat násobky velikosti paměťové stránky -- tento offset určí, který z regionů zpřístupněných jadernou částí ovladače má být namapován.
+\item[\texttt{addr}]~\\V případě, že není nulový, určí na jakou adresu by měla být paměť mapována.
+\item[\texttt{length}]~\\ Udává velikost mapované paměti v násobcích velikosti paměťové stránky. 
+\item[\texttt{prot}]~\\ Obsahuje příznaky definující, zda bude mapovaná paměť pro čtení/zápis, apod.
+\item[\texttt{flags}]~\\ Pomocí příznaků určuje, zda se mají změny zapisovat pouze do \textit{lokální kopie} (příznak \texttt{MAP\_PRIVATE}) nebo zda mají být zapisovány do původního souboru/zařízení (příznak \texttt{MAP\_SHARED}).
+\item[\texttt{fd}]~\\ Obsahuje \textit{filedescriptor} na zařízení, které má být namapováno (v tomto případě file\-desc\-riptor vrácený voláním \texttt{open("/dev/uio0", ... );}).
+\item[\texttt{offset}]~\\ Určuje, zda se daný soubor/zařízení začne mapovat od posunuté adresy. V případě UIO ovladače je možné jako offset používat násobky velikosti paměťové stránky -- tento offset určí, který z regionů zpřístupněných jadernou částí ovladače má být namapován.
 \end{description}
 
 Příklad, jak takové volání může vypadat (bez ošetření chybových stavů):
@@ -1124,9 +1130,9 @@ Příklad, jak takové volání může vypadat (bez ošetření chybových stav
   8 |                    device_fd, BAR2_offset);
 \end{verbatim}
 
-S adresou vrácenou voláním \texttt{mmap()} však není možné vždy ihned pracovat. Může se stát, že mapovaný region PCI zařízení (reprezentovaný zařízením \texttt{/dev/uio0}, na které je \texttt{mmap()} volán) je menší než je velikost celé stránky, \texttt{mmap()} však vrací ukazatel zarovnaný na velikost stránky. Je tedy potřeba se v rámci této stránky posunout na tu část, která odpovídá požadovanému regionu.
+S adresou vrácenou voláním \texttt{mmap()} však není možné vždy ihned pracovat. Může se stát, že mapovaný region zařízení (reprezentovaný zařízením \texttt{/dev/uio0}, na které je \texttt{mmap()} volán) je menší než je velikost celé stránky, \texttt{mmap()} však vrací ukazatel zarovnaný na velikost stránky. Je tedy potřeba se v rámci této stránky posunout na tu část, která odpovídá požadovanému regionu.
 
-Jak velký je potřeba udělat \textit{posun} pomůže zjistit soubor \texttt{/sys/class/uio/uio0/maps/map1/addr}\footnote{Pro názornost je uvedena konkrétní cesta -- jedná se tedy o \textit{druhý} paměťový region zařízení \textit{uio0}.} -- ten obsahuje fyzickou adresu požadovaného regionu. Z té je možné následujícím trikem získat ukazatel, se kterým je již možné pracovat (nejnižší bity totiž budou zachovány z fyzické adresy):
+Jak velký je potřeba udělat \textit{posun} pomůže zjistit soubor \texttt{/sys/class/uio/uio0/maps/ /map1/addr}\footnote{Pro názornost je uvedena konkrétní cesta -- jedná se tedy o \textit{druhý} paměťový region zařízení \textit{uio0}.} -- ten obsahuje fyzickou adresu požadovaného regionu. Z té je možné následujícím trikem získat ukazatel, se kterým je již možné pracovat (nejnižší bity totiž budou zachovány z fyzické adresy):
 \begin{verbatim}
   mf624_BAR2 += (BAR2_phys_addr & (sysconf(_SC_PAGESIZE) - 1));
     |                \-- Fyzická adresa
@@ -1141,24 +1147,22 @@ Jelikož se jedná o paměť zařízení, je potřeba i v uživatelském prostor
 \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).
 
-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).
+Pro ovladače měřících karet existuje v Linuxu subsystém -- tzv. Comedi (\textit{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.
+\item[Kcomedilib] -- je jaderný modul, který poskytuje stejné rozhraní jako Comedilib v uživatelském prostoru. Používá se v případě potřeby ovládat zařízení v reálném čase.
 \end{description}
 
 
 \subsection{Registrace ovladače}
-Pro správnou funkci je potřeba, aby byl ovladač ihned po načtení modulu (tj. 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}.
+Pro správnou funkci je potřeba, aby byl ovladač ihned po načtení modulu (tj. v \textit{init} funkci) zaregistrován -- jak do PCI subsystému, tak do subsystému Comedi. Registrace do PCI subsystému je popsána v kapitole \ref{pci_reg}. Registrace mezi Comedi ovladače se provede voláním \texttt{comedi\_driver\_register()}, kde jako parametr se předá ukazatel na strukturu \texttt{struct comedi\_driver}.
 
 \subsection{Struktura \texttt{struct comedi\_driver}}
-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:
+Jednotlivé položky struktury \texttt{struct comedi\_driver} popisují daný ovladač. Mezi nejdůležitější položky patří:
 \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}.
@@ -1173,13 +1177,15 @@ Funkce \texttt{attach} je volána v případě aktivace Comedi ovladače. Dřív
 
 \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 (\textit{podzažízení})] je jedna z mnoha funkcí zařízení. V případě ovladače karty Humusoft MF614 budou implementovány 4 podzařízení: digitální vstupy, digitální výstupy, analogové vstupy, analogové výstupy.
+\item[Subdevice (\textit{podzažízení})] je jedna z mnoha funkcí zařízení. V případě ovladače karty Humusoft MF614 budou implementovány 4 podzařízení: digitální vstupy, digitální výstupy, analogové vstupy, analogové výstupy. Každé z těchto podzařízení bude schopno obsluhovat více \textit{kanálů}.
 \end{description}
 
-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}.
+\vspace{1cm}
+
+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} odpovídající jednotlivým pod\-zařízením.
 
 \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:
+Každé podporované funkci zařízení (tj. měřící karty) by měla odpovídat jedna struktura \texttt{struct comedi\_subdevice}. Hlavní položky, které struktura obsahuje jsou:
 
 \begin{description}
 \item[\texttt{int type}]~\\ Označuje druh \textit{podzařízení}. Na výběr jsou např. možnosti: 
@@ -1190,15 +1196,16 @@ Každé podporované funcki zařízení/karty by měla odpovídat jedna struktur
 \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í zapsá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):\\
+\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 ukazatel na některou z nich):\\
 \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) ( ... );}]~\\Ukazatel na funkci, která má na starosti čtení z podzařízení (většinou se používá pro A/D převodníky).
-\item[\texttt{int (*insn\_write) ( ... );}]~\\Ukazatel na funkci, která má na starosti zápis do zařízení (většinou se používá pro A/D převodníky).
+\item[\texttt{int (*insn\_write) ( ... );}]~\\Ukazatel na funkci, která má na starosti zápis do zařízení (většinou se používá pro D/A převodníky).
 \item[\texttt{int (*insn\_bits) ( ... );}]~\\Ukazatel na funkci použitou pro zápis a čtení digitálních výstupů a vstupů,
-\item[\texttt{int (*insn\_config) ( ... );}]~\\Ukazatel na funkci, která má na starosti konfiguraci podazařízení.
+\item[\texttt{int (*insn\_config) ( ... );}]~\\Ukazatel na funkci, která má na starosti konfiguraci podzařízení.
 
-Poslední čtyři funkce mají parametry: \\ \texttt{(struct comedi\_device *, struct comedi\_subdevice *, struct comedi\_insn *, unsigned int *);}. První z nich je ukazatel na strukturu popisující Comedi ovladač. Druhý je ukazatelem na strukturu odpovídající podzařízení. Třetí obsahuje ukazatel na strukturu popisující \textit{instrukci}, která má být provedena. Poslední obsahuje ukazatel na proměnnou, ze které je vyčtena zapisovaná hodnota nebo je do ni čtená hodnota zapsána.
+Poslední čtyři funkce mají parametry: \\ \texttt{(struct comedi\_device *dev, 
+struct comedi\_subdevice *s, struct comedi\_insn *insn, unsigned int *data)}. První z nich je ukazatel na strukturu popisující Come\-di ovladač. Druhý je ukazatelem na strukturu odpovídající podzařízení. Třetí obsahuje ukazatel na strukturu popisující \textit{instrukci}, která má být provedena. Poslední obsahuje ukazatel na proměnnou, ze které je vyčtena zapisovaná hodnota nebo je do ni čtená hodnota zapsána.
  
 \end{description}
 
@@ -1210,37 +1217,54 @@ V případě dealokace zdrojů ovladače není potřeba tuto paměť dealokovat
 
 \subsection{Funkce pro čtení a zápis z/do podzařízení}
 Funkce pro čtení, zápis a konfiguraci A/D, D/A převodníků a~digitálních vstupů a~výstupů mají stejné parametry. Jsou to: \texttt{(struct comedi\_device *dev, 
-struct comedi\_sub- device *s, struct comedi\_insn *insn, unsigned int *data)};
+struct comedi\_subdevice *s, struct comedi\_insn *insn, unsigned int *data)}.
 
 V prvním parametru je předán ukazatel na strukturu reprezentující Comedi zařízení. Díky tomu je možné prostřednictvím její proměnné \texttt{private} získat ukazatel na strukturu obsahující privátní data ovladače.
 
-Druhý parametr je ukazatel na strukturu reprezentující podzařízení. Tato struktura obsahuje, kromě položek inicializovaných ve funkci \textit{attach} i proměnnou \texttt{state}. Tato proměnná popisuje \textit{stav zařízení} a používá se především pro zjištění stavu digitálních výstupů (stav digitálních výstupů není možné za zařízení přečíst, pro změnu pouze jednoho bitu je tedy potřeba znát stav ostatních).
+Druhý parametr je ukazatel na strukturu reprezentující podzařízení. Tato struktura obsahuje, kromě položek inicializovaných ve funkci \textit{attach} i proměnnou \texttt{state}. Tato proměnná popisuje \textit{stav zařízení} a používá se především pro zjištění stavu digitálních výstupů (stav digitálních výstupů většinou není možné ze zařízení přečíst, pro změnu pouze jednoho bitu je tedy potřeba znát stav ostatních).
 
 Třetí parametr obsahuje ukazatel na strukturu popisující danou \textit{instrukci}, která má být provedena. Důležité položky, které tato struktura obsahuje:
 \begin{description}
-\item[\texttt{unsigned int n}]~\\Udává počet instrukcí, které mají být provedeny
+\item[\texttt{unsigned int n}]~\\Udává počet instrukcí, které mají být provedeny.
 \item[\texttt{unsigned int chanspec}]~\\Obsahuje informace o kanálu podzařízení, na kterém má být operace provedena. V~jedné proměnné typu \texttt{unsigned int} je obsaženo více údajů, proto je potřeba ke čtení používat speciální makro
 \texttt{CR\_CHAN()}, které vrací číslo zvoleného kanálu.
 \end{description}
 
-FIXME parametr data[0] a data[1]
+Čtvrtý parametr obsahuje ukazatel na pole zapisovaných/čtených položek. Počet prvků pole odpovídá proměnné \texttt{n} struktury \texttt{struct comedi insn}. V případě čtení A/D převodníku obsahuje opakovaně čtené položky. Podobně to platí pro nastavování hodnoty D/A převodní\-ku. V případě čtení/zápisu digitálních vstupů/výstupů má toto pole pouze dva prvky. Čtenou/ zapisovanou hodnotu obsahuje položka \texttt{data[1]}. Položka \texttt{data[0]} obsahuje jako binární masku zadané kanály čtených/ zapiso\-vaných digitálních vstupů/výstupů.  
+
+Příklad, jak může být implementováno čtení digitálních vstupů:
+\begin{verbatim}
+  1 |  static int mf614_di_insn_bits(struct comedi_device *dev, 
+  2 |                                struct comedi_subdevice *s, 
+  3 |                                struct comedi_insn *insn,
+  4 |                                unsigned int *data)
+  5 |  {
+  6 |      if(insn->n != 2) {
+  7 |          return -EINVAL;
+  8 |      }
+  9 |  
+ 10 |      data[1] = ioread8(devpriv->BAR0_io + DIN_reg);
+ 11 |      
+ 12 |      return 2;
+ 13 |  }
+\end{verbatim}
 
 \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.
+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.
 
-Odregistrování ovladače z PCI a Comedi subsystému by mělo být voláno v \textit{úklidové funkci} modulu. O samotné odregistrování se starají funkce:
-\texttt{pci\_unregister\_driver()} a \texttt{comedi\_driver\_unregister()}, kterým se jako parametr předá ukazatel na strukturu použitou při registraci.
+Odregistrování ovladače z PCI a Comedi subsystému by mělo být voláno v \textit{úklidové fun\-kci} modulu. O samotné odregistrování se starají funkce:
+\texttt{pci\_unregister\_driver()} a \texttt{comedi\_driver\_unregister()}, kterým se jako parametr předá ukazatel na strukturu po\-uži\-tou při registraci.
 
 
 \subsection{Přístup z uživatelského prostoru}
 Pro správnou funkci konkrétního Comedi ovladače je nejprve potřeba načíst modul Comedi (\texttt{modprobe comedi}). Poté je již možné načíst ovladač zařízení (v případě ručně kompilovaného ovladače, pomocí příkazu \texttt{insmod}, jinak opět pomocí \texttt{modprobe}).
 
-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.
+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í -- \texttt{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í 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()} a jiných.
 
 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 (tj. 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.
+Prvním parametrem všech funkcí je ukazatel na \texttt{comedi\_t} odpovídající danému zařízení. Druhým je číslo \textit{podzařízení}. Třetí parametr určuje kanál (tj. 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.
 
 Ukázka jednoduchého userspace programu:
 \begin{verbatim}
@@ -1270,6 +1294,8 @@ Ukázka jednoduchého userspace programu:
 24 |  }
 \end{verbatim}
 
+Při kompilaci je potřeba použít parametry \texttt{-lcomedi -lm}.
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Implementace karty Humusoft MF624 v Qemu}\label{qemu}
 Měřící karta Humusoft MF624 je hardware vhodný pro výklad principů implementace ovladačů PCI zařízení. Nevýhodou může být její cena. Pro účely výuky proto byly do emulačního software Qemu implementovány základní funkce této měřící karty -- konkrétně se jedná o A/D převodníky, D/A převodníky a digitální vstupy a výstupy. Takto modifikovaná verze qemu může pří implementaci základního ovladače plně nahradit původní kartu.
@@ -1286,25 +1312,26 @@ Kromě částečné implementace karty MF624 do Qemu je součástí tohoto \text
 \end{figure}
 
 \section{Qemu}
-Qemu je emulátor různých procesorových architektur. Od klasických virtualizačních nás\-tro\-jů se odlišuje tím, že podporuje velké kromě IA-32 architektury také např. ARM, SPARC, PowerPC, MIPS, m68k. Qemu umožňuje kromě \textit{plné emulace} (kdy je spuštěn celý operační systém) tzv. \textit{uživatelskou emulaci}, kdy je v uživatelském prostoru spuštěn program zkompilovaný pro jinou architekturu. Uživatelská emulace je možná pouze pro operační systém GNU/Linux.
+Qemu je emulátor různých procesorových architektur. Od klasických virtualizačních nás\-tro\-jů se odlišuje tím, že podporuje kromě IA-32 architektury také např. ARM, SPARC, PowerPC, MIPS, m68k. Qemu umožňuje kromě \textit{plné emulace} (kdy je spuštěn celý operační systém) tzv. \textit{uživatelskou emulaci}, kdy je v uživatelském prostoru spuštěn program zkompilovaný pro jinou architekturu. Uživatelská emulace je možná pouze pro operační systém GNU/Linux.
 
 \subsection{Kompilace, instalace}
-Po stažení a rozbalení zdrojových kódů některé ze stabilních verzí emulátoru Qemu je potřeba spustit příkaz (na počítači architektury AI-32):
+Po stažení a rozbalení zdrojových kódů některé ze stabilních verzí emulátoru Qemu je potřeba spustit příkaz (pro emulaci architektury IA-32):
 \begin{verbatim}
   $ ./configure --enable-system  --target-list=i386-softmmu
 \end{verbatim}
 
-V případě, že spuštěný skript neohlásí žádné chybějící knihovny, je možné spustit  samotnou kompilaci:
+Neohlásí-li spuštěný skript žádné chybějící knihovny, je možné spustit kompilaci:
 \begin{verbatim}
   $ make
 \end{verbatim}
 
 \subsection{Kompilace virtuální karty Humusoft MF624}
-V případě, že je potřeba zkompilovat virtuální kartu MF624, je potřeba  před kompilací překopírovat zdrojový soubor implementující zařízení do složky \texttt{/hw} a do souboru \texttt{Makefile.objs} (nachází se v kořenovém adresáři se zdrojovými kódy) přidat řádek
+V případě, že je potřeba zkompilovat virtuální kartu MF624, je nejprve potřeba překopírovat zdrojový soubor implementující zařízení do složky \texttt{/hw} a do souboru \texttt{Makefile.objs} (nachází se v kořenovém adresáři se zdrojovými kódy) přidat řádek:
+
 \begin{verbatim}
   hw-obj-$(CONFIG_PCI) += mf624.o
 \end{verbatim}
-Poté je již možné spustit příkaz
+Poté je již možné spustit příkaz:
 \begin{verbatim}
   $ make
 \end{verbatim}
@@ -1343,16 +1370,16 @@ Pro komunikaci s virtuální kartou MF624 bylo implementováno jednoduché grafi
 
 Komunikace mezi virtuální kartou a grafickou aplikací probíhá pomocí TCP/IP protokolu. Přenášené informace jsou textového charakteru, ve formátu \texttt{REGISTR=HODNOTA}.
 
-Na obrázku \ref{qt_gui} je vidět vzhled grafické aplikace.
+Na obrázku \ref{qt_gui} je snímek obrazovky implementované grafické aplikace.
 
 \subsection{Kompilace, použití}
-Grafická aplikace je vytvořena za pomoci grafického knihovny Qt. V případě, že jsou v~systému nainstalovány vývojářské verze Qt knihoven, včetně vývojářských nástrojů, stačí pro kompilaci spustit
+Grafická aplikace je vytvořena za pomoci knihovny Qt. V případě, že je v~systému nainstalována vývojářská verze Qt knihovny, včetně potřebných vývojářských nástrojů, stačí pro kompilaci spustit:
 \begin{verbatim}
   $ qmake
   $ 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í (zobrazují výstupní hodnoty).
+Jako parametr při spuštění je nutné zadat číslo portu, na kterém naslouchá virtuální karta MF624. 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!]
@@ -1366,7 +1393,7 @@ Použití aplikace by mělo být intuitivní. Položky, u kterých není možné
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Testování}
 \section{UIO ovladač, Comedi ovladač}
-Jednotlivé ovladače jsou tvořeny samostatnými jadernými moduly, které pouze využívají volání jednotlivých subsystémů -- neexportují žádné \textit{symboly} ani nemění globální proměnné. V tomto případě nebylo nutné provádět regresní testování.
+Jednotlivé ovladače jsou tvořeny samostatnými jadernými moduly, které pouze využívají funkce jednotlivých subsystémů -- neexportují žádné \textit{symboly} ani nemění globální proměnné. V tomto případě nebylo nutné provádět regresní testování.
 
 Testování správnosti funkce ovladačů probíhala přímo na hardware, za pomoci \textit{univerzální svorkovnice TB620} (obrázek \ref{svorkovnice}).
 
@@ -1393,20 +1420,69 @@ Základní propojení na svorkovnici, které se osvědčilo, bylo:
 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í}
-Správnost implementace virtuálního hardware byla testována spouštěním implementovaných ovladačů v systému virtualizovaného v Qemu. Zároveň byla ověřena funkčnost grafického rozhraní, reprezentujícího vstupy a výstupy do/z virtuální karty. 
+Správnost implementace virtuálního hardware byla testována spouštěním ovladačů (testovaných na skutečném hardware) v systému virtualizovaném v Qemu. Zároveň byla ověřena funkčnost grafického rozhraní, reprezentujícího vstupy a výstupy do/z virtuální karty. 
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Závěr}
-V této práci se mi podařilo vysvětlit základní aspekty psaní ovladačů PCI ovladačů pro operační systém GNU/Linux -- jak na obecné úrovni, tak u konkrétních ovladačů typu UIO a Comedi.
+V této práci se mi podařilo vysvětlit základní aspekty psaní ovladačů PCI zařízení pro operační systém GNU/Linux -- jak na obecné úrovni, tak u konkrétních ovladačů typu UIO a Comedi.
 
 Součástí práce jsou základní (pokrývající pouze A/D, D/A převodníky a digitální vstupy/výstupy) ovladače pro karty Humusoft MF624 a Humusoft MF614. V budoucnu by tyto ovladače mohly být rozšířeny tak, aby pokrývaly všechny funkce těchto karet.
 
-Pro potřeby výuky byly implementovány základní funkce karty Humusoft MF614 do emulátoru Qemu. Tato implementace by mohla být v budoucnu rozšířena, případně by mohla posloužit jako příklad pro implementaci jiných jednoduchých PCI zařízení sloužících pro výuku implementace PCI ovladačů. I když tak nebylo původně zamýšleno, mohla by částečná implementace karty MF614 do Qemu posloužit i při výuce psaní ovladačů pro jiné operační systémy, jako například systémy rodiny Microsoft Windows.
+Pro potřeby výuky byly implementovány základní funkce karty Humusoft MF614 do emulátoru Qemu. Tato implementace by mohla být v budoucnu rozšířena, případně by mohla posloužit jako příklad pro tvorbu jiných jednoduchých PCI zařízení v Qemu, sloužících pro výuku implementace PCI ovladačů. I když tak nebylo původně zamýšleno, mohla by částečná implementace karty MF614 do Qemu posloužit i při výuce psaní ovladačů pro jiné operační systémy, jako například systémy rodiny Microsoft Windows.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%\appendix
+\appendix
+\chapter{Obsah přiloženého CD}
+
+\begin{verbatim}
+.
+|-- doc
+|   |-- diploma_thesis
+|   |   |-- kernel_module_example
+|   |   `-- text
+|   `-- hw
+|       |-- mf614
+|       |   |-- datasheet
+|       |   `-- sys_bus_pci_device
+|       `-- mf624
+|           |-- datasheet
+|           |-- sys_bus_pci_device
+|           `-- sys_class_uio_uio0
+`-- src
+    |-- comedi
+    |   |-- fpoulain
+    |   |   |-- code_configuration
+    |   |   |-- comedi+rtai
+    |   |   `-- documentation
+    |   |-- mf614_simple_driver
+    |   |   |-- kernel
+    |   |   `-- userspace
+    |   |       `-- dout_example
+    |   `-- mf624_simple_driver
+    |       |-- kernel
+    |       `-- userspace
+    |           |-- dac_example
+    |           `-- dout_example
+    |-- qemu
+    |   |-- hw
+    |   `-- mf624_interface
+    |       `-- untitled-build-desktop
+    |-- qemu_qt_gui
+    |   `-- untitled
+    `-- uio
+        |-- mf614
+        |   `-- kernel
+        `-- mf624
+            |-- kernel
+            |   `-- udev_rules
+            `-- userspace
+                `-- test_application
+\end{verbatim}
+
+To be done.
+
+
 %\chapter{Hudaqlib}
 
-%\chapter{Obsah přiloženého CD}
index 49865c0eb1596223676091ca3736ce4d1c13c677..9c223163ac04afc7cb3536aacaf598398e36402d 100644 (file)
@@ -45,7 +45,7 @@
 %\newcommand\StudProgram{Elektrotechnika a informatika, dobíhající, Magisterský}
 % \newcommand\StudProgram{Elektrotechnika a informatika, strukturovaný, Bakalářský}
 % \newcommand\StudProgram{Elektrotechnika a informatika, strukturovaný, Navazující magisterský}
-\newcommand\StudProgram{Otevřená informatika, strukturovaný, Navazující magisterský}
+\newcommand\StudProgram{Otevřená informatika, Navazující magisterský}
 
 % \newcommand\StudProgram{Softwarové technologie a management, Bakalářský}
 % English study:
@@ -72,8 +72,8 @@
 % Set up Work Title, Author and Supervisor
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\newcommand\WorkTitle{Prostředí pro výuku vývoje PCI ovladačů do OS GNU/Linux}
-\newcommand\FirstandFamilyName{Rostislav Lisový}
+\newcommand\WorkTitle{Prostředí pro výuku vývoje PCI ovladačů \\do operačního systému GNU/Linux}
+\newcommand\FirstandFamilyName{Bc. Rostislav Lisový}
 \newcommand\Supervisor{Ing. Pavel Píša, Ph.D.}
 
 
 
 \acknowledgements
 \noindent
-Rád bych poděkoval Ing. Pavlu Píšovi, Ph.D., za věcné rady, připomínky a čas strávený konzultováním diplomové práce.
+Rád bych poděkoval Ing. Pavlu Píšovi, Ph.D., za věcné rady a připomínky.
 %Zde můžete napsat své poděkování, pokud chcete a máte komu děkovat.
 
 
@@ -207,7 +207,7 @@ FIXME
 \noindent{\Huge \textbf{Abstrakt}}
 \vspace{8ex}
 
-Cílem této práce je popsat základní principy implementace ovladače PCI zařízení pro operační systém GNU/Linux. Kromě obecného popisu je zmíněna implementace ovladačů typu UIO a Comedi.
+Cílem této práce je popsat základní principy implementace ovladačů PCI zařízení pro operační systém GNU/Linux. Kromě obecných principů je popsána implementace ovladačů typu UIO a Comedi.
 
 Jako ukázková zařízení byly zvoleny karty Humusoft MF624 a MF614. Základní funkce (D/A, A/D převodníky, digitální vstupy a výstupy) karty Humusoft MF624 byly implementovány do emulátoru Qemu tak, aby bylo možné popsané postupy vyzkoušet bez fyzického přístupu ke kartě.