X-Git-Url: https://rtime.felk.cvut.cz/gitweb/mf6xx.git/blobdiff_plain/47fa7cabe30aeb0447c557407e4e0104136d718d..6d9f34d94fec662da0963638b9885186bb581af6:/doc/diploma_thesis/text/dip_text.tex

diff --git a/doc/diploma_thesis/text/dip_text.tex b/doc/diploma_thesis/text/dip_text.tex
index 7c3107e..be97182 100644
--- a/doc/diploma_thesis/text/dip_text.tex
+++ b/doc/diploma_thesis/text/dip_text.tex
@@ -1,9 +1,8 @@
-%FIXME
+% ==Typografie==
 % vlna
-% \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
+% odsazovÃ¡nÃ­ zdrojaku ve verbatim: __X_|__  nebo jen __
+% Popisy obrÃ¡zkÅ¯ bez teÄky (i s vÃ­ce vÄtami)
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Ãvod}
@@ -15,7 +14,7 @@ Text popisuje zÃ¡kladnÃ­ aspekty prÃ¡ce s PCI zaÅÃ­zenÃ­mi v jÃ¡dÅe Linux a uv
 
 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.
+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Ã© ovla\-daÄ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)
 
@@ -62,7 +61,7 @@ Jak je moÅ¾nÃ© ovlÃ¡dat hardwarovÃ© periferie pomocÃ­ programu (software) je nej
 \end{description}%
 }
 
-PrvnÃ­m zpÅ¯sobem, jak zmÄnit stav GPIO pinu (aÅ¥ uÅ¾ nastavenÃ­, zda se mÃ¡ jednat o vstupnÃ­/vÃ½stupnÃ­ pin nebo jakou hodnotu mÃ¡ mÃ­t v pÅÃ­padÄ, Å¾e je vÃ½stupnÃ­) je provedenÃ­ operace zÃ¡pisu na urÄitou adresu v pamÄÅ¥ovÃ©m adresnÃ­m prostoru (ta je pevnÄ danÃ¡ a liÅ¡Ã­ mezi jednotlivÃ½mi architekturami mikrokontrolÃ©rÅ¯), tato adresa odpovÃ­dÃ¡ \textbf{registru}\footnote{Registr mÅ¯Å¾e bÃ½t pro zjednoduÅ¡enÃ­ povaÅ¾ovÃ¡n za malou pamÄÅ¥ovou buÅku. ZmÄna jejÃ­ hodnoty pÅÃ­mo ovlivÅuje stav hardware. V dokumentaci ke konkrÃ©tnÃ­mu mikrokontrolÃ©ru/\-mikroprocesoru/\-programovatelnÃ©mu integrovanÃ©mu obvodu je uvedeno, jakou funkci majÃ­ jednotlivÃ© bity registru.} GPIO pinu. VnitÅnÃ­ uspoÅÃ¡dÃ¡nÃ­ mikrokontrolÃ©ru, dle adresy na kterou bylo zapisovÃ¡no, rozpoznÃ¡, Å¾e provedenÃ¡ operace zÃ¡pisu nebyla urÄena pro zmÄnu hodnoty vnitÅnÃ­ pamÄti, ale je urÄena pro zmÄnu hodnoty registru a z toho plynoucÃ­ zmÄny stavu urÄitÃ© ÄÃ¡sti hardwaru. ZapsanÃ¡ hodnota se tedy projevÃ­ zmÄnou stavu GPIO pinu. Tato moÅ¾nost je nejjednoduÅ¡Å¡Ã­ a je moÅ¾nÃ¡ v pÅÃ­padÄ, Å¾e jsou hardwarovÃ© periferie mapovÃ¡ny do urÄitÃ© ÄÃ¡sti tzv. \textbf{pamÄÅ¥ovÃ©ho prostoru}.\footnote{TakÃ© oznaÄovÃ¡no jako MMIO -- \textit{Memory-mapped input/output}}
+PrvnÃ­m zpÅ¯sobem, jak zmÄnit stav GPIO pinu (aÅ¥ uÅ¾ nastavenÃ­, zda se mÃ¡ jednat o~vstupnÃ­/vÃ½stupnÃ­ pin nebo jakou hodnotu mÃ¡ mÃ­t v pÅÃ­padÄ, Å¾e je vÃ½stupnÃ­) je provedenÃ­ operace zÃ¡pisu na urÄitou adresu v pamÄÅ¥ovÃ©m adresnÃ­m prostoru (ta je pevnÄ danÃ¡ a liÅ¡Ã­ mezi jednotlivÃ½mi architekturami mikrokontrolÃ©rÅ¯), tato adresa odpovÃ­dÃ¡ \textbf{registru}\footnote{Registr mÅ¯Å¾e bÃ½t pro zjednoduÅ¡enÃ­ povaÅ¾ovÃ¡n za malou pamÄÅ¥ovou buÅku. ZmÄna jejÃ­ hodnoty pÅÃ­mo ovlivÅuje stav hardware. V dokumentaci ke konkrÃ©tnÃ­mu mikrokontrolÃ©ru/\-mikroprocesoru/\-programovatelnÃ©mu integrovanÃ©mu obvodu je uvedeno, jakou funkci majÃ­ jednotlivÃ© bity registru.} GPIO pinu. VnitÅnÃ­ uspoÅÃ¡dÃ¡nÃ­ mikrokontrolÃ©ru, dle adresy na kterou bylo zapisovÃ¡no, rozpoznÃ¡, Å¾e provedenÃ¡ operace zÃ¡pisu nebyla urÄena pro zmÄnu hodnoty vnitÅnÃ­ pamÄti, ale je urÄena pro zmÄnu hodnoty registru a z toho plynoucÃ­ zmÄny stavu urÄitÃ© ÄÃ¡sti hardwaru. ZapsanÃ¡ hodnota se tedy projevÃ­ zmÄnou stavu GPIO pinu. Tato moÅ¾nost je nejjednoduÅ¡Å¡Ã­ a je moÅ¾nÃ¡ v pÅÃ­padÄ, Å¾e jsou hardwarovÃ© periferie mapovÃ¡ny do urÄitÃ© ÄÃ¡sti tzv. \textbf{pamÄÅ¥ovÃ©ho prostoru}.\footnote{TakÃ© oznaÄovÃ¡no jako MMIO -- \textit{Memory-mapped input/output}}
 
 \begin{figure}[h!]
 	\begin{center}
