GNU/Linux >> Tutoriels Linux >  >> Linux

Comment contrôler les ports périphériques :accéder et écrire sur le port parallèle avec C sous Linux. Première partie

L'un des cas d'utilisation les plus frappants et les plus émergents pour contrôler les ports périphériques d'un PC est la domotique, cette technologie offre un champ infini de possibilités dans nos maisons. La domotique est une discipline technique à dimension sociale. Notre approche consiste, à l'aide de quelques phrases clés, à améliorer la qualité de vie, à élargir la communication et à automatiser les processus. Tout cela semble assez simple, mais la complexité inhérente à ce nouveau monde de la domotique est passionnante, voyons pourquoi.

La domotique est une activité complexe pour plusieurs raisons. Tout d'abord, le fonctionnement sur les appareils domestiques (capteurs, appareils intelligents, actionneurs...) vous donne une idée des phénomènes physiques compliqués, comme la mécanique quantique ou l'effet photoélectrique. De plus, l'un de ces appareils peut effectuer diverses tâches et pas nécessairement une simple. En second lieu, parler de domotique, c'est parler de systèmes composés de nombreux composants différents qui n'interagissent pas toujours facilement (imaginez un système de sécurité domestique qui comprend des caméras vidéo, des détecteurs de présence, des équipements de communication, des alarmes avec un système d'alerte à distance, etc. . ...). Enfin et surtout, il est complexe car il confronte l'automatisation des systèmes techniques aux systèmes sociaux.

Définition des termes

Port parallèle :

Un port parallèle est une interface entre un ordinateur et un périphérique, dont la principale caractéristique est que les bits de données voyagent ensemble, en envoyant un octet de paquet à la fois. Un câble ou chemin physique pour chaque bit de données est implémenté en formant un bus de 8 lignes. Grâce au port parallèle, nous pouvons également contrôler des périphériques tels que des lumières, des moteurs et d'autres appareils.

Interfaces Web :

Une interface Web permet aux utilisateurs de contrôler et d'interagir avec leurs appareils via un navigateur Web. Cela peut être utilisé pour une télécommande, la gestion d'une bibliothèque, un retour visuel et bien d'autres choses.

Domotique :

C'est l'automatisation de tous les systèmes capables d'automatiser une maison, de fournir des services de gestion de l'énergie, de sécurité, de bien-être et de communication, et peut être intégré dans des réseaux de communication intérieurs et extérieurs filaires ou sans fil.

Comment travailler avec les ports parallèles en C

Pour notre objectif principal, la domotique de base, nous utiliserons le port parallèle pour démontrer comment nous pouvons écrire (ou lire) certains octets pour contrôler des appareils simples. Le port parallèle d'un PC de type ECP possède un connecteur de sortie femelle de type DB25 dont le schéma et les signaux sont visibles sur la figure suivante :

Figure 1 :Schéma du port parallèle. Brochage du connecteur femelle. Avec l'aimable autorisation de Wikipédia

Sortie du port parallèle

Le port parallèle d'un PC, selon la norme Centronics, est composé d'un bus de communication bidirectionnel à 8 bits de données, plus un ensemble de lignes pour le protocole. Les lignes de communication ont une retenue qui contient la dernière valeur qui leur a été écrite jusqu'à ce que de nouvelles données soient écrites, les caractéristiques électriques sont :

  •      Tension de haut niveau :3,3 à 5 V.
  •      Tension de niveau bas :0 V.
  •      Courant de sortie maximal :2,6 mA.
  •      Courant d'entrée maximal :24 mA.

La tension et le courant peuvent alimenter un ensemble de dispositifs de contrôle tels que des LED, des relais et des commutateurs à semi-conducteurs. Ces tampons sont nécessaires pour éteindre ou rallumer les éléments ayant une consommation d'énergie plus élevée.

Adressage

L'adressage d'un port parallèle standard est important en raison de la variété des ressources qu'il utilise à partir de l'ordinateur et à des fins d'identification. Le port parallèle standard utilise trois adresses contiguës, généralement dans l'une de ces plages :

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


