GNU/Linux >> Znalost Linux >  >> Linux

Jak ovládat periferní porty:Přístup a zápis na paralelním portu s C na Linuxu. Část I

Jedním z nejpozoruhodnějších a nově vznikajících případů použití pro ovládání periferních portů na PC je domácí automatizace, tato technologie nabízí v našich domácnostech nekonečné pole možností. Domácí automatizace je technická disciplína se sociální stránkou. Náš přístup je pomocí některých klíčových frází zlepšit kvalitu života, rozšířit komunikaci a automatizovat procesy. To vše se zdá být docela jednoduché, ale složitost tohoto nového světa domácí automatizace je vzrušující, podívejme se proč.

Domácí automatizace je komplexní činnost z několika důvodů. Za prvé, provoz na domácích zařízeních (senzory, chytré spotřebiče, akční členy...) vám dává představu o složitých fyzikálních jevech, jako jsou mechanická kvanta nebo fotoelektrický jev. Kromě toho může jedno z těchto zařízení provádět různé úkoly, a ne nutně jen jednoduché. Za druhé, když mluvíme o Home Automation, mluvíme o systémech složených z mnoha různých komponent, které ne vždy snadno interagují (představte si domácí bezpečnostní systém, který zahrnuje videokamery, detektory přítomnosti, komunikační zařízení, alarmy se vzdáleným výstražným systémem atd.). ... ...). A konečně, a to nejdůležitější, je komplexní, protože čelí automatizaci technických systémů se sociálními systémy.

Definice pojmů

Paralelní port:

Paralelní port je rozhraní mezi počítačem a periferním zařízením, jehož hlavní charakteristikou je, že datové bity putují společně a posílají paketový bajt najednou. Kabelová nebo fyzická cesta pro každý bit dat je implementována vytvořením sběrnice 8 linek. Prostřednictvím paralelního portu můžeme také ovládat periferie, jako jsou světla, motory a další zařízení.

Webová rozhraní:

Webové rozhraní umožňuje uživatelům ovládat svá zařízení a komunikovat s nimi prostřednictvím webového prohlížeče. To lze použít pro dálkové ovládání, správu knihovny, vizuální zpětnou vazbu a mnoho dalších věcí.

Domácí automatizace:

Jde o automatizaci všech systémů schopných automatizovat domácnost, poskytovat služby energetického managementu, zabezpečení, sociální zabezpečení a komunikaci a lze ji integrovat do kabelových nebo bezdrátových vnitřních a venkovních komunikačních sítí.

Jak pracovat s paralelními porty v C

Pro náš primární účel, základní domácí automatizaci, použijeme paralelní port k demonstraci toho, jak můžeme zapisovat (nebo číst) některé bajty pro ovládání jednoduchých zařízení. Paralelní port PC typu ECP má výstupní konektor typu DB25, jehož schéma a signály jsou uvedeny na následujícím obrázku:

Obrázek 1:Diagram paralelního portu. Pinout zásuvka konektoru. S laskavým svolením Wikipedie

Výstup paralelního portu

Paralelní port PC se podle standardu Centronics skládá z obousměrné 8bitové datové komunikační sběrnice a sady linek pro protokol. Komunikační linky mají držák, který uchovává poslední hodnotu, která do nich byla zapsána, dokud nejsou zapsána nová data, elektrické charakteristiky jsou:

  •      Vysoké napětí:3,3 až 5 V.
  •      Nízké napětí:0 V.
  •      Maximální výstupní proud:2,6 mA.
  •      Maximální vstupní proud:24 mA.

Napětí a proud mohou napájet sadu ovládacích zařízení, jako jsou LED diody, relé a polovodičové spínače. Tyto vyrovnávací paměti jsou vyžadovány pro vypnutí nebo zapnutí prvků s vyšší spotřebou energie.

Adresování

Adresování standardního paralelního portu je důležité kvůli rozmanitosti zdrojů, které z počítače využívá, a pro účely identifikace. Standardní paralelní port používá tři souvislé adresy, obvykle v jednom z těchto rozsahů:

