Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: два устройства один драйвер
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
lazarev andrey
добрый день.
собрал я устройство с bulk обменом.
когда устройство одно сидит на шине, то все хорошо.
как только два устройства сажаю, то работает все арвно только одно устройство через драйвер.

проверял так:
прошил два устройства с разными идентификаторами.
сделал две программы под разные идентификаторы.
подключаю устройства, тут все хорошо, винда видит оба.

запускаю две проги, работает только одно устройство.

что можно сделать?

надо чтобы работали несколько устройств через драйвер.

я в драйверах нуб.
просто взял стандартный usbbulk.sys и подправил *.inf файл
вот...
спасибо.
oran-be
Вообще то странно, поскольку Винда создает разные экземпляры драйверов для каждого устройства с разными идентификаторами и даже с разными серийными номерами. Возможно какой то дурацкий баг в программе, либо что - то с дровами, хотя это вряд ли.
lazarev andrey
вот и мне казалось, что по идее для каждого устройства должна быть своя копия драйвера, он же прописывается в реестр и так далее. моежт быть действительно тчо то с прогой.
а может быть надо что то прописать дополнительное в инф файл?
oran-be
Дополнительное не надо. Винда ищет драйвер по идентификатору устройства - PID & VID, и потом проверяет серийник - если новый, то она создает новый экземпляр драйвера. Это легко проверить, делает ли она это, если сменить серийник ыв девайсе и воткнуть в ЮСБ. Тогда Винда как бы поставит новые дрова.
Вопрос в том, как прога - находит ли она требуемый девайс на шине и потом - получает ли она на него дескриптор. То есть - если есть сбой, то в каком он месте.
lazarev andrey
серийного номера в дескрипторе не предусмотрено, предусмотрены разные PID.
в inf - файле прописаны несколько PID. может быть в этом дело?
может надо делать для каждого отдельного устройства свой inf - файл?
oran-be
Серийник входит в дескриптор - вот пример свойств устройства в системе.

USB\VID_1С37&PID_00A4\A0000001

А вот насчет инфа - не знаю, я пользовал разные инфы для разных устройств. все таки непонятно. как прога получает дескриптор на устройство?. На чем сделан девайс и что за драйвер?
alexkok
Цитата(lazarev andrey @ Feb 8 2008, 10:41) *
серийного номера в дескрипторе не предусмотрено, предусмотрены разные PID.
в inf - файле прописаны несколько PID. может быть в этом дело?
может надо делать для каждого отдельного устройства свой inf - файл?

