X-Git-Url: https://rtime.felk.cvut.cz/gitweb/mf6xx.git/blobdiff_plain/2b333f4e0e0ca6e5029d8542e6836cb191373c25..604c8bba5f47d037418199381320f7af97a3c9f5:/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 ec94f88..5046bee 100644
--- a/doc/diploma_thesis/text/dip_text.tex
+++ b/doc/diploma_thesis/text/dip_text.tex
@@ -55,7 +55,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 ovliÅuje stav hardware. V dokumentaci ke konkrÃ©tnÃ­mu mikrokontroleru/\-mikroprocesoru/\-programovatelnÃ©mu integrovanÃ©mu obvodu je uvedeno, jakou funkci majÃ­ jednotlivÃ© bity registru.} GPIO pinu. VnitÅnÃ­ uspoÅÃ¡dÃ¡nÃ­ mikrokontroleru, 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}
@@ -75,7 +75,7 @@ HlavnÃ­ rozdÃ­ly mezi chovÃ¡nÃ­m pamÄÅ¥ovÃ© buÅky a registru zaÅÃ­zenÃ­ jsou:
 \item ZmÄnou hodnoty registru je moÅ¾nÃ© mÄnit stav zaÅÃ­zenÃ­/periferie odpovÃ­dajÃ­cÃ­ danÃ©mu registru.
 \item V pÅÃ­padÄ zÃ¡pisu do registru a jeho okamÅ¾itÃ©m ÄtenÃ­, nemusÃ­ bÃ½t pÅeÄtenÃ¡ hodnota shodnÃ¡ se zapisovanou -- v tom pÅÃ­padÄ byla hodnota registru zmÄnÄna hardwarem.
 \item V pÅÃ­padÄ ÄtenÃ­ z registru mÅ¯Å¾e bÃ½t spuÅ¡tÄn tzv. \textbf{side effect}, kdy hardware na toto ÄtenÃ­ reaguje zmÄnou stavu, podobnÄ jako by byl proveden zÃ¡pis do registru (PÅÃ­klad: Ihned po vyÄtenÃ­ hodnoty registru A/D pÅevodnÃ­ku se spustÃ­ novÃ½ pÅevod a pÅ¯vodnÃ­ hodnota se pÅepÃ­Å¡e novou). Side effects mohou nastat i pÅi zÃ¡pisu do registru. 
-\item PÅi zÃ¡pisu a ÄtenÃ­ do/z registru si je nutnÃ© pÅesnÄ rozliÅ¡ovat, kolikabitovÃ© operace zÃ¡pisu/ÄtenÃ­ smÄjÃ­ bÃ½t pouÅ¾ity (8-, 16-, 32bitovÃ©).
+\item PÅi zÃ¡pisu a ÄtenÃ­ do/z registru si je nutnÃ© pÅesnÄ rozliÅ¡ovat, kolika-bitovÃ© operace zÃ¡pisu/ÄtenÃ­ smÄjÃ­ bÃ½t pouÅ¾ity (8-, 16-, 32bitovÃ©).
 \end{itemize}
 
 \begin{figure}[h!]
@@ -92,7 +92,7 @@ HlavnÃ­ rozdÃ­ly mezi chovÃ¡nÃ­m pamÄÅ¥ovÃ© buÅky a registru zaÅÃ­zenÃ­ jsou:
 \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Åenost 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{PÅÃ­klad: FIXME}
 
 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.
 
@@ -101,7 +101,7 @@ V roce 1990 zaÄala prÃ¡ce na specifikaci PCI v laboratoÅÃ­ch firmy Intel. Prvn
 
 V pozdÄjÅ¡Ã­ch letech se pÅ¯vodnÃ­ standard doÄkal vylepÅ¡enÃ­ -- zvÃ½Å¡enÃ­ Å¡Ã­Åky paralelnÃ­ sbÄrnice z 32 bitÅ¯ na 64 bitÅ¯ a zrychlenÃ­ z 33 MHz na 66 Mhz a vÃ½Å¡e. Tyto pokroÄilejÅ¡Ã­ verze se vÅ¡ak pÅÃ­liÅ¡ neujaly.
 \subsection{Konektory}
-Pro spojenÃ­ mezi kartou a sbÄrnicÃ­ je potÅeba pouze konektor na stranÄ sbÄrnice -- tzv. slot. V zÃ¡vislosti na napÃ¡jecÃ­m napÄtÃ­ (3,3 V nebo 5 V) jsou na kartÃ¡ch klÃ­ÄovacÃ­ zÃ¡Åezy -- tyto zaÅezy znemoÅujÃ­ zasunutÃ­ \textit{napÄÅ¥ovÄ} nekompatibilnÃ­ karty do slotu. Jsou vÅ¡ak karty, kterÃ© majÃ­ tyto zÃ¡Åezy oba, dÃ­ky ÄemuÅ¾ mÅ¯Å¾e bÃ½t karta pouÅ¾ita v libovolnÃ©m slotu (Obr. \ref{pci}).
+Pro spojenÃ­ mezi kartou a sbÄrnicÃ­ je potÅeba pouze konektor na stranÄ sbÄrnice -- tzv. slot. V zÃ¡vislosti na napÃ¡jecÃ­m napÄtÃ­ (3,3 V nebo 5 V) jsou na kartÃ¡ch klÃ­ÄovacÃ­ zÃ¡Åezy -- tyto zÃ¡Åezy znemoÅ¾ÅujÃ­ zasunutÃ­ \textit{napÄÅ¥ovÄ} nekompatibilnÃ­ karty do slotu. Jsou vÅ¡ak karty, kterÃ© majÃ­ tyto zÃ¡Åezy oba, dÃ­ky ÄemuÅ¾ mÅ¯Å¾e bÃ½t karta pouÅ¾ita v libovolnÃ©m slotu (Obr. \ref{pci}).
 
 \begin{figure}[h!]
 	\begin{center}
