IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Récupération de l'adresse d'un port


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut Récupération de l'adresse d'un port
    Bonjour,

    Je suis tombé sur le code d'un module destiné à piloter une LED située en face avant d'un petit PC, pouvant prendre 3 états (rouge, orange, éteinte). J'ai globalement compris le code (fourni pour les versions 2.0 et 2.2 du noyau Linux) à l'exception de cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static int read_base_addr(void){
        int addr;
        unsigned int msb, lsb;
        outb(0x07, 0x2E);
        outb(0x07, 0x2F);
        outb(0x60, 0x2E);
        msb = inb(0x2F);
        outb(0x61, 0x2E);
        lsb = inb(0x2F);
        addr = (msb << 8) + lsb;
        outb(0x0F, addr + 1);
        return addr;
    }
    Elle est censée lire l'adresse du port contrôlant la LED, je comprends la signification de chaque instruction (écrire l'octet 0x07 sur le port d'adresse 0x2E, etc), mais pourquoi fait-on cela ?

    Merci par avance...

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    Je suis tombé sur le code d'un module destiné à piloter une LED située en face avant d'un petit PC, pouvant prendre 3 états (rouge, orange, éteinte). J'ai globalement compris le code (fourni pour les versions 2.0 et 2.2 du noyau Linux) à l'exception de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static int read_base_addr(void){
        int addr;
        unsigned int msb, lsb;
        outb(0x07, 0x2E);
        outb(0x07, 0x2F);
        outb(0x60, 0x2E);
        msb = inb(0x2F);
        outb(0x61, 0x2E);
        lsb = inb(0x2F);
        addr = (msb << 8) + lsb;
        outb(0x0F, addr + 1);
        return addr;
    }
    Elle est censée lire l'adresse du port contrôlant la LED, je comprends la signification de chaque instruction (écrire l'octet 0x07 sur le port d'adresse 0x2E, etc), mais pourquoi fait-on cela ?

    Merci par avance...
    C'est donc du code kernel Linux ancien.

    outb(0x07, 0x2E);
    on écrit 7h dans le composant situé à l'adresse I/0 2Eh

    outb(0x07, 0x2F);
    on écrit 7h dans le composant situé à l'adresse I/0 2Fh

    outb(0x60, 0x2E);
    on écrit 60h dans le composant situé à l'adresse I/0 2Eh

    msb = inb(0x2F);
    on lit dans le composant situé à l'adresse I/0 2Fh

    outb(0x61, 0x2E);
    on écrit 61h dans le composant situé à l'adresse I/0 2Eh

    lsb = inb(0x2F);
    on lit dans le composant situé à l'adresse I/0 2Fh

    addr = (msb << 8) + lsb;
    on constitue une adresse 16-bit avec les 2 valeurs lues

    outb(0x0F, addr + 1);
    on écrit Fh dans le composant situé à l'adresse lue
    .
    J'ai un peu du mal à voir comment ça peut agir sur des LEDs... Je vais me renseigner sur ces composants...

    D'après ceci

    Registre 2Eh et 2Fh : semblent liés au port // EPP ? Bizarre.

    Je n'ai pas de réponse...

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    D'abord merci pour ta réponse ! Il s'agit en fait de l'écriture d'un pilote (d'où les outb, inb...).

    outb(0x07, 0x2E);
    on écrit 0x02E dans le composant situé à l'adresse I/0 0h, registre 7h
    Je crois qu'ici, l'ordre des paramètres est inversé : on écrit 0x07 à l'adresse 0x2E. Voici le lien vers l'article :

    http://pficheux.free.fr/articles/lmf/drivers/

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    Je crois qu'ici, l'ordre des paramètres est inversé : on écrit 0x07 à l'adresse 0x2E.
    C'est très bizarre, mais je crois que tu as raison.

    Je vais réécrire ma réponse dans ce sens.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    Après de longues recherches, voici ce que j'ai compris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    static int read_base_addr(void){
        int addr;
        unsigned int msb, lsb;
        /* Select SuperIO chip for querying */
        outb(0x07, 0x2E);
        outb(0x07, 0x2F);
        /* Select and read the high-nibble of the GPIO base address */
        outb(0x60, 0x2E);
        msb = inb(0x2F);
        /* Select and read the low-nibble of the GPIO base address */
        outb(0x61, 0x2E);
        lsb = inb(0x2F);
        addr = (msb << 8) + lsb;
        /* ? */
        outb(0x0F, addr + 1);
        return addr;
    }
    Les GPIO sont des ports d'entrée/sortie à usage général, la première adresse (16 bits) doit donc servir à piloter la LED sur la machine de l'auteur de l'article...

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    Les GPIO sont des ports d'entrée/sortie à usage général, la première adresse (16 bits) doit donc servir à piloter la LED sur la machine de l'auteur de l'article...
    Tu es sur un PC ?

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    Oui, mais je ne cherche pas à éxécuter ce code, je veux simplement le comprendre... L'auteur du programme était aussi sur un petit PC architecturé autour d'un processeur MediaGX. Pourquoi ?

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    Oui, mais je ne cherche pas à éxécuter ce code, je veux simplement le comprendre... L'auteur du programme était aussi sur un petit PC architecturé autour d'un processeur MediaGX. Pourquoi ?
    C'est important, car il agit directement sur le matériel. Or tu me parles de GPIO, je n'ai jamais entendu parlé de ça sur un PC... C'est probablement une extension fournie par MediaGX (Cyrix : ordinosaure !) ...

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Or tu me parles de GPIO, je n'ai jamais entendu parlé de ça sur un PC... C'est peut être une extension fournie par MediaGX...
    Moi je n'avais jamais entendu parler de GPIO tout court

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    Moi je n'avais jamais entendu parler de GPIO tout court
    General Purpose Input/Output : C'est un port // d'E/S d'usage général. Je suppose que ce port fait partie de l'architecture antique MediaGX et que les LEDS sont câblées dessus.

    Tout ce qui concerne les I/O matérielles est, par définition, lié à l'architecture matérielle.

    Nota : Je n'ai pas pu trouver la doc du MediaGX sur http://www.national.com/

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    Merci pour ces précisions !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération d'une adresse mac
    Par ouss dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/04/2009, 10h00
  2. [C#] Sockets, récupération de l'adresse IP locale
    Par dockurt2k dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/09/2006, 22h30
  3. Réponses: 6
    Dernier message: 28/02/2006, 17h41
  4. récupération de d'octet venant du port série
    Par jekeclo dans le forum Access
    Réponses: 2
    Dernier message: 29/11/2005, 17h14
  5. Récupération de l'adresse ip d'une interface précise
    Par PierreBo dans le forum Développement
    Réponses: 1
    Dernier message: 20/09/2005, 15h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo