Устройство USB Communications с несколькими последовательными портами, работающее на всех платформах - PullRequest
7 голосов
/ 01 апреля 2011

У нас есть встроенное устройство, которое подключается к ПК через USB и имеет несколько виртуальных последовательных портов (CDC-ACM).

У нас это работает на Windows. На встроенном устройстве у нас есть несколько интерфейсов CDC-ACM. Дескрипторы USB объявляют его как составное устройство (класс = 0xEF, подкласс = 2, протокол = 1), и он имеет «дескриптор ассоциации интерфейса» для каждого виртуального последовательного порта. В Windows мы используем INF-файл, который устанавливает usbser.sys для каждого интерфейса управления CDC-ACM (MI_00, MI_02 и т. Д.).

Однако, как мы обнаружили, этот метод, похоже, не работает для Mac. Я обнаружил, что могу заставить его работать на Mac и Linux, изменив его на класс «Communications» (class = 2, sub-class = 0, protocol = 0) и удалив IAD. (Для Linux, тестируя с Ubuntu, я обнаружил, что это работает с ядром Ubuntu Linux 2.6.35-28 или новее. В более ранних ядрах работал только первый последовательный порт.) Но тогда этот метод не работает для Windows.

Какой метод можно использовать для создания устройства USB с несколькими виртуальными последовательными портами, которое работает в Windows, Mac и Linux? Я думаю, что предпочел бы решение, которое максимально использует стандарт CDC-ACM и максимально избегает опции «пишите свои собственные драйверы».

Ответы [ 3 ]

3 голосов
/ 06 апреля 2011

Единственный способ, который я могу придумать, - это представить устройство как концентратор USB с несколькими отдельными устройствами, подключенными к одному последовательному порту.Это не красиво, но очень пуленепробиваемо.

2 голосов
/ 04 июля 2012

Одно решение, которое я нашел, которое, я думаю, могло бы работать (при условии дальнейшего тестирования в Windows):

Настройте перечисление устройства так, как это работает для Mac:

  • Сделать это классом «Связи» (класс = 2, подкласс = 0, протокол = 0), а не составное устройство.
  • Удалить IAD.

Устройстводолжен «просто работать» на Mac и недавнем Linux, в этой конфигурации.(Для Linux, тестируя с Ubuntu, я обнаружил, что это работает с ядром Ubuntu Linux 2.6.35-28 или новее. В более ранних ядрах работал только первый последовательный порт.)

Затем для Windows изменитеINF-файл для устройства, чтобы явно загрузить драйвер составного устройства usbccgp.sys.Я новичок в Windows INF-файлах, но вот соответствующие фрагменты из того, что я мог до сих пор выяснить:

[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 

С файлом INFпри явной загрузке драйвера usbccgp.sys оба 32-битных USB-порта работали у меня на 32-битной Windows XP SP3.

Пока я провел только ограниченное тестирование, поэтому мне было бы интересно узнать, насколько хорошо это работаетили нет, для других.

2 голосов
/ 06 апреля 2011

Поскольку драйверы Apple не поддерживают составные CDC-устройства, я бы посоветовал либо каким-либо образом перенастроить ваше устройство и сделать ваши альтернативные дескрипторы обычными CDC, либо придерживаться составного и использовать сторонний драйвер (моя компания делает CDC ACM драйверы для OS X, которые, вероятно, будут поддерживать ваше устройство).

Также может быть возможно форсировать проблему с помощью кода без кода.

...