2009-07-24 8 views
10

Esto no se puede considerar directamente relacionado con la programación, pero no sé dónde más preguntar. He intentado buscar en una variedad de sitios web, pero hasta ahora Google no ha sido mi amigo.¿Tengo que escribir mi propio controlador USB del lado del host para un dispositivo CDC

Tengo problemas para saber si necesito escribir el controlador de mi dispositivo para las diferentes plataformas windows/linux/mac a las que está conectado el dispositivo que estoy desarrollando, o si la funcionalidad viene de los controladores estándar.

Mi dispositivo es un USB CDC (dispositivo de comunicaciones) que aparece como COM: puerto. También incluye un cargador de batería que, una vez que se haya enumerado el dispositivo, requiere la corriente de suministro de carga de 5 unidades (500 mA) que se puede extraer del conector USB. Mi problema es que si el controlador USB en el host decide que no puede entregar la corriente de suministro completo, entonces no debe enumerar el dispositivo.

Si, como alternativa, proporciono un segundo conjunto de configuración que solo permite que el dispositivo extraiga 1 unidad de carga del conector de interfaz, los controladores estándar enumerarán el dispositivo que usa esta configuración.

+0

Creo que primero hay que buscar en la especificación USB para ver si estas cosas están permitidas. Si la especificación lo permite, los navegadores estándar probablemente lo admitirán. – kgiannakakis

+0

En la especificación USB 2.0, el descriptor del dispositivo permite una serie de configuraciones, cada una de las cuales puede especificar que requiere una cierta cantidad de energía de la interfaz. Entonces, supongo, dependerá del controlador elegir entre estas diferentes configuraciones. –

Respuesta

6

Necesita escribir un archivo .inf para Windows que vincule su dispositivo VID y PID con el sistema usbser.sys. El mío se parece a esto (Reemplazar Suempresa según sea necesario, poner en su VID y PID (en hexadecimal), y cambiar la línea DriverVer a cualquier fecha y la versión que desea):

; ----------------------------------------------------------------------------- 
; 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" 

Nota esto funciona con 32 bits SOs . También funciona con Vista aunque el encabezado del archivo no lo dice.

Tenga en cuenta que algunas versiones de usbser.sys tienen problemas importantes, incluyendo bluescreening, por ejemplo cuando se transfieren paquetes que son múltiplos exactos de 64 bytes. Si está utilizando XP SP2 o anterior, instale el hotfix KB943198. XP SP3 y Vista están bien.

Para Mac, solo necesita informar la clase de su dispositivo correctamente y la exploración del controlador recoge los controladores correctos. (Windows ignora la clase de dispositivo por lo que debe proporcionar el archivo .inf).

EDITAR: Lo siento, debería haber sido más claro. Esto no dejará de enumerar si no puede extraer la carga completa; no estoy seguro de que sea posible.

+1

Estoy intentando instalar este controlador automáticamente en lugar de que el usuario necesite ir al administrador del dispositivo (aunque esto funciona). Intenté simplemente usar la instalación con el botón derecho y también usar el método descrito en http://stackoverflow.com/questions/677686/how-do-i-deploy-a-inf-based-driver. En cualquier caso, cuando enchufo el dispositivo, aparece el Asistente para hardware nuevo y, mientras aparece en Puertos en el administrador de dispositivos, no hay ningún controlador asociado. Más detalles: –

+0

... Estoy probando Windows XP y usando un chip Cypress. Cypress proporciona un archivo .inf para esto (http://www.cypress.com/?rID=40248) que es bastante diferente, por ejemplo CopyFiles está configurado en DriverCopyFiles, no en FakeModemCopyFileSection. ¿Cualquier sugerencia? –

+0

Hemos utilizado usbser.sys como el controlador para una serie de productos producidos por mi empresa y nunca he encontrado una manera fácil de evitar el "Asistente de hardware nuevo encontrado" en Windows XP. Si lo haces, por favor, házmelo saber. La buena noticia es que, utilizando el mismo archivo inf, los controladores pueden instalarse automáticamente sin ningún asistente en Windows Vista y Windows 7 si el dispositivo está conectado después de que se haya instalado el archivo inf. –

1

No estoy seguro acerca de la cuestión de energía, pero hay muchos controladores CDC (o creo que hay) por lo que podría usar uno. Para la cuestión de poder, la solución con muchas configuraciones probablemente sea buena, nunca me he encontrado con esto en el trabajo (tengo un analizador USB) pero en casa a veces, cuando tengo 3 o más dispositivos diferentes que requieren energía desde USB, recibí una enumeración fallida. Supongo que esta es la elección del sistema operativo si no puede suministrar energía al nuevo dispositivo que lo corta (opción sensata ya que no puede alimentarlo). Esta es mi opinión antes que verificar el estándar USB.

1

Si su dispositivo informa una ID de dispositivo que el sistema operativo host ya admite, entonces no necesitarán un controlador.

Es posible que deba suplantar a un dispositivo USB uart existente. Las hojas de datos están disponibles. (Pero creo que ya lo sabía)

No estoy seguro de que el sistema operativo anfitrión cumpla con su idea de configuración múltiple.

¡Pero denle una propina para que todos lo sepamos!

+0

Tenga en cuenta que una ID de dispositivo consiste en una ID de vendedor y una ID de producto, y es posible que el propietario de esa ID de vendedor no aprecie el secuestro de su ID. Para los proyectos personales eso no es un problema, por supuesto, pero no vendes esos dispositivos. – MSalters

+0

por supuesto, obtener su propia identificación no es tan caro, y todos querremos comprar su maravilloso dispositivo, ¿verdad? –

1

Tiene razón en la pregunta del conductor. Cuando el dispositivo está enchufado y pasa por el proceso de enumeración, se requiere que permanezca en < 100mA. El host interrogará y determinará la (s) configuración (es). Si hay más de uno que admite diferentes niveles de potencia, entonces el controlador deberá decidir seleccionar la configuración adecuada. Si solo hay alta potencia y no está disponible, no enumerará el dispositivo. En general, el controlador estándar que realiza CDC no sería consciente de las diferentes configuraciones de nivel de dispositivo que serían posibles y, por lo tanto, requeriría cierto grado de personalización para manejarlas.

1

Si su dispositivo se conecta como dispositivo USB CDC-ACM al host de escritorio de Windows, el escritorio de Windows ya proporciona el controlador usbser.sys. Pero hay algunos problemas en Windows Vista. Solo necesita el inf para instalar el usbser.sys en el escritorio. Para WinCE no tiene el controlador y necesita escribir u obtener uno de un proveedor externo. Aquí está uno

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

Si el dispositivo especifica como auto propulsado en su descriptor de dispositivos a continuación, el anfitrión se basaría en la capacidad de potencia dispositivos de auto. Puede verificar en usb.org para más detalles. Gracias.

Cuestiones relacionadas