]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Diploma thesis text.
authorRostislav Lisovy <lisovy@gmail.com>
Sun, 17 Apr 2011 02:20:01 +0000 (04:20 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Sun, 17 Apr 2011 02:20:01 +0000 (04:20 +0200)
doc/diploma_thesis/text/dip_text.tex
doc/diploma_thesis/text/k336_thesis_macros_new.sty
doc/diploma_thesis/text/lisovy_dip.tex
doc/diploma_thesis/text/reference.bib

index cca4f04b38ac2ed7b12f4df0ec46726c74da1ea4..8a620ca2ee990cc24e90c5693f12db99a471a1ec 100644 (file)
@@ -61,15 +61,7 @@ Prvním způsobem, jak změnit stav GPIO pinu (ať už nastavení, zda se má je
 
 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. 
 
-
-\begin{figure}[h!]
-       \begin{center}
-       \includegraphics[width=100mm]{img/mmio.pdf}
-       \caption{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.}
-       \label{mmio}
-       \end{center}
-\end{figure}
-
+\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}
@@ -79,7 +71,17 @@ Hlavní rozdíly mezi chováním paměťové buňky a registru zařízení jsou:
 \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é).
 \end{itemize}
 
+\begin{figure}[h!]
+       \begin{center}
+       \includegraphics[width=100mm]{img/mmio.pdf}
+       \caption{Paměťový a vstupně-výstupní prostor u architektury IA-32.}
+       \label{mmio}
+       \end{center}
+\end{figure}
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\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í.
 
@@ -88,13 +90,16 @@ PCI (\textit{Peripheral Component Interconnect}) je standard paralelní sběrnic
 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.
 
 \subsection{Historie}
+V roce 1990 začala práce na specifikaci PCI v laboratořích firmy Intel. První specifikace definující jak komunikační protokol, tak vzhled konektoru a slotu, byla zveřejněna 30. dubna 1993 (jedná se o PCI 2.0). PCI sběrnice se poté začala objevovat v počítačích architektury PC XT a Power Macintosh.
 
+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}).
 
 \begin{figure}[h!]
        \begin{center}
        \begin{minipage}[b]{0.4\linewidth}
-               \includegraphics[width=50mm]{img/pci_schema2.png}
+               \includegraphics[width=57mm]{img/pci_schema2.png}
        \end{minipage}
        \begin{minipage}[b]{0.4\linewidth}
                \includegraphics[width=50mm]{img/pci2.jpg}
@@ -106,37 +111,40 @@ Komunikace mezi zařízeními připojenými na sběrnici a procesorem zajišťuj
 
 
 \subsection{Dynamická konfigurace a konfigurační adresní prostor}
