GNU/Linux >> Linux Esercitazione >  >> Linux

Come controllare le porte periferiche:Accesso e scrittura su Porta Parallela con C su Linux. Parte I

Uno dei casi d'uso più sorprendenti ed emergenti per controllare le porte periferiche su un PC è la domotica, questa tecnologia offre un campo infinito di possibilità nelle nostre case. La domotica è una disciplina tecnica con un lato sociale. Il nostro approccio è, utilizzando alcune frasi chiave, migliorare la qualità della vita, ampliare la comunicazione e automatizzare i processi. Tutto ciò sembra abbastanza semplice, ma la complessità insita in questo nuovo mondo della domotica è eccitante, vediamo perché.

La domotica è un'attività complessa per diversi motivi. Innanzitutto, il funzionamento sui dispositivi domestici (sensori, elettrodomestici intelligenti, attuatori...) ti dà un'idea dei complicati fenomeni fisici, come il quanto meccanico o l'effetto fotoelettrico. Inoltre, uno di questi dispositivi può svolgere diverse attività e non necessariamente solo semplici. In secondo luogo, parlare di Domotica è parlare di sistemi composti da tanti componenti diversi che non sempre interagiscono facilmente (immagina un sistema di sicurezza domestica che includa telecamere, rilevatori di presenza, apparecchiature di comunicazione, allarmi con sistema di teleallarme, ecc. ...). Infine, e soprattutto, è complesso perché affronta l'automazione dei sistemi tecnici con i sistemi sociali.

Definizione dei termini

Porta parallela:

Una porta parallela è un'interfaccia tra un computer e un dispositivo periferico, la cui caratteristica principale è che i bit di dati viaggiano insieme, inviando un pacchetto byte alla volta. Un cavo o un percorso fisico per ogni bit di dati viene implementato formando un bus di 8 linee. Attraverso la porta parallela possiamo anche controllare periferiche come luci, motori e altri dispositivi.

Interfacce Web:

Un'interfaccia Web consente agli utenti di controllare e interagire con i propri dispositivi tramite un browser Web. Questo può essere utilizzato per un telecomando, la gestione della libreria, il feedback visivo e molte altre cose.

Domotica:

È l'automazione di tutti i sistemi in grado di automatizzare una casa, fornire servizi di gestione dell'energia, sicurezza, benessere e comunicazione, e può essere integrato in reti di comunicazione interne ed esterne cablate o wireless.

Come lavorare con le porte parallele in C

Per il nostro scopo principale, la domotica di base, utilizzeremo la porta parallela per dimostrare come possiamo scrivere (o leggere) alcuni byte per il controllo di dispositivi semplici. La porta parallela di un PC tipo ECP ha un connettore di uscita tipo DB25 femmina il cui diagramma e segnali sono visibili nella figura seguente:

Figura 1:diagramma della porta parallela. Pinout connettore femmina. Per gentile concessione di Wikipedia

Uscita porta parallela

La porta parallela di un PC, secondo lo standard Centronics, è composta da un bus di comunicazione bidirezionale a 8 bit di dati, più un insieme di linee per il protocollo. Le linee di comunicazione hanno un fermo che conserva l'ultimo valore che è stato scritto su di esse fino a quando non vengono scritti nuovi dati, le caratteristiche elettriche sono:

  •      Tensione di alto livello:da 3,3 a 5 V.
  •      Tensione di basso livello:0 V.
  •      Corrente di uscita massima:2,6 mA.
  •      Corrente di ingresso massima:24 mA.

La tensione e la corrente possono alimentare una serie di dispositivi di controllo come LED, relè e interruttori a stato solido. Questi buffer sono necessari per spegnere o accendere elementi con un consumo energetico maggiore.

Indirizzamento

L'indirizzamento di una porta parallela standard è importante per la varietà di risorse che utilizza dal computer e per scopi di identificazione. La porta parallela standard utilizza tre indirizzi contigui, solitamente in uno di questi intervalli:

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