@@ -118,21 +118,21 @@ 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Ärnicic 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 jednolivÃ¡ 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ÄteovladaÄ zaÅÃ­zenÃ­, kterÃ½ je souÄÃ¡stÃ­ opraÄ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{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.
 
 
-KromÄ vÃ½Å¡e zmÃ­nÄnÃ½ch 6 BAR registrÅ¯, obsahujÃ­ PCI zaÅÃ­zenÃ­ i nÃ¡sledujÃ­cÃ­c registry:
+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[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 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 tomot registru.
-\item[Subsystem ID]~\\OpÄt se jednÃ¡ o Ãºdaj podobnÃ½ \texttt{Device ID} slouÅ¾Ã­cÃ­ k roliÅ¡enÃ­ karet postavenÃ½ch na univerzÃ¡lnÃ­m ÅadiÄi.
+\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.
+\item[Subsystem ID]~\\OpÄt se jednÃ¡ o Ãºdaj podobnÃ½ \texttt{Device ID} slouÅ¾Ã­cÃ­ k rozliÅ¡enÃ­ karet postavenÃ½ch na univerzÃ¡lnÃ­m ÅadiÄi.
 \end{description}
 
-Registry \texttt{Vendor ID}, \texttt{Device ID} (pÅÃ­p. jeÅ¡tÄ \texttt{Subsystem Vendor ID} a \texttt{Subsystem ID}) slouÅ¾Ã­ operaÄnÃ­mu systÃ©mu k jednoznaÄnÃ© identifikaci zaÅ¾Ã­zenÃ­, pÅi volbÄ sprÃ¡vnÃ©ho ovladaÄe.
+Registry \texttt{Vendor ID}, \texttt{Device ID} (pÅÃ­p. jeÅ¡tÄ \texttt{Subsystem Vendor ID} a \texttt{Subsystem ID}) slouÅ¾Ã­ operaÄnÃ­mu systÃ©mu k jednoznaÄnÃ© identifikaci zaÅÃ­zenÃ­, pÅi volbÄ sprÃ¡vnÃ©ho ovladaÄe.
 
 
 \begin{figure}[h!]
@@ -145,13 +145,14 @@ Registry \texttt{Vendor ID}, \texttt{Device ID} (pÅÃ­p. jeÅ¡tÄ \texttt{Subsyst
 
 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.
 
+
 \subsection{PÅeruÅ¡enÃ­}
 SbÄrnice PCI obsahuje ÄtyÅi linky pÅeruÅ¡enÃ­ a vÅ¡echny z nich jsou dostupnÃ© kaÅ¾dÃ©mu zaÅÃ­zenÃ­. PÅeruÅ¡enÃ­ mohou bÃ½t sdÃ­lenÃ¡, tudÃ­Å¾ o jedno pÅeruÅ¡enÃ­ se mÅ¯Å¾e dÄlit vÃ­ce zaÅÃ­zenÃ­. Pro snazÅ¡Ã­ sdÃ­lenÃ­ pÅeruÅ¡enÃ­ jsou ÃºrovÅovÄ spouÅ¡tÄnÃ¡ (oproti hranovÃ©mu spouÅ¡tÄnÃ­ nedochÃ¡zÃ­ k promeÅ¡kÃ¡nÃ­ pÅeruÅ¡enÃ­).
 
 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 narozdÃ­l od PCI seriovÃ¡ 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.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Humusoft MF624}
 \begin{figure}[h!]
@@ -241,7 +242,7 @@ Z tabulky \ref{tab_bar} lze vyÄÃ­st informaci, Å¾e registry ovlÃ¡dajÃ­cÃ­ digit
 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 8bitÅ¯ registru DOUT, hornÃ­ch 8 bitÅ¯ je potÅeba ignorovat.
+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.
 
 \begin{table}[h!]
 	\begin{center}
@@ -278,7 +279,7 @@ Karta MF624 obsahuje osm 14bitovÃ½ch A/D pÅevodnÃ­kÅ¯ s pevnÄ stanovenÃ½m rozs
 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 znamnÃ¡, Å¾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ÅÃ¡dÃ­ od 0 do 7.
+\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.
 
 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}
@@ -304,7 +305,7 @@ Hodnota vyÄtenÃ¡ z A/D pÅevodnÃ­kÅ¯ je ve formÃ¡tu dvojkovÃ©ho doplÅku -- pÅ
 \subsection{D/A pÅevodnÃ­ky}
 Karta MF624 obsahuje takÃ© osm 14bitovÃ½ch D/A pÅevodnÃ­kÅ¯ s rozsahem $\pm$10 V.
 
-NastavenÃ­ vÃ½stupnÃ­ch hodnot D/A pÅevodnÃ­kÅ¯ mÅ¯Å¾e probÃ­hat nÃ¡sledujÃ­cÃ­cm zpÅ¯sobem:
+NastavenÃ­ vÃ½stupnÃ­ch hodnot D/A pÅevodnÃ­kÅ¯ mÅ¯Å¾e probÃ­hat nÃ¡sledujÃ­cÃ­m zpÅ¯sobem:
 
 \begin{itemize}
 \item Hodnota v aditivnÃ­m kÃ³du (tabulka \ref{tab_daval}) se zapÃ­Å¡e do jednoho z osmi registrÅ¯ DA0--DA7 odpovÃ­dajÃ­cÃ­ho D/A pÅevodnÃ­ku, kterÃ½ mÃ¡ bÃ½t nastaven.
@@ -339,7 +340,7 @@ NastavenÃ­ vÃ½stupnÃ­ch hodnot D/A pÅevodnÃ­kÅ¯ mÅ¯Å¾e probÃ­hat nÃ¡sledujÃ­cÃ­
 	\end{center}
 \end{figure}
 
-Karta Humusoft MF614 mÃ¡ podobnÃ© funkce a vyuÅ¾itÃ­ jako karta MF624. Ve skuteÄnosti se jednÃ¡ o jeji pÅedchÅ¯dkyni. 
+Karta Humusoft MF614 mÃ¡ podobnÃ© funkce a vyuÅ¾itÃ­ jako karta MF624. Ve skuteÄnosti se jednÃ¡ o jejÃ­ pÅedchÅ¯dkyni. 
 
 Karta disponuje nÃ¡sledujÃ­cÃ­mi funkcemi:
 
@@ -398,7 +399,7 @@ Po nahlÃ©dnutÃ­ do manuÃ¡lu (dostupnÃ½ ze strÃ¡nek vÃ½robce: \url{http://www2.hu
 	\hline BADR2 + 0x10 & \textbf{STATUS} -- Status register & \\ 	
 	\hline 
 	\end{tabular} 
-	\caption{Registry karty MF614 nÃ¡zeÅ¾Ã­cÃ­ digitÃ¡lnÃ­m vstupÅ¯m/vÃ½stupÅ¯m a analogovÃ½m vstupÅ¯m/vÃ½stupÅ¯m}
+	\caption{Registry karty MF614 nÃ¡leÅ¾Ã­cÃ­ digitÃ¡lnÃ­m vstupÅ¯m/vÃ½stupÅ¯m a analogovÃ½m vstupÅ¯m/vÃ½stupÅ¯m}
 	\label{tab_mf614_regs}
 	\end{center}
 \end{table}
@@ -412,7 +413,7 @@ JednotlivÃ© registry v tÄchto regionech jsou 8bitovÃ©, proto je potÅeba pÅi 
 \end{verbatim}
 
 \subsection{DigitÃ¡lnÃ­ vstupy a vÃ½stupy}
-Pro nastavenÃ­ hodnoty digitÃ¡lnÃ­ch vÃ½stupÅ¯ se zapÃ­Å¡e poÅ¾adovanÃ¡ hodnota do registru DOUT, kde jeden bit odpovÃ­dÃ¡ jednomu digitÃ¡lnÃ­mu vÃ½stupu. Pro ÄtenÃ­ ditigÃ¡lnÃ­ch vstupÅ¯ je potÅeba pÅeÄÃ­st registr DIN.
+Pro nastavenÃ­ hodnoty digitÃ¡lnÃ­ch vÃ½stupÅ¯ se zapÃ­Å¡e poÅ¾adovanÃ¡ hodnota do registru DOUT, kde jeden bit odpovÃ­dÃ¡ jednomu digitÃ¡lnÃ­mu vÃ½stupu. Pro ÄtenÃ­ digitÃ¡lnÃ­ch vstupÅ¯ je potÅeba pÅeÄÃ­st registr DIN.
 
 \subsection{A/D pÅevodnÃ­ky}
 ÄtenÃ­ A/D pÅevodnÃ­kÅ¯ je u karty MF614 oproti MF624 trochu sloÅ¾itÄjÅ¡Ã­, hlavnÄ dÃ­ky tomu, Å¾e je u pÅevodnÃ­kÅ¯ potÅeba nastavit, v jakÃ©m rozsahu bude provedeno mÄÅenÃ­. Je moÅ¾nÃ© vybÃ­rat mezi rozsahy -10--10 V, -5--5 V, 0--10 V, 0--5 V. 
@@ -507,10 +508,69 @@ Hodnota je zapsÃ¡na v aditivnÃ­m kÃ³du (tab. \ref{tab_mf614_dac}).
 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.
 
 \subsection{PrÃ¡ce s PCI zaÅÃ­zenÃ­mi z uÅ¾ivatelskÃ©ho prostoru}
-FIXME popsat lspci (parametry a pÅÃ­klady) a /sys/bus/pci
+Pro vÃ½pis vÅ¡ech zaÅÃ­zenÃ­ v systÃ©mu pÅipojenÃ½ch pomocÃ­ sbÄrnice PCI slouÅ¾Ã­ program \texttt{lspci}.
+Po jeho spuÅ¡tÄnÃ­ bez udÃ¡nÃ­ parametrÅ¯ bude vypsÃ¡n zÃ¡kladnÃ­ seznam PCI zaÅÃ­zenÃ­. 
+
+Mezi dÅ¯leÅ¾itÃ© parametry, pouÅ¾itelnÃ© pÅi spuÅ¡tÄnÃ­ programu, patÅÃ­:
+\begin{description}
+\item[\texttt{-t}] ZobrazÃ­ diagram znÃ¡zorÅujÃ­cÃ­ jednotlivÃ© PCI sbÄrnice a mosty.
+\item[\texttt{-v}, \texttt{-vv}, \texttt{-vvv}]
+ UmoÅ¾Åuje vypisovÃ¡nÃ­ podrobnÃ½ch informacÃ­ o zaÅÃ­zenÃ­ch. (PostupnÄ od \textit{stÅednÃ­ podrobnosti} k \textit{vysokÃ© podrobnosti}).
+\item[\texttt{-nn}] ZobrazÃ­ Vendor ID a Device ID v ÄÃ­selnÃ© a zÃ¡roveÅ i textovÃ© podobÄ
+\item[\texttt{-d [<vendor>]:[<device>]}] ZobrazÃ­ informace pouze o zaÅÃ­zenÃ­ch odpovÃ­dajÃ­cÃ­ch Vendor ID, pÅÃ­padnÄ i Device ID
+\end{description}
+
+PÅÃ­klad, jak takovÃ½ vÃ½pis mÅ¯Å¾e vypadat:
+\begin{verbatim}
+$ lspci -nn -d 186c:0624 -vvv
+01:0b.0 Signal processing controller [1180]: Humusoft, s.r.o. MF624 
+             Multifunction I/O Card [186c:0624]
+        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-
+        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]
+        Region 2: Memory at d2dff800 (32-bit, non-prefetchable) [size=128]
+        Region 4: Memory at d2dff400 (32-bit, non-prefetchable) [size=128]
+        Kernel driver in use: mf624
+\end{verbatim}
+
+
+Jinou moÅ¾nostÃ­, jak zjistit informace o PCI zaÅÃ­zenÃ­, je nahlÃ©dnutÃ­ do souborovÃ©ho systÃ©mu \textit{sysfs}, kde jsou pro jednotlivÃ¡ zaÅÃ­zenÃ­ (nejen na PCI sbÄrnici) soubory\footnote{Tyto soubory ve skuteÄnosti nejsou uloÅ¾eny nikde na disku, ale jsou dynamicky vytvÃ¡Åeny operaÄnÃ­m systÃ©mem.}, kterÃ© obsahujÃ­ informace o zaÅÃ­zenÃ­ch.
+
+\ibox{FyzickÃ¡ adresa PCI zaÅÃ­zenÃ­ je tvoÅena adresou \textit{sbÄrnice}, adresou \textit{zaÅÃ­zenÃ­} a adresou \textit{logickÃ©ho zaÅÃ­zenÃ­}. PCI specifikace umoÅ¾Åuje, aby jeden systÃ©m obsahoval aÅ¾ 256 sbÄrnic. KaÅ¾dÃ¡ sbÄrnice mÅ¯Å¾e obsahovat aÅ¾ 32 zaÅÃ­zenÃ­. Jedno fyzickÃ© zaÅÃ­zenÃ­ mÅ¯Å¾e obsahovat aÅ¾ 8 logickÃ½ch.}
+
+Informace o PCI zaÅÃ­zenÃ­ch se nachÃ¡zejÃ­ ve sloÅ¾ce \texttt{/sys/bus/pci/devices/} -- jednotlivÃ¡ zaÅÃ­zenÃ­ jsou reprezentovÃ¡na podsloÅ¾kou, jejÃ­Å¾ nÃ¡zev je tvoÅen fyzickou adresou PCI zaÅÃ­zenÃ­. Mezi nejdÅ¯leÅ¾itÄjÅ¡Ã­ soubory, kterÃ© tato podsloÅ¾ka obsahuje patÅÃ­:
+
+\begin{description}
+\item[\texttt{vendor}] -- Obsahuje Vendor ID zaÅÃ­zenÃ­.
+\item[\texttt{device}] -- Obsahuje Device ID zaÅÃ­zenÃ­.
+\item[\texttt{class}] -- Obsahuje 24bitovÃ½ identifikÃ¡tor tÅÃ­dy zaÅÃ­zenÃ­.
+\item[\texttt{subsystem\_vendor}] -- Obsahuje Subsystem Vendor ID.
+\item[\texttt{subsystem\_device}] -- Obsahuje Subsystem ID.
+\item[\texttt{resource}] -- Soubor obsahuje popis jednotlivÃ½ch regionÅ¯ (reprezentovanÃ½ch BAR registry) vyuÅ¾Ã­vanÃ½ch zaÅÃ­zenÃ­m.
+\end{description}
+
+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
+\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). 
+
+
+
 
 \subsection{ZÃ¡kladnÃ­ jadernÃ½ modul}
-JÃ¡dro operaÄnÃ­ho systÃ©mu GNU/Linux je monolitickÃ© -- to znamenÃ¡, Å¾e po zkompilovÃ¡nÃ­ a slinkvÃ¡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}
@@ -534,19 +594,19 @@ Jak se takovÃ½ jadernÃ½ modul mÅ¯Å¾e vypadat, je nejlepÅ¡Ã­ si ukÃ¡zat na pÅÃ­k
 18 |  MODULE_LICENSE("Dual BSD/GPL");
 \end{verbatim}
 
-PrvnÃ­ vÄc, na kterou je potÅeba upozornit je, Å¾e vÄtÅ¡ina jadernÃ½ch modulÅ¯ (stejnÄ jako zdrojovÃ½ch kÃ³dÅ¯ jÃ¡dra samotnÃ©ho) je psÃ¡na v programovacÃ­m jazyce C (jednÃ¡ se o mÃ­rnÄ modifikovanÃ½ standard C90).
+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.
 \begin{description}
 \item[ÅÃ¡dky 1 a 2] obsahujÃ­ vloÅ¾enÃ­ hlaviÄkovÃ½ch souborÅ¯ -- obsahujÃ­ prototypy volanÃ½ch funkcÃ­ a jsou nutnÃ© pro tvorbu jadernÃ©ho modulu.
 \item[Na ÅÃ¡dcÃ­ch 4--8] je funkce, kterÃ¡ bude spuÅ¡tÄna ihned po zavedenÃ­ naÅ¡eho modulu do jÃ¡dra. Ta obsahuje pouze volÃ¡nÃ­ funkce \texttt{printk()}.
 
-Pro jednoduchost mÅ¯Å¾eme s funkcÃ­ \texttt{printk()} pracovat jako s, pro ÄtenÃ¡Åe znÃ¡mou, funkcÃ­ \texttt{printf()} -- narozdÃ­l od standardnÃ­ho vÃ½stupu se vÅ¡ak text vypsanÃ½ funkcÃ­ \texttt{printk()} zapÃ­Å¡e do \textit{logu} jÃ¡dra. JednÃ­m ze zpÅ¯sobÅ¯, jak ho zobrazit je pomocÃ­ programu \texttt{dmesg}.\\Jak se zaÅÃ­dÃ­, Å¾e se tato funkce vykonÃ¡ ihned po zavedenÃ­ modulu do jÃ¡dra? O to se postarÃ¡ pÅÃ­kaz na $\rightarrow$
+Pro jednoduchost mÅ¯Å¾eme s funkcÃ­ \texttt{printk()} pracovat jako s, pro ÄtenÃ¡Åe znÃ¡mou, funkcÃ­ \texttt{printf()} -- na rozdÃ­l od standardnÃ­ho vÃ½stupu se vÅ¡ak text vypsanÃ½ funkcÃ­ \texttt{printk()} zapÃ­Å¡e do \textit{logu} jÃ¡dra. JednÃ­m ze zpÅ¯sobÅ¯, jak ho zobrazit je pomocÃ­ programu \texttt{dmesg}.\\Jak se zaÅÃ­dÃ­, Å¾e se tato funkce vykonÃ¡ ihned po zavedenÃ­ modulu do jÃ¡dra? O to se postarÃ¡ pÅÃ­kaz na $\rightarrow$
 \item[ÅÃ¡dku 15] -- ten obsahuje makro \texttt{module\_init()}, kterÃ©mu Åekneme prÃ¡vÄ to, kterÃ¡ funkce se mÃ¡ po naÄtenÃ­ spustit.
 \item[ÅÃ¡dek 16] obsahuje naopak makro, kterÃ© udÃ¡vÃ¡, kterÃ¡ funkce se mÃ¡ zavolat v pÅÃ­padÄ, Å¾e se bude modul uvolÅovat z jÃ¡dra. V naÅ¡em pÅÃ­padÄ je to funkce na $\rightarrow$
 \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}