-Mezi její hlavní výhody (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/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ě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.
 
-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 pro potřeby komunikace vyčte oprační systém.
+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.
 
 
-\begin{figure}[h!]
-       \begin{center}
-       \includegraphics[width=100mm]{img/pci-config-space2.pdf}
-       \caption{Obsah 256 bajtů konfiguračního prostoru PCI karty (zvýrazněny jsou ty registry, jejichž znalost využijeme při vývoji ovladačů)}
-       \label{sa1}
-       \end{center}
-\end{figure}
-
-Zmínil jsem 6 BAR registrů, které každá z karet obsahuje. Mezi další registry, které je potřeba při implementaci ovladačů znát, patří:
+Kromě výše zmíněných 6 BAR registrů, obsahují PCI zařízení i následující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 naše karta využívá PCI řadič třetí strany, jako \texttt{Vendor ID} se zobrazí ID výrobce tohoto řadiče. Abychom byli schopni naše zařízení odlišit od jiného, které využívá stejný řadič, ID našeho zařízení bude uloženo v tomot registru. (V případě, že v registru \texttt{Vendor ID} je skutečně naše ID, může být opět i v tomto registru).
-\item[Subsystem ID]~\\Opět se jedná o údaj podobný \texttt{Device ID}
+\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.
 \end{description}
 
-Tyto registry 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.
+
 
-Výše popsané registry (a ostatní, které nejsou pro čtenáře podstatné) se nacházejí v 256bitovém tzv. \textbf{konfiguračním adresním prostoru} karty (\textit{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.
+\begin{figure}[h!]
+       \begin{center}
+       \includegraphics[width=80mm]{img/pci-config-space2.pdf}
+       \caption{Obsah 256 bajtů konfiguračního prostoru PCI karty (zvýrazněny jsou nejdůležitější registry).}
+       \label{sa1}
+       \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.
 
 \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ž XY Gbit/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 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.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Humusoft MF624}
 \begin{figure}[h!]
@@ -147,27 +155,32 @@ V posledních letech je na poli osobních počítačů PCi sběrnice nahrazován
        \end{center}
 \end{figure}
 
-Měřící karta Humusoft MF624 (dále jen MF624), připojitelná k počítači pomocí PCI sběrnice, má pro účely výkladu psaní ovladačů několik nesporných výhod:
+Měřící karta Humusoft MF624 (obr. \ref{mf624}), připojitelná k počítači pomocí PCI sběrnice, má pro účely výkladu psaní ovladačů několik nesporných výhod:
 \begin{itemize}
-\item Komunikace (na úrovni ovladače) s kartou probíhá snadno pochopitelným, přímo\-čarým způsobem (bude vysvětleno dále).
-\item Je snadné si ověřit správnou funkci napsaného ovladače -- např. připojením LED diody k digitálnímu výstupu.
+\item Komunikace (na úrovni ovladače) s kartou probíhá snadno pochopitelným, přímo\-čarým způsobem, kdy je pouze zapisováno (nebo čteno) do registrů karty (bude vysvětleno dále).
+\item Je možné si ověřit správnou funkci napsaného ovladače -- např. připojením LED diody k digitálnímu výstupu nebo měřením napětí na výstupu D/A převodníku.
 \end{itemize}
 
-Karta MF624 najde své uplatnění hlavně v laboratorním prostředí -- v případech, když je potřeba vytvořit styk mezi počítačem a senzorem/jiným zařízením, které poskytuje analogový, resp. digitální signál (v tom případě využijeme A/D převodníků, resp. digitálních vstupů). Kartu je možné použít pro řízení akčního členu/zařízení -- na výběr máme D/A převodníky a digitální výstupy.
-Kromě výše popsaných funkcí disponuje karta dalšími funkcemi (v popisu implementace ovladačů se omezím pouze na A/D, D/A převodníky a digitální vstupy/výstupy):
+Karta MF624 najde své uplatnění hlavně v laboratorním prostředí -- v případech, když je potřeba vytvořit styk mezi počítačem a senzorem/jiným zařízením, které poskytuje analogový, resp. digitální signál (v tom případě jsou použity A/D převodníky, resp. digitální vstupy). Kartu je možné použít pro řízení akčního členu/zařízení -- k dispozici jsou D/A převodníky a digitální výstupy.
+
+Karta disponuje následujícícmi funkcemi (v popisu implementace ovladačů se omezím pouze na A/D, D/A převodníky a digitální vstupy/výstupy):
 \begin{itemize}
-\item Časovač/čítač
-\item Vstupy inkrementálních snímačů
+\item 8 digitálních vstupů
+\item 8 digitálních výstupů
+\item 8 14bitových A/D převodníků
+\item 8 14bitových D/A převodníků
+\item 4 časovače/čítače
+\item 4 vstupy inkrementálních snímačů
 \end{itemize}
 
 \subsection{Komunikace s kartou}\label{hum_komunikace}
-Komunikace s kartou probíhá celkem přímočarým způsobem:
+Komunikace s kartou není nijak složitá -- zjednodušeně by se dala popsat následovně:
 \begin{itemize}
-\item V případě, že chceme číst hodnoty digitálních vstupů, přečteme hodnotu registru určeného právě digitálním vstupům -- v případě zápisu na digitální výstupy, zapíšeme do registru určeného digitálním výstupům
-\item V případě čtení A/D převodníku nejprve zapíšeme do konfiguračního registru A/D převodníku slovo odpovídající požadované konfiguraci. Poté již z registru náležícího A/D převodníku vyčteme požadovanou hodnotu.
+\item V případě čtení hodnoty digitálních vstupů, přečte se hodnota registru určeného právě digitálním vstupům -- v případě zápisu na digitální výstupy, se zapíše do registru určeného digitálním výstupům.
+\item V případě čtení hodnoty A/D převodníku, se nejprve zapíše do konfiguračního registru A/D převodníku hodnota odpovídající požadované konfiguraci. Poté se již z registru náležícího A/D převodníku vyčte požadovaná hodnota.
 \end{itemize}
 
-Které registry karta obsahuje, jakou mají funkci a kde jsou umístěny je možné zjistit z manuálu ke kartě -- ten je možné stáhnout z oficiálních internetových stránek výrobce.\footnote{\url{http://www2.humusoft.cz/www/datacq/manuals/mf624um.pdf}}
+Které registry karta obsahuje, jakou mají funkci a kde jsou umístěny je možné zjistit z manuálu ke kartě -- ten je možné stáhnout z oficiálních internetových stránek výrobce: \url{http://www2.humusoft.cz/www/datacq/manuals/mf624um.pdf}.
 
 Na straně 11 je k vidění první důležitá tabulka (zde tab. \ref{tab_bar}):
 
@@ -185,10 +198,10 @@ Na straně 11 je k vidění první důležitá tabulka (zde tab. \ref{tab_bar}):
        \end{center}
 \end{table}
 
-Z ní je patrné, že karta využívá 3 regiony\footnote{V manuálu je uvedeno, že se jedná o regiony odpovídající BAR0, BAR1 a BAR2 registrům -- skutečnost je však taková, že karta využívá regiony odpovídající registrům BAR0, BAR2 a BAR4. Rozdíl mezi skutečností a manuálem spočívá v tom, že v muálu jsou registry popsány tak, jak je vidí operační systém Microsoft Windows. Na tuto skutečnost se musí při implementaci ovladače brát zřetel. FIXME} mapované do paměťového adresního prostoru (sloupec 1) -- o velikostech 32, 128 a 128 bajtů (sloupce 3). Pro čtení/zápis z/do nich je potřeba používat 32-, 16-, 32bitové operace (sloupec 4).\footnote{V manuálu je uvedeno, že za určitých podmínek je možné k BAR1 přistupovat i pomocí 32bitových operací. V této práci bych se tomuto složitějšímu přístupu rád vyhnul. Částečná implementace karty MF624 do emulátoru Qemu (Popsaná v příloze \ref{qemu}) umožňuje \textbf{pouze} 16bitový přístup do BAR1 paměťového regionu.}
+Z ní je patrné, že karta využívá 3 regiony\footnote{V manuálu je uvedeno, že se jedná o regiony odpovídající BAR0, BAR1 a BAR2 registrům -- na počítačích s procesorem rodiny IA-32 a s operačním systémem GNU/Linux však karta využívá BAR0, BAR2 a BAR4. Důvod rozdílu mezi skutečností a manuálem není jasný. Na tuto skutečnost se musí při implementaci ovladače brát zřetel.} mapované do paměťového adresního prostoru -- o velikostech 32, 128 a 128 bajtů. Pro čtení/zápis z/do nich je potřeba používat 32-, 16-, 32bitové operace\footnote{V manuálu je uvedeno, že za určitých podmínek je možné k BAR1 přistupovat i pomocí 32bitových operací. V této práci bych se tomuto složitějšímu přístupu rád vyhnul. Částečná implementace karty MF624 do emulátoru Qemu (Popsaná v příloze \ref{qemu}) umožňuje \textbf{pouze} 16bitový přístup do BAR1 paměťového regionu.}
 
 \subsection{Digitální vstupy a výstupy}
-Z tabulky \ref{tab_bar} lze vyčíst informaci, že registry ovládající digitální vstupy a výstupy budou ležet zřejmě v regionu BAR1 (sloupec 2). Dále je potřeba se podívat na přehled registrů náležejících tomuto paměťovému regionu (v oficiálním manuálu na straně 12) -- tomu odpovídá tabulka (s menšími úpravami) \ref{tab_bar1}.
+Z tabulky \ref{tab_bar} lze vyčíst informaci, že registry ovládající digitální vstupy a výstupy leží v regionu BAR1 (sloupec 2). Dále je potřeba se podívat na přehled registrů náležejících tomuto paměťovému regionu (v oficiálním manuálu na straně 12) -- tomu odpovídá tabulka (s menšími úpravami) \ref{tab_bar1}.
 
 \begin{table}[h!]
        \begin{center}
@@ -218,7 +231,7 @@ Z tabulky \ref{tab_bar} lze vyčíst informaci, že registry ovládající digit
        \end{center}
 \end{table}
 
-Na devátém řádku je napsáno \textit{DIN -- Digital input, DOUT -- Digital output} -- to značí registr, který se stará o nastavování digitálních výstupů a čtení digitálních vstupů (Všimněme si, že registr DIN a DOUT mají stejnou adresu i přesto, že na kartě jsou vstupy a výstupy realizovány oddělenými vodiči). 
+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.
@@ -260,7 +273,7 @@ Každý z A/D převodníků je reprezentován jedním bitem. Zápisem 1 do dané
 \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 vyčteme jednotlivé naměřené hodnoty z aktivovaných A/D převodníků v pořádí od 0 k 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 pouze 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 p 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.
+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}.
@@ -311,7 +324,10 @@ Nastavení výstupních hodnot D/A převodníků může probíhat následující
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \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 jeho otevřenost (a z toho plynoucí velké množství kvalitní dokumentace), rozšířenost (hlavně mezi vestavěnými zařízeními) a vysoká kvalita. Distribucí použitou při vývoji byl  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 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
 
 \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.
@@ -419,13 +435,17 @@ 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[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{FIXME příklad s e1000e síťovkou}.
+\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 poškození 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.
 \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
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Ovladače PCI zařízení}
-%Než začneme implementovat skutečný ovladač pro kartu MF624 je potřeba si vysvětlit základní funkce pro práci s PCI zařízeními a vstupně-výstupním a paměťovým adresním prostorem.
-\ibox{Následující popis není zcela vyčerpávající a obsahuje pouze to nejnutnější pro implementaci základního ovladače. Zájemce o problematiku mohu odkázat na literaturu FIXME nebo zdrojové kódy jádra\footnote{Pro prohlížení zdrojových kódů jádra mohu doporučit online \textit{the Linux Cross Reference} -- \url{http://lxr.linux.no/} FIXME footnote se nezobrazuje}}
+\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/}.}
 
 První věc, kterou ovladač PCI zařízení potřebuje udělat, aby se stal součástí systému, je registrace do seznamu všech PCI ovladačů v operačním systému. To se provede voláním funkce \texttt{pci\_register\_driver()}, které se jako parametr předá ukazatel na strukturu \texttt{struct pci\_driver}. 
 
@@ -713,6 +733,57 @@ FIXME
 UIO ovladač dává uživateli možnost využít 100 \% všech funkcí zařízení -- daní za to je pomalejší odezva než v případě plnohodnotného jaderného ovladače.
 
 Pro ovladače měřících karet existuje v Linuxu subsystém -- tzv. Comedi (Control and Measurement Device Interface).
+\subsection{Registrace Comedi ovladače}
+V případě Comedi ovladače se namísto volání \texttt{module\_init()} a \texttt{module\_exit()} zavolá makro \texttt{COMEDI\_INITCLEANUP()}, kterému se jako parametr předá struktura \texttt{struct comedi\_driver} (toto makro však ve skutečnosti volá výše zmíněné standardní funkce).
+
+\subsection{Struktura \texttt{struct comedi\_driver}}
+Tato struktura obsahuje ukazatele na funkce, které jsou zavolány při nahrání resp. uvolnění ovladače.
+Položky struktury jsou:
+\begin{description}
+\item[\texttt{const char *driver\_name;}]~\\Obsahuje textový název ovladače.
+\item[\texttt{struct module *module;}]~\\Ukazatel na modul, kterému tato struktura náleží. Inicializuje se makrem \texttt{THIS\_MODULE}.
+\item[\texttt{int (*attach) (struct comedi\_device *, struct comedi\_devconfig *);}]~\\Ukazatel na funkci, která má být zavolána po načtení modulu
+\item[\texttt{int (*detach) (struct comedi\_device *);}]~\\Ukazatel na funkci, která má být zavolána při uvolňování modulu
+\end{description}
+
+
+\subsection{Registrace struktury \texttt{struct pci\_device\_id}}
+V případě UIO ovladače, byla vytvořena struktura \texttt{struct pci\_driver}, jejíž jeden parametr byl ukazatel na strukturu \texttt{struct pci\_device\_id}. V případě Comedi ovladače se struktura \texttt{struct pci\_driver} nevytváří, proto je potřeba registrovat strukturu \texttt{struct pci\_device\_id} zvlášť.
+
+\ibox{\texttt{MODULE\_DEVICE\_TABLE(type, struct pci\_device\_id* name);}}
+
+Po inicializaci správnými hodnotami se pro registraci zavolá makro \texttt{MODULE\_DEVICE\_TABLE(type, name)}, kde se prvním parametrem určí, o jaké se jedná zařízení (v tomto případě \uv{pci}) a druhým parametrem se předá ukazatel na strukturu \texttt{struct pci\_device\_id}.
+
+
+Příklad základní registrace zařízení:
+\begin{verbatim}
+ 1 |  static struct pci_device_id mf624_pci_table[] = {
+ 2 |      { /* ... */ },
+ 3 |      { 0 }
+ 4 |  };
+ 5 |  MODULE_DEVICE_TABLE(pci, mf624_pci_table);
+ 6 |  
+ 7 |  static struct comedi_driver driver_mf624 = {
+ 8 |      driver_name:  "mf624",
+ 9 |      module:       THIS_MODULE,
+10 |      attach:       mf624_attach,
+11 |      detach:       mf624_detach,
+12 |  };
+13 |  
+14 |  COMEDI_INITCLEANUP(driver_mf624);
+\end{verbatim}
+
+\subsection{Funkce \texttt{attach}}
+FIXME procházení všech karet
+
+\texttt{struct comedi\_subdevice}
+
+\subsection{Funkce \texttt{detach}}
+
+\subsection{Struktura popisující vlastnosti zařízení}
+%Výše byly popsány struktury a funkce potřebné pro samotnou registraci Comedi ovladače. Dále je potřeba se zabývat 
+\subsection{Struktura pro privátní data}
+
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Testování}
@@ -730,7 +801,7 @@ Testování správnosti funkce ovladačů probíhala přímo na hardware, za pom
 \end{figure}
 
 \vspace{1cm}
-Základní nastavení bylo:
+Základní propojení na svorkovnici, které se osvědčilo, bylo:
 \begin{itemize}
 \item 2 $\times$ LED pro nejnižší bity DOUT
 \item 2 $\times$ 1k$\Omega$ rezistory mezi 5 V a nejnižšími bity DIN
@@ -751,15 +822,27 @@ Konzistence jádra byla testována opětovným načítáním a uvolňováním je
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \appendix
 \chapter{Qemu a Humusoft MF624}\label{qemu}
-Měřící karta Humusoft MF624 je hardware vhodný pro výklad 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.
+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{Kompilace, instalace}
-Tento \textit{virtuální} hardware se skládá ze dvou částí:
-\begin{itemize}
-\item Částečné implementace funkce karty do emulačního softwaru Qemu
-\item Grafického programu svázaného s virtuální kartou v Qemu, který má na starosti nastavování vstupních hodnot a zobrazování výstupních hodnot do/z karty.
-\end{itemize}
 
-\section{Použití}
+\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 stuš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}
index 70ce828a5e2b02c6fba6111612b1fb753c022de3..bdd4a8b8e43349ddacf0ee7b013b5d1ee492fefe 100644 (file)
 \newcommand{\bflushr}{\begin{flushright}}
 \newcommand{\eflushr}{\end{flushright}}
 % ceske uvozovky
-\chardef\clqq=18 \sfcode18=0
-\chardef\crqq=16 \sfcode16=0
-\def\uv#1{\clqq#1\crqq}
+%\chardef\clqq=18 \sfcode18=0
+%\chardef\crqq=16 \sfcode16=0
+%\def\uv#1{\clqq#1\crqq}
 
 
 
index 03f3cdce68f329121c5ff975756737b149884cd6..cea18cdfcae7e0b3b7377da98bb138edbf464e36 100644 (file)
  % \newcommand{\efig}{\end{center}\end{figure}}
  % umoznuje pouzit prikaz \bfig namisto \begin{figure}\begin{center} atd.
 
-\newcommand{\ibox}[1]{\begin{center}\fbox{\parbox{14cm}{ #1 }}\end{center}}
+% Box command
+\newcommand{\ibox}[1]{\begin{center}\fboxsep 6pt  \fbox{\parbox{14cm}{ #1 }}\end{center}}
 
+% To make "clearpage" work after "figure"
+\makeatletter
+\setlength{\@fptop}{0pt}
+\makeatother
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Zvolte jednu z moznosti 
@@ -66,7 +71,7 @@
 
 \newcommand\WorkTitle{Prostředí pro výuku vývoje PCI ovladačů do OS GNU/Linux}
 \newcommand\FirstandFamilyName{Rostislav Lisový}
-\newcommand\Supervisor{Ing. Pavel Píša, Ph.D. (fixme)}
+\newcommand\Supervisor{Ing. Pavel Píša, Ph.D.}
 
 
 % Pouzijete-li pdflatex, tak je prijemne, kdyz bude mit vase prace
 
 \acknowledgements
 \noindent
-Rád bych poděkoval Ing. Pavlu Píšovi, Ph.D. za ochotu být vedoucím mé diplomové práce a za věcné rady a připomínky.
+Rád bych poděkoval Ing. Pavlu Píšovi, Ph.D., za věcné rady, připomínky čas poskytnutý při konzultacích FIXME.
 %Zde můžete napsat své poděkování, pokud chcete a máte komu děkovat.
 
 
index 37a5b97919067b0445b98433f3550ca8e53ffd62..18d5572e37cedd3bea204f35e005195e44f4a4e0 100644 (file)
@@ -7,6 +7,15 @@
        isbn = {0596005903},
 }
 
+
+@BOOK{nutshell,
+       author = {{Greg Kroah-Hartman}},
+       title = {{Linux Kernel in a Nutshell}},
+       publisher = {O'Reilly Media},
+       year = {2006},
+       isbn = {0596100795},
+}
+
 @BOOK{understandingkernel,
        author = {{Daniel Bovet} and {Marco Cesati}},
        title = {{Understanding the Linux Kernel, 3rd Edition}},