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

Windows Discussion :

piloter des I/O de carte mère en C


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut piloter des I/O de carte mère en C
    Bonjour,

    j'essaye de piloter des I/O d'une carte mère mini-ITX (Axiomtek SBC86807). Je sais que sous Xp, on ne peut pas attaquer directement avec inportb/outportb. J'ai donc essayer par un CreateFile, çà compile mais ne marche pas: INVALID_HANDLE_VALUE

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <windows.h>
    #include <iostream>
    #include <dos.h>
    
    #define ADDR_DIO   0x40B8
    
    void Init_IO( void );
    void Write_IO( long data );
    
    
    using namespace std;
    HANDLE hIO;      // déclarer un handle  
    
    int main (int argc, char *argv[])
    { 
        Init_IO();
        Write_IO(0x00);
        cout << "Press ENTER to continue..." << endl; 
        cin.get();
        return 0;
    }
    
    
    void Init_IO( void )
    {
    
     char adresse[7];
     sprintf( adresse, "0x40B8");
    
     hIO = CreateFile( adresse, GENERIC_READ | GENERIC_WRITE, 0, NULL,                            
           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    
    	if( hIO == INVALID_HANDLE_VALUE )
        	cout << "Error opening IO!" << endl;
    }
    
    void Write_IO( long data )
    {
         DWORD written;  // variable qui recoit le nombre de byte écrit
         WriteFile( hIO, &data, 1, &written, NULL );
    }

    Voilà, je pige pas trop pourquoi çà marche pas.... j'ai un doute sur mon adresse....

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    INVALID_HANDLE_VALUE n'existe pas dans le MSDN que j'ai..
    d'ou vient l'exemple ?
    Et puis tu seras obligé de créer un thread ou Event pour lire les ports..sinon tu risques d'avoir des problèmes de synchro de lecture et d'envoi

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    j'ai tapé CreateFile dans Google, tomber sur le site MS (http://msdn2.microsoft.com/en-us/lib...58(VS.85).aspx) et vu que si la fonction plante, la valeur retournée est INVALID_HANDLE_VALUE, d'où mon if.

    Ce sont des I/O très simple, juste pour piloter une LED par exemple.

    J'ai oublié de dire que j'étais sous DevC++

  4. #4
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Pour communiquer avec du matériel, ne faut il pas un driver? (ring 0)
    Si tu en utilises-un, autant utiliser les IRP via les IOCTL.
    SI tu n'en utilises-pas alors peut être serait il intéressant d'en créer un via le DDK?
    Un driver n'est pas obligatoire bien entendu pour communiquer avec des ports. (tu peux écrire et lire sur des ports directement en ASM, mais j'ignore si des fonctions équivalent existe dans les API de windows (autre que celle du DDK))
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Euh.... je suis électronicien à la base alors "utiliser les IRP via les IOCTL" çà me parle pas du tout...

    j'ai compris le principe des ring par contre. donc j'ai 3 possibilités ?

    - écrire un driver (compliqué pour moi çà)
    - récupérer un driver (lequel ?)
    - modifier les permissions avant d'écrire/lire sur les I/O. (faisable?)

    merci pour vos réponses en tout cas.

  6. #6
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonsoir,

    - écrire un driver (compliqué pour moi çà)

    ça ce fait en C, pour Windows tu trouvera toutes les informations dans le DDK (avec une exelente documentation te permettant de te lancer).

    - récupérer un driver (lequel ?)

    Si c'est un périphérique que tu as conçus toi même, il ne doit pas y en avoir il faut en écrire un toi même.

    - modifier les permissions avant d'écrire/lire sur les I/O. (faisable?)

    Mhhh, j'ai en tête que le debug privilège permet d'executer des APIs utilisable uniquement en ring0 (tels les ZW*) (à tester/verifier)

    Coder ça en assembleur pourrait être une autre possibilité.
    (ou utiliser de l'assembleur dans le code écrit en C)
    (ou encore vérifier s'il n'existe pas une fonction dans l'API win32)
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette réponse qui me précise quelques points.

    Je suis en train de regarder le DDK (j'ai l'impression que çà s'appelle plutôt WDk maintenant), çà me parait un peu sortir la grosse artillerie pour un truc simple.

    J'ai récupérer un truc qui s'appelle NTport library et qui m'a permis de piloter mes ports simplement. Le hic c'est une version d'éval. (un équivalent en free?)

    allez, encore merci

Discussions similaires

  1. Réponses: 12
    Dernier message: 23/01/2008, 11h45
  2. pilote pour carte mère d'un portable
    Par vampyer972 dans le forum Composants
    Réponses: 3
    Dernier message: 07/04/2006, 20h10
  3. Sens des connecteurs sur carte mère
    Par SteelBox dans le forum Composants
    Réponses: 2
    Dernier message: 04/01/2006, 13h00
  4. Pour les spécialistes des Cartes Mères !
    Par zakuli dans le forum Composants
    Réponses: 8
    Dernier message: 04/12/2005, 07h30
  5. choix d'une carte mère pour des besoins précis
    Par Angelle dans le forum Composants
    Réponses: 6
    Dernier message: 12/10/2005, 13h05

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