]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Diploma thesis text.
authorRostislav Lisovy <lisovy@gmail.com>
Mon, 28 Mar 2011 22:09:44 +0000 (00:09 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Mon, 28 Mar 2011 22:09:44 +0000 (00:09 +0200)
doc/diploma_thesis/text/dip_text.tex [new file with mode: 0644]

diff --git a/doc/diploma_thesis/text/dip_text.tex b/doc/diploma_thesis/text/dip_text.tex
new file mode 100644 (file)
index 0000000..fe87e55
--- /dev/null
@@ -0,0 +1,167 @@
+\documentclass[a4paper, 12pt]{report} 
+\usepackage[hscale=0.75, vscale=0.75]{geometry}
+\usepackage[utf8]{inputenc}
+\usepackage[czech]{babel}
+\usepackage{indentfirst}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{amssymb,amsmath}
+
+\newcommand{\ibox}[1]{\begin{center} \fbox{\parbox{14cm}{ #1 }} \end{center} }
+
+%opening
+\title{\textsf{\begin{huge}Prostředí pro výuku vývoje PCI ovladačů do OS GNU/Linux\end{huge}\\
+Fakulta elektrotechnická ČVUT}
+\date{}}
+\author{Rostislav Lisový (lisovy@gmail.com)}
+
+\begin{document}
+
+\maketitle
+\newpage
+
+\tableofcontents
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Abstrakt}
+Cílem této práce je vysvětlit základní principy komunikace ovladače operačního systému s hardwarem. Pro názornost jsou v práci popsány postupy implementace UIO a Comedi ovladače pro měřící kartu Humusoft MF624 pro operační systém GNU/Linux.
+
+Součástí této práce je i implementace základních funkcí (DAC, ADC, DIO) karty Humusoft MF624 do emulátoru Qemu, aby si případný zájemce mohl popsané postupy vyzkoušet, aniž by vlastnil potřebný hardware.
+Od čtenáře se očekává základní znalost používání operačního systému GNU/Linux a dobrá znalost programovacího jazyka C.
+\newpage
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Hardware}
+\section{Komunikace s hardwarem}
+Jak je možné ovládat hardware pomocí programu (software) je nejsnazší ukázat na příkladu jednočipového počítače.
+
+\ibox{Mikrokontrolér, neboli jednočipový počítač má velikost pouze jednoho čipu. Obsahuje přitom procesor, paměť, vstupně-výstupní zařízení jako: 
+\begin{description}
+\item[GPIO piny (General Purpose Input/Output)] --  u těch je možné nastavit, zda chceme jejich hodnotu číst (a je k nim tedy připojeno jiné zařízení) nebo zda chceme jejich hodnotu nastavovat.
+\item[AD převodníky] -- TODO
+\item[Časovače] -- TODO
+\end{description}
+
+
+%\begin{figure}[h!]
+%      \begin{center}
+       \includegraphics[width=80mm]{img/msp430g2x01.png}
+%      \caption{Architektura velmi jednoduchého mikroprocesoru MSP430G2x01 firmy Texas Instruments.}
+%      \label{microcontroller}
+%      \end{center}
+%\end{figure}
+
+}
+
+V případě, že budeme chtít změnit hodnotu GPIO pinu, je první možností 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ů). Vnitřní uspořádání mikrokontroleru, dle adresy na kterou jsme zapisovali, rozpozná, že provedená operace zápisu nebyla určena pro změnu hodnoty vnitřní paměti, ale je určena pro změnu stavu určité části hardwaru. Námi zapsaná hodnota se tedy projeví změnou výstupní hodnoty 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}.
+
+\begin{figure}[h!]
+       \begin{center}
+       \includegraphics[width=100mm]{img/mmio.pdf}
+       \caption{V případě architektury IA-32 (označovanou 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}
+
+Jiným přístupem je při zápisu/čtení do/ze zařízení použití jiné instrukce než kterou používáme pro paměťové operace -- tj. místo zápisu na adresu v paměťovém prostoru vyhrazenou pro GPIO, provedeme zápis do tzv. \textbf{vstupně-výstupního prostoru} na adresu (v tomto případě označovanou jako \textbf{port}) odpovídající GPIO pinům. Adresy paměťového a vstupně-výstupního prostoru\footnote{dále v textu bude pro zkrácení občas použito označení \textit{I/O prostor} (z anglického Input/Output)} spolu nijak nesouvisí.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newpage
+\section{PCI sběrnice a komunikační protokol}
+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 ty nejdůležitější principy, které tato sběrnice využívá.
+
+\begin{figure}[h!]
+       \begin{center}
+       \begin{minipage}[b]{0.4\linewidth}
+               \includegraphics[width=50mm]{img/pci_schema2.png}
+       \end{minipage}
+       \begin{minipage}[b]{0.4\linewidth}
+               \includegraphics[width=50mm]{img/pci2.jpg}
+       \end{minipage}
+       \caption{\textit{Vlevo}: Schéma znázorňující rozdíly mezi konektory pro karty s napájením 3,3 V a 5 V. \textit{Vpravo}: Reálná fotografie PCI konektorů}
+       \label{pci}
+       \end{center}
+\end{figure}
+
+PCI (\textit{Peripheral Component Interconnect}) je standard paralelní sběrnice využívaný v počítačích nejrůznějších architektur. 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.
+
+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.
+
+
+\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é budeme při implementaci ovladačů používat, patří:
+\begin{description}
+\item[Device ID] -- FIXME
+\item[Vendor ID] -- 
+\item[Class code] -- 
+\item[Subsystem ID] -- 
+\item[Subsystem Vendor ID] -- 
+\end{description}
+
+Výše popsané registry (a ostatní, které nejsou pro čtenáře podstatné) se nacházejí v tzv. \textbf{konfiguračním adresním prostoru} karty (\textit{ano, po paměťovém a vstupně-výstupním adresním prostoru je zde třetí -- konfigurační -- adresní prostor}). Do toho je možné na architektuře IA-32 přistupovat pomocí zapsání adresy (kam chceme v konfiguračním prostoru zapisovat) a dat (která chceme do konfiguračního prostoru zapsat) do dvou I/O portů s pevně danou adresou.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Humusoft MF624}
+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:
+\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 Snadno si ověříme funkci námi napsaného ovladače -- např. připojením LED diody k digitálnímu výstupu.
+\end{itemize}
+
+\begin{figure}[h!]
+       \begin{center}
+       \includegraphics[width=150mm]{img/mf624.jpg}
+       \caption{Měřící karta Humusoft MF624}
+       \label{sa1}
+       \end{center}
+\end{figure}
+
+Karta MF624 najde své uplatnění hlavně v laboratorním prostředí -- v případech, když potřebujeme 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 AD 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 DA 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íme pouze na ADC, DAC a DIO):
+\begin{itemize}
+\item Časovač/čítač
+\item Vstupy inkrementálních snímačů
+\end{itemize}
+
+\subsection{Komunikace s kartou}
+Komunikace s kartou probíhá celkem přímočarým způsobem:
+\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í AD převodníku nejprve zapíšeme do konfiguračního registru AD převodníku slovo odpovídající požadované konfiguraci. Poté již z registru náležícího AD převodníku vyčteme požadovanou hodnotu.
+\end{itemize}
+
+\ibox{Jak se spustí převod. Čtení se side effects}
+
+\ibox{AD převod chvíli trvá a buď čekáme nebo přijde přerušení}
+
+\ibox{Co je bitová maska}
+
+Jak se dozvíme adresu potřebného registru? 
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\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. 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.
+
+\subsection{Principy psaní jaderných modulů}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{UIO ovladač}
+\subsection{Jaderný modul}
+\subsection{Uživatelský program}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Comedi ovladač}
+
+
+\end{document}