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

Bibliothèques Discussion :

[Linux][libusb] : utilisation de usb_get_descriptor_by_endpoint


Sujet :

Bibliothèques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de COGAN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 109
    Par défaut [Linux][libusb] : utilisation de usb_get_descriptor_by_endpoint
    Bonjour à tous,

    J'utilise une carte audio USB avec un certain nombre de sorties sur un endpoint, mais ce nombre n'est pas fixe !

    Je me suis dit : "Pas de problème, je vais lire le descripteur de ce endpoint !"

    Je pense alors avoir trouvé la solution en utilisant cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int usb_get_descriptor_by_endpoint(usb_dev_handle *dev, int ep, unsigned char type, unsigned char index, void *buf, int size);
    Mais avec la documentation de sourceforge, je n'arrive pas à comprendre l'utilisation de la fonction.

    Je fais donc appel à quelqu'un qui l'aurai déjà utilisée !

    Merci.

  2. #2
    Membre confirmé Avatar de COGAN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 109
    Par défaut Code retour négatif
    Lorsque j'utilise la fonction :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    struct usb_dev_handle * UsbAudioTst::AudioEsOpen()
    {
      struct usb_device * device;
      struct usb_bus * bus;
     
      struct usb_endpoint_descriptor * outEndPoint;
      struct usb_endpoint_descriptor * inEndPoint;
     
      // Initialiser la librairie USB
      usb_init();
      // Scanner tous les bus USB de la machine
      usb_find_busses();
      // Scanner tous les périphériques USB connectés
      usb_find_devices();
     
      // Parcourir tous les bus USB
      for ( bus = usb_get_busses(); bus != NULL; bus = bus->next )
      {
        struct usb_device * usb_devices = bus->devices;
        // Parcourir tous les périphériques USB connectés au bus
        for( device = usb_devices; device != NULL; device = device->next )
        {
          // Si le périphérique est la carte audio, alors
          if( device->descriptor.idVendor == AUDIO_VID && device->descriptor.idProduct == AUDIO_PID )
          {
            struct usb_dev_handle *d;
            // Ouvrir le bus USB sur le périphérique audio
            d = usb_open(device);
            // Si l'ouverture a réussie, alors
            if( d )
            {
              // Si il y a un échec pour la réservation du périphérique, alors
              if ( usb_claim_interface(d, interface_audio_es) )
              {
                // Refermer le bus USB
                usb_close(d);
                // Renvoyer un pointeur null
                return NULL;
              } else {
                // Récupérer le descripteur du EndPoint des sorties
                int retour =  usb_get_descriptor_by_endpoint(d, ES_ENDPPOINT_1_OUT, 0, 0, outEndPoint, sizeof(usb_endpoint_descriptor));
                if ( retour > 0)
                  nByteWriteAudio = outEndPoint->wMaxPacketSize;
                else
                  nByteWriteAudio = 0;
                // Renvoyer le pointeur sur le handle du périphérique USB
                return d;
              }
           }
         }
      }
      emit message(QString::fromUtf8("Carte audio non detectée sur le bus USB !"));
      return NULL;
    }
    Le code retour de usb_get_descriptor_by_endpoint (retour) est = -16

    Je continue...

    A+

  3. #3
    Membre confirmé Avatar de COGAN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 109
    Par défaut Utilisation d'une autre méthode
    J'ai abandonné l'utilisation de la fonction usb_get_descriptor_by_endpoint.
    J'utilise le code suivant :
    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
      // Parcourir tous les bus USB
      for ( bus = usb_get_busses(); bus != NULL; bus = bus->next )
      {
        struct usb_device * usb_devices = bus->devices;
        // Parcourir tous les peripheriques USB connectes au bus
        for( device = usb_devices; device != NULL; device = device->next )
        {
          // Si le peripherique est la carte audio, alors
          if( device->descriptor.idVendor == AUDIO_VID && device->descriptor.idProduct == AUDIO_PID )
          {
            for ( int i = 0; i < device->descriptor.bNumConfigurations; i++)
            {
              struct usb_config_descriptor *cfg = &device->config[i];
              for (int j = 0; j < cfg->bNumInterfaces; j++)
              {
                struct usb_interface *ifp = &cfg->interface[j];
                for (int k = 0; k < ifp->num_altsetting; k++)
                {
                  struct usb_interface_descriptor *as = &ifp->altsetting[k];
                  for(int l = 0; l < as->bNumEndpoints; l++)
                  {
                    struct usb_endpoint_descriptor *ep=&as->endpoint[l];
                    if ( ep->bEndpointAddress == ES_ENDPPOINT_1_IN )
                      _nbMaxByteInAudio = ep->wMaxPacketSize;
                    if ( ep->bEndpointAddress == ES_ENDPPOINT_1_OUT )
                      _nbMaxByteOutAudio = ep->wMaxPacketSize;
                  }
                }
              }
            }
          }
        }
      }
    Je récupère directement mes données _nbMaxByteInAudio et _nbMaxByteOutAudio dans les descripteurs.

    Je poste cette solution à tout hasard !
    Peut-être ne suis-je pas le seul à utiliser la librairie "libusb" ?

  4. #4
    Nouveau candidat au Club
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Par défaut
    Citation Envoyé par COGAN Voir le message
    J'ai abandonné l'utilisation de la fonction usb_get_descriptor_by_endpoint.
    J'utilise le code suivant :
    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
      // Parcourir tous les bus USB
      for ( bus = usb_get_busses(); bus != NULL; bus = bus->next )
      {
        struct usb_device * usb_devices = bus->devices;
        // Parcourir tous les peripheriques USB connectes au bus
        for( device = usb_devices; device != NULL; device = device->next )
        {
          // Si le peripherique est la carte audio, alors
          if( device->descriptor.idVendor == AUDIO_VID && device->descriptor.idProduct == AUDIO_PID )
          {
            for ( int i = 0; i < device->descriptor.bNumConfigurations; i++)
            {
              struct usb_config_descriptor *cfg = &device->config[i];
              for (int j = 0; j < cfg->bNumInterfaces; j++)
              {
                struct usb_interface *ifp = &cfg->interface[j];
                for (int k = 0; k < ifp->num_altsetting; k++)
                {
                  struct usb_interface_descriptor *as = &ifp->altsetting[k];
                  for(int l = 0; l < as->bNumEndpoints; l++)
                  {
                    struct usb_endpoint_descriptor *ep=&as->endpoint[l];
                    if ( ep->bEndpointAddress == ES_ENDPPOINT_1_IN )
                      _nbMaxByteInAudio = ep->wMaxPacketSize;
                    if ( ep->bEndpointAddress == ES_ENDPPOINT_1_OUT )
                      _nbMaxByteOutAudio = ep->wMaxPacketSize;
                  }
                }
              }
            }
          }
        }
      }
    Je récupère directement mes données _nbMaxByteInAudio et _nbMaxByteOutAudio dans les descripteurs.
    Je poste cette solution à tout hasard !
    Peut-être ne suis-je pas le seul à utiliser la librairie "libusb" ?
    bonjour, je me demandais est-ce que ce code était du C# ou autre chose? voilà je m'explique je dois réaliser un projet qui consiste à lier deux PC à l'aide d'un câble USB en C# donc ce code si'il était en C# il me serait vraiment très utile le problème c'est que c'est la première fois que j'utilise le C# donc voilà
    ce que je voudrais savoir est-ce que c'est du C# ou non? si OUI alors un grand MERCI! si non est-ce que vous pourriez poster la version en C# et un GRAND MERCI.

    himdene!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/06/2014, 12h03
  2. Réponses: 0
    Dernier message: 11/06/2012, 18h20
  3. Réponses: 3
    Dernier message: 11/05/2009, 02h02
  4. Réponses: 8
    Dernier message: 16/04/2009, 06h51
  5. [NASM / Linux 64] Utiliser les fonctions standard du C
    Par j0o0 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 27/01/2009, 21h07

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