Мне нужно написать собственный драйвер USB на стороне хоста для устройства CDC

Это не может рассматриваться как прямое программирование, но я не понимаю, где еще спросить. Я пробовал смотреть на различные сайты, но пока Google не был моим другом.

У меня возникли проблемы с поиском, нужно ли мне писать собственный драйвер устройства для различных платформ windows/linux/mac, к которым может подключаться устройство, на котором я работаю, или функциональность обеспечивается стандартными драйверами.

Мое устройство - USB CDC (коммуникационное устройство), которое отображается как порт COM:. Он также включает зарядное устройство для аккумулятора, которое после того, как устройство будет перечислить, должно иметь полный ток питания 5 мА (500 мА), который можно извлечь из разъема USB. Моя проблема в том, что если драйвер USB в хосте решает, что он не может доставить полный ток питания, он не должен перечислить устройство.

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

Ответ 1

Вам нужно написать файл .inf для Windows, который связывает VID вашего устройства и PID с системой usbser.sys. Mine выглядит следующим образом (замените свою Компанию по необходимости, введите VID и PID (в шестнадцатеричном формате) и измените строку DriverVer на любую дату и версию):

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

Обратите внимание, что это работает только с 32-разрядными ОС. Он также работает с Vista, хотя заголовок файла так не говорит!

Помните, что некоторые версии usbser.sys имеют значительные проблемы, в том числе bluescreening, например, при передаче пакетов, которые являются точными кратными 64 байтам. Если вы используете XP SP2 или предыдущий, установите исправление KB943198. XP SP3 и Vista в порядке.

Для Mac вам просто нужно сообщить свой класс устройства правильно, и сканирование драйверов отобразит правильные драйверы. (Windows игнорирует класс устройства, поэтому вам необходимо предоставить файл .inf).

EDIT: Извините, я должен был быть более ясным. Это не приведет к перерасчету, если он не сможет нарисовать полную нагрузку - я не уверен, что это возможно.

Ответ 2

Я не уверен в вопросе власти, но они - это CDC-драйверы (или я думаю, что есть), чтобы вы могли использовать их. Для энергетического вопроса решение со многими конфигурациями, вероятно, хорошо, я никогда не сталкивался с этим в работе (у меня есть USB-анализатор), но дома иногда, когда у меня есть 3 или более разных устройства, требующих питания от USB, я получил неудачное перечисление. Я полагаю, что это выбор операционной системы, если он не может подавать питание на новое устройство, которое он отключил (разумный выбор, поскольку он не может его подавать). Это мои предположения, скорее проверяющие стандарт USB.

Ответ 3

Если ваше устройство сообщает идентификатор устройства, который уже поддерживает ОС хоста, то им не понадобится драйвер.

Возможно, вам придется выдавать себя за существующий USB uart. Листы данных легко доступны. (Но я полагаю, вы уже знали это.)

Я не уверен, что ОС хоста выполнит вашу идею с несколькими конфигурациями.

Но дайте ему пунт, чтобы мы все знали!

Ответ 4

Вы верны в вопросе драйвера. Когда устройство подключено и проходит процесс перечисления, требуется, чтобы он оставался < 100мА. Хост будет допросить и определить конфигурацию (ы). Если есть несколько, которые поддерживают разные уровни мощности, то драйверу необходимо будет выбрать соответствующую конфигурацию. Если есть только мощная и недоступная, то она не будет перечислять устройство. В общем, стандартный драйвер, выполняющий CDC, не будет знать о различных конфигурациях уровня устройства, которые были бы возможны, и поэтому для их обработки потребуется некоторая степень настройки.

Ответ 5

Если ваше устройство подключается к USB CDC-ACM-устройству на настольный компьютер Windows, рабочий стол Windows уже предоставляет драйвер usbser.sys. Но в Windows Vista есть некоторые проблемы. Вам просто нужно установить inf для установки usbser.sys на рабочий стол. Для WinCE у вас нет драйвера, и вам нужно написать или получить его у любого стороннего поставщика. Вот один

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

Если ваше устройство определяет себя как автономное питание в своем дескрипторе устройства, то хост будет полагаться на возможности автономной работы устройств. Вы можете проверить на usb.org для получения дополнительной информации. Спасибо.