Как же не предусмотрено?
(http://proyectosfie.com/html/usb/libro/ стр.97)


The device descriptor has 14 fields in 18 bytes.

0 bLength 1 Descriptor size in bytes
1 bDescriptorType 1 The constant DEVICE (01h)
2 bcdUSB 2 USB specification release number (BCD)
4 bDeviceClass 1 Class code
5 bDeviceSubclass 1 Subclass code
6 bDeviceProtocol 1 Protocol Code
7 bMaxPacketSize0 1 Maximum packet size for Endpoint 0
8 idVendor 2 Vendor ID
10 idProduct 2 Product ID
12 bcdDevice 2 Device release number (BCD)
14 iManufacturer 1 Index of string descriptor for the manufacturer
15 iProduct 1 Index of string descriptor for the product
16 iSerialNumber 1 Index of string descriptor containing the serial
number
17 bNumConfigurations 1 Number of possible configurations

iSerialNumber. An index that points to a string containing the device’s
serial number. This value is zero if there is no serial number. Some device
classes (such as mass storage) require serial numbers. Serial numbers are useful
if users may have more than one identical device on the bus and the host
needs to keep track of which is which even after rebooting. Serial numbers
also enable a host to determine whether a peripheral is the same one used
previously or a new installation of a peripheral with the same Vendor ID and
Product ID. No devices with the same Vendor ID, Product ID, and device
release number should have the same serial number.
lazarev andrey
снова стало актуально.
устройтсво сделано на at89c5131.

вот такой текст инф файла:

/*---------------------------
[Version]
Signature = $CHICAGO$
Provider = "Company"
Class = USB
DriverVer = 10/12/2007, 1.0.0.0

;-------------------------------------------------------------------------
; Driver information
;-------------------------------------------------------------------------

[Manufacturer]
"Co" = Tech.Mfg

[Tech.Mfg]

"Device1" = DDInstall_USB_C001, USB\VID_03EB&PID_C001
"Device2" = DDInstall_USB_C002, USB\VID_03EB&PID_C002


;-------------------------------------------------------------------------
; Windows 2000 installation section
;-------------------------------------------------------------------------

[DDInstall_USB_C001.NT]
AddReg = AddRegistry_C001
CopyFiles = DrivertFiles.Ext, DrivertFiles.Inf

[DDInstall_USB_C001.NT.Services]
AddService = USBBulk, 0x00000002, Service_Inst, EventLog_Inst


[DDInstall_USB_C002.NT]
AddReg = AddRegistry_C002
CopyFiles = DrivertFiles.Ext, DrivertFiles.Inf

[DDInstall_USB_C002.NT.Services]
AddService = USBBulk, 0x00000002, Service_Inst, EventLog_Inst


[Service_Inst]
DisplayName = "USB 2 Endpoints universal driver"
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; 2 - SERVICE_AUTO_START, 3 - SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\USBBulk.sys
LoadOrderGroup = Base

;-------------------------------------------------------------------------
; Windows 9X installation section
;-------------------------------------------------------------------------

[DDInstall_USB_C001]
AddReg = AddRegistry_9X, AddRegistry_C001
CopyFiles = DrivertFiles.Ext, DrivertFiles.Inf


[DDInstall_USB_C002]
AddReg = AddRegistry_9X, AddRegistry_C002
CopyFiles = DrivertFiles.Ext, DrivertFiles.Inf

;-------------------------------------------------------------------------
; Registry section
;-------------------------------------------------------------------------

[AddRegistry_9X]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,USBBulk.sys

[AddRegistry_C001]
HKR, "Parameters", "MaxInXfer", 0x00010001, 1048576
HKR, "Parameters", "EPInAddress", 0x00010001, 5
HKR, "Parameters", "MaxOutXfer", 0x00010001, 32
HKR, "Parameters", "EPOutAddress", 0x00010001, 2

[AddRegistry_C002]
HKR, "Parameters", "MaxInXfer", 0x00010001, 1048576
HKR, "Parameters", "EPInAddress", 0x00010001, 5
HKR, "Parameters", "MaxOutXfer", 0x00010001, 32
HKR, "Parameters", "EPOutAddress", 0x00010001, 2


;-------------------------------------------------------------------------
; Event log registry entries
;-------------------------------------------------------------------------

[EventLog_Inst]
AddReg = EventLog_AddReg

[EventLog_AddReg]
HKR,,EventMessageFile,0x00020000,"%SystemRoot%\System32\IoLogMsg.dll;%SystemRoot%\System32\Drivers\USBBulk.sys"
HKR,,TypesSupported,0x00010001,7

;-------------------------------------------------------------------------
; Source file information
;-------------------------------------------------------------------------

[PreCopySection]
HKR,,NoSetupUI,,1

[DestinationDirs]
DrivertFiles.Ext = 10, System32\Drivers
DrivertFiles.Inf = 10, Inf

[DrivertFiles.Ext]
USBBulk.sys

[DrivertFiles.Inf]
Atmel.inf

;=========================================================================


ну это я взял готовый инф и подправил немного.

драйвер я прикрепил.
может что надо подправить в инф-файле?
Седой
Попытаюсь оказать вам посильную помощь, но сначаля вопросы:

1. "Стандартный USBBulk.sys" - драйвер из DDK bulkusb.sys или из DriverStudio usbbulk.sys ?
2. Какой программой для тестирования пользуетесь?
3. В секции [DrivertFiles.Inf] указан atmel.inf? Откуда и для чего этот файл?
lazarev andrey
1. драйвер взяли с диска, который был с платой евалборда at89c5131 (разработчики не выходят на связь).
2. программа для тестирования опять же взята из исходника, но переправленная для наших нужд.
3. atmel.inf - текст файла приведен выше. это он.
Седой
Цитата(lazarev andrey @ Mar 24 2008, 12:14) *
2. программа для тестирования опять же взята из исходника, но переправленная для наших нужд.


Как в программе тестирования определяется экземпляр устройства, с которым она должна работать?
lazarev andrey
по моему через VID и PID
int BulkDevice::TestDevice()
{
if(!OK())
return 0;

SendPacketGETID rq;
if(Dio(IOCTL_GET_CONFIG, &rq, sizeof(rq), &rq, sizeof(rq)) <= 0)
return 0;

if((rq.m_nVID != VENDOR_ID && rq.m_nVID != VENDOR_ID1) ||
(rq.m_nPID != BULK1_PID && rq.m_nPID != BULK2_PID))
return 0;

return rq.m_nPID & 0xFFFF;
}
lazarev andrey
похоже, что нашли причину, при ближайшем рассмотрении кода приложения.

мдас...надо осваивать более высокий уровень программирования sad.gif

Тему можно закрыть, Всем спасибо, огромное за содействие.
Тёмыч
Народ, а вот у меня имеются отладочные платы AVR32 с usb (2 шт). Назначаю им уникальные VID PID, инф файл по аналогии сделал, что был выше. Драйвер беру из NTDDK - bulkusb.sys. Пытаюсь подрубить два устройства на один драйвер. В системе установка проходит, висят оба устройства в диспетчере, дебагвью показывает отладку для каждого из устройств при подключении. Вроде все хорошо, пока не вытащишь одно из устройств из порта - тут же синий экран и перезагруз. При работе только с одним устройствам - и подцепляется, и отцепляется корректно. В чем особенность драйвера для работы на два (или более) устройств, кто подскажет? Полагаю, что обработка surprise_remove или просто remove такова, что выгружает полностью драйвер из системы (это мои догадки). Повторяю, инф файл идентичен тому, что выше в теме. Спасибо.
Тёмыч
Вот наткнулся на IRP_MN_QUERY_DEVICE_RELATIONS и обработка REMOVAL_RELATIONS. В bulkusb от NTDDK этих обработчиков нету. Возможно это есть решение моего вопроса. Кто знает, как это работает?
Konst_777
Цитата(Тёмыч @ May 17 2011, 18:36) *
...Драйвер беру из NTDDK - bulkusb.sys...

Ведь есть готовые универсальные драйверы libusb-win32 или WinUSB. Зачем мучить себя написанием собственного драйвера?
Тёмыч
Даже не знаю, что и ответить... Ну, чтоб уметь, наверное! А если мне не универсальный нужен?
Konst_777
В таком случае, извините за bb-offtopic.gif
Тёмыч
Если кому интересно, то причина моей проблемы крылась в настройках компиляции ддкшного драйвера. Синий экран подсказал)
sergeeff
Цитата(Тёмыч @ May 20 2011, 22:56) *
Если кому интересно, то причина моей проблемы крылась в настройках компиляции ддкшного драйвера. Синий экран подсказал)


Интересно. Поделитесь. Что стандартных установок для компиляции драйвера недостаточно?
Тёмыч
Компиляция под дебаг (chk) при возникновении assertов требовала дебаггера, о чем говорил номер ошибки в синем экране. В free версии все работает, хотя не плохо было бы узнать, что за assert (или breakpoint) срабатовал и требовал отладчика для продолжения работы. Буду продолжать эксперименты)
sergeeff
Цитата(Тёмыч @ May 22 2011, 16:51) *
Компиляция под дебаг (chk) при возникновении assertов требовала дебаггера, о чем говорил номер ошибки в синем экране. В free версии все работает, хотя не плохо было бы узнать, что за assert (или breakpoint) срабатовал и требовал отладчика для продолжения работы. Буду продолжать эксперименты)


А что, DbgView молчит? Уж он то assert диагностику должен показать. Что-то странноватое у вас происходит. Может компилируете не в том DDK/WDK или не под вашу версию Windows?
Тёмыч
А я на локальной машине DbgView использовал, он то может что-то и показывал, только я этого не видел. Для меня вывод один: kerel-mode отладку надо вести на сторонней машине.

С версиями DDK и Wndows я разобрался
sergeeff
Цитата(Тёмыч @ May 23 2011, 00:04) *
А я на локальной машине DbgView использовал, он то может что-то и показывал, только я этого не видел. Для меня вывод один: kerel-mode отладку надо вести на сторонней машине.

С версиями DDK и Wndows я разобрался


Может я старый стал, но никак не пойму стиля обсуждения топика. Chk версия вываливается в синий экран, а free - нет? Assert что-то показывает в DbgView, или сразу все накрывается? Странно все это (если это так). Обычно проблемы при переходе от chk --> free. Невнятно как то все это излагается, я до конца в проблематику не въезжаю.
Тёмыч
Все накрывалось сразу и ни в каком дебагвью не успеешь посмотреть (так как он на той же машине был запущен). Включил отображение синего экрана. Выяснилось. что ошибка 0x7E -> 0x80000003: STATUS_BREAKPOINT indicates a breakpoint or ASSERT was encountered when no kernel debugger was attached to the system. Вывод: надо подключать внешний отладчик, либо компилить без ассертов этот драйвер. Что ж я тут не правильно излагаю?
sergeeff
Я не говорил ни слова про "неправильно", а говорил "про непонятно". ASSERT - чистая диагностика. Как правило, вылавливание неинициализированных переменных, выход за границы массивов, попытки чтения/записи по NULL указателю. Вариантов, на мой взгляд, два:
1. Неудачно реализован сан assert.
2. На самом деле ошибка, которую вылавливал assert, как была, так и осталась, только пока это не приводит к экрану смерти. Хотя и странно это.
Тёмыч
Верно, я понимаю, что вызов ассерта не есть хорошо. Поэтому буду экспериментировать с отладчиком. Хотя возможно это был чисто отладочный (тестовый) брейкпоинт от Майкрософт.
sergeeff
Большие сомнения про breakpoint. Откуда он может взяться? Его именнo в отладчике только и можно установить. Как понимаю, нет отладчика, нет и breakpoint'a.

Припоминая давние времена, usbbulk валился у меня, при некоректно описанных дескрипторах в usb device или перепутанных (ввод/вывод) endpoint'aх. Надо все это внимательно перепроверить.
Тёмыч
Цитата
Большие сомнения про breakpoint. Откуда он может взяться? Его именнo в отладчике только и можно установить. Как понимаю, нет отладчика, нет и breakpoint'a.


Ну почему же? Можно из драйвера передать управление отладчику, как раз такая штука в этом драйвере (bulkusb) и стоит. И стоит она как раз в месте эвента по отсоединению устройства.

DbgBreakPoint называется, кажется.
sergeeff
Осталось выяснить, кто DbgBreakPoint там поставил и зачем? В WDK в драйвере bulkusb ничего такого не используется.
Тёмыч
Цитата
В WDK в драйвере bulkusb ничего такого не используется.


А не подскажете версию ВДК, в последних этого примера нет.
sergeeff
У меня стоит WinDDk3790 "Microsoft® Windows® Server 2003 Driver Development Kit (DDK)" с bulkusb драйвером. Файлы датированы 2005 годом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.