@@ -73,9 +72,9 @@ PrvnÃ­m zpÅ¯sobem, jak zmÄnit stav GPIO pinu (aÅ¥ uÅ¾ nastavenÃ­, zda se mÃ¡ je
 \end{figure}
 
 
-JinÃ½m zpÅ¯sobem zmÄny stavu registru je pouÅ¾itÃ­ jinÃ© instrukce neÅ¾ kterÃ¡ se pouÅ¾Ã­vÃ¡ pro pamÄÅ¥ovÃ© operace -- tj. mÃ­sto zÃ¡pisu na adresu v pamÄÅ¥ovÃ©m prostoru vyhrazenou pro GPIO registr, se provede zÃ¡pis do tzv. \textbf{vstupnÄ-vÃ½stupnÃ­ho prostoru}\footnote{TakÃ© oznaÄovÃ¡n zkratkou PIO -- \textit{Programmed input/output} nebo jako I/O adresnÃ­ prostor} na adresu (v tomto pÅÃ­padÄ oznaÄovanou jako \textbf{port}) odpovÃ­dajÃ­cÃ­ registru GPIO pinÅ¯. Adresy pamÄÅ¥ovÃ©ho a vstupnÄ-vÃ½stupnÃ­ho prostoru spolu nijak nesouvisÃ­. V pÅÃ­padÄ zÃ¡pisu a ÄtenÃ­ do/z portu I/O adresnÃ­ho prostoru je potÅeba z dokumentace \textbf{pÅesnÄ vÄdÄt} jak Å¡irokÃ¡ (kolikabitovÃ¡) slova je moÅ¾nÃ© zapisovat/ÄÃ­st. 
+JinÃ½m zpÅ¯sobem zmÄny stavu registru je pouÅ¾itÃ­ jinÃ© instrukce neÅ¾ kterÃ¡ se pouÅ¾Ã­vÃ¡ pro pamÄÅ¥ovÃ© operace -- tj. mÃ­sto zÃ¡pisu na adresu v pamÄÅ¥ovÃ©m prostoru vyhrazenou pro GPIO registr, se provede zÃ¡pis do tzv. \textbf{vstupnÄ-vÃ½stupnÃ­ho prostoru}\footnote{TakÃ© oznaÄovÃ¡n zkratkou PIO -- \textit{Programmed input/output} nebo jako I/O adresnÃ­ prostor} na adresu (v tomto pÅÃ­padÄ oznaÄovanou jako \textbf{port}) odpovÃ­dajÃ­cÃ­ registru GPIO pinÅ¯. Adresy pamÄÅ¥ovÃ©ho a~vstupnÄ-vÃ½stupnÃ­ho prostoru spolu nijak nesouvisÃ­. V pÅÃ­padÄ zÃ¡pisu a ÄtenÃ­ do/z portu I/O adresnÃ­ho prostoru je potÅeba z dokumentace \textbf{pÅesnÄ vÄdÄt} jak Å¡irokÃ¡ (kolikabitovÃ¡) slova je moÅ¾nÃ© zapisovat/ÄÃ­st. 
 
-\ibox{V pÅÃ­padÄ architektury IA-32 (oznaÄovanÃ© takÃ© jako x86) mÃ¡me k dispozici pamÄÅ¥ovÃ½ a vstupnÄ-vÃ½stupnÃ­ adresnÃ­ prostor. VstupnÄ vÃ½stupnÃ­ adresnÃ­ prostor je pouze 16bitovÃ½, zatÃ­mco pamÄÅ¥ovÃ½ je (\textit{pro zjednoduÅ¡enÃ­ nebereme ohled na PAE -- Physical Address Extension}) 32bitovÃ½. Toto rozdÄlenÃ­ pÅetrvÃ¡vÃ¡ z historickÃ½ch dÅ¯vodÅ¯ -- i pÅesto je jiÅ¾ moÅ¾nÃ© nÄkterÃ¡ zaÅÃ­zenÃ­ mapovat do pamÄÅ¥ovÃ©ho prostoru. (ZnÃ¡zornÄno na obrÃ¡zku \ref{mmio}.)}
+\ibox{V pÅÃ­padÄ architektury IA-32 (oznaÄovanÃ© takÃ© jako x86) mÃ¡me k dispozici pamÄÅ¥ovÃ½ a vstupnÄ-vÃ½stupnÃ­ adresnÃ­ prostor. VstupnÄ vÃ½stupnÃ­ adresnÃ­ prostor je pouze 16bitovÃ½, zatÃ­mco pamÄÅ¥ovÃ½ je (\textit{pro zjednoduÅ¡enÃ­ nebereme ohled na PAE -- Physical Address Extension}) 32bitovÃ½. Toto rozdÄlenÃ­ pÅetrvÃ¡vÃ¡ z historickÃ½ch dÅ¯vodÅ¯ -- i~pÅesto je jiÅ¾ moÅ¾nÃ© nÄkterÃ¡ zaÅÃ­zenÃ­ mapovat do pamÄÅ¥ovÃ©ho prostoru. (ZnÃ¡zornÄno na obrÃ¡zku \ref{mmio}.)}
 
 HlavnÃ­ rozdÃ­ly mezi chovÃ¡nÃ­m pamÄÅ¥ovÃ© buÅky a registru zaÅÃ­zenÃ­ jsou:
 \begin{itemize}
@@ -94,12 +93,12 @@ HlavnÃ­ rozdÃ­ly mezi chovÃ¡nÃ­m pamÄÅ¥ovÃ© buÅky a registru zaÅÃ­zenÃ­ jsou:
 \end{figure}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\clearpage
+%\clearpage
 %\newpage
 \section{PCI sbÄrnice}\label{pcich}
 %PÅesnÃ½ popis PCI sbÄrnice je mimo rozsah a zamÄÅenÃ­ tÃ©to prÃ¡ce. PokusÃ­m se vÅ¡ak zmÃ­nit a nÃ¡zornÄ vysvÄtlit principy vyuÅ¾Ã­vanÃ© touto sbÄrnicÃ­, kterÃ© je nutnÃ© alespoÅ ÄÃ¡steÄnÄ znÃ¡t pÅi implementaci ovladaÄÅ¯ PCI zaÅÃ­zenÃ­.
 
-PCI (\textit{Peripheral Component Interconnect}) je standard paralelnÃ­ sbÄrnice vyuÅ¾Ã­vanÃ½ v poÄÃ­taÄÃ­ch rÅ¯znÃ½ch architektur. Å Ã­Åka paralelnÄ pÅenÃ¡Å¡enÃ½ch dat je 32 nebo v modernÄjÅ¡Ã­, mÃ©nÄ Äasto pouÅ¾Ã­vanÃ© verzi, 64 bitÅ¯. SbÄrnice je orientovÃ¡na na pÅenos zprÃ¡v oproti pÅÃ­mÃ© komunikaci mezi zaÅÃ­zenÃ­mi\footnote{PÅÃ­klad: FIXME}
+PCI (\textit{Peripheral Component Interconnect}) je standard paralelnÃ­ sbÄrnice vyuÅ¾Ã­vanÃ½ v~poÄÃ­\-ta\-ÄÃ­ch rÅ¯znÃ½ch architektur. Å Ã­Åka paralelnÄ pÅenÃ¡Å¡enÃ½ch dat je 32 nebo v modernÄjÅ¡Ã­, mÃ©nÄ Äasto pouÅ¾Ã­vanÃ© verzi, 64 bitÅ¯. SbÄrnice je orientovÃ¡na na pÅenos zprÃ¡v oproti pÅÃ­mÃ© komunikaci mezi zaÅÃ­zenÃ­mi.\footnote{T.j. mÃ­sto toho, aby PCI most pÅistupoval pÅÃ­mo k pamÄti jednotlivÃ½ch zaÅÃ­zenÃ­, vyÅ¡le se na sbÄrnici zprÃ¡va s poÅ¾adavkem. V pÅÃ­padÄ, Å¾e je zaÅÃ­zenÃ­ schopno poÅ¾adavek obslouÅ¾it, umÃ­stÃ­ na datovou sbÄrnici poÅ¾adovanÃ¡ data.}
 
 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.
 
@@ -125,14 +124,14 @@ Pro spojenÃ­ mezi kartou a sbÄrnicÃ­ je potÅeba pouze konektor na stranÄ sbÄ
 
 
 \subsection{DynamickÃ¡ konfigurace a konfiguraÄnÃ­ adresnÃ­ prostor}\label{pci_conf}
-Mezi hlavnÃ­ vÃ½hody PCI sbÄrnice (oproti jejÃ­ pÅedchÅ¯dkyni -- sbÄrnici ISA) patÅÃ­ dynamickÃ¡ konfigurace pÅipojenÃ½ch zaÅÃ­zenÃ­: Ve vÄtÅ¡inÄ pÅÃ­padÅ¯ probÃ­hÃ¡ komunikace mezi hostitelskÃ½m systÃ©mem a pÅipojenou (a nakonfigurovanou) PCI kartou zÃ¡pisem/ÄtenÃ­m do urÄitÃ© pamÄÅ¥ovÃ© (nebo vstupnÄ-vÃ½stupnÃ­) oblasti. U starÅ¡Ã­ sbÄrnice ISA si kaÅ¾dÃ¡ karta pevnÄ urÄila, kam se jejÃ­ ÄÃ¡st pamÄti namapuje -- v takovÃ©m pÅÃ­padÄ mohl nastat problÃ©m, Å¾e vÃ­ce neÅ¾ jedna karta mapovala svoji pamÄÅ¥ na stejnou adresu (nebo se jednotlivÃ¡ mapovÃ¡nÃ­ pÅekrÃ½vala). PCI sbÄrnice tomuto problÃ©mu pÅedchÃ¡zÃ­ takovÃ½m zpÅ¯sobem, Å¾e kaÅ¾dÃ¡ z karet nese informaci o tom, kolik jak velkÃ½ch pamÄÅ¥ovÃ½ch nebo I/O regionÅ¯ potÅebuje namapovat -- o samotnÃ© mapovÃ¡nÃ­ se potÃ© postarÃ¡ PCI most.
+Mezi hlavnÃ­ vÃ½hody PCI sbÄrnice (oproti jejÃ­ pÅedchÅ¯dkyni -- sbÄrnici ISA) patÅÃ­ dynamickÃ¡ konfigurace pÅipojenÃ½ch zaÅÃ­zenÃ­: Ve vÄtÅ¡inÄ pÅÃ­padÅ¯ probÃ­hÃ¡ komunikace mezi hostitelskÃ½m systÃ©mem a pÅipojenou (a nakonfigurovanou) PCI kartou zÃ¡pisem/ÄtenÃ­m do urÄitÃ© pamÄÅ¥ovÃ© (nebo vstupnÄ-vÃ½stupnÃ­) oblasti. U starÅ¡Ã­ sbÄrnice ISA si kaÅ¾dÃ¡ karta pevnÄ urÄila, kam se jejÃ­ ÄÃ¡st pamÄti namapuje -- v takovÃ©m pÅÃ­padÄ mohl nastat problÃ©m, Å¾e vÃ­ce neÅ¾ jedna karta mapovala svoji pamÄÅ¥ na stejnou adresu (nebo se jednotlivÃ¡ mapovÃ¡nÃ­ pÅekrÃ½vala). PCI sbÄrnice tomuto problÃ©mu pÅedchÃ¡zÃ­ takovÃ½m zpÅ¯sobem, Å¾e kaÅ¾dÃ¡ z karet nese informaci o~tom, kolik jak velkÃ½ch pamÄÅ¥ovÃ½ch nebo I/O regionÅ¯ potÅebuje namapovat -- o samotnÃ© mapovÃ¡nÃ­ se potÃ© postarÃ¡ PCI most.
 
-Informaci o tom, kolik (a jakÃ©) pamÄti karta bude potÅebovat mÃ¡ pÅed nakonfigurovÃ¡nÃ­m uloÅ¾enu v tzv. \textbf{Base Address Registrech} -- BAR0--BAR5\footnote{FIXME Ve skuteÄnosti funguje vyÄtenÃ­ poÅ¾adovanÃ© velikosti z registru karty PCI mostem takovÃ½m zpÅ¯sobem, Å¾e se PCI most snaÅ¾Ã­ do kaÅ¾dÃ©ho BAR registru zapsat 0xFF a potÃ© zapsanou hodnotu pÅeÄÃ­st -- do BAR registru je moÅ¾nÃ© zapsat pouze .... bla bla}. PotÃ© co se PCI mostu podaÅÃ­ tuto hodnotu pÅeÄÃ­st a poÅ¾adovanou pamÄÅ¥ alokovat, zapÃ­Å¡e zpÄt do danÃ©ho registru adresu, na kterÃ© se alokovanÃ¡ pamÄÅ¥ nachÃ¡zÃ­. Tu si potÃ© pro potÅeby komunikace vyÄte ovladaÄ zaÅÃ­zenÃ­, kterÃ½ je souÄÃ¡stÃ­ operaÄnÃ­ho systÃ©mu.
+Informaci o tom, kolik (a jakÃ©) pamÄti karta bude potÅebovat mÃ¡ pÅed nakonfigurovÃ¡nÃ­m uloÅ¾enu v tzv. \textbf{Base Address Registrech} -- BAR0--BAR5\footnote{Informace o velikosti poÅ¾adovanÃ© oblasti je v registru uloÅ¾ena takovÃ½m zpÅ¯sobem, Å¾e je pouze jeho ÄÃ¡st urÄena k zÃ¡pisu a zbytek je pouze pro ÄtenÃ­. PCI most se pokusÃ­ do registru zapsat hodnotu 0xFFFFFFFF, potÃ© je hodnota zpÄt vyÄtena -- z bitÅ¯ nÃ¡leÅ¾ejÃ­cÃ­ch do zapisovatelnÃ© ÄÃ¡sti registru, je pÅeÄtena $1_2$, zbÃ½vajÃ­cÃ­ ÄÃ¡st obsahuje hodnoty $0_2$.}. PotÃ© co se PCI mostu podaÅÃ­ tuto hodnotu pÅeÄÃ­st a poÅ¾adovanou pamÄÅ¥ alokovat, zapÃ­Å¡e zpÄt do danÃ©ho registru adresu, na kterÃ© se alokovanÃ¡ pamÄÅ¥ nachÃ¡zÃ­. Tu si potÃ© pro potÅeby komunikace vyÄte ovladaÄ zaÅÃ­zenÃ­, kterÃ½ je souÄÃ¡stÃ­ operaÄnÃ­ho systÃ©mu.
 
 
 KromÄ vÃ½Å¡e zmÃ­nÄnÃ½ch 6 BAR registrÅ¯, obsahujÃ­ PCI zaÅÃ­zenÃ­ i nÃ¡sledujÃ­cÃ­ registry:
 \begin{description}
-\item[Vendor ID]~\\Obsahuje unikÃ¡tnÃ­ 16bitovÃ© ÄÃ­slo identifikujÃ­cÃ­ vÃ½robce zaÅÃ­zenÃ­. Za poplatek je udÄlovÃ¡no PCI-SIG (\textit{PCI Special Interest Group}) organizacÃ­.\footnote{V Debianu, po nainstalovÃ¡nÃ­ balÃ­Äku \texttt{hwdata}, se seznam tÄchto identifikÃ¡torÅ¯ nachÃ¡zÃ­ v souboru \texttt{/usr/share/hwdata/pci.ids}}
+\item[Vendor ID]~\\Obsahuje unikÃ¡tnÃ­ 16bitovÃ© ÄÃ­slo identifikujÃ­cÃ­ vÃ½robce zaÅÃ­zenÃ­. Za poplatek je udÄlo\-vÃ¡no PCI-SIG (\textit{PCI Special Interest Group}) organizacÃ­.\footnote{V Debianu, po nainstalovÃ¡nÃ­ balÃ­Äku \texttt{hwdata}, se seznam tÄchto identifikÃ¡torÅ¯ nachÃ¡zÃ­ v souboru \texttt{/usr/share/hwdata/pci.ids}}
 \item[Device ID]~\\Obsahuje 16bitovÃ© ÄÃ­slo identifikujÃ­cÃ­ model zaÅÃ­zenÃ­. Hodnotu tohoto identifikÃ¡toru si volÃ­ sÃ¡m vÃ½robce zaÅÃ­zenÃ­.
 \item[Class code]~\\OznaÄuje (ve 24 bitech) druh zaÅÃ­zenÃ­ -- zda se jednÃ¡ napÅ. o grafickou kartu, zvukovou kartu nebo kartu zpracovÃ¡vajÃ­cÃ­ signÃ¡l.
 \item[Subsystem Vendor ID] -- PodobÃ¡ se \texttt{Vendor ID}. V pÅÃ­padÄ, Å¾e karta vyuÅ¾Ã­vÃ¡ PCI ÅadiÄ tÅetÃ­ strany, jako \texttt{Vendor ID} se zobrazÃ­ ID vÃ½robce tohoto ÅadiÄe. Aby bylo moÅ¾nÃ© zaÅÃ­zenÃ­ odliÅ¡it od jinÃ©ho, kterÃ© vyuÅ¾Ã­vÃ¡ stejnÃ½ ÅadiÄ, skuteÄnÃ© ID zaÅÃ­zenÃ­ bude uloÅ¾eno v tomto registru.
@@ -150,7 +149,7 @@ Registry \texttt{Vendor ID}, \texttt{Device ID} (pÅÃ­p. jeÅ¡tÄ \texttt{Subsyst
 	\end{center}
 \end{figure}
 
-VÃ½Å¡e popsanÃ© registry (spolu s ostatnÃ­mi, kterÃ© zde nebyly popsÃ¡ny) se nachÃ¡zejÃ­ v 256bitovÃ©m tzv. \textbf{konfiguraÄnÃ­m adresnÃ­m prostoru} karty\footnote{Po pamÄÅ¥ovÃ©m a vstupnÄ-vÃ½stupnÃ­m adresnÃ­m prostoru je zde tÅetÃ­ -- konfiguraÄnÃ­ -- adresnÃ­ prostor.}. PÅÃ­stup do konfiguraÄnÃ­ho adresnÃ­ho prostoru je na architektuÅe IA-32 moÅ¾nÃ½ pomocÃ­ zapsÃ¡nÃ­ adresy (\textit{kam chceme v konfiguraÄnÃ­m prostoru zapisovat}) a dat (\textit{kterÃ¡ chceme do konfiguraÄnÃ­ho prostoru zapsat}) do dvou speciÃ¡lnÃ­ch I/O portÅ¯, kterÃ© jsou pro tuto operaci vyhrazeny.
+VÃ½Å¡e popsanÃ© registry (spolu s ostatnÃ­mi, kterÃ© zde nebyly popsÃ¡ny) se nachÃ¡zejÃ­ v~256bito\-vÃ©m tzv. \textbf{konfiguraÄnÃ­m adresnÃ­m prostoru} karty\footnote{Po pamÄÅ¥ovÃ©m a vstupnÄ-vÃ½stupnÃ­m adresnÃ­m prostoru je zde tÅetÃ­ -- konfiguraÄnÃ­ -- adresnÃ­ prostor.}. PÅÃ­stup do konfiguraÄnÃ­ho adresnÃ­ho prostoru je na architektuÅe IA-32 moÅ¾nÃ½ pomocÃ­ zapsÃ¡nÃ­ adresy (\textit{kam mÃ¡ bÃ½t v~konfiguraÄnÃ­m prostoru zapisovÃ¡no}) a dat (\textit{kterÃ¡ majÃ­ bÃ½t do konfiguraÄnÃ­ho prostoru zapsÃ¡na}) do dvou speciÃ¡lnÃ­ch I/O portÅ¯, kterÃ© jsou pro tuto operaci vyhrazeny.
 
 
 \subsection{PÅeruÅ¡enÃ­}
@@ -159,8 +158,9 @@ SbÄrnice PCI obsahuje ÄtyÅi linky pÅeruÅ¡enÃ­ a vÅ¡echny z nich jsou dostupn
 V pozdÄjÅ¡Ã­ch revizÃ­ch PCI specifikacÃ­ je pÅidÃ¡na podpora pro pÅeruÅ¡enÃ­ signalizovanÃ© zprÃ¡vou. V tomto pÅÃ­padÄ zaÅÃ­zenÃ­ oznamuje svÅ¯j poÅ¾adavek na obslouÅ¾enÃ­ zÃ¡pisem do pamÄti PCI mostu -- ten potÃ© tento poÅ¾adavak smÄruje dÃ¡le k procesoru.
 
 \subsection{Budoucnost}
-V poslednÃ­ch letech je na poli osobnÃ­ch poÄÃ­taÄÅ¯ PCI sbÄrnice nahrazovÃ¡na jejÃ­ nÃ¡stupkynÃ­ -- sbÄrnicÃ­ PCIe (PCI Express). Ta je na rozdÃ­l od PCI sÃ©riovÃ¡ a dosahuje rychlostÃ­ aÅ¾ 16 GB/s. I pÅesto je sbÄrnice PCI stÃ¡le vyuÅ¾Ã­vÃ¡na mnohÃ½mi zaÅÃ­zenÃ­mi -- pÅevÃ¡Å¾nÄ v prÅ¯myslu.
+V poslednÃ­ch letech je na poli osobnÃ­ch poÄÃ­taÄÅ¯ PCI sbÄrnice nahrazovÃ¡na jejÃ­ nÃ¡stupkynÃ­ -- sbÄrnicÃ­ PCIe (PCI Express). Ta je na rozdÃ­l od PCI sÃ©riovÃ¡ a dosahuje rychlostÃ­ aÅ¾ 16 GB/s. I~pÅesto je sbÄrnice PCI stÃ¡le vyuÅ¾Ã­vÃ¡na mnohÃ½mi zaÅÃ­zenÃ­mi -- pÅevÃ¡Å¾nÄ v prÅ¯myslu.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newpage
 \section{Humusoft MF624}
 \begin{figure}[h!]
 	\begin{center}
@@ -241,12 +241,12 @@ Z tabulky \ref{tab_bar} lze vyÄÃ­st informaci, Å¾e registry ovlÃ¡dajÃ­cÃ­ digit
 	\hline 0x2E &  & \textbf{DA7} -- D/A 7 data \\ 
 	\hline 
 	\end{tabular} 
-	\caption{Registry karty obsaÅ¾enÃ© v regionu BAR1}
+	\caption{Registry karty MF624 obsaÅ¾enÃ© v regionu BAR1}
 	\label{tab_bar1}
 	\end{center}
 \end{table}
 
-Na devÃ¡tÃ©m ÅÃ¡dku jsou zmÃ­nÄny \texttt{DIN} (Digital input) a \texttt{DOUT} (Digital output) registry. Z tÃ©to tabulky je patrnÃ¡ pozice tÄchto registrÅ¯ v pamÄÅ¥ovÃ©m prostoru (t.j. offset v bytech vÅ¯Äi adrese BAR1).
+Na devÃ¡tÃ©m ÅÃ¡dku jsou zmÃ­nÄny \texttt{DIN} (Digital input) a \texttt{DOUT} (Digital output) registry. Z~tÃ©to tabulky je patrnÃ¡ pozice tÄchto registrÅ¯ v pamÄÅ¥ovÃ©m prostoru (t.j. offset v bytech vÅ¯Äi adrese BAR1).
 
 Jak jsou data v registrech reprezentovÃ¡na, je moÅ¾nÃ© si pÅeÄÃ­st (v oficiÃ¡lnÃ­m manuÃ¡lu) na stranÄ 16, kde jsou tyto dva registry podrobnÄ popsÃ¡ny (zde tabulka \ref{tab_din} a \ref{tab_dout}). 
 PrvnÃ­ sloupec urÄuje, kterÃ½ch bitÅ¯ se danÃ½ ÅÃ¡dek tÃ½kÃ¡. V druhÃ©m sloupci je informace o funkci. TÅetÃ­ sloupec udÃ¡vÃ¡ vÃ½chozÃ­ hodnotu. Z toho, co je v tabulkÃ¡ch uvedeno, plyne, Å¾e pro ÄtenÃ­ 8bitovÃ©ho digitÃ¡lnÃ­ho vstupu staÄÃ­ pÅeÄÃ­st spodnÃ­ch 8 bitÅ¯ DIN registru, hornÃ­ch 8 bitÅ¯ je potÅeba ignorovat. StejnÄ tak pro nastavenÃ­ 8bitovÃ©ho digitÃ¡lnÃ­ho vÃ½stupu se zapÃ­Å¡e poÅ¾adovanÃ¡ hodnota do spodnÃ­ch 8 bitÅ¯ registru DOUT, hornÃ­ch 8 bitÅ¯ je potÅeba ignorovat.
@@ -283,7 +283,7 @@ Karta MF624 obsahuje osm 14bitovÃ½ch A/D pÅevodnÃ­kÅ¯ s pevnÄ stanovenÃ½m rozs
 
 \begin{itemize}
 \item Nejprve se v registru ADCTRL zvolÃ­, kterÃ© A/D pÅevodnÃ­ky majÃ­ bÃ½t Äteny. 
-KaÅ¾dÃ½ z A/D pÅevodnÃ­kÅ¯ je reprezentovÃ¡n jednÃ­m bitem. ZÃ¡pisem 1 do danÃ©ho bitu se nastavÃ­, Å¾e bude danÃ½ A/D pÅevodnÃ­k aktivnÃ­ -- 0 ho deaktivuje. Je moÅ¾nÃ© zvolit vÃ­ce neÅ¾ jeden A/D pÅevodnÃ­k.
+KaÅ¾dÃ½ z~A/D pÅevodnÃ­kÅ¯ je reprezentovÃ¡n jednÃ­m bitem. ZÃ¡pisem 1 do danÃ©ho bitu se nastavÃ­, Å¾e bude danÃ½ A/D pÅevodnÃ­k aktivnÃ­ -- 0 ho deaktivuje. Je moÅ¾nÃ© zvolit vÃ­ce neÅ¾ jeden A/D pÅevodnÃ­k.
 \item ÄtenÃ­m registru ADSTART se spustÃ­ pÅevod na zvolenÃ½ch A/D pÅevod\-nÃ­cÃ­ch. PÅeÄtenÃ¡ hodnota se dÃ¡le nepouÅ¾Ã­vÃ¡.
 \item V pÅÃ­padÄ, Å¾e se provedl pÅevod na vÅ¡ech zvolenÃ½ch A/D pÅevodnÃ­cÃ­ch, je EOLC bit (17. bit) GPIOC registru nastaven na 0 (jinak je v 1).
 \item VÃ½slednou hodnotu je moÅ¾nÃ© pÅeÄÃ­st z registru ADDATA, kterÃ½ je typu FIFO. To znamenÃ¡, Å¾e opÄtovnÃ½m ÄtenÃ­m jednoho registru jsou vyÄÃ­tÃ¡ny jednotlivÃ© namÄÅenÃ© hodnoty z mÄÅenÃ½ch A/D pÅevodnÃ­kÅ¯ v poÅadÃ­ od 0 do 7.
@@ -291,7 +291,7 @@ KaÅ¾dÃ½ z A/D pÅevodnÃ­kÅ¯ je reprezentovÃ¡n jednÃ­m bitem. ZÃ¡pisem 1 do danÃ©
 Jinou moÅ¾nostÃ­ je mÃ­sto ÄtenÃ­ registru ADDATA ÄÃ­st nÄkterÃ½ z jeho \textit{zrcadlenÃ½ch registrÅ¯} (celkem je jich 7, v manuÃ¡lu jsou oznaÄeny jako \textit{BADR1 + 0x02} aÅ¾ \textit{BADR1 + 0x0E}). Tyto registry se chovajÃ­ \textbf{zcela stejnÄ} jako registr ADDATA, pouze leÅ¾Ã­ na jinÃ½ch adresÃ¡ch. PÅÃ­klad: pokud byly aktivovÃ¡ny prvnÃ­ ÄtyÅi A/D pÅevodnÃ­ky, po pÅevodu je moÅ¾nÃ© vÃ½slednou hodnotu vyÄÃ­st opakovanÃ½m ÄtenÃ­m registru ADDATA nebo ÄtenÃ­m registru ADDATA, ADDATA1, ADDATA2, ADDATA3 pÅesnÄ v tomto poÅadÃ­. ÄtenÃ­ z registrÅ¯ v jinÃ©m poÅadÃ­ bude stÃ¡le vracet hodnoty pÅevodnÃ­kÅ¯ 0--4.
 \end{itemize}
 
-Hodnota vyÄtenÃ¡ z A/D pÅevodnÃ­kÅ¯ je ve formÃ¡tu dvojkovÃ©ho doplÅku -- pÅÃ­klad konkrÃ©tnÃ­ch hodnot je v tabulce \ref{tab_adval}.
+Hodnota vyÄtenÃ¡ z A/D pÅevodnÃ­kÅ¯ je ve formÃ¡tu dvojkovÃ©ho doplÅku -- pÅÃ­klad konkrÃ©t\-nÃ­ch hodnot je v tabulce \ref{tab_adval}.
 
 
 \begin{table}[h!]
@@ -363,7 +363,7 @@ Karta disponuje nÃ¡sledujÃ­cÃ­mi funkcemi:
 \subsection{Komunikace s kartou}
 ZpÅ¯sob komunikace s kartou MF614 se mÃ­rnÄ liÅ¡Ã­ od MF624.
 
-Po nahlÃ©dnutÃ­ do manuÃ¡lu (dostupnÃ½ ze strÃ¡nek vÃ½robce: \url{http://www2.humusoft.cz/www/datacq/manuals/mf614um.pdf}) je z tabulky 9 (zde tab. \ref{tab_mf614_bars}) patrnÃ©, Å¾e karta vyuÅ¾Ã­vÃ¡ vÃ­ce regionÅ¯ neÅ¾ MF624, pÅiÄemÅ¾ nÄkterÃ© jsou mapovÃ¡ny do pamÄti, jinÃ© do vstupnÄ-vÃ½stupnÃ­ho adresnÃ­ho prostoru. Po prohlÃ©dnutÃ­ tabulky popisujÃ­cÃ­ rozloÅ¾enÃ­ registrÅ¯ (zde tab. \ref{tab_mf614_regs}) je zÅejmÃ©, Å¾e pro pÅÃ­stup k digitÃ¡lnÃ­m vstupÅ¯m/vÃ½stupÅ¯m a analogovÃ½m vstupÅ¯m/vÃ½stupÅ¯m jsou pouÅ¾ity vstupnÄ-vÃ½stupnÃ­ regiony BAR0, BAR2. 
+Po nahlÃ©dnutÃ­ do manuÃ¡lu (dostupnÃ½ ze strÃ¡nek vÃ½robce: \url{http://www2.humusoft.cz/www/datacq/manuals/mf614um.pdf}) je z tabulky 9 (zde tab. \ref{tab_mf614_bars}) patrnÃ©, Å¾e karta vyuÅ¾Ã­vÃ¡ vÃ­ce regionÅ¯ neÅ¾ MF624, pÅiÄemÅ¾ nÄkterÃ© jsou mapovÃ¡ny do pamÄti, jinÃ© do vstupnÄ-vÃ½stup\-nÃ­ho adresnÃ­ho prostoru. Po prohlÃ©dnutÃ­ tabulky popisujÃ­cÃ­ rozloÅ¾enÃ­ registrÅ¯ (zde tab. \ref{tab_mf614_regs}) je zÅejmÃ©, Å¾e pro pÅÃ­stup k digitÃ¡lnÃ­m vstupÅ¯m/vÃ½stupÅ¯m a analogovÃ½m vstupÅ¯m/vÃ½stupÅ¯m jsou pouÅ¾ity vstupnÄ-vÃ½stupnÃ­ regiony BAR0, BAR2. 
 
 \begin{table}[h!]
 	\begin{center}
@@ -413,10 +413,10 @@ Po nahlÃ©dnutÃ­ do manuÃ¡lu (dostupnÃ½ ze strÃ¡nek vÃ½robce: \url{http://www2.hu
 
 JednotlivÃ© registry v tÄchto regionech jsou 8bitovÃ©, proto je potÅeba pÅi ÄtenÃ­/zÃ¡pisu pouÅ¾Ã­vat pouze 8bitovÃ© funkce. 16bitovÃ© hodnoty jsou rozdÄleny do dvou 8bitovÃ½ch registrÅ¯ -- v takovÃ©m pÅÃ­padÄ, obsahuje-li registr ve svÃ©m nÃ¡zvu pÃ­smena \textbf{LO}, jednÃ¡ se o spodnÃ­ bajt, zatÃ­mco \textbf{HI} znaÄÃ­ hornÃ­ bajt. VÃ½slednÃ¡ 16bitovÃ¡ hodnota se zÃ­skÃ¡ sloÅ¾enÃ­m dvou 8bitovÃ½ch:
 \begin{verbatim}
-   u8 regAHI, regALO;
-   u16 regA;
+  u8 regAHI, regALO;
+  u16 regA;
    
-   regA = regALO | (regAHI << 8);
+  regA = regALO | (regAHI << 8);
 \end{verbatim}
 
 \subsection{DigitÃ¡lnÃ­ vstupy a vÃ½stupy}
@@ -512,7 +512,7 @@ Hodnota je zapsÃ¡na v aditivnÃ­m kÃ³du (tab. \ref{tab_mf614_dac}).
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Implementace ovladaÄÅ¯}
 \section{OperaÄnÃ­ systÃ©m GNU/Linux}
-Jako cÃ­lovÃ½ operaÄnÃ­ systÃ©m, na kterÃ©m bude vysvÄtlena implementace zÃ¡kladnÃ­ch ovladaÄÅ¯, byl zvolen GNU/Linux\footnote{OperaÄnÃ­ systÃ©m sestÃ¡vajÃ­cÃ­ z GNU nÃ¡strojÅ¯ a jÃ¡dra Linux je oznaÄovÃ¡n jako GNU/Linux.}. HlavnÃ­m dÅ¯vodem je dostupnost zdrojovÃ½ch kÃ³dÅ¯, velkÃ© mnoÅ¾stvÃ­ kvalitnÃ­ dokumentace, rozÅ¡Ã­Åenost a vysokÃ¡ kvalita. DistribucÃ­ pouÅ¾itou pÅi vÃ½voji je Debian GNU/Linux (verze jÃ¡dra Linux 2.6.35) -- popsanÃ© postupy by vÅ¡ak mÄly fungovat i pro jinÃ© distribuce.
+Jako cÃ­lovÃ½ operaÄnÃ­ systÃ©m, na kterÃ©m bude vysvÄtlena implementace zÃ¡kladnÃ­ch ovla\-da\-ÄÅ¯, byl zvolen GNU/Linux\footnote{OperaÄnÃ­ systÃ©m sestÃ¡vajÃ­cÃ­ z GNU nÃ¡strojÅ¯ a jÃ¡dra Linux je oznaÄovÃ¡n jako GNU/Linux.}. HlavnÃ­m dÅ¯vodem je dostupnost zdrojovÃ½ch kÃ³dÅ¯, velkÃ© mnoÅ¾stvÃ­ kvalitnÃ­ dokumentace, rozÅ¡Ã­Åenost a vysokÃ¡ kvalita. DistribucÃ­ pouÅ¾itou pÅi vÃ½voji je Debian GNU/Linux (verze jÃ¡dra Linux 2.6.35) -- popsanÃ© postupy by vÅ¡ak mÄly fungovat i pro jinÃ© distribuce.
 
 \subsection{PrÃ¡ce s PCI zaÅÃ­zenÃ­mi z uÅ¾ivatelskÃ©ho prostoru}
 Pro vÃ½pis vÅ¡ech zaÅÃ­zenÃ­ v systÃ©mu pÅipojenÃ½ch pomocÃ­ sbÄrnice PCI slouÅ¾Ã­ program \texttt{lspci}.
@@ -535,8 +535,8 @@ $ lspci -nn -d 186c:0624 -vvv
         Subsystem: Humusoft, s.r.o. MF624 Multifunction I/O Card [186c:0624]
         Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- 
              Stepping- SERR- FastB2B- DisINTx-
-        Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- 
-             <MAbort- >SERR- <PERR- INTx-
+        Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
+             <TAbort- <MAbort- >SERR- <PERR- INTx-
         Interrupt: pin A routed to IRQ 22
         Region 0: Memory at d2dffc00 (32-bit, non-prefetchable) [size=128]
         Region 1: I/O ports at b800 [size=128]
@@ -563,12 +563,12 @@ Informace o PCI zaÅÃ­zenÃ­ch se nachÃ¡zejÃ­ ve sloÅ¾ce \texttt{/sys/bus/pci/dev
 
 Struktura souboru \texttt{resource} mÅ¯Å¾e vypadat nÃ¡sledovnÄ:
 \begin{verbatim}
-0x00000000d2dffc00 0x00000000d2dffc7f 0x0000000000020200
-0x000000000000b800 0x000000000000b87f 0x0000000000020101
-0x00000000d2dff800 0x00000000d2dff87f 0x0000000000020200
-0x0000000000000000 0x0000000000000000 0x0000000000000000
-0x00000000d2dff400 0x00000000d2dff47f 0x0000000000020200
-0x0000000000000000 0x0000000000000000 0x0000000000000000
+  0x00000000d2dffc00 0x00000000d2dffc7f 0x0000000000020200
+  0x000000000000b800 0x000000000000b87f 0x0000000000020101
+  0x00000000d2dff800 0x00000000d2dff87f 0x0000000000020200
+  0x0000000000000000 0x0000000000000000 0x0000000000000000
+  0x00000000d2dff400 0x00000000d2dff47f 0x0000000000020200
+  0x0000000000000000 0x0000000000000000 0x0000000000000000
 \end{verbatim}
 
 PrvnÃ­ sloupec oznaÄuje adresu zaÄÃ¡tku regionu, druhÃ½ jeho konec. TÅetÃ­ sloupec obsahuje pÅÃ­znaky danÃ©ho regionu. DÃ­ky nim je moÅ¾nÃ© zjistit, zda se napÅ. jednÃ¡ o pamÄÅ¥ovÃ½ nebo I/O region. Tyto pÅÃ­znaky jsou popsÃ¡ny v souboru \texttt{include/linux/ioport.h} (ve zdrojovÃ½ch souborech jÃ¡dra Linux). 
@@ -577,28 +577,28 @@ PrvnÃ­ sloupec oznaÄuje adresu zaÄÃ¡tku regionu, druhÃ½ jeho konec. TÅetÃ­ sl
 
 
 \subsection{ZÃ¡kladnÃ­ jadernÃ½ modul}\label{kern_mod}
-JÃ¡dro operaÄnÃ­ho systÃ©mu GNU/Linux je monolitickÃ© -- to znamenÃ¡, Å¾e po zkompilovÃ¡nÃ­ a slinkovÃ¡nÃ­ je tvoÅeno jednÃ­m kusem kÃ³du. Tento druh jÃ¡dra je lÃ©ty provÄÅen a mezi vÃ½hody patÅÃ­ jeho snadnÃ¡ implementace. Aby bÄÅ¾Ã­cÃ­ jÃ¡dro nemuselo obsahovat veÅ¡kerÃ© dostupnÃ© ovladaÄe zaÅÃ­zenÃ­ (nebo abychom v pÅÃ­padÄ potÅeby pÅidat do jÃ¡dra ovladaÄ pro novÃ½ hardware nemuseli celÃ© jÃ¡dro znovu kompilovat), existuje mechanismus naÄÃ­tÃ¡nÃ­ jadernÃ½ch modulÅ¯ za bÄhu, tzv. LKM -- Loadable Kernel Module. V praxi to vypadÃ¡ tak, Å¾e jsou v bÄÅ¾Ã­cÃ­m jÃ¡dÅe zakompilovÃ¡ny pouze nejnutnÄjÅ¡Ã­ ovladaÄe, vÅ¡echny ostatnÃ­ si mÅ¯Å¾e systÃ©m nebo uÅ¾ivatel za bÄhu do jÃ¡dra naÄÃ­st -- v pÅÃ­padÄ, Å¾e jiÅ¾ nejsou potÅeba, je moÅ¾nÃ© je z jÃ¡dra uvolnit.
+JÃ¡dro operaÄnÃ­ho systÃ©mu GNU/Linux je monolitickÃ© -- to znamenÃ¡, Å¾e po zkompilovÃ¡nÃ­ a slinkovÃ¡nÃ­ je tvoÅeno jednÃ­m kusem kÃ³du. Tento druh jÃ¡dra je lÃ©ty provÄÅen a mezi vÃ½hody patÅÃ­ jeho snadnÃ¡ implementace. Aby bÄÅ¾Ã­cÃ­ jÃ¡dro nemuselo obsahovat veÅ¡kerÃ© dostupnÃ© ovladaÄe zaÅÃ­zenÃ­ (nebo abychom v pÅÃ­padÄ potÅeby pÅidat do jÃ¡dra ovladaÄ pro novÃ½ hardware nemuseli celÃ© jÃ¡dro znovu kompilovat), existuje mechanismus naÄÃ­tÃ¡nÃ­ jadernÃ½ch modulÅ¯ za bÄhu, tzv. LKM -- Loadable Kernel Module. V praxi to vypadÃ¡ tak, Å¾e jsou v~bÄÅ¾Ã­cÃ­m jÃ¡dÅe zakompilovÃ¡ny pouze nejnutnÄjÅ¡Ã­ ovladaÄe, vÅ¡echny ostatnÃ­ si mÅ¯Å¾e systÃ©m nebo uÅ¾ivatel za bÄhu do jÃ¡dra naÄÃ­st -- v pÅÃ­padÄ, Å¾e jiÅ¾ nejsou potÅeba, je moÅ¾nÃ© je z jÃ¡dra uvolnit.
 
 Jak se takovÃ½ jadernÃ½ modul mÅ¯Å¾e vypadat, je nejlepÅ¡Ã­ si ukÃ¡zat na pÅÃ­kladu:
 \begin{verbatim}
- 1 |  #include <linux/init.h>
- 2 |  #include <linux/module.h>
- 3 | 
- 4 |  static int hello_init(void)
- 5 |  {
- 6 |      printk("Hello, world!\n");
- 7 |      return 0;
- 8 |  }
- 9 | 
-10 |  static void hello_exit(void)
-11 |  {
-12 |      printk("Goodbye, cruel world!\n");
-13 |  }
-14 | 
-15 |  module_init(hello_init);
-16 |  module_exit(hello_exit);
-17 |  
-18 |  MODULE_LICENSE("Dual BSD/GPL");
+  1 |  #include <linux/init.h>
+  2 |  #include <linux/module.h>
+  3 | 
+  4 |  static int hello_init(void)
+  5 |  {
+  6 |      printk("Hello, world!\n");
+  7 |      return 0;
+  8 |  }
+  9 | 
+ 10 |  static void hello_exit(void)
+ 11 |  {
+ 12 |      printk("Goodbye, cruel world!\n");
+ 13 |  }
+ 14 | 
+ 15 |  module_init(hello_init);
+ 16 |  module_exit(hello_exit);
+ 17 |  
+ 18 |  MODULE_LICENSE("Dual BSD/GPL");
 \end{verbatim}
 
 Z pÅÃ­kladu je patrnÃ©, Å¾e je modul napsÃ¡n v programovacÃ­m jazyce C. To platÃ­ pro vÄtÅ¡inu vÅ¡ech jadernÃ½ch modulÅ¯ (stejnÄ jako zdrojovÃ½ch kÃ³dÅ¯ jÃ¡dra samotnÃ©ho). Ve skuteÄnosti se jednÃ¡ o mÃ­rnÄ modifikovanÃ½ standard C90.
@@ -612,105 +612,105 @@ Pro jednoduchost je moÅ¾nÃ© s funkcÃ­ \texttt{printk()} pracovat jako s, jistÄ
 \item[ÅÃ¡dcÃ­ch 10--13.] Tato funkce nemÃ¡ na starost nic jinÃ©ho neÅ¾ vÃ½pis krÃ¡tkÃ©ho textu do logu jÃ¡dra.
 \end{description}
 
-\subsection{Kompilace modulu}
+\subsubsection{Kompilace modulu}
 DÃ¡le je potÅeba jadernÃ½ modul pÅeloÅ¾it\footnote{PÅed samotnÃ½m pÅekladem jÃ¡dra je potÅeba mÃ­t k dispozici zdrojovÃ© kÃ³dy jÃ¡dra. Ty je moÅ¾nÃ© stÃ¡hnout z \texttt{kernel.org} nebo v distribuci Debian nainstalovat pomocÃ­ pÅÃ­kazu \texttt{apt-get install linux-source}}. K tomu poslouÅ¾Ã­ nÃ¡sledujÃ­cÃ­ \texttt{Makefile}:
 \begin{verbatim}
-1 |  KERNEL_VER=`uname -r`
-2 |  obj-m += hello.o
-3 |
-4 |  all:
-5 |      make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) modules
-6 |  clean:
-7 |      make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) clean
+  1 |  KERNEL_VER=`uname -r`
+  2 |  obj-m += hello.o
+  3 |
+  4 |  all:
+  5 |      make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) modules
+  6 |  clean:
+  7 |      make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) clean
 \end{verbatim}
-Linux vyuÅ¾Ã­vÃ¡ pÅi kompilaci systÃ©mu \texttt{KBUILD}. Ten je tvoÅen mnoÅ¾stvÃ­m Makefile souborÅ¯ a jeho smyslem je umoÅ¾nit uÅ¾ivateli snadnou konfiguraci pÅed kompilacÃ­ -- urÄujÃ­cÃ­, kterÃ© ÄÃ¡asti se do jÃ¡dra zakompilujÃ­ a kterÃ© nikoliv. Popis toho systÃ©mu je mimo rozsah tÃ©to prÃ¡ce. StruÄnÃ½ popis vÃ½Å¡e zmÃ­nÄnÃ©ho Makefile souboru:
+Linux vyuÅ¾Ã­vÃ¡ pÅi kompilaci systÃ©mu \texttt{KBUILD}. Ten je tvoÅen mnoÅ¾stvÃ­m Makefile souborÅ¯ a~jeho smyslem je umoÅ¾nit uÅ¾ivateli snadnou konfiguraci pÅed kompilacÃ­ -- urÄujÃ­cÃ­, kterÃ© ÄÃ¡sti se do jÃ¡dra zakompilujÃ­ a kterÃ© nikoliv. VÃ½Å¡e uvedenÃ½ (zÃ¡kladnÃ­) Makefile soubor je tvoÅen nÃ¡sledovnÄ:
 
 \begin{description}
-\item[Na prvnÃ­m ÅÃ¡dku] se do promÄnnÃ© \texttt{KERNEL\_VER} pÅiÅadÃ­ verze aktuÃ¡lnÄ bÄÅ¾Ã­cÃ­ho jÃ¡dra (po zavolÃ¡nÃ­ pÅÃ­kazu \texttt{uname -r}, kterÃ½ tuto informaci vracÃ­)
-\item[DruhÃ½ ÅÃ¡dek] ÅÃ­kÃ¡, Å¾e modul bude vytvÃ¡Åen ze zdrojovÃ©ho souboru \texttt{hello.c} (pod tÃ­mto nÃ¡zvem jsme uloÅ¾ili nÃ¡Å¡ ukÃ¡zkovÃ½ modul)
-\item[Na pÃ¡tÃ©m ÅÃ¡dku] (uvozenÃ©m tabelÃ¡torem) se volÃ¡ (pomocÃ­ pÅepÃ­naÄe \texttt{-C}) Makefile ze systÃ©mu \texttt{KBUILD}, kterÃ½ se nachÃ¡zÃ­ v adresÃ¡Åi spolu se zdrojovÃ½mi kÃ³dy jÃ¡dra. Parametrem \texttt{M} ÅÃ­kÃ¡me, kterÃ© moduly si pÅejeme vytvoÅit -- v tomto pÅÃ­padÄ jsou to ty, jejichÅ¾ zdrojovÃ© soubory jsou v aktuÃ¡lnÃ­m adresÃ¡Åi (tj. \texttt{PWD}).
+\item[Na prvnÃ­m ÅÃ¡dku] se do promÄnnÃ© \texttt{KERNEL\_VER} pÅiÅadÃ­ verze aktuÃ¡lnÄ bÄÅ¾Ã­cÃ­ho jÃ¡dra (po zavolÃ¡nÃ­ pÅÃ­kazu \texttt{uname -r}, kterÃ½ tuto informaci vracÃ­).
+\item[DruhÃ½ ÅÃ¡dek] ÅÃ­kÃ¡, Å¾e modul bude vytvÃ¡Åen ze zdrojovÃ©ho souboru \texttt{hello.c} (t.j. modul popisovanÃ½ v kapitole \ref{kern_mod}).
+\item[Na pÃ¡tÃ©m ÅÃ¡dku] (uvozenÃ©m tabelÃ¡torem) se volÃ¡ (pomocÃ­ pÅepÃ­naÄe \texttt{-C}) Makefile ze sys\-tÃ©mu \texttt{KBUILD}, kterÃ½ se nachÃ¡zÃ­ v adresÃ¡Åi spolu se zdrojovÃ½mi kÃ³dy jÃ¡dra. Parametr \texttt{M} urÄuje, kterÃ© moduly majÃ­ bÃ½t vytvoÅeny -- v tomto pÅÃ­padÄ jsou to ty, kterÃ© jsou uvedeny v Makefile, nachÃ¡zejÃ­cÃ­m se v aktuÃ¡lnÃ­m adresÃ¡Åi (tj. \texttt{PWD}).
 \end{description}
 
 V pÅÃ­padÄ, Å¾e v adresÃ¡Åi, ve kterÃ©m se nachÃ¡zÃ­ zdrojovÃ½ soubor modulu \texttt{hello.c} a vÃ½Å¡e popsanÃ½ soubor \texttt{Makefile}, spustÃ­ pÅÃ­kaz \texttt{make}, mÄl by probÄhnout samotnÃ½ pÅeklad:
 \begin{verbatim}
-$ make
-make -C /lib/modules/`uname -r`/build M=/tmp/kernel_module_example modules
-make[1]: Entering directory `/usr/src/linux-headers-2.6.35-28-generic'
-  CC [M]  /tmp/kernel_module_example/hello.o
-  Building modules, stage 2.
-  MODPOST 1 modules
-  CC      /tmp/hello.mod.o
-  LD [M]  /tmp/hello.ko
-make[1]: Leaving directory `/usr/src/linux-headers-2.6.35-28-generic'
+  $ make
+  make -C /lib/modules/`uname -r`/build M=/tmp/kernel_module_example modules
+  make[1]: Entering directory `/usr/src/linux-headers-2.6.35-28-generic'
+    CC [M]  /tmp/kernel_module_example/hello.o
+    Building modules, stage 2.
+    MODPOST 1 modules
+    CC      /tmp/hello.mod.o
+    LD [M]  /tmp/hello.ko
+  make[1]: Leaving directory `/usr/src/linux-headers-2.6.35-28-generic'
 \end{verbatim}
 V aktuÃ¡lnÃ­m adresÃ¡Åi by se mÄl nachÃ¡zet kromÄ rÅ¯znÃ½ch souborÅ¯, kterÃ© vzniky pÅi pÅekladu, i potÅebnÃ½ \texttt{hello.ko} -- t.j. zkompilovanÃ½ jadernÃ½ modul pÅipravenÃ½ na zavedenÃ­ do jÃ¡dra.
 
 \begin{verbatim}
-$ ls
-hello.c  hello.ko  hello.mod.c  hello.mod.o  hello.o  
-Makefile  modules.order  Module.symvers
+  $ ls
+  hello.c  hello.ko  hello.mod.c  hello.mod.o  hello.o  
+  Makefile  modules.order  Module.symvers
 \end{verbatim}
 
-\subsection{ZavedenÃ­ modulu}
+\subsubsection{ZavedenÃ­ modulu}
 Po ÃºspÄÅ¡nÃ©m zkompilovÃ¡nÃ­ jadernÃ©ho modulu jiÅ¾ pouze zbÃ½vÃ¡ ho zavÃ©st do jÃ¡dra. To se provede programem \texttt{insmod} -- ten musÃ­ bÃ½t spouÅ¡tÄn se superuÅ¾ivatelskÃ½m oprÃ¡vnÄnÃ­m:
 \begin{verbatim}
-$ sudo insmod ./hello.ko 
+  $ sudo insmod ./hello.ko 
 \end{verbatim}
 
 V pÅÃ­padÄ, Å¾e vÅ¡e probÄhlo sprÃ¡vnÄ, mÄl by bÃ½t v logu jÃ¡dra text vypisovanÃ½ modulem po jeho zavedenÃ­. To je moÅ¾nÃ© ovÄÅit:
 \begin{verbatim}
-$ dmesg | tail -1
-[ 9245.757491] Hello, world!
+  $ dmesg | tail -1
+  [ 9245.757491] Hello, world!
 \end{verbatim}
 A skuteÄnÄ je poslednÃ­m ÅÃ¡dkem v logu text vypsanÃ½ ÃºspÄÅ¡nÄ zavedenÃ½m modulem.
 
 Pro plnÃ© otestovÃ¡nÃ­ funkÄnosti ukÃ¡zkovÃ©ho modulu, je potÅeba ho jeÅ¡tÄ z jÃ¡dra uvolnit. K tomu slouÅ¾Ã­ program \texttt{rmmod} (opÄt je potÅeba spouÅ¡tÄt se superuÅ¾ivatelskÃ½mi privilegii).
 \begin{verbatim}
-$ sudo rmmod hello 
+  $ sudo rmmod hello 
 
-$ dmesg | tail -1
-[ 9612.256929] Goodbye, cruel world!
+  $ dmesg | tail -1
+  [ 9612.256929] Goodbye, cruel world!
 \end{verbatim}
 V logu je opÄt nachÃ¡zÃ­ text vypisovanÃ½ modulem pÅi uvolÅovÃ¡nÃ­ z jÃ¡dra.
 
 
 \ibox{V pÅÃ­padÄ, Å¾e mÃ¡ bÃ½t do jÃ¡dra zaveden modul, jehoÅ¾ funkÄnost a stabilita nenÃ­ jistÃ¡, je vhodnÃ© si uloÅ¾it veÅ¡kerou prÃ¡ci a pÅed zavedenÃ­m/uvolnÄnÃ­m modulu do/z jÃ¡dra spustit program \texttt{sync}, kterÃ½ uloÅ¾Ã­ obsah diskovÃ½ch bufferÅ¯ na disky.}
 
-\subsection{Na co si dÃ¡vat pozor}
-PÅi psanÃ­ zÃ¡kladnÃ­ho modulu pro jÃ¡dro Linux nejsou patrnÃ© vÄtÅ¡Ã­ rozdÃ­ly oproti psanÃ­ programÅ¯ pro uÅ¾ivatelskÃ½ prostor. I pÅesto, Å¾e tyto rozdÃ­ly nejsou vidÄt, stÃ¡le tady jsou. Mezi ty nejdÅ¯leÅ¾itÄjÅ¡Ã­, kterÃ½ch si mÃ¡ bÃ½t programÃ¡tor vÄdom, patÅÃ­:
+\subsubsection{Na co si dÃ¡vat pozor}
+PÅi psanÃ­ zÃ¡kladnÃ­ho modulu pro jÃ¡dro Linux nejsou patrnÃ© vÄtÅ¡Ã­ rozdÃ­ly oproti psanÃ­ programÅ¯ pro uÅ¾ivatelskÃ½ prostor. I~pÅesto, Å¾e tyto rozdÃ­ly nejsou vidÄt, stÃ¡le tady jsou. Mezi ty nejdÅ¯leÅ¾itÄjÅ¡Ã­, kterÃ½ch si mÃ¡ bÃ½t programÃ¡tor vÄdom, patÅÃ­:
 
 \begin{description}
 \item[Å½Ã¡dnÃ¡ ochrana pamÄti]~\\LibovolnÃ½ jadernÃ½ modul mÃ¡ pÅÃ­stup k veÅ¡kerÃ© pamÄti poÄÃ­taÄe. V pÅÃ­padÄ, Å¾e se chybnÄ pokusÃ­ zapsat do pamÄti, do kterÃ© by zapisovat nemÄl, nenÃ­ zde Å¾Ã¡dnÃ½ mechanismus, kterÃ½ by mu v tom zabrÃ¡nil nebo ho na to alespoÅ upozornil.
 \item[UvolÅovÃ¡nÃ­ pamÄti]~\\StejnÄ jako pro programy psanÃ© v uÅ¾ivatelskÃ©m prostoru platÃ­, Å¾e nepotÅebnÃ¡ dynamicky alokovanÃ¡ pamÄÅ¥ by mÄla bÃ½t dealokovÃ¡na. V pÅÃ­padÄ neuvolÅovÃ¡nÃ­ pamÄti programem v uÅ¾ivatelskÃ©m prostoru je zde stÃ¡le operaÄnÃ­ systÃ©m, kterÃ½ po skonÄenÃ­ programu veÅ¡kerou pamÄÅ¥ uvolnÃ­. Nic takovÃ©ho vÅ¡ak v jÃ¡dÅe operaÄnÃ­ho systÃ©mu nefunguje -- po uvolnÄnÃ­ modulu z jÃ¡dra nenÃ­ nic, co by se postaralo o alokovanou.
-\item[PÅÃ­mÃ½ pÅÃ­stup k hardwaru]~\\ZÃ¡kladnÃ­ jadernÃ½ modul psanÃ½ napÅÃ­klad nezkuÅ¡enÃ½m studentem mÃ¡ zcela stejnÃ© moÅ¾nosti pÅÃ­stupu k hardware jako subsystÃ©my jÃ¡dra, kterÃ© se starajÃ­ o sprÃ¡vnou funkci jednotlivÃ½ch ovladaÄÅ¯. V lepÅ¡Ã­m pÅÃ­padÄ mÅ¯Å¾e Å¡patnÃ½ ovladaÄ zpÅ¯sobit pÃ¡d systÃ©mu, v horÅ¡Ã­m napÅ. zniÄenÃ­ dat na disku nebo dokonce zniÄenÃ­ hardware\footnote{NapÅÃ­klad velmi tÄÅ¾ko opravitelnÃ© poÅ¡kozenÃ­ firmware sÃ­Å¥ovÃ½ch karet Intel e1000e: \\ \url{http://www.abclinuxu.cz/clanky/jaderne-noviny/jaderne-noviny-22.-10.-2008\#pricina-chyby-poskozujici-e1000e}}.
-\item[GlobÃ¡lnÃ­ promÄnnÃ©]~\\KaÅ¾dÃ½ ovladaÄ mÅ¯Å¾e bÃ½t spuÅ¡tÄn ve vÃ­ce instancÃ­ch, proto by v kÃ³du nemÄly bÃ½t globÃ¡lnÃ­ promÄnnÃ©. PromÄnnÃ©, kterÃ© je potÅeba zpÅÃ­stupnit z vÃ­ce mÃ­st ovladaÄe se vloÅ¾Ã­ do jednÃ© struktury, kterÃ¡ je potÃ© pÅÃ­stupnÃ¡ skrze ukazatel na \textit{privÃ¡tnÃ­ data} ovladaÄe. Struktura reprezentujÃ­cÃ­ danÃ½ ovladaÄe vÄtÅ¡inou obsahuje ukazatel s nÃ¡zvem \texttt{private} nebo \texttt{priv}, kterÃ½ slouÅ¾Ã­ k tomuto ÃºÄelu.
+\item[PÅÃ­mÃ½ pÅÃ­stup k hardwaru]~\\ZÃ¡kladnÃ­ jadernÃ½ modul psanÃ½ napÅÃ­klad nezkuÅ¡enÃ½m studentem mÃ¡ zcela stejnÃ© moÅ¾no\-sti pÅÃ­stupu k hardware jako subsystÃ©my jÃ¡dra, kterÃ© se starajÃ­ o sprÃ¡vnou funkci jednotlivÃ½ch ovladaÄÅ¯. V lepÅ¡Ã­m pÅÃ­padÄ mÅ¯Å¾e Å¡patnÃ½ ovladaÄ zpÅ¯sobit pÃ¡d systÃ©mu, v~horÅ¡Ã­m napÅ. zniÄenÃ­ dat na disku nebo dokonce zniÄenÃ­ hardware\footnote{NapÅÃ­klad velmi tÄÅ¾ko opravitelnÃ© poÅ¡kozenÃ­ firmware sÃ­Å¥ovÃ½ch karet Intel e1000e: \\ \url{http://www.abclinuxu.cz/clanky/jaderne-noviny/jaderne-noviny-22.-10.-2008\#pricina-chyby-poskozujici-e1000e}}.
+\item[GlobÃ¡lnÃ­ promÄnnÃ©]~\\KaÅ¾dÃ½ ovladaÄ mÅ¯Å¾e bÃ½t spuÅ¡tÄn ve vÃ­ce instancÃ­ch, proto by v kÃ³du nemÄly bÃ½t globÃ¡lnÃ­ promÄnnÃ©. PromÄnnÃ©, kterÃ© je potÅeba zpÅÃ­stupnit z vÃ­ce mÃ­st ovladaÄe se vloÅ¾Ã­ do jednÃ© struktury, kterÃ¡ je potÃ© pÅÃ­stupnÃ¡ skrze ukazatel na \textit{privÃ¡tnÃ­ data} ovladaÄe. Struktura reprezentujÃ­cÃ­ danÃ½ ovladaÄe vÄtÅ¡inou obsahuje ukazatel s nÃ¡zvem \texttt{private} nebo \texttt{priv}, kterÃ½ slouÅ¾Ã­ k~tomuto ÃºÄelu.
 
 V pÅÃ­padÄ ukonÄenÃ­ funkce ovladaÄe musÃ­ bÃ½t tato pamÄÅ¥ uvolnÄna.
 \end{description}
 
-\subsection{PÅÃ­kaz GOTO}
+\subsubsection{PÅÃ­kaz GOTO}
 ObecnÄ je doporuÄovÃ¡no pÅÃ­kaz \texttt{goto} nepouÅ¾Ã­vat. Najdou se ale pÅÃ­pady, kdy jeho pouÅ¾itÃ­ usnadnÃ­ prÃ¡ci a i pÅesto neznepÅehlednÃ­ kÃ³d. V jÃ¡dÅe Linux se tento pÅÃ­kaz pouÅ¾Ã­vÃ¡ pÅi postupnÃ©m uvolÅovÃ¡nÃ­ zdrojÅ¯ zaÅÃ­zenÃ­.
 
 PÅÃ­klad pro lepÅ¡Ã­ nÃ¡zornost:
 \begin{verbatim}
- 1 |  int mf614_attach(...)
- 2 |  {
- 3 |      if(pci_enable_device(devpriv->pci_dev))
- 4 |          goto out_exit;
- 5 |  
- 6 |      if(pci_request_regions(devpriv->pci_dev, "mf614"))
- 7 |          goto out_disable;
- 8 |  
- 9 |      if (!pci_iomap(devpriv->pci_dev, 0, 0))
-10 |          goto out_release;
-11 |  	
-12 |  out_release:
-13 |      pci_release_regions(devpriv->pci_dev);
-14 |  out_disable:
-15 |      pci_disable_device(devpriv->pci_dev);
-16 |  out_exit:
-17 |      return -ENODEV;
-18 |  }
+  1 |  int mf614_attach(...)
+  2 |  {
+  3 |      if(pci_enable_device(devpriv->pci_dev))
+  4 |          goto out_exit;
+  5 |  
+  6 |      if(pci_request_regions(devpriv->pci_dev, "mf614"))
+  7 |          goto out_disable;
+  8 |  
+  9 |      if (!pci_iomap(devpriv->pci_dev, 0, 0))
+ 10 |          goto out_release;
+ 11 |  	
+ 12 |  out_release:
+ 13 |      pci_release_regions(devpriv->pci_dev);
+ 14 |  out_disable:
+ 15 |      pci_disable_device(devpriv->pci_dev);
+ 16 |  out_exit:
+ 17 |      return -ENODEV;
+ 18 |  }
 \end{verbatim}
 
 Na ÅÃ¡dcÃ­ch 3, 6 a 9 jsou volÃ¡ny funkce, kterÃ© majÃ­ za nÃ¡sledek alokaci zdrojÅ¯ zaÅÃ­zenÃ­. Po skonÄenÃ­ funkce ovladaÄe je potÅeba zavolat jinÃ© funkce, kterÃ© tyto zdroje uvolnÃ­.
@@ -724,38 +724,43 @@ Za pomoci volÃ¡nÃ­ \texttt{goto} je vÃ½Å¡e popsanÃ½ problÃ©m elegantnÄ vyÅeÅ¡e
 V jÃ¡dÅe Linux je kromÄ funkcÃ­ specifickÃ½ch pro prÃ¡ci se zaÅÃ­zenÃ­m urÄitÃ©ho typu, takÃ© sada obecnÃ½ch funkcÃ­ pouÅ¾Ã­vanÃ½ch napÅÃ­Ä vÅ¡emi ovladaÄi. Mezi nÄ patÅÃ­ napÅÃ­klad funkce pro vypisovÃ¡nÃ­ ladÃ­cÃ­ch zprÃ¡v, funkce pro alokaci a uvolÅovÃ¡nÃ­ pamÄti.
 
 \subsection{Funkce \texttt{printk()} pro vypisovÃ¡nÃ­ ladÃ­cÃ­ch zprÃ¡v}
-\ibox{\texttt{printk(FIXME)};}
-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 nastavenÃ­ ÃºrovnÄ dÅ¯leÅ¾itosti zprÃ¡vy a speciÃ¡lnÃ­ formÃ¡tovacÃ­ ÅetÄzce.
+\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\_ERR}]~\\Informace o vzniklÃ© chybÄ. BÃ½vÃ¡ pouÅ¾ito napÅ. pÅi informovÃ¡nÃ­ o Å¡patnÃ© funkci hardware.
+\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. MÅ¯Å¾e bÃ½t pouÅ¾ito napÅ. od ovladaÄe zaÅÃ­zenÃ­ o ÃºspÄÅ¡nÃ©m spuÅ¡tÄnÃ­.
+\item[\texttt{KERN\_INFO}]~\\InformaÄnÃ­ zprÃ¡va (napÅ. od ovladaÄe zaÅÃ­zenÃ­ o ÃºspÄÅ¡nÃ©m spuÅ¡tÄnÃ­).
 \item[\texttt{KERN\_DEBUG}]~\\ObyÄejnÃ¡ ladÃ­cÃ­ zprÃ¡va.
 \end{description}
 
 \vspace{5mm}
 
-FormÃ¡tovacÃ­ ÅetÄzce fungujÃ­ podobnÄ jako u funkce \texttt{printf()}. KromÄ znÃ¡mÃ½ch, \texttt{\%s}, \texttt{\%u}, \texttt{\%d} a \texttt{\%x} jsou zde navÃ­c:
+FormÃ¡tovacÃ­ ÅetÄzce fungujÃ­ podobnÄ jako u funkce \texttt{printf()}. KromÄ znÃ¡mÃ½ch, \texttt{\%s}, \texttt{\%u}, \texttt{\%d} a \texttt{\%x} je zde navÃ­c \texttt{\%p}, kterÃ½ slouÅ¾Ã­ k vÃ½pisu hodnoty ukazatele.
 
+MoÅ¾nÃ© zpÅ¯soby pouÅ¾itÃ­ jsou:
 \begin{description}
-\item[\texttt{\%p}] SlouÅ¾Ã­ k vÃ½pisu hodnoty ukazatele.
-\item[FIXME]
+\item[\texttt{\%pF}] Pro ukazatel na funkci vypÃ­Å¡e nÃ¡zev danÃ© funkce.
+\item[\texttt{\%pf}] Pro ukazatel na funkci vypÃ­Å¡e nÃ¡zev danÃ© funkce vÄetnÄ offsetu.
+\item[\texttt{\%pR}] Pro ukazatel na strukturu vypÃ­Å¡e adresy pamÄti pÅÃ­sluÅ¡ejÃ­cÃ­ danÃ© struktuÅe, vÄetnÄ pÅÃ­znakÅ¯.
+\item[\texttt{\%pr}] Pro ukazatel na strukturu vypÃ­Å¡e adresy pamÄti pÅÃ­sluÅ¡ejÃ­cÃ­ danÃ© struktuÅe, bez pÅÃ­znakÅ¯.
 \end{description}
 
 PÅÃ­klad nastavenÃ­ typu zprÃ¡vy a pouÅ¾itÃ­ formÃ¡tovacÃ­ho ÅetÄzce:
 \begin{verbatim}
-    printk(KERN_DEBUG "I'm trashed; giving up on %p\n", ptr);
+  printk(KERN_DEBUG "Hodnota ukazatele ptr je %p\n", ptr);
 \end{verbatim}
 
 
-\subsection{Funkce \texttt{kmalloc()}, \texttt{kzalloc()} pro alokaci pamÄti}
+\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.
 
-\ibox{\texttt{void *kmalloc(size\_t size, int flags);}}
-ZÃ¡kladnÃ­ funkce pro alokaci malÃ© pamÄÅ¥ovÃ© oblasti (napÅ. pro strukturu obsahujÃ­cÃ­ privÃ¡tnÃ­ data ovladaÄe) je \texttt{kmalloc()}. 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}.
+\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}.
+
+NovÄ alokovanÃ¡ pamÄÅ¥ je vÅ¾dy vynulovÃ¡na.
 
 PÅÃ­klad alokace a uvolnÄnÃ­ pamÄti (vÄetnÄ oÅ¡etÅenÃ­ chybovÃ½ch stavÅ¯):
 \begin{verbatim}
@@ -770,7 +775,7 @@ PÅÃ­klad alokace a uvolnÄnÃ­ pamÄti (vÄetnÄ oÅ¡etÅenÃ­ chybovÃ½ch stavÅ¯):
 \end{verbatim}
 
 
-\subsection{Funkce \texttt{kfree()}}
+\subsection{Funkce \texttt{kfree()} pro uvolÅovÃ¡nÃ­ alokovanÃ© pamÄti}
 \ibox{\texttt{void kfree(void *obj);}}
 
 KdyÅ¾ jiÅ¾ alokovanÃ¡ pamÄÅ¥ nenÃ­ potÅeba, je nutnÃ© ji volÃ¡nÃ­m \texttt{kfree()} uvolnit. 
@@ -778,12 +783,12 @@ 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 jejich prohlÃ­Å¾enÃ­ existuje Å¡ikovnÃ½ online nÃ¡stroj \textit{The Linux Cross Reference} -- \\
+\ibox{Jako nejlepÅ¡Ã­ reference jednotlivÃ½ch funkcÃ­ slouÅ¾Ã­ zdrojovÃ© kÃ³dy jÃ¡dra. Jednou z~moÅ¾nostÃ­ jejich prohlÃ­Å¾enÃ­ je pomocÃ­ online nÃ¡stroje \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.
 
-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}), 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}.
 
 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}.
 
@@ -791,25 +796,25 @@ KaÅ¾dÃ½ ovladaÄ by mÄl tedy obsahovat informaci o tom, pro kterÃ© zaÅÃ­zenÃ­
 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Ä:
 
 \begin{verbatim}
- 1 |  #define PCI_VENDOR_ID_HUMUSOFT          0x186c
- 2 |  #define PCI_DEVICE_ID_MF624             0x0624
- 3 |  #define PCI_DEVICE_ID_MF614             0x0614
- 4 |  #define PCI_SUBVENDOR_ID_HUMUSOFT       0x186c
- 5 |  #define PCI_SUBDEVICE_MF624             0x0624
- 6 |  
- 7 |  static struct pci_device_id mf624_pci_id[] = {
- 8 |      {
- 9 |          .vendor = PCI_VENDOR_ID_HUMUSOFT,
-10 |          .device = PCI_DEVICE_ID_MF624,
-11 |          .subvendor = PCI_SUBVENDOR_ID_HUMUSOFT,
-12 |          .subdevice = PCI_SUBDEVICE_MF624,
-13 |      },
-14 |
-15 |      { PCI_VENDOR_ID_HUMUSOFT, PCI_DEVICE_ID_MF614, 
-16 |          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
-17 |
-18 |      { 0, } /* seznam je vÅ¾dy zakonÄen prÃ¡zdnÃ½m prvkem */
-19 |  };
+  1 |  #define PCI_VENDOR_ID_HUMUSOFT          0x186c
+  2 |  #define PCI_DEVICE_ID_MF624             0x0624
+  3 |  #define PCI_DEVICE_ID_MF614             0x0614
+  4 |  #define PCI_SUBVENDOR_ID_HUMUSOFT       0x186c
+  5 |  #define PCI_SUBDEVICE_MF624             0x0624
+  6 |  
+  7 |  static struct pci_device_id mf624_pci_id[] = {
+  8 |      {
+  9 |          .vendor = PCI_VENDOR_ID_HUMUSOFT,
+ 10 |          .device = PCI_DEVICE_ID_MF624,
+ 11 |          .subvendor = PCI_SUBVENDOR_ID_HUMUSOFT,
+ 12 |          .subdevice = PCI_SUBDEVICE_MF624,
+ 13 |      },
+ 14 |
+ 15 |      { PCI_VENDOR_ID_HUMUSOFT, PCI_DEVICE_ID_MF614, 
+ 16 |          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+ 17 |
+ 18 |      { 0, } /* seznam je vÅ¾dy zakonÄen prÃ¡zdnÃ½m prvkem */
+ 19 |  };
 \end{verbatim}
 
 V pÅÃ­padÄ, Å¾e je u zaÅÃ­zenÃ­ rozhodujÃ­cÃ­ Vendor ID, ale na Subvendor ID nezÃ¡leÅ¾Ã­, je moÅ¾nÃ© pouÅ¾Ã­t makro \texttt{PCI\_ANY\_ID} (to platÃ­ 
@@ -832,13 +837,13 @@ Tato struktura obsahuje zÃ¡kladnÃ­ informace o ovladaÄi -- zÃ¡kladnÃ­ promÄnn
 
 PÅÃ­klad, jak mÅ¯Å¾e bÃ½t struktura \texttt{pci\_driver} inicializovÃ¡na a nÃ¡slednÄ zaregistrovÃ¡na:
 \begin{verbatim}
- 1 |  static struct pci_driver mf624_pci_driver = {
- 2 |      .name = "mf624",
- 3 |      .id_table = mf624_pci_id,
- 4 |      .probe = mf624_pci_probe, 
- 5 |      .remove = mf624_pci_remove,
- 6 |  };
- 7 |  pci_register_driver(&mf624_pci_driver);
+  1 |  static struct pci_driver mf624_pci_driver = {
+  2 |      .name = "mf624",
+  3 |      .id_table = mf624_pci_id,
+  4 |      .probe = mf624_pci_probe, 
+  5 |      .remove = mf624_pci_remove,
+  6 |  };
+  7 |  pci_register_driver(&mf624_pci_driver);
 \end{verbatim}
 
 
@@ -862,12 +867,12 @@ Nejprve je potÅeba operaÄnÃ­ systÃ©m poÅ¾Ã¡dat o vÃ½luÄnÃ½ pÅÃ­stup ke zdroj
 
 \ibox{\texttt{unsigned long pci\_resource\_start(struct pci\_dev *dev, int bar);}}
 
-V pÅÃ­padÄ, Å¾e volÃ¡nÃ­ \texttt{pci\_request\_regions()} probÄhlo ÃºspÄÅ¡nÄ, je jiÅ¾ moÅ¾nÃ© zÃ­skat pÅÃ­stup pÅÃ­mo k jednotlivÃ½m regionÅ¯m karty. Fyzickou adresu jednotlivÃ½ch regionÅ¯ lze zjistit volÃ¡nÃ­m funkce \texttt{pci\_resource\_start()}, kde se jako druhÃ½ parametr uvede ÄÃ­slo BAR registru urÄujÃ­cÃ­ho region (tj. 0--5). 
+V pÅÃ­padÄ, Å¾e volÃ¡nÃ­ \texttt{pci\_request\_regions()} probÄhlo ÃºspÄÅ¡nÄ, je jiÅ¾ moÅ¾nÃ© zÃ­skat pÅÃ­stup pÅÃ­mo k jednotlivÃ½m regionÅ¯m karty. Fyzickou adresu jednotlivÃ½ch regionÅ¯ lze zjistit volÃ¡nÃ­m funkce \texttt{pci\_resource\_start()}, kde se jako druhÃ½ parametr uvede ÄÃ­slo BAR registru urÄujÃ­\-cÃ­ho region (tj. 0--5). 
 %VolÃ¡nÃ­ tÃ©to funkce mÃ¡ pouze informativnÃ­ charakter
 
 \ibox{\texttt{unsigned long pci\_resource\_len(struct pci\_dev *dev, int bar);}}
 
-V pÅÃ­padÄ, Å¾e je potÅeba zjistit velikost danÃ©ho pamÄÅ¥ovÃ©ho nebo I/O regionu, slouÅ¾Ã­ k tomu funkce \texttt{pci\_resource\_len()}.
+V pÅÃ­padÄ, Å¾e je potÅeba zjistit velikost danÃ©ho pamÄÅ¥ovÃ©ho nebo I/O regionu, slouÅ¾Ã­ k~tomu funkce \texttt{pci\_resource\_len()}.
 
 \ibox{\texttt{void \_\_iomem *pci\_ioremap\_bar(struct pci\_dev *pdev, int bar);}}
 
@@ -893,7 +898,7 @@ Tato funkce by se mÄla postarat o Ãºklid vÅ¡ech naalokovanÃ½ch prostÅedkÅ¯. M
 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Å¯.
 
 \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Ã­:
+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Ã­:
 
 \ibox{\texttt{unsigned inb(unsigned port);}}
 
@@ -916,9 +921,9 @@ TÅetÃ­ pÃ­smeno, stejnÄ jako u funkcÃ­ pro ÄtenÃ­, znaÄÃ­ o kolika-bitovÃ½ p
 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>}).
 
 \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 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.
 
-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 bude 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Ã­:
 
@@ -946,26 +951,27 @@ nebo v pÅÃ­padÄ PCI zaÅÃ­zenÃ­ funkce
 se pamÄÅ¥ chovÃ¡ jakoby byla v pamÄÅ¥ovÃ©m adresnÃ­m prostoru a je nutnÃ© pro pÅÃ­stup k nÃ­ pouÅ¾Ã­vat volÃ¡nÃ­ popsanÃ¡ v tÃ©to kapitole.
 
 
-Pro pÅÃ­stup k pamÄti zaÅÃ­zenÃ­ z uÅ¾ivatelskÃ©ho prostoru bohuÅ¾el Å¾Ã¡dnÃ¡ sada funkcÃ­ nenÃ­. Je potÅeba nadefinovat funkce vlastnÃ­, kterÃ© pÅistupujÃ­ k pamÄti skrze ukazatel, kterÃ½ je ale oznaÄen jako \texttt{volatile}. To opÄt zabrÃ¡nÃ­ pÅekladaÄi v optimalizaci kÃ³du manipulujÃ­cÃ­ho s ukazatelem.
+Pro pÅÃ­stup k pamÄti zaÅÃ­zenÃ­ z uÅ¾ivatelskÃ©ho prostoru bohuÅ¾el Å¾Ã¡dnÃ¡ sada funkcÃ­ nenÃ­. Je potÅeba nadefinovat funkce vlastnÃ­, kterÃ© pÅistupujÃ­ k pamÄti skrze ukazatel, kterÃ½ je ale oznaÄen jako \texttt{volatile}. To opÄt zabrÃ¡nÃ­ pÅekladaÄi v optimalizaci kÃ³du manipulujÃ­cÃ­ho s~ukazatelem.
 
 PÅÃ­klad jak takovÃ© funkce mohou vypadat:
 
 \begin{verbatim}
-  1 | static inline void mf624_write32(uint32_t val, uint32_t *ptr)
-  2 | {
-  3 |     *(volatile uint32_t*) ptr = val;
-  4 | }
-  5 | static inline int32_t mf624_read32(uint32_t *ptr)
-  6 | {
-  7 |     return (volatile uint32_t) *ptr;
-  8 | }
+  1 |  static inline void mf624_write32(uint32_t val, uint32_t *ptr)
+  2 |  {
+  3 |      *(volatile uint32_t*) ptr = val;
+  4 |  }
+  5 |  static inline int32_t mf624_read32(uint32_t *ptr)
+  6 |  {
+  7 |      return (volatile uint32_t) *ptr;
+  8 |  }
 \end{verbatim}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\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 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 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}).
+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}).
 
 \begin{figure}[h!]
 	\begin{center}