Il primo indirizzo nell'intervallo è l'indirizzo di base della porta, chiamato anche registro dati o semplicemente indirizzo della porta. Il secondo indirizzo è il registro di stato della porta e il terzo è il registro di controllo.

EPP e ECP riservano indirizzi aggiuntivi per ciascuna porta. Un EPP aggiunge cinque registri all'indirizzo di base + 3 tramite l'indirizzo di base + 7 e un ECP aggiunge tre registri all'indirizzo di base + 400h tramite l'indirizzo di base + 402h. Per un indirizzo di base di 378h, i registri EPP sono da 37Bh a 37Fh ​​e i registri ECP sono da 778h a 77Fh.

Canali DMA

Gli ECP possono utilizzare l'accesso diretto alla memoria (DMA) per i trasferimenti di dati alla porta parallela. Durante i trasferimenti DMA, la CPU è libera di fare altre cose, quindi i trasferimenti DMA possono comportare prestazioni complessive più veloci. Per utilizzare DMA, la porta deve avere un canale DMA assegnato, compreso tra 0 e 3.

Accesso alle porte fisiche su Linux

Poiché l'hardware della porta su un PC è controllato direttamente dal kernel Linux, dobbiamo accedere a determinate intestazioni relative al bus della porta parallela. Il compilatore GCC può accedere a queste intestazioni, tenendo sempre presente che l'utente deve avere i privilegi di root per evitare errori di accesso. Queste intestazioni sono:

  • stdio.h:Lo "standard input-output header" (standard header I/O) è il file di intestazione che contiene le definizioni delle macro, le costanti, le dichiarazioni di funzione nella libreria standard del linguaggio di programmazione C per eseguire le operazioni, standard input e output, nonché la definizione dei tipi necessari per tali operazioni. Per ragioni di compatibilità, anche il linguaggio di programmazione C++ (derivato C) ha una propria implementazione di queste funzioni, che vengono dichiarate con l'intestazione del file cstdio. La funzione che devo usare è fprintf che permette di stampare su una finestra di terminale in caso di errore.
  • stdlib.h: è il file di intestazione per la libreria standard del linguaggio di programmazione generico C. Contiene i prototipi della funzione C per la gestione dinamica della memoria, il controllo di processo e altro. Supporta C++ dove è noto come cstdlib. La funzione che userò è l'uscita quando riceviamo un errore
  • unistd.h: file di intestazione che fornisce l'accesso all'API del sistema operativo POSIX. Sui sistemi simili a Unix, l'interfaccia definita da unistd.h è in genere costituita in gran parte da funzioni di wrapper delle chiamate di sistema come fork, pipe e primitive di I/O (lettura, scrittura, chiusura, ecc.).
  • sys/io.h:questa famiglia di funzioni viene utilizzata per eseguire input e output di porte di basso livello. Le funzioni out* fanno port output, le funzioni in* fanno port input; le funzioni del suffisso b sono larghezza di byte e le funzioni del suffisso w larghezza della parola; le funzioni _p-suffix si interrompono fino al completamento dell'I/O. Di questa funzione familiare userò outb.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

In Linux, è facile accedere e controllare la porta parallela, tuttavia, l'accesso come root deve essere tenuto in grande considerazione. Quanto sopra sono tutte le librerie richieste per il nostro tutorial di oggi.

Definizione dell'indirizzo di memoria per la porta parallela

Una volta incluse le librerie, dobbiamo definire l'indirizzo di memoria assegnato alla porta parallela, come detto sopra, l'indirizzo di default per la prima porta parallela è 0x378.

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

In caso di problemi con questo indirizzo, dovresti provare 0x278.

Utilizzo del bus dati come porta di output