-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 buÄ stÃ¡hneme pÅÃ­mo z \texttt{kernel.org} nebo v distribuci Debian nainstalujeme pomocÃ­ pÅÃ­kazu\\\texttt{apt-get install ... FIXME}}. K tomu poslouÅ¾Ã­ nÃ¡sledujÃ­cÃ­ \texttt{Makefile}:
+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
@@ -561,7 +621,7 @@ Linux vyuÅ¾Ã­vÃ¡ pÅi kompilaci systÃ©mu \texttt{KBUILD}. Ten je tvoÅen mnoÅ¾st
 \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Ã¡ÅÃ­ 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 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}).
 \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:
@@ -576,7 +636,7 @@ make[1]: Entering directory `/usr/src/linux-headers-2.6.35-28-generic'
   LD [M]  /tmp/hello.ko
 make[1]: Leaving directory `/usr/src/linux-headers-2.6.35-28-generic'
 \end{verbatim}
-A v aktuÃ¡lnÃ­m adresÃ¡Åi se nachÃ¡zÃ­ kromÄ rÅ¯znÃ½ch souborÅ¯, kterÃ© vzniky pÅi pÅekladu, i potÅebnÃ½ \texttt{hello.ko}
+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
@@ -614,22 +674,59 @@ PÅi psanÃ­ zÃ¡kladnÃ­ho modulu pro jÃ¡dro Linux nejsou patrnÃ© vÄtÅ¡Ã­ rozdÃ­l
 
 \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Ã­ nikdo, kdo by se postaral o naalokovanou pamÄÅ¥. FIXME