@@ -1001,7 +1007,7 @@ 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ÄÅ¥ovÃ©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 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).
 \end{description}
 
@@ -1029,26 +1035,26 @@ Struktura \texttt{struct uio\_port} obsahuje poloÅ¾ky:
 
 PÅÃ­klad, jak takovÃ¡ jednoduchÃ¡ inicializace struktury \texttt{struct uio\_info} vÄetnÄ registrace mÅ¯Å¾e vypadat (bez oÅ¡etÅenÃ­ chybovÃ½ch stavÅ¯):
 \begin{verbatim}
- 1 |  /* struct pci_dev *dev */
- 2 |  struct uio_info *info;
- 3 |  info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
- 4 |  
- 5 |  info->name = "mf624";
- 6 |  info->version = "0.0.1";
- 7 |  
- 8 |  info->mem[0].name = "PCI chipset, ...";
- 9 |  info->mem[0].addr = pci_resource_start(dev, 0);
-10 |  info->mem[0].size = pci_resource_len(dev, 0);
-11 |  info->mem[0].memtype = UIO_MEM_PHYS;
-12 |  info->mem[0].internal_addr = pci_ioremap_bar(dev, 0);
-13 |  
-14 |  info->port[0].name = "Board programming registers";
-15 |  info->port[0].porttype = UIO_PORT_X86;
-16 |  info->port[0].start = pci_resource_start(dev, 1);
-17 |  info->port[0].size = pci_resource_len(dev, 1);
-18 |  
-19 |  uio_register_device(&dev->dev, info);
-20 |  pci_set_drvdata(dev, info);
+  1 |  /* struct pci_dev *dev */
+  2 |  struct uio_info *info;
+  3 |  info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
+  4 |  
+  5 |  info->name = "mf624";
+  6 |  info->version = "0.0.1";
+  7 |  
+  8 |  info->mem[0].name = "PCI chipset, ...";
+  9 |  info->mem[0].addr = pci_resource_start(dev, 0);
+ 10 |  info->mem[0].size = pci_resource_len(dev, 0);
+ 11 |  info->mem[0].memtype = UIO_MEM_PHYS;
+ 12 |  info->mem[0].internal_addr = pci_ioremap_bar(dev, 0);
+ 13 |  
+ 14 |  info->port[0].name = "Board programming registers";
+ 15 |  info->port[0].porttype = UIO_PORT_X86;
+ 16 |  info->port[0].start = pci_resource_start(dev, 1);
+ 17 |  info->port[0].size = pci_resource_len(dev, 1);
+ 18 |  
+ 19 |  uio_register_device(&dev->dev, info);
+ 20 |  pci_set_drvdata(dev, info);
 \end{verbatim}
 
 \ibox{\texttt{void pci\_set\_drvdata(struct pci\_dev *pdev, void *data)}}
