2016-09-26 3 views
0

Je suis en œuvre un dispositif HID personnalisé qui a l'interface suivante:USB HID différence entre « Obtenir le rapport d'entrée » et « Rapport d'entrée »

0x06, 0xA0, 0xFF, // Usage Page (Vendor Defined 0xFFA0) 
0x09, 0x01,  // Usage (0x01) 
0xA1, 0x01,  // Collection (Application) 

0x85, 0x01,  // Report ID (1) 
0x15, 0x00,  // Logical Minimum (0) 
0x26, 0x01, 0x00, // Logical Maximum (1) 
0x75, 0x08,  // Report Size (8) 
0x95, 0x01,  // Report Count (1) 
0x91, 0x02,  // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 

0x85, 0x01,  // Report ID (1) 
0x15, 0x00,  // Logical Minimum (0) 
0x26, 0x01, 0x00, // Logical Maximum (1) 
0x75, 0x01,  // Report Size (1) 
0x95, 0x02,  // Report Count (2) 
0x81, 0x02,  // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 
0x75, 0x06,  // Report Size (6) 
0x95, 0x01,  // Report Count (1) 
0x81, 0x01,  // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) 

0x85, 0x03,  // Report ID (1) 
0x15, 0x00,  // Logical Minimum (0) 
0x26, 0xFF, 0xFF, // Logical Maximum (65535) 
0x75, 0x10,  // Report Size (16) 
0x95, 0x01,  // Report Count (1) 
0xB1, 0x02,  // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 

0xC0,    // End Collection 

Lorsque je branche l'appareil à l'ordinateur par une logique USB analyseur je vois énumèrent, alors quelque chose (je ne sais pas quoi, des idées?) utilise le descripteur caché du rapport de saisir intelligemment un tas de rapports:

(control)(endpoint 0) Get Input Report[1] 
(control)(endpoint 0) Get Feature Report[1] 

l'entrée « Obtenir le rapport d'entrée » me confondre comme Je pensais que les rapports d'entrée étaient envoyés via un transfert d'interruption. Si j'utilise hid_write de usbhid, je vois l'entrée suivante je dois donc être au moins la moitié droite sur les rapports d'entrée étant envoyés par des transferts d'interruption ...:

(interrupt)(endpoint 1) Input Report[1]" 

Je suis incapable de trouver des informations décrivant la différence entre contrôler "obtenir des rapports d'entrée" et d'interrompre les transferts de "rapport d'entrée" dont j'espère que l'un d'entre vous saura.

Pourquoi le contrôle "obtenir des rapports d'entrée" existe-t-il?

Pourquoi ne pas simplement avoir le mandat de spécification d'une entrée "get feature report" existe pour chaque entrée "input report"? Pourquoi est-ce que saisir des rapports d'entrée/de fonction est nécessaire pour chaque rapport d'entrée/fonction défini en utilisant un transfert de contrôle pour les rapports d'entrée par rapport à un transfert d'interruption?

Répondre

0

Jetez un oeil à USB HID v1.1, il y a définition de la demande Get_Report à la page 51:

Cette demande est utile au moment de l'initialisation des éléments absolus et pour déterminer l'état des éléments de fonction. Cette demande n'est pas destinée à être utilisée pour interroger l'état de l'appareil sur une base régulière.

Ici, c'est exactement ce que fait le pilote: il récupère les différents rapports pour initialiser son état actuel. Notez que l'hôte ne peut pas demander au périphérique d'envoyer un rapport sur son canal d'interruption. D'où la demande sur le tuyau de contrôle.

Le chapitre 4.4 explique l'utilisation des différents points de terminaison. Notez également que les rapports de fonctionnalité et les rapports d'entrée n'abordent pas les mêmes données, même s'ils ont le même ID de rapport (les ID de rapport sont par type de rapport).