+\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. FIXME.
+\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}
-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Ã© dealokace. FIXME
+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 |  }
+\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Ã­.
+
+V pÅÃ­padÄ, Å¾e by volÃ¡nÃ­ na ÅÃ¡dku 6 skonÄilo neÃºspÄchem, musela by bÃ½t zavolÃ¡na funkce \texttt{pci\_disable\_device()}, kterÃ¡ deaktivuje zaÅÃ­zenÃ­ (aktivovanÃ© pÅÃ­kazem na ÅÃ¡dku 3). V pÅÃ­padÄ, Å¾e by poslednÃ­ volÃ¡nÃ­ probÄhlo neÃºspÄÅ¡nÄ, musela by bÃ½t zavolÃ¡na jak funkce \texttt{pci\_disable\_device()}, tak funkce \texttt{pci\_release\_regions()} -- to zpÅ¯sobuje duplikaci kÃ³du, kterÃ¡ vede k nepÅehlednosti a mÅ¯Å¾e zpÅ¯sobovat chyby (v pÅÃ­padÄ, Å¾e se omylem zmÄnÃ­ volÃ¡nÃ­ funkce pouze na jednom mÃ­stÄ).
+
+Za pomoci volÃ¡nÃ­ \texttt{goto} je vÃ½Å¡e popsanÃ½ problÃ©m elegantnÄ vyÅeÅ¡en.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{ZÃ¡kladnÃ­ funkce v prostÅedÃ­ jÃ¡dra Linux}
+\subsection{Funkce \texttt{printk()}}
+FIXME
+\subsection{Funkce \texttt{kalloc()}}
+\subsection{Funkce \texttt{kfree()}}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{OvladaÄe PCI zaÅÃ­zenÃ­}\label{pci_driv}
 \ibox{Jako nejlepÅ¡Ã­ reference jednotlivÃ½ch funkcÃ­ slouÅ¾Ã­ zdrojovÃ© kÃ³dy jÃ¡dra. Pro prohlÃ­Å¾enÃ­ zdrojovÃ½ch kÃ³dÅ¯ jÃ¡dra mohu doporuÄit online \textit{The Linux Cross Reference} -- \\
 \url{http://lxr.linux.no/linux/}.}
 
-OvladaÄe PCI zaÅÃ­zenÃ­ jsou ve vÄtÅ¡inÄ pÅÃ­padÅ¯ kompilovÃ¡ny jako jadernÃ© moduly, dynmicky 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.
+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 prosotru) 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}.
 