La première adresse de la plage est l'adresse de base du port, également appelée registre de données ou simplement l'adresse du port. La deuxième adresse est le registre d'état du port et la troisième est le registre de contrôle.

Les EPP et les ECP réservent des adresses supplémentaires pour chaque port. Un EPP ajoute cinq registres à la base de l'adresse + 3 à l'adresse de base + 7, et un ECP ajoute trois registres à l'adresse de base + 400h à l'adresse de base + 402h. Pour une adresse de base de 378h, les registres EPP sont de 37Bh à 37Fh, et les registres ECP sont de 778h à 77Fh.

Canaux DMA

Les ECP peuvent utiliser l'accès direct à la mémoire (DMA) pour les transferts de données vers le port parallèle. Pendant les transferts DMA, le processeur est libre de faire d'autres choses, de sorte que les transferts DMA peuvent entraîner des performances globales plus rapides. Pour utiliser DMA, le port doit avoir un canal DMA attribué, dans la plage 0 à 3.

Accéder aux ports physiques sous Linux

Étant donné que le matériel du port sur un PC est contrôlé directement par le noyau Linux, nous devons accéder à certains en-têtes liés au bus du port parallèle. Le compilateur GCC peut accéder à ces en-têtes, en gardant toujours à l'esprit que l'utilisateur doit avoir les privilèges root pour éviter les erreurs d'accès. Ces en-têtes sont :

  • stdio.h :L'"en-tête d'entrée-sortie standard" (en-tête standard I/O) est le fichier d'en-tête qui contient les définitions de macros, les constantes, les déclarations de fonctions dans la bibliothèque standard du langage de programmation C pour effectuer des opérations, standard entrée et sortie, ainsi que la définition des types nécessaires à ces opérations. Pour des raisons de compatibilité, le langage de programmation C ++ (dérivé C) a également sa propre implémentation de ces fonctions, qui sont déclarées avec l'en-tête de fichier cstdio. La fonction que je dois utiliser est fprintf qui permet d'imprimer sur une fenêtre de terminal s'il y a une erreur.
  • stdlib.h : est le fichier d'en-tête de la bibliothèque standard du langage de programmation à usage général C. Il contient les prototypes de fonctions C pour la gestion dynamique de la mémoire, le contrôle des processus et autres. Il prend en charge C ++ où il est connu sous le nom de cstdlib. La fonction que j'utiliserai est quitter lorsque nous obtenons une erreur
  • unistd.h : fichier d'en-tête qui permet d'accéder à l'API du système d'exploitation POSIX. Sur les systèmes de type Unix, l'interface définie par unistd.h est généralement composée en grande partie de fonctions wrapper d'appel système telles que fork, pipe et primitives d'E/S (lecture, écriture, fermeture, etc.).
  • sys/io.h :cette famille de fonctions est utilisée pour effectuer des entrées et des sorties de port de bas niveau. Les fonctions out* font la sortie du port, les fonctions in* font l'entrée du port; les fonctions de suffixe b sont de largeur d'octet et les fonctions de suffixe w de largeur de mot ; les fonctions _p-suffix s'interrompent jusqu'à ce que l'E/S soit terminée. De cette fonction familiale j'utiliserai outb.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

Sous Linux, il est facile d'accéder et de contrôler le port parallèle, cependant, l'accès root doit être fortement pris en compte. Les bibliothèques ci-dessus sont toutes requises pour notre tutoriel d'aujourd'hui.

Définir l'adresse mémoire du port parallèle

Une fois inclus les bibliothèques, nous devons définir l'adresse mémoire attribuée au port parallèle, comme mentionné ci-dessus, l'adresse par défaut pour le premier port parallèle est 0x378.

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

Si vous rencontrez des problèmes pour essayer cette adresse, vous devez essayer 0x278.

Utilisation du bus de données comme port de sortie

Pour ce tutoriel de première partie, je vais utiliser le bus de données comme port de sortie. Dans le chapitre suivant, nous verrons comment l'utiliser comme port d'entrée de données ou même comme port mixte. Dans l'image ci-dessous, nous pouvons voir le contrôle d'un ensemble de 8 LED connectées, via des résistances de limitation de courant, au port parallèle, qui répondent à la valeur attribuée à l'adresse 0x378. La valeur des résistances peut varier de 100 Ohms à 300 Ohms, c'est important cette partie car nous pouvons endommager le port si nous ne limitons pas le courant.

