2011-04-01 24 views
7

Tenemos un dispositivo integrado que se conecta a la PC a través de USB, y tiene múltiples puertos seriales virtuales (CDC-ACM).Dispositivo de comunicaciones USB con múltiples puertos serie, que trabaja en todas las plataformas

Tenemos esto funcionando en Windows. En el dispositivo integrado, tenemos múltiples interfaces CDC-ACM. Los descriptores USB lo declaran como un dispositivo compuesto (clase = 0xEF, subclase = 2, protocolo = 1) y tiene un "Descriptor de asociación de interfaz" para cada puerto serie virtual. En Windows, utilizamos un archivo INF que instala usbser.sys para cada interfaz de control CDC-ACM (MI_00, MI_02, etc.).

Sin embargo, como hemos visto, este método no parece funcionar para Mac. Descubrí que puedo hacer que funcione para Mac y Linux, cambiándolo a una clase de "Comunicaciones" (clase = 2, subclase = 0, protocolo = 0) y eliminando los IAD. (Para Linux, probando con Ubuntu, encontré que esto funcionaba con el kernel de Ubuntu Linux 2.6.35-28 o posterior. Con kernels anteriores, solo funcionaba el primer puerto serie). Pero entonces, este método no funciona para Windows.

¿Qué método se puede usar para hacer un dispositivo USB con múltiples puertos serie virtuales, que funciona en Windows, Mac y Linux? Creo que preferiría una solución que use el estándar CDC-ACM tanto como sea posible, y evite la opción de escribir tus propios controladores tanto como sea posible.

Respuesta

3

La única manera que se me ocurre es que el dispositivo se presenta a sí mismo como un concentrador USB con múltiples dispositivos separados de puerto serie único conectados. Esto no es bonito, pero muy a prueba de balas.

+0

Gracias por esa opción "fuera de la caja". Es una mayor carga de implementación en el dispositivo integrado, pero sin duda funcionaría sin problemas en las PC. –

2

Como los controladores de Apple no son compatibles con dispositivos CDC compuestos, sugiero que reconfigure su dispositivo y que los descriptores alternativos llamen CDC o que se adhieran al compuesto y utilicen un controlador de terceros (mi compañía fabrica controladores CDC ACM para OS X, que probablemente sea compatible con su dispositivo).

También es posible forzar el problema con un código kext sin código.

+0

La reconfiguración no es una buena solución para los usuarios. Debería "funcionar" con todos los sistemas operativos host. Pero gracias por el puntero a los controladores OS X. Lo investigaré. –

+0

¿Qué es un "kext sin controlador"? –

+0

@Craig McQueen: Debería haber sido "kext sin código". Un kext normalmente contiene tanto un plist que contiene las distintas personalidades del controlador, como un binario. es posible hacer un kext que contenga solo un archivo Info.plist, con personalidades para los controladores preinstalados – Hasturkun

2

Una solución que he encontrado, que creo que podría funcionar (sujeto a pruebas adicionales en Windows):

Hacer que la enumeración dispositivo de la manera que funciona para Mac:

  • Hacer es clase "Comunicaciones" (clase = 2, subclase = 0, protocolo = 0), no dispositivo compuesto.
  • Eliminar los IAD.

El dispositivo debe "simplemente funcionar" en Mac y en Linux reciente, en esta configuración. (Para Linux, probando con Ubuntu, encontré que esto funcionaba con el kernel Ubuntu Linux 2.6.35-28 o posterior. Con kernels anteriores, solo funcionaba el primer puerto serie)

Luego, para Windows, modifique el INF archivo para el dispositivo, para cargar explícitamente el controlador de dispositivo compuesto usbccgp.sys. Soy un novato con los archivos INF de Windows, pero aquí están los fragmentos relevantes por lo que pude averiguar hasta el momento:

[CCGPDriverInstall.NT] 
Include=usb.inf 
Needs=Composite.Dev.NT 
AddReg=CCGPDriverInstall.AddReg 

[CCGPDriverInstall.NT.Services] 
Include=usb.inf 
Needs=Composite.Dev.NT.Services 

[CCGPDriverInstall.AddReg] 
HKR,,EnumeratorClass, 0x00000001,02,00,00 

...

[DeviceList] 
%DESCRIPTION_DEVICE%=CCGPDriverInstall, USB\VID_FFFF&PID_0001 
%DESCRIPTION_AT%=DriverInstall, USB\VID_FFFF&PID_0001&MI_00 
%DESCRIPTION_MENU%=DriverInstall, USB\VID_FFFF&PID_0001&MI_02 

[DeviceList.NTamd64] 
%DESCRIPTION_DEVICE%=CCGPDriverInstall, USB\VID_FFFF&PID_0001 
%DESCRIPTION_AT%=DriverInstall, USB\VID_FFFF&PID_0001&MI_00 
%DESCRIPTION_MENU%=DriverInstall, USB\VID_FFFF&PID_0001&MI_02 

[DeviceList.NTx86...1] 
%DESCRIPTION_DEVICE%=CCGPDriverInstall, USB\VID_FFFF&PID_0001 
%DESCRIPTION_AT%=DriverInstall, USB\VID_FFFF&PID_0001&MI_00 
%DESCRIPTION_MENU%=DriverInstall, USB\VID_FFFF&PID_0001&MI_02 

Con el archivo INF cargar explícitamente el usbccgp.sys controlador, ambos puertos serie USB funcionaron para mí en Windows XP SP3 de 32 bits.

Hasta ahora he realizado pruebas limitadas, por lo que me interesaría saber qué tan bien funciona, o no, para otros.

Cuestiones relacionadas