@@ -717,7 +814,7 @@ V pÅÃ­padÄ, Å¾e je potÅeba zjistit velikost danÃ©ho pamÄÅ¥ovÃ©ho nebo I/O re
 
 \ibox{\texttt{void \_\_iomem *pci\_ioremap\_bar(struct pci\_dev *pdev, int bar);}}
 
-S ukazatelem, kterÃ½ vrÃ¡tÃ­ funkce \texttt{pci\_request\_regions()} vÅ¡ak nenÃ­ moÅ¾nÃ© pÅÃ­mo pracovat -- je to toiÅ¾ \textbf{fyzickÃ¡ adresa} danÃ©ho regionu, ke kterÃ© neumÃ­ procesor pÅÃ­mo pÅistupovat. Aby tato fyzickÃ¡ adresa byla pÅemapovÃ¡na na adresu \textbf{virtuÃ¡lnÃ­}, je potÅeba zavolat funkci \texttt{pci\_ioremap\_bar()}.
+S ukazatelem, kterÃ½ vrÃ¡tÃ­ funkce \texttt{pci\_request\_regions()} vÅ¡ak nenÃ­ moÅ¾nÃ© pÅÃ­mo pracovat -- je to totiÅ¾ \textbf{fyzickÃ¡ adresa} danÃ©ho regionu, ke kterÃ© neumÃ­ procesor pÅÃ­mo pÅistupovat. Aby tato fyzickÃ¡ adresa byla pÅemapovÃ¡na na adresu \textbf{virtuÃ¡lnÃ­}, je potÅeba zavolat funkci \texttt{pci\_ioremap\_bar()}.
 
 K ukazateli, kterÃ½ vrÃ¡tÃ­ volÃ¡nÃ­ \texttt{pci\_ioremap\_bar()} je jiÅ¾ moÅ¾nÃ© pomocÃ­ speciÃ¡lnÃ­ch funkcÃ­ (popsÃ¡ny v kap. \ref{iofce}) pÅistupovat.
 