Schéma


Remarque :la couleur des voyants n'a pas d'importance.

Circuit réel



Attention :soyez prudent lors de la manipulation du connecteur de port parallèle, soyez Assurez-vous de ne pas débrancher le circuit avant d'éteindre le PC. Cela peut endommager le port ou même la carte mère. Nous ne pouvons pas assumer les dommages que vous pourriez causer à vos appareils matériels.

Implémentation logicielle

Pour mes besoins, je vais vous montrer comment mettre certaines valeurs dans le port, et comment le timing de ces valeurs doit être fait, c'est une routine très simple pour vous montrer comment cela fonctionne.

Je vais maintenant vous expliquer toutes les commandes et tous les mots utilisés dans le logiciel de contrôle :

  • Étape 1 :Condition si l'utilisateur dispose de l'autorisation root pour accéder au port. L'argument de cette commande conditionnelle est ioperm qui définit les bits d'autorisation d'accès au port pour la base d'adresses de port.
if (ioperm(base,1,1))
  • Étape 2 :Si l'utilisateur ne dispose pas des privilèges suffisants pour accéder au port parallèle, une erreur d'accès s'affichera et l'exécution du programme se terminera.
fprintf(stderr, "Access denied to %x\n", base), exit(1);
  • Étape 3 :Si l'accès est accordé, une boucle for donnera une séquence d'activation et de désactivation des voyants par des valeurs prédéfinies à afficher dans le port. La fonction de temporisation que j'ai utilisée est sleep() qui fait dormir le thread appelant jusqu'à ce que les secondes de l'argument se soient écoulées.
        w=0;
        for (x=0; x=7; x++)  
            {        
            y=pow(2,w);
            outb(y, base);
            sleep(1);
            w=w+1;
               }


    Lorsque le traitement du code a dépassé la ligne d'accès autorisé,  'fprintf (stderr, "Accès refusé à% x \ n", base), exit (1); ', les broches de données du port parallèle sont disponibles à votre disposition et imagination. Dans mon cas, je ne prends qu'une séquence simple de la première conduite à la dernière avec un intervalle d'une seconde, en utilisant des puissances de base 2. (voir le lien vidéo). Cependant, les possibilités sont infinies, en fait, sans utiliser le multiplexage, vous pouvez contrôler jusqu'à 8 sorties indépendantes, avec les sorties de multiplexage, vous pouvez augmenter jusqu'à 255 possibilités. Selon l'application, que ce soit en termes de domotique, nous pouvons gérer le port sans multiplexage, en plaçant les tampons appropriés pour gérer des charges de courant plus élevées, qui seront traitées plus tard dans un autre tutoriel.


    Références :

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

    Axelson J. Port parallèle complet. Programmation, interfaçage et utilisation du port d'imprimante parallèle du PC. Amazon INC. ISBN : 0-9650819-1-5

    Kerrisk M. L'interface de programmation Linux. Projet de pages de manuel Linux. ISBN 978-1-59327-220-3


    Linux
    1. Comment trouver des fichiers avec des autorisations SUID et SGID sous Linux

    2. Flatpak sur Linux :qu'est-ce que c'est et comment installer des applications avec ?

    3. Comment compresser des fichiers et des répertoires sous Linux (avec exemples)

    4. Comment vérifier les ports ouverts sous Linux avec netstat, lsof et nmap

    5. Comment travailler avec des utilisateurs et des groupes sous Linux

    Comment faire une analyse de port sous Linux

    Qu'est-ce que Crontab et comment automatiser des tâches sous Linux avec Crontab

    Comment afficher l'utilisation du disque avec Duf sous Linux et Unix

    Comment rechercher et fermer des ports ouverts sous Linux

    Comment utiliser Netcat pour analyser les ports ouverts sous Linux

    Comment et pourquoi utiliser Linux pour installer Telnet