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

MFC Discussion :

[C++] Simulation déco / reco d'un device USB


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut [C++] Simulation déco / reco d'un device USB
    Bonjour !

    Je souhaite écrire un programme permettant de simuler la déconnection puis la reconnection d'un périphérique USB, de telle manière que le processus d'énumération habituel de Windows soit effectué.

    Je me suis tout d'abord orienté vers DevCon de Windows Server 2003 DDK. J'ai voulu recompiler le programme à partir des sources mais je n'ai pas réussi au vu des trops nombreux headers manquants...

    J'ai ensuite pensé essayer de manipuler le port USB où le device est branché à l'aide de DeviceIoControl : désactivation puis réactivation du port mais je n'ai pas réussi.... Je me suis renseigné et j'ai l'impression que ce n'est pas trop possible...
    (j'ai le handler + le port usb, le problème vient de la requête...).

    Qu'en pensez-vous et que me conseillez-vous ?

    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Bonjour à tous,

    J'ai finalement réussi à aller jusqu'au bout de la piste DevCon pour au final me rendre compte que ça ne correspondait pas totalement à mes attentes.
    En effet, ça ne simule pas réellement une déconnection physique car le device usb est toujours alimenté.

    Je m'oriente donc à présent sur la gestion de la tension du port.
    Avez-vous des idées qui me permettrait de faire du power on ou off sur un port bien spécifique (ou voir sur un root hub complet) ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Dans la suite de ma reflexion, je viens de voir que Windows est capable d'éteindre des périphériques pour économiser l'énergie.

    Ainsi dans les propriétés de "Concentrateur USB Racine" (Gestionnaire de périphérique) où mon device est attaché, dans l'onglet "Gestion de l'alimentation" on trouve "Autoriser l'ordinateur a éteindre ce périphérique pour économiser l'énergie".

    Peut être que cette option ne sert à rien et que windows n'éteind jamais les ports usb.
    Dans le cas contraire en revanche, celà voudrait dire qu'il doit bien exister une commande quelque part pour éteindre les périphériques...

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Peut être du côté du power managment, mais j'ai un doute:
    http://msdn.microsoft.com/library/en..._PowerMgmt.asp
    en plus ça pose problème je crois la mise en veille de certains périph (marche pas très bien).
    Regarde peut être plutôt du côté de la désactivation du périph.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Merci pour ta réponse !

    Je suis allé voir à l'adresse que tu m'as fourni mais ça concerne plus le comportement des périphériques lors d'une mise en veille Windows...
    J'ai aussi testé le comportement du hub usb lors d'une mise en veille et, même si sa tension est (peut être) réduite, il reste alimenté (au vu de sa diode d'état), et donc le périphérique aussi.
    Idem lors d'une désactivation, que ce soit le périphérique, le hub externe ou le hub interne (où le hub esterne est branché).

    J'ai vu dans les spécifications usb qu'il est possible de gérer l'alimentation des ports usb (via Set Port Feature).
    J'ai voulu de ce fait tenter via DeviceIoControl d'envoyer une requête au hub mais j'ai un paramètre manquant (le dwIoControlCode)
    (cf http://msdn.microsoft.com/library/de...eiocontrol.asp)
    Je n'ai pas trouvé le paramètre dans le header usbioctl.h...

    Voici la portion de mon code concernée par l'opération :

    //Booléen de retour pour la primitive DeviceIoControl, Ok = nonzero
    bool Success;
    //Structure de requête (idem pour Hub)
    DESCRIPTOR_REQUEST Packet;
    //Taille des données écrites dans "Packet" par DeviceIoControl
    DWORD BytesReturned;

    //Préparation de Packet pour la requête
    memset(&Packet, 0, sizeof(Packet));
    Packet.ConnectionIndex = PortIndex;

    //On va remplir le Bitmap Request
    //Ici on dit qu'on veut un SET_FEATURE
    Packet.SetupPacket.bmRequest = 0x23;
    Packet.SetupPacket.bRequest = 0x00;

    Packet.SetupPacket.wValue[1] = 0x08; //PORT_POWER;
    //Le port concerné
    Packet.SetupPacket.wIndex[1] = PortIndex;
    Packet.SetupPacket.wLength[1] = 1; //Utilisation d'un buffer 2K

    //Lancement de la commande
    Success = (DeviceIoControl(HubHandle, ???, &Packet, sizeof(Packet), &Packet, sizeof(Packet), &BytesReturned, NULL) !=0 );


    Je ne suis pas non plus un pro des commandes DevicIoControl et il est probable que le code présenté soit inexact.

    Je ne sais pas trop si vous pouvez m'aider sur quelque chose de si précis mais je suis ouvert à tout.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Finalement, je pense avoir trouvé un IOCTL qui pourrait convenir :
    IOCTL_INTERNAL_USB_CYCLE_PORT.

    J'aimerais le tester pour vérifier qu'il convient bien.
    J'ai essayé via DeviceIoControl mais sans succès :

    Success = (DeviceIoControl(HubHandle, IOCTL_INTERNAL_USB_CYCLE_PORT, NULL, 0, NULL, 0, NULL, NULL) !=0 );

    Success = false et GetLastError me renvoie 1 (ERROR_INVALID_FUNCTION).

    Savez-vous comment utiliser ce IOCTL ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Bon, après recherche, j'ai cru comprendre que cet IOCTL ne convenait que pour un driver (INTERNAL), ce qui n'est pas mon cas...

    Dans mes recherches je suis tombé sur IOCTL_USB_HUB_CYCLE_PORT qui m'a l'air mieux.
    Par contre, toujours aussi peu d'information concernant son utilisation...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Finalement après test, celà ne correspond toujours pas à mes attentes car il n'y a pas de power off du port...

Discussions similaires

  1. [Débutant] get vid et pid d'un device USB
    Par hatemk dans le forum C#
    Réponses: 0
    Dernier message: 24/05/2012, 11h25
  2. Réponses: 5
    Dernier message: 23/01/2012, 15h24
  3. Simuler la connexion d'un boitier usb
    Par fabienlege dans le forum C++
    Réponses: 4
    Dernier message: 13/06/2010, 15h48
  4. installation device usb
    Par mongolic dans le forum Matériel
    Réponses: 1
    Dernier message: 12/11/2009, 00h32
  5. Acceder en c++ à un device USB "composé"
    Par wooshoo dans le forum Windows
    Réponses: 4
    Dernier message: 16/03/2006, 15h08

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