@@ -1061,19 +1067,19 @@ Funkce \texttt{pci\_get\_drvdata()} slouÅ¾Ã­ k \textit{zÃ­skÃ¡nÃ­} dat uloÅ¾enÃ½
 
 PÅÃ­klad pouÅ¾itÃ­:
 \begin{verbatim}
- 1 |  static void mf624_pci_remove(struct pci_dev *dev)
- 2 |  {
- 3 |      struct uio_info *info = pci_get_drvdata(dev);
- 4 |      /* ... */
- 5 |  }
+  1 |  static void mf624_pci_remove(struct pci_dev *dev)
+  2 |  {
+  3 |      struct uio_info *info = pci_get_drvdata(dev);
+  4 |      /* ... */
+  5 |  }
 \end{verbatim}
 
 
 \subsection{Program v uÅ¾ivatelskÃ©m prostoru}
 PotÃ©, co je jadernÃ¡ ÄÃ¡st UIO ovladaÄe ÃºspÄÅ¡nÄ zkompilovÃ¡na a zavedena do systÃ©mu, ve kterÃ©m se nachÃ¡zÃ­ poÅ¾adovanÃ© zaÅÃ­zenÃ­, je rozhranÃ­ mezi tÃ­mto modulem a uÅ¾ivatelskÃ½m prostorem tvoÅeno:
 \begin{itemize}
