2016-12-22 1 views
0

Creuser avec/pour les rapports HID, j'ai rencontré un problème étrange dans un périphérique USB HID. J'implémente un périphérique de classe HID et j'ai basé mon programme sur le programme USB HID fourni par Keil. Certains codes ont été modifiés dans ce projet et il semble fonctionner correctement avec une entrée de 32 octets et un rapport de sortie de 32 octets. D'une manière ou d'une autre, après des milliers de transferts de données, l'Endpoint 1 serait suspendu et deviendrait un mauvais tuyau. Ensuite, j'ai cherché sur le google pour quelques conseils, un sujet me rappelle que nous devrions écrire un paquet de données de longueur zéro après l'envoi d'une longueur de paquet correspondant à ce que vous avez défini dans la description du rapport. Mais ça ne marche pas pour moi. Ensuite, j'écris une longueur de données zéro à la pipe de contrôle après avoir reçu un paquet de sortie et comme par magie, ça marche! Il ne serait jamais suspendu après des millions de transferts!usb hid: pourquoi devrais-je écrire "null" dans le tube de commande dans l'interruption du point de sortie

Voici ma question: Pourquoi cela fonctionne-t-il après l'écriture d'un zéro de longueur de données dans un tube de commande. Les données transférées dans le tube de sortie ne doivent pas avoir de relation avec les données dans le tube de commande. Ça me perturbe!

+0

Se reporter à: [Demandez] et s'il vous plaît montrer un [MCVE]. Vous n'avez même pas pris la peine de terminer la visite du site de 2 minutes avant de demander. –

Répondre

0

Si vous transférez des données inférieures à la taille de charge utile prévue, vous devez envoyer un paquet de longueur zéro pour indiquer que les données ont été transférées.

Mais cela dépend fortement de l'implémentation sur le contrôleur hôte, et tous les périphériques ne suivent pas la spécification au point et peuvent bloquer.

Source:
When do USB Hosts require a zero-length IN packet at the end of a Control Read Transfer?

+0

Merci pour votre réponse. L'information que vous m'avez fournie m'a vraiment beaucoup aidé. J'ai compris que la raison pour laquelle j'ai besoin d'envoyer ZLP après l'envoi d'un paquet USB est que chaque transaction USB OUT a besoin d'un ACK de l'appareil après avoir envoyé un paquet USB avec succès. Peu importe la taille de la charge utile que l'appareil envoie. –

+0

rectifier le commentaire: pas après l'envoi, c'est après réception. –