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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

+ 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