-\item souborem \texttt{/dev/uio0\footnote{Pro nÃ¡zornost je v textu uvedeno konkrÃ©tnÃ­ zaÅÃ­zenÃ­ \texttt{uio0}. V pÅÃ­padÄ, Å¾e systÃ©m obsahuje vÃ­ce aktivnÃ­ch UIO ovladaÄÅ¯, jsou postupnÄ ÄÃ­slovÃ¡ny od 0 vÃ½Å¡e.}}.
-\item sloÅ¾kou \texttt{/sys/class/uio/uio0}, kterÃ¡ obsahuje informace o regionech, kterÃ© jsou zpÅÃ­stupnÄny skrze UIO modul v jÃ¡dÅe.
+\item souborem \texttt{/dev/uio0\footnote{Pro nÃ¡zornost je v textu uvedeno konkrÃ©tnÃ­ zaÅÃ­zenÃ­ \texttt{uio0}. V~pÅÃ­padÄ, Å¾e systÃ©m obsahuje vÃ­ce aktivnÃ­ch UIO ovladaÄÅ¯, jsou postupnÄ ÄÃ­slovÃ¡ny od 0 vÃ½Å¡e.}}.
+\item sloÅ¾kou \texttt{/sys/class/uio/uio0}, kterÃ¡ obsahuje informace o regionech, kterÃ© jsou zpÅÃ­\-stup\-nÄny skrze UIO modul v jÃ¡dÅe.
 \end{itemize}
 
 \subsubsection{Obsah sloÅ¾ky \texttt{/sys/class/uio/uio0}}