3BCh 3BDh 3BEh
378 h 379 h 37Ah
278 h 279 h 27Ah


První adresa v rozsahu je základní adresa portu, nazývaná také datový registr nebo pouze adresa portu. Druhá adresa je stavový registr portu a třetí je řídicí registr.

EPP a ECP rezervují další adresy pro každý port. EPP přidá pět registrů na základní adrese + 3 až základní adrese + 7 a ECP přidá tři registry na základní adrese + 400h až základní adrese + 402h. Pro základní adresu 378h jsou registry EPP na 37Bh až 37Fh ​​a registry ECP jsou na 778h až 77Fh.

Kanály DMA

ECP mohou používat přímý přístup do paměti (DMA) pro přenos dat na paralelní port. Během přenosů DMA může CPU dělat jiné věci, takže přenosy DMA mohou mít za následek celkově rychlejší výkon. Aby bylo možné používat DMA, port musí mít přiřazený kanál DMA v rozsahu 0 až 3.

Přístup k fyzickým portům v systému Linux

Protože hardware portu na PC je řízen přímo linuxovým jádrem, musíme přistupovat k určitým hlavičkám souvisejícím se sběrnicí paralelního portu. Kompilátor GCC může přistupovat k těmto hlavičkám, vždy s ohledem na to, že uživatel musí mít oprávnění root, aby se vyhnul chybám přístupu. Tato záhlaví jsou:

  • stdio.h:"Standardní vstupně-výstupní hlavička" (standardní hlavička I/O) je hlavičkový soubor, který obsahuje definice maker, konstanty, deklarace funkcí ve standardní knihovně programovacího jazyka C pro provádění operací, standardní vstup a výstup, stejně jako definice typů nezbytných pro takové operace. Z důvodu kompatibility má programovací jazyk C++ (derivát C) také vlastní implementaci těchto funkcí, které jsou deklarovány hlavičkou souboru cstdio. Funkce, kterou musím použít, je fprintf, která umožňuje tisknout na okno terminálu, pokud dojde k nějaké chybě.
  • stdlib.h: Je soubor záhlaví pro standardní knihovnu univerzálního programovacího jazyka C. Obsahuje prototypy funkcí C pro dynamickou správu paměti, řízení procesů a další. Podporuje C++, kde je známý jako cstdlib. Funkce, kterou použiji, je exit, když dostaneme chybu
  • unistd.h: Soubor záhlaví, který poskytuje přístup k rozhraní API operačního systému POSIX. Na systémech podobných Unixu je rozhraní definované pomocí unistd.h obvykle tvořeno z velké části funkcemi obalování systémových volání, jako jsou fork, pipe a I/O primitiva (čtení, zápis, zavření atd.).
  • sys/io.h:Tato rodina funkcí se používá k provádění nízkoúrovňového vstupu a výstupu portu. Funkce out* zajišťují výstup portu, funkce in* vstup portu; funkce s příponou b mají šířku bytu a funkce přípon w šířku slova; funkce _p-suffix se pozastaví, dokud se nedokončí I/O. Z této rodinné funkce využiji outb.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

V Linuxu je snadný přístup k paralelnímu portu a jeho ovládání, je však třeba velmi zvážit přístup root. Výše uvedené jsou všechny potřebné knihovny pro náš dnešní výukový program.

Definování adresy paměti pro paralelní port

Jakmile zahrneme knihovny, musíme definovat adresu paměti přiřazenou paralelnímu portu, jak je uvedeno výše, výchozí adresa pro první paralelní port je 0x378.

#define base 0x378           /* parallel port base address */

Pokud máte problém s touto adresou, měli byste zkusit 0x278.

Použití datové sběrnice jako výstupního portu

Pro tuto první část tutoriálu použiji datovou sběrnici jako výstupní port. V další kapitole uvidíme, jak jej použít jako port pro vstup dat nebo dokonce jako smíšený port. Na obrázku níže vidíme ovládání sady 8 LED připojených přes proudové omezovací odpory k paralelnímu portu, které reagují na hodnotu přiřazenou adrese 0x378. Hodnota rezistorů se může lišit od 100 Ohmů do 300 Ohmů, tato část je důležitá, protože pokud neomezíme proud, můžeme poškodit port.

