Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как переключить интерфейс USB?  (Прочитано 25166 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Artem
Интересующийся

ru
Offline Offline

« : 28-07-2006 08:37 » 

Доброго времени суток! Есть USB девайс, имеющий 1 конфигурацию и два интерфейса. В одном одна конечная точка типа INT, а в другом две типа BULK. По умолчанию драйвер конфигурируется на интерфейс 0. А мне нужен интерфейс 1(где две конечных точки). Как в драйвере переключать интерфейсы? (пишу на DDK, точнее пыиаюсь писать)
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #1 : 28-07-2006 15:14 » 

URB_FUNCTION_SELECT_INTERFACE
Записан
Artem
Интересующийся

ru
Offline Offline

« Ответ #2 : 31-07-2006 03:07 » 

Спасибо. А по подробнее можно? Примерчик кода бы какой-нибудь, если не жалко
Записан
IRP
Постоялец

ua
Offline 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
Постоялец

ua
Offline Offline

« Ответ #5 : 31-07-2006 08:25 » 

У него то конфигурация 1, а интерфейсов несколько. Это запрос он должен был сделать до переключения (выбора) интерфейсов.
Записан
maaaaaad
Гость
« Ответ #6 : 31-07-2006 08:38 » 

я привел пример для UsbBuildGetDescriptorRequest, большая разница что-ли?
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #7 : 31-07-2006 08:43 » 

А я по поводу UsbBuildSelectConfigurationRequest отвечал Улыбаюсь
К коду ни каких притензий, все правильно!
Записан
Artem
Интересующийся

ru
Offline Offline

« Ответ #8 : 31-07-2006 09:44 » 

Спасибо за ответы! Т.е. мне можно применить этот примерчик, только вместо UsbBuildGetDescriptorRequest поставить UsbBuildSelectInterfaceRequest ?
Записан
IRP
Постоялец

ua
Offline 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
Интересующийся

ru
Offline Offline

« Ответ #10 : 01-08-2006 05:15 » 

там в DDK вроде через urb = USBD_CreateConfigurationRequestEx(ConfigurationDescriptor, tmp); делается?
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #11 : 01-08-2006 06:56 » 

Можно и так, а можно и ручками с помошью ExAllocatePool...выделить память и заполнить структуру...дело твое.
Вообще советую еще раз: поставь USB монитор и посмотри как работают с USB девайсами, потому как мне кажется что тебе поручили задачу с которой ты еще не разобрался...
Разобраться как работать с URB запросами и т.д...

Записан
Artem
Интересующийся

ru
Offline Offline

« Ответ #12 : 01-08-2006 08:19 » 

так вот я и разбираюсь! Понятно, что можно сделатьпо разному..  А скажите как лучше и проще? Если я ни разу не писал дрова, то конечно очень много нового и непонятного.. Спасибо , что помогаете разобраться!
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #13 : 01-08-2006 09:17 » 

Как лучше сказать не могу.. каждый сам выбирает как ему работать.
Только скажу, если Вы ни разу не писали драйвера, то будет сложно, а темболее в такой теме как USB.
Советую найти и почитать немного книгу Walter Oney 2nd ed.
Она написано довольно хорошо, и есть раздел который посвящен USB.
Затем открываем DDK и читаем весь материал посвященный URB запросам. Это для понимания того как общается USB драйвер с хост контроллером. Вот после того как у Вас будет понимание работы USB драйверов в Windows, можно приступать к написанию драйвера.
Я так понимаю что железка работает по определенному протоколу, который Вам прийдется поддерживать на уровне URB протокола.



Записан
Artem
Интересующийся

ru
Offline Offline

« Ответ #14 : 02-08-2006 04:18 » 

Эта железка - это макетная плата с микроконтроллером AT91SAM7S64. С прошивкой от ИАРа. (Basic USB). Вот хочу с ниим разобраться для начала. Но там 1 конфигурация и два интерфейса, в одном 1 к.т., а в другом - 2 к.т. Вот я и хочу переключить интерфейс. А как сделать пока не знаю...
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #15 : 02-08-2006 06:32 » 

Все понятно, но опять же, по хорошему действовать нужно по выше описанному алгоритму, выполнить вот те 5 шагов, а дальше переключай интерфейсы как хочешь. Все равно скоро тебе понадобится еще и данные передавать или получать, а без понимания протокола завернутого в URB запросы - никуда. Примеры смотри в DDK, они довольно хорошо написаны.
Записан
Artem
Интересующийся

ru
Offline Offline

« Ответ #16 : 02-08-2006 09:21 » 

А может есть у кого нибудь исходник для примера? А то в DDK слишком большой и трудный для понимания на начальных порах...
Записан
Sdefs
Гость
« Ответ #17 : 26-10-2006 15:14 » 

Здоров!
Чесно говоря разбираюсь с той же темой!
AT91SAM7S64.
Нужно разобраться с интерфейсом USB.
Ты же разбирался с этим почти 3 месяца назад, многое узнал наверно.
Подскажешь, можно ли отлаживать драйвер в вижуале?
Есть ли у тебя такой драйвер?

* atm6124.Inf (1.7 Кб - загружено 839 раз.)
* atm6124.sys (50.38 Кб - загружено 817 раз.)
Записан
Artem
Интересующийся

ru
Offline Offline

« Ответ #18 : 09-11-2006 06:02 » 

Привет. Вроде разобрался. Но в Вижуале я не работаю, поэтому не знаю как так отлаживаться. Я пишу в редакторе и компилирую DDK. Отлаживаюсь в СофтАйсе. Если интересно - пиши Ctrl_Shift@ngs.ru
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #19 : 16-01-2007 19:11 » 

Вообще советую еще раз: поставь USB монитор...

а можешь посоветовать какой-нибудь USB монитор?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Artem
Интересующийся

ru
Offline Offline

« Ответ #21 : 19-01-2007 05:00 » 

Да, программа хорошая, только таблетки на неё я не нашёл.. Жаль  . Может у кого есть?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 19-01-2007 10:55 » 

говорят часы можно при запуске не пол года назад перевести...? не пробовал...

PS
http://www.softforfree.com/programs/advanced_usb_port_monitor-4640.html
докучи... не помню ставил или нет...

PPS
http://vrchance.net/Computers/Hardware/Buses/USB
докучи ссылок на разработчиков...
« Последнее редактирование: 19-01-2007 11:05 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Artem
Интересующийся

ru
Offline Offline

« Ответ #23 : 22-01-2007 04:38 » 

Мне понравилась ещё SourceUSB, но на неё тоже таблетку не нашёл. Сейчас юзаю USBTrace, и лекарство на него у меня есть. Прога такая-же почти такая-же как и те. В общем за неимением ничего устраивает. Ещё можно юзать SnoopyPro. Она тоже показывает что при энумерации происходит.
« Последнее редактирование: 22-01-2007 04:42 от Artem » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines