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

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

ru
Offline Offline
Пол: Женский

« : 09-03-2016 11:30 » 

Здравствуйте! Помогите, пожалуйста, разобраться!
Требуется послать вендор-команды устройству, в Numega DS это задача реализована с помощью данной функции:
Код:
pUrb = m_Lower.BuildVendorRequest(
NULL, // transfer buffer
0, // transfer buffer size
0, // request reserved bits
1, // request
0, // Value
FALSE, // In
FALSE, // Short Ok
NULL, // link urb
0, // index
URB_FUNCTION_VENDOR_DEVICE // function
);

Этот код замечательно работает, переписала с помощью библиотек WinDDK:
Код:
WDF_REQUEST_SEND_OPTIONS_INIT(


WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&controlSetupPacket,
BmRequestHostToDevice,
BmRequestToDevice,
1, // Request
0, // Value
0); // Index


status = WdfUsbTargetDeviceSendControlTransferSynchronously(
pDevContext->UsbDevice,
WDF_NO_HANDLE, // Optional WDFREQUEST
NULL,//
&controlSetupPacket,
NULL, // MemoryDescriptor
NULL); // BytesTransferred

Но в моей интерпретации посылка запроса работать не хочет, выдает статус unsuccessful, в usblyzer пишет STALL PID (это, как я понимаю, говорит о том, что устройство не понимает запрос).
Не знаю,что и делать, возможно упускаю какую-то деталь...
Записан
Ochkarik
Модератор

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

« Ответ #1 : 09-03-2016 14:38 » new

проверьте WdfRequestGetCompletionParams
Params->Parameters.Usb.Completion->UsbdStatus? а у вас его нет.... хм

не обязательно - не понимает. устройство может решить это по своему состоянию. может быть просто не выполнены какие то еще условия. неверное состояние устройства или еще какая то предварительная инициализация требуется.
может еще WDF_REQUEST_SEND_OPTION_TIMEOUT добавить - мало ли что.. но вряд ли поможет.

посмотрите повнимательней - одинаковое ли состояние вашего устройства перед этим запросом в обоих вариантах вашего драйвера?
Записан

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

ru
Offline Offline
Пол: Женский

« Ответ #2 : 10-03-2016 11:40 » 

Статус я проверяю так:
Код:
if (!NT_SUCCESS(status)) {DbgPrint("send failed- 0x%x \n", status);}
Код статуса выдает 0xC0000001 (STATUS_UNSUCCESSFUL), хотя при первом подключении запрос работает...а потом никак

С таймаутом экспериментировала, результат также отрицательный)

Единственное подозрение вызывает результат в usblyzer. В рабочем варианте

В моей модификации такой результат

setup packet в обоих случаях одинаковый

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

Смущает этот vendor device и как его можно получить...



* 2.jpg (46.29 Кб - загружено 1200 раз.)
* 3.jpg (46.88 Кб - загружено 1273 раз.)
* 1.jpg (19.7 Кб - загружено 1281 раз.)
« Последнее редактирование: 10-03-2016 11:43 от Манник » Записан
Ochkarik
Модератор

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

« Ответ #3 : 10-03-2016 11:54 » 

немного не понял - вы про пакет 7928?

Добавлено через 1 минуту и 26 секунд:
посмотрите что внутри, разберите по полям пакет
« Последнее редактирование: 10-03-2016 11:55 от Ochkarik » Записан

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

ru
Offline Offline
Пол: Женский

« Ответ #4 : 10-03-2016 12:31 » 

Да, я про пакет 7928. Спасибо за подсказку! Только вот теперь понять, что там к чему нужно... Еще стала сравнивать 0016 с 7929, есть некоторые отличия, правда, в тех вещах, что мне пока неведомы... Попробую разобраться. И 7928 я разобрала,все равно остается загадкой, как получить этот таинственный запрос vendor device вместо control transfer. Там используется структура _URB_CONTROL_VENDOR_OR_CLASS_REQUEST, чтобы задать ее параметры раньше пробовала делать так
Код:
UsbBuildVendorRequest(urb,
   URB_FUNCTION_VENDOR_DEVICE,
   sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
   ( USBD_TRANSFER_DIRECTION_OUT| USBD_SHORT_TRANSFER_OK),
      0,
      1,
      0,                        // value
      0,                        // index
      NULL,
      NULL,
      0,
      NULL
);
status = WdfUsbTargetDeviceSendUrbSynchronously(pDevContext->UsbDevice,
  NULL,
  NULL,
  &urb);



В этом случае, статус был 0xC000000D (STATUS_INVALID_PARAMETER) и в usblyzer никак не отображалось это действие, то есть никакого control transfer  не было
« Последнее редактирование: 10-03-2016 12:33 от Манник » Записан
Ochkarik
Модератор

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

« Ответ #5 : 10-03-2016 15:44 » 

я где то ссылку про USB кидал в списке литературы. там коротенечко про аппаратный протокол. проглядите. может натолкнет на мысль) вообще может вы все таки сравните то что нумега делает и что в в WDF перевели? там наверное по умолчанию какие нить свойства читаются или еще что...

PS не, ну если это REQUEST то наверное надо что-то где-то заполнить в URB_CONTROL_VENDOR_OR_CLASS_REQUEST)
Записан

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

