Artem
Интересующийся
Offline
|
|
« : 28-07-2006 08:37 » |
|
Доброго времени суток! Есть USB девайс, имеющий 1 конфигурацию и два интерфейса. В одном одна конечная точка типа INT, а в другом две типа BULK. По умолчанию драйвер конфигурируется на интерфейс 0. А мне нужен интерфейс 1(где две конечных точки). Как в драйвере переключать интерфейсы? (пишу на DDK, точнее пыиаюсь писать)
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #1 : 28-07-2006 15:14 » |
|
URB_FUNCTION_SELECT_INTERFACE
|
|
|
Записан
|
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #2 : 31-07-2006 03:07 » |
|
Спасибо. А по подробнее можно? Примерчик кода бы какой-нибудь, если не жалко
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #3 : 31-07-2006 07:14 » |
|
Живого примера нет, но если почитаешь DDK там написано что для заполнения стуктуры данного типа, можно использовать функцию UsbBuildSelectInterfaceRequest один из параметров которой InterfaceNumber. В результате обработки данного IRP тебе будет заполнена структура USBD_INTERFACE_INFORMATION которая содержит массив хендлов для каждого пайпа в этом интерфейсе. Для определения размера URB структуры можно воспользоваться макросом GET_SELECT_INTERFACE_REQUEST_SIZE.
|
|
|
Записан
|
|
|
|
maaaaaad
Гость
|
|
« Ответ #4 : 31-07-2006 08:21 » |
|
есть еще макто UsbBuildSelectConfigurationRequest
или 1. Создаешь рекваест, например USB_DEVICE_DESCRIPTOR dd; URB urb; UsbBuildGetDescriptorRequest(&urb, sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, &dd, NULL, sizeof(dd), NULL); 2. Отправляешь его о ожидаешь выполнения NTSTATUS SendAwaitUrb(PDEVICE_OBJECT fdo, PURB urb) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; KEVENT event; KeInitializeEvent(&event, NotificationEvent, FALSE); IO_STATUS_BLOCK iostatus; PIRP Irp = IoBuildDeviceIoControlRequest (IOCTL_INTERNAL_USB_SUBMIT_URB, pdx->LowerDeviceObject, NULL, 0, NULL, 0, TRUE, &event, &iostatus); PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp); stack->Parameters.Others.Argument1 = (PVOID) urb; NTSTATUS status = IoCallDriver(pdx->LowerDeviceObject, Irp); if (status == STATUS_PENDING) { KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); status = iostatus.Status; } return status; }
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #5 : 31-07-2006 08:25 » |
|
У него то конфигурация 1, а интерфейсов несколько. Это запрос он должен был сделать до переключения (выбора) интерфейсов.
|
|
|
Записан
|
|
|
|
maaaaaad
Гость
|
|
« Ответ #6 : 31-07-2006 08:38 » |
|
я привел пример для UsbBuildGetDescriptorRequest, большая разница что-ли?
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #7 : 31-07-2006 08:43 » |
|
А я по поводу UsbBuildSelectConfigurationRequest отвечал К коду ни каких притензий, все правильно!
|
|
|
Записан
|
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #8 : 31-07-2006 09:44 » |
|
Спасибо за ответы! Т.е. мне можно применить этот примерчик, только вместо UsbBuildGetDescriptorRequest поставить UsbBuildSelectInterfaceRequest ?
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #9 : 31-07-2006 09:54 » |
|
Нет. Для того что бы начать работу с USB устройством ты должен:
1. Запросить дискриптор устройства используя URB запрос URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
2. Затем дискриптор конфигурации (в котором и содержится информация об конфигурациях устройства и конфигурациях интерфейсов) URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
3. Если необходимо запросить дополнительные дискрипторы URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
4. Выполнить выбор конфигурации. URB_FUNCTION_SELECT_CONFIGURATION
5. И наконец выбрать интерфейс в выбраной конфигурации. URB_FUNCTION_SELECT_INTERFACE
6. Еще какая то инициализация, если нужна и собственно работа....
Microsoft облегчила жизнь програмистам и создала несколько обверточных функций который помогут тебе заполнять структуры URB запросов, это функции UsbBuild... как ими пользоваться найдешь в DDK. В качестве примера можешь глянуть \WINDDK\3790\src\wdm\usb\bulkusb\
И еще советую поставить какой нибудь USB монитор и посмотреть как начинают работать драйвера с USB устройством. Процесс инициализации у них практически идентичный...
|
|
« Последнее редактирование: 31-07-2006 09:58 от IRP »
|
Записан
|
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #10 : 01-08-2006 05:15 » |
|
там в DDK вроде через urb = USBD_CreateConfigurationRequestEx(ConfigurationDescriptor, tmp); делается?
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #11 : 01-08-2006 06:56 » |
|
Можно и так, а можно и ручками с помошью ExAllocatePool...выделить память и заполнить структуру...дело твое. Вообще советую еще раз: поставь USB монитор и посмотри как работают с USB девайсами, потому как мне кажется что тебе поручили задачу с которой ты еще не разобрался... Разобраться как работать с URB запросами и т.д...
|
|
|
Записан
|
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #12 : 01-08-2006 08:19 » |
|
так вот я и разбираюсь! Понятно, что можно сделатьпо разному.. А скажите как лучше и проще? Если я ни разу не писал дрова, то конечно очень много нового и непонятного.. Спасибо , что помогаете разобраться!
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #13 : 01-08-2006 09:17 » |
|
Как лучше сказать не могу.. каждый сам выбирает как ему работать. Только скажу, если Вы ни разу не писали драйвера, то будет сложно, а темболее в такой теме как USB. Советую найти и почитать немного книгу Walter Oney 2nd ed. Она написано довольно хорошо, и есть раздел который посвящен USB. Затем открываем DDK и читаем весь материал посвященный URB запросам. Это для понимания того как общается USB драйвер с хост контроллером. Вот после того как у Вас будет понимание работы USB драйверов в Windows, можно приступать к написанию драйвера. Я так понимаю что железка работает по определенному протоколу, который Вам прийдется поддерживать на уровне URB протокола.
|
|
|
Записан
|
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #14 : 02-08-2006 04:18 » |
|
Эта железка - это макетная плата с микроконтроллером AT91SAM7S64. С прошивкой от ИАРа. (Basic USB). Вот хочу с ниим разобраться для начала. Но там 1 конфигурация и два интерфейса, в одном 1 к.т., а в другом - 2 к.т. Вот я и хочу переключить интерфейс. А как сделать пока не знаю...
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #15 : 02-08-2006 06:32 » |
|
Все понятно, но опять же, по хорошему действовать нужно по выше описанному алгоритму, выполнить вот те 5 шагов, а дальше переключай интерфейсы как хочешь. Все равно скоро тебе понадобится еще и данные передавать или получать, а без понимания протокола завернутого в URB запросы - никуда. Примеры смотри в DDK, они довольно хорошо написаны.
|
|
|
Записан
|
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #16 : 02-08-2006 09:21 » |
|
А может есть у кого нибудь исходник для примера? А то в DDK слишком большой и трудный для понимания на начальных порах...
|
|
|
Записан
|
|
|
|
Sdefs
Гость
|
|
« Ответ #17 : 26-10-2006 15:14 » |
|
Здоров! Чесно говоря разбираюсь с той же темой! AT91SAM7S64. Нужно разобраться с интерфейсом USB. Ты же разбирался с этим почти 3 месяца назад, многое узнал наверно. Подскажешь, можно ли отлаживать драйвер в вижуале? Есть ли у тебя такой драйвер?
|
|
|
Записан
|
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #18 : 09-11-2006 06:02 » |
|
Привет. Вроде разобрался. Но в Вижуале я не работаю, поэтому не знаю как так отлаживаться. Я пишу в редакторе и компилирую DDK. Отлаживаюсь в СофтАйсе. Если интересно - пиши Ctrl_Shift@ngs.ru
|
|
|
Записан
|
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #19 : 16-01-2007 19:11 » |
|
Вообще советую еще раз: поставь USB монитор...
а можешь посоветовать какой-нибудь USB монитор?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #20 : 18-01-2007 10:04 » |
|
USB Monitor http://www.hhdsoftware.com/Products/home/usb-monitor.htmlэксперементировал на FTDI и ставил его. но была лишь триальная версия на 14 дней с сайте производителя... но попользовавшись - дико понравилась прога) ето мое ИМХО. но были и еще пару программулек...
|
|
« Последнее редактирование: 18-01-2007 12:09 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #21 : 19-01-2007 05:00 » |
|
Да, программа хорошая, только таблетки на неё я не нашёл.. . Может у кого есть?
|
|
|
Записан
|
|
|
|
|
Artem
Интересующийся
Offline
|
|
« Ответ #23 : 22-01-2007 04:38 » |
|
Мне понравилась ещё SourceUSB, но на неё тоже таблетку не нашёл. Сейчас юзаю USBTrace, и лекарство на него у меня есть. Прога такая-же почти такая-же как и те. В общем за неимением ничего устраивает. Ещё можно юзать SnoopyPro. Она тоже показывает что при энумерации происходит.
|
|
« Последнее редактирование: 22-01-2007 04:42 от Artem »
|
Записан
|
|
|
|
|