La lecture et l'écriture à l'USB (HID) interrompre les points de terminaison sur Mac

Je suis tente de communiquer avec un plutôt périphérique USB spécifique et de développer à la fois Windows et Mac code pour le faire.

Le périphérique est un périphérique USB avec une interface HID (classe 3) avec deux points d'extrémité, une entrée d'interruption et une interruption de la production. La nature de l'appareil est telle que les données sont envoyées à partir de l'appareil sur l'entrée d'extrémité seulement lorsque des données sont demandées à partir de l'hôte: l'hôte envoie des données qui le périphérique répond sur son entrée d'interruption de point de terminaison. L'obtention de données de l'appareil (l'écriture) est beaucoup plus simple...

Le code pour Windows est plutôt simple: je reçois une poignée de l'appareil, puis en appel, soit ReadFile ou WriteFile. Apparemment, une grande partie de la sous-jacentes du comportement asynchrone est une abstraction de l'extérieur. Il semble bien fonctionner.

Sur Mac, cependant, c'est un peu collante. J'ai essayé un certain nombre de choses, aucun qui ont été pleinement réussie, mais ici sont les deux choses qui semble la plus prometteuse...

1.) Tenter d'obtenir l'accès à l'appareil (USB) via IOUSBInterfaceInterface, itérer sur les systèmes d'extrémité pour déterminer l'entrée et la sortie des points de terminaison, et (espérons-le) de l'utilisation de ReadPipe et WritePipe de communiquer. Malheureusement, je suis incapable d'ouvrir l'interface une fois que je l'ai, avec la valeur de retour (kIOReturnExclusiveAccess) en notant que quelque chose a déjà l'appareil ouvert exclusivement. J'ai essayé d'utiliser IOUSBinterfaceInterface183, de sorte que je pouvais l'appeler USBInterfaceOpenSeize, mais que les résultats dans le même retourner la valeur de l'erreur.

--- mise à jour 7/30/2010 ---

Apparemment, Apple IOUSBHIDDriver correspond au début de l appareil et c'est ce qui est probablement la prévention de l'ouverture de la IOUSBInterfaceInterface. Depuis le creusement du sujet il me semble que la façon la plus courante pour prévenir la IOUSBHIDDriver à partir de la correspondance est d'écrire un code-moins kext (extension du noyau) avec une sonde de score. Cela permettrait de match au début, la prévention de la IOUSBHIDDriver de l'ouverture de l'appareil, et devrait, en théorie, permettez-moi d'ouvrir l'interface et à écrire et à lire, pour les effets directement. C'est OK, je préfèrerais ne pas avoir à installer quelque chose sur l'ordinateur de l'utilisateur. Si quelqu'un connaît une solide alternative je serais reconnaissant pour l'information.

2.) Ouvrir l'appareil comme un IOHIDDeviceInterface122 (ou plus tard). À lire, j'ai mis en place un async port, source de l'événement et de la méthode de rappel à appeler lorsque les données sont prêtes lorsque les données sont envoyées à partir de l'appareil sur l'entrée d'interruption de point de terminaison. Cependant, pour écrire les données que l'appareil a besoin — pour initialiser une réponse je ne peux pas trouver un moyen. Je suis perplexe. setReport généralement écrit pour le contrôle de l'ordinateur d'extrémité, plus j'ai besoin d'une écriture qui ne vous attendez pas à une réponse directe, pas de blocage.

J'ai regardé autour en ligne et ont essayé beaucoup de choses, mais aucun d'entre eux me donne le succès. Tous les conseils? Je ne peux pas utiliser une grande partie de l'Apple HIDManager code depuis beaucoup de qui est de 10,5+ et mon application doit fonctionner sur 10.4 ainsi.

InformationsquelleAutor Demi | 2010-07-30