@@ -1099,26 +1105,26 @@ Tato funkce slouÅ¾Ã­ k \textit{namapovÃ¡nÃ­} souboru nebo zaÅÃ­zenÃ­ do operaÄ
 
 PÅÃ­klad, jak takovÃ© volÃ¡nÃ­ mÅ¯Å¾e vypadat (bez oÅ¡etÅenÃ­ chybovÃ½ch stavÅ¯):
 \begin{verbatim}
- 1 |  #define BAR2_offset       (1 * sysconf(_SC_PAGESIZE))
- 2 |  
- 3 |  void* mf624_BAR2 = NULL;
- 4 |  int device_fd = open("/dev/uio0", O_RDWR);
- 5 |  
- 6 |  mf624_BAR2 = mmap(0, 1 * sysconf(_SC_PAGESIZE), 
- 7 |                    PROT_READ | PROT_WRITE, MAP_SHARED, 
- 8 |                    device_fd, BAR2_offset);
+  1 |  #define BAR2_offset       (1 * sysconf(_SC_PAGESIZE))
+  2 |  
+  3 |  void* mf624_BAR2 = NULL;
+  4 |  int device_fd = open("/dev/uio0", O_RDWR);
+  5 |  
+  6 |  mf624_BAR2 = mmap(0, 1 * sysconf(_SC_PAGESIZE), 
+  7 |                    PROT_READ | PROT_WRITE, MAP_SHARED, 
+  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.
 
 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
-   \-- Ukazatel vrÃ¡cenÃ½ volÃ¡nÃ­m mmap()                 
+  mf624_BAR2 += (BAR2_phys_addr & (sysconf(_SC_PAGESIZE) - 1));
+    |                \-- FyzickÃ¡ adresa
+     \-- Ukazatel vrÃ¡cenÃ½ volÃ¡nÃ­m mmap()                 
 \end{verbatim}
 
-\subsection{PÅÃ­stup k pamÄti zaÅÃ­zenÃ­}
+\subsubsection{PÅÃ­stup k pamÄti zaÅÃ­zenÃ­}
 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}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1170,7 +1176,7 @@ KaÅ¾dÃ© podporovanÃ© funcki zaÅÃ­zenÃ­/karty by mÄla odpovÃ­dat jedna struktur
 \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).
 