@@ -747,7 +844,7 @@ StejnÄ jako program v jazyku symbolickÃ½ch instrukcÃ­ vyuÅ¾Ã­vÃ¡ pro pÅÃ­stup
 
 \ibox{\texttt{unsigned inl(unsigned port);}}
 
-TÅetÃ­ pÃ­smeno znaÄÃ­ o \textit{kolikabitovÃ©} ÄtenÃ­ se jednÃ¡: b = 8 b, w = 16 b, l = 32 b.
+TÅetÃ­ pÃ­smeno znaÄÃ­ o \textit{kolika-bitovÃ©} ÄtenÃ­ se jednÃ¡: b = 8 b, w = 16 b, l = 32 b.
 
 Pro zÃ¡pis je moÅ¾nÃ© vyuÅ¾Ã­t volÃ¡nÃ­:
 \ibox{\texttt{void outb(unsigned char byte, unsigned port);}}
@@ -757,7 +854,7 @@ Pro zÃ¡pis je moÅ¾nÃ© vyuÅ¾Ã­t volÃ¡nÃ­:
 \ibox{\texttt{void outl(unsigned char byte, unsigned port);}}
 
 
-TÅetÃ­ pÃ­smeno, stejnÄ jako u funkcÃ­ pro ÄtenÃ­, znaÄÃ­ o kolikabitovÃ½ pÅÃ­stup se jednÃ¡.
+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>}).
 
@@ -782,7 +879,7 @@ a pro zÃ¡pis:
 
 \ibox{\texttt{void iowrite32(u32 value, void *addr);}}
 
-ÄÃ­slo na konci funkce oznaÄuje o kolikabitovÃ½ pÅÃ­stup se jednÃ¡.
+ÄÃ­slo na konci funkce oznaÄuje o kolika-bitovÃ½ pÅÃ­stup se jednÃ¡.
 
 V pÅÃ­padÄ, Å¾e se na pamÄÅ¥ ve vstupnÄ-vÃ½stupnÃ­m adresnÃ­m prostoru zavolÃ¡ funkce 
 \ibox{\texttt{void *ioport\_map(unsigned long port, unsigned int count);}} 
@@ -809,11 +906,11 @@ PÅÃ­klad jak takovÃ© funkce mohou vypadat:
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{UIO ovladaÄ}
-V pÅÃ­padÄ, Å¾e je vytvÃ¡Åen ovladaÄ pro linuxovÃ© jÃ¡dro, mÄlo by bÃ½t rozhodnuto, kterÃ©ho subsystÃ©mu se stane souÄÃ¡stÃ­ -- napÅ. zda jde o jednoduchÃ© znakovÃ© zaÅÃ­zenÃ­, sÃ­Å¥ovou kartu nebo zvukovou kartu. Tato volba uÅÄÃ­, 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 jde o PCI zaÅÃ­zenÃ­, kterÃ© nelze snadno zaÅadit do Å¾Ã¡dnÃ© kategorie (jednÃ¡-li se napÅÃ­klad o neobvyklou prÅ¯myslovou kartu), je moÅ¾nÃ© vytvoÅit tzv. UIO (\textit{Userspace I/O}) ovladaÄ. Tento ovladaÄ se sklÃ¡dÃ¡ ze dvou ÄÃ¡stÃ­: jednoduchÃ©ho jadernÃ©ho modulu a aplikace v uÅ¾ivatelskÃ©m prostoru. 
 
-Mezi jeho hlavnÃ­ vÃ½hody patÅÃ­ to, Å¾e v jÃ¡dÅe je obsaÅ¾ena pouze malÃ¡ obecnÃ¡ ÄÃ¡st, kterÃ¡ zpÅÃ­stupÅuje zdroje zaÅÃ­zenÃ­ do uÅ¾ivatelskÃ©ho prostoru (jejÃ­ implementace je pomÄrnÄ snadnÃ¡). Druhou ÄÃ¡stÃ­ je aplikace v uÅ¾ivateskÃ©m prostoru, kterÃ¡ pÅistupuje k jednotlivÃ½m zdrojÅ¯m karty a tvoÅÃ­ hlavnÃ­ logiku ovladaÄe. VÄtÅ¡ina vÃ½voje tedy probÃ­hÃ¡ v uÅ¾ivatelskÃ©m prostoru, ÄÃ­mÅ¾ klesÃ¡ riziko naruÅ¡enÃ­ stability jÃ¡dra.
+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.
 
 \subsection{JadernÃ½ modul}
 JadernÃ½ modul UIO ovladaÄe PCI zaÅÃ­zenÃ­ by mÄl obsahovat:
@@ -824,11 +921,12 @@ JadernÃ½ modul UIO ovladaÄe PCI zaÅÃ­zenÃ­ by mÄl obsahovat:
 \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Ã¡ \textit{rodiÄ} FIXME struktury \texttt{struct pci\_dev} struktury -- tj. ukazatel na jejÃ­ poloÅ¾ku \texttt{dev}. DruhÃ½ parametr pÅedÃ¡ ukazatel na strukturu \texttt{struct uio\_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.
+DruhÃ½ parametr pÅedÃ¡ ukazatel na strukturu \texttt{struct uio\_info}.
 
 \subsubsection{Struktura \texttt{struct uio\_info}}
 
@@ -842,7 +940,7 @@ Mezi jejÃ­ hlavnÃ­ poloÅ¾ky patÅÃ­:
 \end{description}
 
 \subsubsection{Struktura \texttt{struct uio\_mem} a \texttt{struct uio\_port}}\label{uio_mem_port}
-Tyto struktury obsahujÃ­ imformace 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 karta mapuje regiony do pamÄÅ¥ovÃ©ho nebo vstupnÄ-vÃ½stupnÃ­ho prostoru.
 
 Struktura \texttt{struct uio\_mem} obsahuje poloÅ¾ky:
 \begin{description}
@@ -915,7 +1013,7 @@ PotÃ©, co je jadernÃ¡ ÄÃ¡st UIO ovladaÄe ÃºspÄÅ¡nÄ zkompilovÃ¡na a zavedena
 \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).
 
-V pÅÃ­padÄ, Å¾e jsou zpÅÃ­stupnÄny regiony raÅÃ­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}.
+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()}.
@@ -930,7 +1028,7 @@ Tato funkce slouÅ¾Ã­ k \textit{namapovÃ¡nÃ­} souboru nebo zaÅÃ­zenÃ­ do operaÄ
 \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 zanÃ½ 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[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.
 \end{description}
 
 PÅÃ­klad, jak takovÃ© volÃ¡nÃ­ mÅ¯Å¾e vypadat (bez oÅ¡etÅenÃ­ chybovÃ½ch stavÅ¯):
@@ -947,7 +1045,7 @@ PÅÃ­klad, jak takovÃ© volÃ¡nÃ­ mÅ¯Å¾e vypadat (bez oÅ¡etÅenÃ­ chybovÃ½ch stav
 
 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):
+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
@@ -990,11 +1088,11 @@ PoloÅ¾ky struktury jsou:
 NarozdÃ­l od pÅedchozÃ­ch pÅÃ­kladÅ¯ je v tomto pÅÃ­padÄ tou hlavnÃ­ \textit{inicializaÄnÃ­} funkcÃ­ nikoliv funkce \texttt{probe()} volanÃ¡ PCI subsystÃ©mem v pÅÃ­padÄ, Å¾e se v systÃ©mu nachÃ¡zÃ­ hardware, kterÃ½ umÃ­ ovladaÄ obslouÅ¾it, ale funkce \texttt{attach()}, kterÃ¡ je volÃ¡na Comedi subsystÃ©mem v zÃ¡vislosti na tom, zda mÃ¡ bÃ½t ovladaÄ pouÅ¾it nebo ne.
 
 \subsection{Funkce \texttt{attach}}
-Funkce \texttt{attach} je volÃ¡na v pÅÃ­padÄ aktivace Comedi ovladaÄe. \texttt{struct comedi\_subdevice}. DÅÃ­ve neÅ¾ dojde na popis incializaÄnÃ­ch krokÅ¯ je nutnÃ© vysvÄtlit nÃ¡zvoslovÃ­, kterÃ© je u Comedi ovladaÄÅ¯ pouÅ¾Ã­vÃ¡no.
+Funkce \texttt{attach} je volÃ¡na v pÅÃ­padÄ aktivace Comedi ovladaÄe. DÅÃ­ve neÅ¾ dojde na popis inicializaÄnÃ­ch krokÅ¯ je nutnÃ© vysvÄtlit nÃ¡zvoslovÃ­, kterÃ© je u Comedi ovladaÄÅ¯ pouÅ¾Ã­vÃ¡no.
 
 \begin{description}
 \item[Board] oznaÄuje konkrÃ©tnÃ­ zaÅÃ­zenÃ­ -- mÄÅÃ­cÃ­ kartu. NÄkterÃ© ovladaÄe podporujÃ­ celou sadu zaÅÃ­zenÃ­ (napÅ. od stejnÃ©ho vÃ½robce).
-\item[Subdevice] je jedna z mnoha funkcÃ­ zaÅÃ­zenÃ­. V pÅÃ­padÄ ovladaÄe karty Humusoft MF614 budou implementovÃ¡ny 4 \textit{subdevices}: digitÃ¡lnÃ­ vstupy, digitÃ¡lnÃ­ vÃ½stupy, analogovÃ© vstupy, analogovÃ© vÃ½stupy.
+\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.
 \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}.
@@ -1010,15 +1108,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Ã­ zapsaÃ¡na/Ätena.
+\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):\\
 \texttt{range\_digital},\\ \texttt{range\_bipolar10},\\ \texttt{range\_bipolar5},\\ \texttt{range\_unipolar10},\\ \texttt{range\_unipolar5}.\\ Jejich nÃ¡zvy jsou samovysvÄtlujÃ­cÃ­.
 
-\item[\texttt{int (*insn\_read) ( ... );}]
-\item[\texttt{int (*insn\_write) ( ... );}]
-\item[\texttt{int (*insn\_bits) ( ... );}]
-\item[\texttt{int (*insn\_config) ( ... );}]
- 
+\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\_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Ã­.
+
+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.
  
 \end{description}
 
