2009-07-24 9 views
10

Cela peut ne pas être considéré comme directement lié à la programmation, mais je ne sais pas où poser la question. J'ai essayé de regarder une variété de sites Web, mais jusqu'à présent, Google n'a pas été mon ami. Je n'arrive pas à savoir si j'ai besoin d'écrire mon propre pilote de périphérique pour les différentes plates-formes Windows/Linux/Mac auxquelles le périphérique que je développe peut être connecté ou si la fonctionnalité est fournie par les pilotes standard.Ai-je besoin d'écrire mon propre pilote USB côté hôte pour un périphérique CDC?

Mon périphérique est un CDC USB (périphérique de communication) qui apparaît sous la forme d'un port COM :. Il comprend également un chargeur de batterie qui, une fois que l'appareil a été énuméré, nécessite le courant d'alimentation complet de 5 unités (500 mA) pouvant être prélevé sur le connecteur USB. Mon problème est que si le pilote USB de l'hôte décide qu'il ne peut pas fournir le courant d'alimentation complet, il devrait échouer à énumérer le périphérique.

Si, en tant que solution de secours, je fournis un second jeu de configuration qui permet uniquement au périphérique de tirer une unité de charge du connecteur d'interface, les pilotes standard énumèrent le périphérique à l'aide de cette configuration.

+0

Je crois que vous devez d'abord regarder dans la spécification USB pour voir si ces choses sont autorisés. Si la spécification le permet, les navigateurs standards le supporteront probablement. – kgiannakakis

+0

Dans la spécification USB 2.0, le descripteur de périphérique permet un certain nombre de configurations, dont chacune peut spécifier qu'elle nécessite une certaine quantité d'énergie de l'interface. Je présume que ce serait au conducteur de choisir entre ces différentes configurations. –

Répondre

6

Vous devez écrire un fichier .inf pour Windows qui lie votre appareil VID et PID avec le système usbser.sys. Le mien ressemble à ceci (Remplacer VotreEntreprise si nécessaire, mettre dans votre VID et PID (en hexadécimal) et changer la ligne DriverVer à ce que la date et la version que vous voulez):

; ----------------------------------------------------------------------------- 
; XP/2000 USB Comms Port Setup 
; ----------------------------------------------------------------------------- 

[Version] 
DriverVer=12/03/2008,1.0.0000.0000 
Signature="$Windows NT$" 
Class=Ports 
ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318} 
Provider=%YourCompany% 

[DestinationDirs] 
DefaultDestDir=10,system32\drivers 
DriverCopyFiles=12 

[ControlFlags] 
ExcludeFromSelect = * 

[Manufacturer] 
%YourCOmpany%=YourCompanySerialPort 

[YourCompanySerialPort] 
%YourCompanyUSBSerialPort%=YOURCOMPANYUSB,USB\VID_1234&PID_ABCD 

; 
; Win 2000/XP 
; 
[YOURCOMPANYUSB] 
Include=mdmcpq.inf 
CopyFiles=FakeModemCopyFileSection 

[YOURCOMPANYUSB.HW] 
AddReg=YOURCOMPANYUSBAddReg.HW 

[YOURCOMPANYUSBAddReg.HW] 
HKR,,DevLoader,0,*ntkern 
HKR,,NTMPDriver,,"usbser.sys" 

[YOURCOMPANYUSB.Services] 
AddService=usbser, 0x00000002, FuncDrv_Service_Inst 

[FuncDrv_Service_Inst] 
DisplayName=%USBFilterString% 
ServiceType= 1 
StartType = 3 
ErrorControl = 0 
ServiceBinary = %12%\usbser.sys 

[Strings] 
YourCompany="YourCompany" 
YourCompanySerialPort="Your Company USB Serial Port" 
USBFilterString = "USB Serial Service" 

Notez que cela fonctionne avec 32 bits des systèmes d'exploitation seulement . Il fonctionne également avec Vista bien que l'en-tête du fichier ne le dise pas! Sachez que certaines versions de usbser.sys ont des problèmes importants, y compris le bluescreening, par exemple lors du transfert de paquets qui sont des multiples exacts de 64 octets. Si vous utilisez XP SP2 ou précédent, installez le correctif KB943198. XP SP3 et Vista vont bien.