-\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).
+\item[\texttt{int subdev\_flags}]~\\ OznaÄuje zÃ¡kladnÃ­ vlastnost podzaÅÃ­zenÃ­. NejpouÅ¾Ã­vanÄjÅ¡Ã­ hodnoty: \texttt{SDF\_READABLE} (z~pod\-zaÅÃ­zenÃ­ mÅ¯Å¾e bÃ½t Äteno), \texttt{SDF\_WRITABLE} (do podzaÅÃ­zenÃ­ mÅ¯Å¾e bÃ½t zapisovÃ¡no).
 
 \item[\texttt{int n\_chan}]~\\ PoÄet kanÃ¡lÅ¯ podzaÅÃ­zenÃ­ (napÅ. pro 8 digitÃ¡lnÃ­ch vstupÅ¯ bude tato hodnota 8).
 
@@ -1194,7 +1200,7 @@ Alokace pamÄti pro struktury se provede volÃ¡nÃ­m \texttt{alloc\_subdevices()},
 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Ã­}
-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, 
+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)};
 
 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.
@@ -1204,7 +1210,7 @@ DruhÃ½ parametr je ukazatel na strukturu reprezentujÃ­cÃ­ podzaÅÃ­zenÃ­. Tato s
 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 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
+\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}
 
@@ -1229,60 +1235,69 @@ PrvnÃ­m parametrem vÅ¡ech funkcÃ­ je ukazatel na \texttt{comedi\_t}. DruhÃ½m je
 
 UkÃ¡zka jednoduchÃ©ho userspace programu:
 \begin{verbatim}