@@ -1032,8 +1131,74 @@ V pÅÃ­padÄ dealokace zdrojÅ¯ ovladaÄe nenÃ­ potÅeba tuto pamÄÅ¥ dealokovat
 
 \subsection{Funkce \texttt{detach}}
 
-\subsection{Konfigurace z uÅ¾ivatelskÃ©ho prostoru}
+\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.
+
+Pro pÅÃ­stup k zaÅÃ­zenÃ­ je potÅeba zavolat na soubor \texttt{/dev/comedi0} funkci \texttt{comedi\_open()}. Ta vracÃ­ ukazatel datovÃ©ho typu \texttt{comedi\_t}, reprezentujÃ­cÃ­ho danÃ© zaÅÃ­zenÃ­. K nÄmu je moÅ¾nÃ© pÅistupovat pomocÃ­ funkcÃ­\\
+\texttt{comedi\_data\_read()},\\
+\texttt{comedi\_data\_write()},\\
+\texttt{comedi\_dio\_read()},\\
+\texttt{comedi\_dio\_write()}.
+
+PrvnÃ­ dvÄ slouÅ¾Ã­ pro zÃ¡pis/ÄtenÃ­ A/D a D/A pÅevodnÃ­kÅ¯, zatÃ­mco poslednÃ­ dvÄ slouÅ¾Ã­ pro pÅÃ­stup k digitÃ¡lnÃ­m vstupÅ¯m/vÃ½stupÅ¯m.
+PrvnÃ­m parametrem vÅ¡ech funkcÃ­ je ukazatel na \texttt{comedi\_t}. DruhÃ½m je ÄÃ­slo \textit{podzaÅÃ­zenÃ­}. TÅetÃ­ parametr urÄuje kanÃ¡l (t.j. napÅ. kterÃ½ z osmi A/D pÅevodnÃ­kÅ¯ mÃ¡ bÃ½t Äten). PoslednÃ­m parametrem je ukazatel na promÄnnou, kam majÃ­ bÃ½t zapsÃ¡na pÅeÄtena data nebo hodnota, kterÃ¡ mÃ¡ bÃ½t zapsÃ¡na.
+
+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 |  }
+\end{verbatim}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Implementace Humusoft MF624 v Qemu}\label{qemu}
+MÄÅÃ­cÃ­ karta Humusoft MF624 je hardware vhodnÃ½ pro vÃ½klad principÅ¯ implementace ovladaÄe -- je ale pomÄrnÄ drahÃ½. 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.
+
+
+\section{Qemu}
+\subsection{Kompilace, instalace}
+Nejprve je potÅeba ÅÃ¡dnÄ zkompilovat nÄkterÃ© ze stabilnÃ­ch vydÃ¡nÃ­ emulÃ¡toru Qemu.
+
+\subsection{PouÅ¾itÃ­}
+Komunikace mezi virtuÃ¡lnÃ­ kartou implementovanou v Qemu a grafickÃ½m programem probÃ­hÃ¡ pomocÃ­ TCP/IP protokolu.
+
+\section{Qt grafikÃ© rozhranÃ­}
+Na obrÃ¡zku \ref{qt_gui} je 
 
+Aplikaci je nutnÃ© spouÅ¡tÄt aÅ¾ po spuÅ¡tÄnÃ­ Qemu ....
+
+\begin{figure}[h!]
+	\begin{center}
+	\includegraphics[width=70mm]{img/qt_gui.png}
+	\caption{(FIXME aktualni verzi). Vzhled grafikcÃ© aplikace pro ovlÃ¡dÃ¡nÃ­ vstupÅ¯ virtuÃ¡lnÃ­ karty MF624}
+	\label{qt_gui}
+	\end{center}
+\end{figure}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{TestovÃ¡nÃ­}
@@ -1065,36 +1230,20 @@ 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. 
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{ZÃ¡vÄr}
+V tÃ©to prÃ¡ci se mi podaÅilo vysvÄtlit zÃ¡kladnÃ­ aspekty psanÃ­ ovladaÄÅ¯ PCI ovladaÄÅ¯ -- 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 614. V budoucnu by tyto ovladaÄe mohly bÃ½t rozÅ¡Ã­Åeny tak, aby pokrÃ½valy vÅ¡echny funkce tÄchto karet.
 
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\appendix
-\chapter{Qemu a Humusoft MF624}\label{qemu}
-MÄÅÃ­cÃ­ karta Humusoft MF624 je hardware vhodnÃ½ pro vÃ½klad principÅ¯ implementace ovladaÄe -- je ale pomÄrnÄ drahÃ½. 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.
-
-
-\section{Qemu}
-\subsection*{Kompilace, instalace}
-Nejprve je potÅeba ÅÃ¡dnÄ zkompilovat nÄkterÃ© ze stabilnÃ­ch vydÃ¡nÃ­ emulÃ¡toru Qemu.
-
-\subsection*{PouÅ¾itÃ­}
-Komunikace mezi virtuÃ¡lnÃ­ kartou implementovanou v Qemu a grafickÃ½m programem probÃ­hÃ¡ pomocÃ­ TCP/IP protokolu.
+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.
 
-\section{Qt grafikÃ© rozhranÃ­}
-Na obrÃ¡zku \ref{qt_gui} je 
 
-Aplikaci je nutnÃ© spouÅ¡tÄt aÅ¾ po stuÅ¡tÄnÃ­ Qemu ....
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\appendix
+%\chapter{Hudaqlib}
 
-\begin{figure}[h!]
-	\begin{center}
-	\includegraphics[width=70mm]{img/qt_gui.png}
-	\caption{(FIXME aktualni verzi). Vzhled grafikcÃ© aplikace pro ovlÃ¡dÃ¡nÃ­ vstupÅ¯ virtuÃ¡lnÃ­ karty MF624}
-	\label{qt_gui}
-	\end{center}
-\end{figure}
+%\chapter{Obsah pÅiloÅ¾enÃ©ho CD}