Per questa prima parte del tutorial userò il bus dati come porta di output. Nel prossimo capitolo vedremo come usarlo come porta per l'input di dati o anche come porta mista. Nell'immagine sottostante possiamo vedere il controllo di un set di 8 led collegati, tramite resistori limitatori di corrente, alla porta parallela, che rispondono al valore assegnato all'indirizzo 0x378. Il valore dei resistori può variare da 100 Ohm a 300 Ohm, è importante questa parte perché possiamo danneggiare la porta se non limitiamo la corrente.

Schema


Nota:il colore dei LED non è importante.

Circuito reale



Attenzione:prestare attenzione nella manipolazione del connettore della porta parallela, essere assicurati di non scollegare il circuito prima di spegnere il PC. Ciò potrebbe causare danni alla porta o addirittura alla scheda madre. Non possiamo presumere alcun danno che tu possa causare ai tuoi dispositivi hardware.

Implementazione del software

Per i miei scopi, ti mostrerò come inserire alcuni valori nella porta e come devono essere eseguiti i tempi di quei valori, questa è una routine molto semplice per mostrarti come funziona.

Ora ti spiego tutti i comandi e le parole usate nel software di controllo:

  • Passaggio 1:condizione se l'utente dispone dell'autorizzazione di root per accedere alla porta. L'argomento per questo comando condizionale è ioperm che imposta i bit di autorizzazione di accesso alla porta per la base dell'indirizzo della porta.
if (ioperm(base,1,1))
  • Fase 2:se l'utente non dispone di privilegi sufficienti per accedere alla porta parallela, verrà visualizzato un errore di accesso e l'esecuzione del programma terminerà.
fprintf(stderr, "Access denied to %x\n", base), exit(1);
  • Passaggio 3:se l'accesso è concesso, un ciclo for darà una sequenza di accensione e spegnimento ai LED in base a valori predefiniti da visualizzare nella porta. La funzione di temporizzazione che ho usato è sleep() che fa dormire il thread chiamante fino a quando non sono trascorsi i secondi nell'argomento.
        w=0;
        for (x=0; x=7; x++)  
            {        
            y=pow(2,w);
            outb(y, base);
            sleep(1);
            w=w+1;
               }


    Quando l'elaborazione del codice ha superato la riga di accesso consentito,  'fprintf (stderr, "Accesso negato a% x \ n", base), exit (1); ', i pin dati della porta parallela sono a tua disposizione e fantasia. Nel mio caso prendo solo una semplice sequenza dalla prima all'ultima con un intervallo di un secondo, usando potenze di base 2. (vedi link video). Tuttavia le possibilità sono infinite, infatti senza utilizzare il multiplexing si possono controllare fino a 8 uscite indipendenti, con il multiplexing le uscite possono crescere fino a 255 possibilità. A seconda dell'applicazione, che sia in termini di domotica, possiamo gestire la porta senza multiplexing, posizionando gli appositi buffer per gestire carichi di corrente maggiori, che verranno trattati più avanti in un altro tutorial.


    Riferimenti:

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

    Axelson J. Porta parallela completa. Programmazione, interfaccia e utilizzo della porta stampante parallela del PC. Amazon INC..  ISBN:0-9650819-1-5

    Kerrisk M. L'interfaccia di programmazione Linux. Progetto pagine man di Linux. ISBN 978-1-59327-220-3


    Linux
    1. Come trovare file con autorizzazioni SUID e SGID in Linux

    2. Flatpak su Linux:cos'è e come installare app con esso

    3. Come comprimere file e directory su Linux (con esempi)

    4. Come verificare la presenza di porte aperte in Linux con netstat, lsof e nmap

    5. Lettura e scrittura su porta seriale in C su Linux

    Come eseguire una scansione delle porte in Linux

    Che cos'è Crontab e come automatizzare le attività in Linux con Crontab

    Come visualizzare l'utilizzo del disco con Duf su Linux e Unix

    Come trovare e chiudere le porte aperte in Linux

    Come utilizzare Netcat per scansionare le porte aperte in Linux

    Come e perché usare Linux per installare Telnet