-  1 |  #include <stdio.h>
-  2 |  #include <comedilib.h>
-  3 |  #define MF614_DO_SUBDEV      1 /* Je potÅeba vÄdÄt, jak je 
-  4 |                                    implementovÃ¡no v ovladaÄi */
-  5 |  
-  6 |  int main(int argc, char* argv[])
-  7 |  {
-  8 |      comedi_t* comedi_dev;
-  9 |  
- 10 |      comedi_dev = comedi_open("/dev/comedi0");
- 11 |      if (comedi_dev == NULL) {
- 12 |          comedi_perror("comedi_open");
- 13 |          return 1;
- 14 |      }
- 15 |
- 16 |      /* ZÃ¡pis 1 na 0. kanÃ¡l digitÃ¡lnÃ­ho vÃ½stupu */  
- 17 |      comedi_dio_write(comedi_dev, MF614_DO_SUBDEV, 0, 1);
- 18 |      sleep(1);
- 19 |      comedi_dio_write(comedi_dev, MF614_DO_SUBDEV, 0, 0);
- 20 |      sleep(1);
- 21 |      comedi_dio_write(comedi_dev, MF614_DO_SUBDEV, 0, 1);
- 22 |      
- 23 |      return 0;
- 24 |  }
+ 1 |  #include <stdio.h>
+ 2 |  #include <comedilib.h>
+ 3 |  #define MF614_DO_SUBDEV      1 /* Je potÅeba vÄdÄt, jak je 
+ 4 |                                    implementovÃ¡no v ovladaÄi */
+ 5 |  
+ 6 |  int main(int argc, char* argv[])
+ 7 |  {
+ 8 |      comedi_t* comedi_dev;
+ 9 |  
+10 |      comedi_dev = comedi_open("/dev/comedi0");
+11 |      if (comedi_dev == NULL) {
+12 |          comedi_perror("comedi_open");
+13 |          return 1;
+14 |      }
+15 |
+16 |      /* ZÃ¡pis 1 na 0. kanÃ¡l digitÃ¡lnÃ­ho vÃ½stupu */  
+17 |      comedi_dio_write(comedi_dev, MF614_DO_SUBDEV, 0, 1);
+18 |      sleep(1);
+19 |      comedi_dio_write(comedi_dev, MF614_DO_SUBDEV, 0, 0);
+20 |      sleep(1);
+21 |      comedi_dio_write(comedi_dev, MF614_DO_SUBDEV, 0, 1);
+22 |      
+23 |      return 0;
+24 |  }
 \end{verbatim}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Implementace karty Humusoft MF624 v Qemu}\label{qemu}
-MÄÅÃ­cÃ­ karta Humusoft MF624 je hardware vhodnÃ½ pro vÃ½klad principÅ¯ implementace ovladaÄÅ¯. 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.
+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.
 
-KromÄ ÄÃ¡steÄnÃ© implementace karty MF624 do Qemu je souÄÃ¡stÃ­ tohoto \textit{virtuÃ¡lnÃ­ho hardware} grafickÃ¡ aplikace, kterÃ¡ mÃ¡ na starosti nastavovÃ¡nÃ­ vstupnÃ­ch hodnot a zobrazovÃ¡nÃ­ vÃ½stupnÃ­ch hodnot do/z karty.
+KromÄ ÄÃ¡steÄnÃ© implementace karty MF624 do Qemu je souÄÃ¡stÃ­ tohoto \textit{virtuÃ¡lnÃ­ho hardware} grafickÃ¡ aplikace, kterÃ¡ mÃ¡ na starosti nastavovÃ¡nÃ­ vstupnÃ­ch hodnot a zobrazovÃ¡nÃ­ vÃ½stupnÃ­ch hodnot do/z karty (obr. \ref{qemu_diagram}).
 
 
+\begin{figure}[h!]
+	\begin{center}
+	\includegraphics[width=100mm]{img/qemu.pdf}
+	\caption{Diagram znÃ¡zorÅujÃ­cÃ­ princip funkce implementovanÃ© karty MF624 v Qemu}
+	\label{qemu_diagram}
+	\end{center}
+\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.
 
 \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):
 \begin{verbatim}
-    $ ./configure --enable-system  --target-list=i386-softmmu
+  $ ./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:
 \begin{verbatim}
-    $ make
+  $ 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 \begin{verbatim}
-    hw-obj-$(CONFIG_PCI) += mf624.o
+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
+\begin{verbatim}
+  hw-obj-$(CONFIG_PCI) += mf624.o
 \end{verbatim}
 PotÃ© je jiÅ¾ moÅ¾nÃ© spustit pÅÃ­kaz
 \begin{verbatim}
-    $ make
+  $ make
 \end{verbatim}
 
 
@@ -1293,15 +1308,15 @@ V pÅÃ­padÄ sprÃ¡vnÄ zkompilovanÃ© virtuÃ¡lnÃ­ karty MF624, je moÅ¾nÃ© ji spus
 
 PÅÃ­klad spuÅ¡tÄnÃ­:
 \begin{verbatim}
-    $ ./qemu -device mf624 -hda ../os_images/debian.qcow --boot c 
-    MF624 Loaded.
-    Waiting on port 55555 for MF624 client to connect
-    Client connected
+  $ ./qemu -device mf624 -hda ../os_images/debian.qcow --boot c 
+  MF624 Loaded.
+  Waiting on port 55555 for MF624 client to connect
+  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
+  $ telnet localhost 55555
   Trying ::1...
   Trying 127.0.0.1...
   Connected to localhost.
@@ -1317,15 +1332,15 @@ $ telnet localhost 55555
 \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Ä.
 
-Komunikace mezi virtuÃ¡lnÃ­ kartou a grafickou aplikacÃ­ probÃ­hÃ¡ pomocÃ­ TCP/IP protokolu. PÅenÃ¡Å¡enÃ© informace jseou textovÃ©ho charakteru, ve formÃ¡tu \texttt{REGISTR=HODNOTA}.
+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.
 
 \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 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
 \begin{verbatim}
-    $ qmake
-    $ make
+  $ 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).
