Mf6xx driver implementation
Úvod
Následující text se snaží tenáři vysvětlit (a názorně předvést) na základní úrovni kroky, které jsou ze strany operaního systému (resp. ovladae, který je jeho souástí) potřeba uinit pro zajištění správné funkce PCI zařízení/karty v poítai.
Kromě základního popisu principu bude vysvětlen konkrétní způsob implementace ovladae PCI zařízení (ve skutenosti půjde o dva možné druhy ovladae).
Jako cílová platforma použitá v celé této práci je zvolena architektura IA-32 (také oznaovaná jako x86). V praxi by však mělo být možné výsledný ovlada použít i na procesorech jiných architektur. Jako operaní systém byl (pro svoji kvalitu, otevřenost, všestrannost a rozšířenost) zvolen Debian GNU/Linux (verze jádra Linux 2.6.xy).
Od tenáře se pro správné pochopení textu vyžaduje základní znalost:
- funkce operaního systému (userspace vs. kernelspace, komunikace s HW)
- memory managementu (základní funkce MMU, paměťový vs. I/O prostor, memory mapped I/O)
- principu fungování obecného procesoru (privilegovaný vs. neprivilegovaný režim)
Dále také základní znalost:
- práce s operaním systémem GNU/Linux (práce v příkazové řádce, základní orientace v hierarchii souborového systému -- Filesystem Hierarchy Standard)
- práce s GNU programovacími nástroji (GCC, Make)
- porozumění kódu a programování v jazyce C
Pro výklad těchto témat bohužel není v této práci místo.
Humusoft MF6x4
Jako PCI zařízení, pro nějž bude v této práci implementován ovlada, byla zvolena PCI karta Humusoft MF614 (http://www.humusoft.cz/produkty/datacq/old/mf614/). Jedná se o tzv. "měřící kartu". Ta sestává z několika analogových vstupů/výstupů a několika digitálních vstupů/výstupů.
Důvodem pro volbu této karty byla celkem snadná a přímoará komunikace mezi operaním systémem hostitelského systému a kartou (zjednodušeně: zapíšeme hodnotu do registru karty, ta se projeví na výstupu; pro vstup teme průběžně měnící se hodnotu registru karty).
PCI zařízení/karta
Pro komunikaci s PCI zařízením/kartou je potřeba pro něj/ni vyhradit uritý paměťový nebo I/O prostor. V případě, že jak karta tak operaní systém (a MMU) budou vědět, že na urité adrese X se nachází paměťová buňka patřící PCI zařízení, může probíhat komunikace tením z nebo zápisem do této paměťové buňky.
Nejsnazší netodou (která se u PCI nepoužívá) by bylo tyto adresy nastavit "natvrdo" v PCI zařízení a ovladai pro toto zařízení v operaním systému. Něco takového by bylo poměrně neflexibilní (místy až nepoužitelné) -- proto zařízení na PCI sběrnici využívají tzv. Plug & Play systém. Ten umožňuje dynamickou konfiguraci mapování jednotlivých PCI zařízení do paměťového a I/O prostoru.
Zjednodušeně: Ovlada v operaním systému ví přesně, kolik jak velkých paměťových a I/O úseků bude zařízení pro svoji funkci vyžadovat -- proto staí pouze tuto paměť vyhradit pro zařízení a nějak ho o tom informovat.
Jelikož karta ze zaátku nemá přidělený žádný úsek v paměťovém nebo I/O prostoru, ztěžuje to její adresaci -- to lze vyřešit pomocí tzv. "geografického" adresování, kdy je karta zvolena na základě své polohy na sběrnici. Poté, co je takto karta oslovena, jsou do jejich adresních registrů (Base Address Registers -- BAR) zapsány poátení adresy již rezervovaných paměťových nebo I/O rozsahů. BAR registrů je celkem 6 (BAR0--BAR5) a leží v tzv. "konfiguraním prostoru" (configuration space) daného PCI zařízení (pozor, zcela se liší od paměťového nebo I/O prostoru). Na x86 architektuře se do něj přistupuje pomocí zapsání adresy (kam chceme v konfiguraním prostoru zapisovat) a dat (která chceme do konfiguraního prostoru zapsat) do dvou I/O portů s pevně danou adresou.
(Pro více info: http://en.wikipedia.org/wiki/PCI_Configuration_Space)
UIO Ovlada
Takzvaný UIO ovlada je ovladaem pro PCI zařízení, který sestává ze dvou ástí: malého jaderného modulu a hlavní ásti v user-space. Důvodem pro použití ovladae tohoto typu je, že většina jeho programového kódu běží v user-space. To je výhodné pro případy jako je tento -- kdy se snažíme (bez velkých předchozích zkušeností) vyvinout funkní ovlada. To, že ovlada poběží v uživatelském prostoru může při vývoji minimalizovat poet pádů operaního systému (ty samozřejmě nejsou nutné, ale při vývoji plnohodnotných kernel-space ovladaů mohou nastat).
Implementaní detaily
[To be done]