Schéma


Poznámka:Barva LED diod není důležitá.

Skutečný okruh



Upozornění:Buďte opatrní při manipulaci s konektorem paralelního portu, buďte ujistěte se, že neodpojujete obvod před vypnutím počítače. To může způsobit poškození portu nebo dokonce základní desky. Nemůžeme předpokládat žádné poškození, které byste mohli způsobit svým hardwarovým zařízením.

Implementace softwaru

Pro mé účely vám ukážu, jak vložit některé hodnoty do portu a jak je třeba provést načasování těchto hodnot. Toto je velmi jednoduchá rutina, která vám ukáže, jak to funguje.

Nyní vysvětlím všechny příkazy a slova používaná v ovládacím softwaru:

  • Krok 1:Podmínka, pokud má uživatel oprávnění root pro přístup k portu. Argumentem pro tento podmíněný příkaz je ioperm, který nastavuje bity oprávnění přístupu k portu pro základ adresy portu.
if (ioperm(base,1,1))
  • Krok 2:Pokud uživatel nemá dostatečná oprávnění pro přístup k paralelnímu portu, zobrazí se chyba přístupu a provádění programu se ukončí.
fprintf(stderr, "Access denied to %x\n", base), exit(1);
  • Krok 3:Pokud je přístup udělen, pak smyčka for poskytne sekvenci zapínání a vypínání kontrolek LED podle předdefinovaných hodnot, které se zobrazí na portu. Funkce časování, kterou jsem použil, je sleep(), která uspí volající vlákno, dokud neuplynou sekundy argumentu.
        w=0;
        for (x=0; x=7; x++)  
            {        
            y=pow(2,w);
            outb(y, base);
            sleep(1);
            w=w+1;
               }


    Když zpracování kódu prošlo řádkem s povoleným přístupem,  'fprintf (stderr, "Přístup odepřen % x \ n", base), exit (1); ', datové kolíky paralelního portu jsou k dispozici podle vaší fantazie. V mém případě vezmu pouze jednoduchou sekvenci od první vedené po poslední s intervalem jedné sekundy s použitím mocnin základu 2. (viz odkaz na video). Možnosti jsou však nekonečné, ve skutečnosti lze bez použití multiplexování ovládat až 8 nezávislých výstupů, s multiplexováním výstupů lze narůst až na 255 možností. V závislosti na aplikaci, ať už jde o domácí automatizaci, můžeme port zpracovat bez multiplexování a umístění příslušných vyrovnávacích pamětí pro zvládnutí vyšší proudové zátěže, o které se budeme věnovat později v dalším tutoriálu.


    Odkazy:

    Martin H, Saez F. Domotica, Un Enfoque Sociotécnico. Červen 2006. Fundación Rogelio Segovia para el Desarrollo de las Telecomunicaciones, Ciudad Universitaria, s/n 28040-Madrid, ISBN:84-7402-335-1.

    Axelson J. Paralelní port dokončen. Programování, propojení a používání paralelního portu tiskárny PC. Amazon INC..  ISBN:0-9650819-1-5

    Kerrisk M. Linuxové programovací rozhraní. Projekt manuálových stránek pro Linux. ISBN 978-1-59327-220-3


    Linux
    1. Jak najít soubory s oprávněními SUID a SGID v Linuxu

    2. Jak pracovat s uživateli a skupinami v Linuxu

    3. Jak mohu zkontrolovat, které porty jsou na mém počítači se systémem Linux obsazené a které volné?

    1. Flatpak na Linuxu:Co to je a jak s ním instalovat aplikace

    2. Jak komprimovat soubory a adresáře v systému Linux (s příklady)

    3. Jak zkontrolovat otevřené porty v Linuxu pomocí netstat, lsof a nmap

    1. Jak otevřít a zavřít porty na RHEL 8 / CentOS 8 Linux

    2. Jak sledovat TCP a UDP porty v reálném čase

    3. Čtení a zápis na sériový port v C na Linuxu