Pour le Mac, il vous suffit de signaler correctement votre classe de périphérique et le scan du pilote détecte les pilotes corrects. (Windows ignore la classe de périphérique, c'est pourquoi vous devez fournir le fichier .inf).

EDIT: Désolé, j'aurais dû être plus clair. Cela ne manquera pas d'énumérer si elle ne peut pas tirer le plein chargement - je ne suis pas sûr que ce soit possible.

+1

J'essaye d'installer ce pilote automatiquement par opposition à l'utilisateur ayant besoin d'aller au gestionnaire de périphériques (bien que cela fonctionne). J'ai essayé juste en utilisant le clic droit installer et en utilisant également la méthode décrite à http://stackoverflow.com/questions/677686/how-do-i-deploy-a-inf-based-driver. Dans les deux cas lorsque je branche l'appareil, il affiche l'Assistant Nouveau matériel et, bien qu'il apparaisse sous Ports dans le Gestionnaire de périphériques, aucun pilote n'est associé à ce dernier. Un peu plus de détails: –

+0

... J'essaie Windows XP et en utilisant une puce Cypress. Cypress fournit un fichier .inf pour cela (http://www.cypress.com/?rID=40248) qui est assez différent, par exemple CopyFiles est défini sur DriverCopyFiles, pas FakeModemCopyFileSection. Toute suggestion? –

+0

Nous avons utilisé usbser.sys comme pilote pour un certain nombre de produits fabriqués par mon entreprise et je n'ai jamais trouvé un moyen facile d'éviter le "Found New Hardware Wizard" dans Windows XP. Si vous le faites, s'il vous plaît laissez-moi savoir. Les bonnes nouvelles sont que, en utilisant le même fichier inf, les pilotes peuvent être installés automatiquement sans assistant dans Windows Vista et Windows 7 si le périphérique est branché après l'installation du fichier inf. –

1

Je ne suis pas sûr de la question de l'alimentation, mais il ya des pilotes CDC pleanty (ou je pense qu'il existe), donc vous pouvez en utiliser un. Pour la question de l'alimentation, la solution avec beaucoup de configuration est probablement bonne, je n'ai jamais rencontré cela dans le travail (j'ai un analyseur USB) mais à la maison parfois quand j'ai 3 appareils différents ou plus qui nécessite de l'alimentation USB. Je suppose que c'est le choix du système d'exploitation s'il ne peut pas alimenter le nouveau périphérique, il coupe (c'est un choix judicieux car il ne peut pas l'alimenter). Ceci est mes indices plutôt que de vérifier USB standart.

1

Si votre appareil signale un ID de périphérique que le système d'exploitation hôte prend déjà en charge, il n'aura pas besoin de pilote.

Vous devrez peut-être emprunter l'identité d'un uart USB existant. Les fiches de données sont facilement disponibles. (Mais je suppose que vous le saviez déjà.)

Je ne suis pas sûr que le système d'exploitation hôte honorera votre idée multi-configuration. Mais donnez-nous un punt donc nous savons tous!

+0

Notez qu'un ID de périphérique se compose d'un ID de fournisseur et d'un ID de produit, et que le propriétaire de cet ID de fournisseur peut ne pas apprécier votre piratage de son ID. Pour les projets personnels, ce n'est pas un problème, mais ne vendez pas de tels appareils. – MSalters

+0

bien sûr, obtenir votre propre identifiant n'est pas si cher, et nous allons tous vouloir acheter votre merveilleux appareil, non? –

1

Vous avez raison sur la question du pilote. Lorsque l'appareil est branché et passe par le processus d'énumération, il doit rester < 100mA. L'hôte va interroger et déterminer la configuration (s). S'il y en a plusieurs qui supportent des niveaux de puissance différents, alors le pilote devra décider de sélectionner la configuration appropriée. S'il n'y a que de la puissance et qu'il n'est pas disponible, il n'énumérera pas l'appareil. En général, le pilote standard exécutant CDC ne serait pas au courant des différentes configurations de niveau de périphérique qui seraient possibles et nécessiterait donc un certain degré de personnalisation pour les gérer.

1

Si votre appareil se connecte en tant que périphérique USB CDC-ACM à l'hôte de bureau Windows, le bureau Windows fournit déjà le pilote usbser.sys. Mais il y a quelques problèmes dans Windows Vista. Vous avez juste besoin de l'inf pour installer le fichier usbser.sys sur le bureau. Pour WinCE, vous n'avez pas le pilote et vous devez en écrire ou en obtenir un auprès d'un fournisseur tiers. Voici un

http://www.em.avant-garde-lab.com/Products.html

Si votre appareil lui-même précise que l'auto alimenté dans son descripteur de périphérique alors l'hôte se fonderait sur les dispositifs d'auto capacité de puissance. Vous pouvez vérifier sur usb.org pour plus de détails. Merci.

Questions connexes