ru
Offline Offline
Пол: Женский

« Ответ #6 : 11-03-2016 05:14 » 

Да-да,я как раз думаю в том направлении. Спасибо за подсказку, и литературу обязательно посмотрю!
Буду пока разбираться)
Записан
Манник
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #7 : 17-03-2016 06:22 » 

Спасибо за Ваши советы! Все получилось! Ура!) Я воспользовалась UsbBuildVendorRequest, только посылала WdfRequestSend'ом.  Единственное,ну вот совсем элементарная вещь ну никак у меня не получается! мне нужно один байт, полученный от устройства, передать приложению, как я только не пробовала, последние два варианта, вроде как более вменяемые, оборачиваются BSOD (KMODE_EXCEPTION_NOT_HANDLED) на процедуре копирования в outputbuffer. Что ж тут я не так делаю? Все из примеров взято
Это первый вариант
Код:
                                                          status = WdfRequestRetrieveOutputMemory(
Request,
&mem
);
if (!NT_SUCCESS(status)){
DbgPrint("WdfRequestRetrieveOutputMemory failed\n");
goto Exit;
}


status = WdfMemoryCopyFromBuffer(
mem,
0,
buffer,
length
);
if (!NT_SUCCESS(status)) {
DbgPrint("WdfMemoryCopyFromBuffer failed\n");
goto Exit;
}
Второй
Код:
                                    status = WdfRequestRetrieveOutputBuffer(Request, length, &bufferIO, &buflength);
if (!NT_SUCCESS(status)){
DbgPrint("WdfRequestRetrieveInputBuffer failed\n");
goto Exit;
}
RtlCopyMemory(&bufferIO, &buffer, length);
На форуме все уже по этой теме прочитала, в интернете обыскалась,предлагаются эти варианты везде, но у меня что-то идет не так.. Здесь была моя ладья...
Записан
Ochkarik
Модератор

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

« Ответ #8 : 17-03-2016 15:28 » 

а на какой строке то падает? на WdfMemoryCopyFromBuffer и RtlCopyMemory?
может быть с выравниванием что то ? IRQL?

Добавлено через 51 секунду:
проверяйте buflength?

Добавлено через 2 минуты и 26 секунд:
Request у вас существует на момент после выполнения запроса вообще?
« Последнее редактирование: 17-03-2016 15:31 от Ochkarik » Записан

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

ru
Offline Offline
Пол: Женский

« Ответ #9 : 18-03-2016 11:00 » 


Да, падает на этих строках.

Честно говоря, про выравнивание не знаю...как это проверить можно?

Насчет IRQL сомневаюсь, я так понимаю, тогда в bsod система вылетела бы с ошибкой об irql.

buflength=1, как и полагается, насчет Request засомневалась, попробовала создать новый запрос (можно же так?), тот же самый результат. После status = WdfRequestRetrieveOutputMemory(Request, &mem) вывела параметр mem, dbgprint показал число, значит же, что память выделяется, я так понимаю? и status=success.



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

ru
Offline Offline
Пол: Женский

« Ответ #10 : 21-03-2016 11:33 » 

Пробовала много вариантов, вот так bsod не вылетает, но и не передает значение приложению

Код:
status = WdfRequestRetrieveOutputBuffer(Request, sizeof(buffer), &bufferIO, &buflength);
if (!NT_SUCCESS(status)){
DbgPrint("WdfRequestRetrieveOUtputBuffer failed\n");
break;
}


RtlZeroMemory(&bufferIO, buflength);
RtlCopyMemory(&bufferIO, &buffer, OutputBufferLength);

А сейчас смущают указатели, так как во всех примерах, что я видела, обходятся без них, а без них bsod...
« Последнее редактирование: 21-03-2016 12:46 от Манник » Записан
Ochkarik
Модератор

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

« Ответ #11 : 21-03-2016 19:26 » 

уууу...
в WdfRequestRetrieveOutputBuffer -
&bufferIO - адрес переменной bufferIO, где будет лежать указатель на буфер.
в RtlZeroMemory и RtlCopyMemory - не нужен указатель на указатель. тут просто адрес буфера.

Добавлено через 6 минут и 46 секунд:
указатель это ж простая вещь.
есть место в памяти где хранится допустим массив. у этого места есть адрес(он же указатель). но адрес может выделяться динамически и его тоже надо где то хранить!
когда мы это адрес буфера(указатель) пытаемся передать наружу из функции - мы его должны положить в переменную.  а чтобы функция знала куда положить адрес буфера - мы ей должны сказать адрес переменной в которую она положит нам нам адрес буфера. это и получается указатель на указатель.
PS главное не путать указатели со ссылками)
« Последнее редактирование: 21-03-2016 19:36 от Ochkarik » Записан

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

ru
Offline Offline
Пол: Женский

« Ответ #12 : 22-03-2016 08:22 » 

Цитата
уууу...

Совсем все плохо, да?)

Что такое указатель, я понимаю) И теперь я ощутила всю-всю его важность!

Код:
       
          status = WdfMemoryCopyFromBuffer(
                                                                mem,
0,
&buffer,
length
     );

Все заработало)Спасибо огромное за Ваши советы!)

Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines