реклама на сайте
подробности

 
 
> Обработка vendor-запросов в USB устройстве на базе ISP1583
ArkZel
сообщение Mar 7 2009, 07:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 15-12-08
Из: Томск
Пользователь №: 42 479



На стороне хоста использую функцию UsbBuiltVendorRequest(&urb, URB_FUNCTION_VENDOR_DEVICE, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), 0, 0, 0x0C, 0, 0, &buf, NULL, 4, NULL)
для посылки устройству 4-х байтового значения. Устройство получает пакет SETUP в 8-байтный буфер (set-up token).
Никаких прерываний по EP0RX не получаю. Где должны находится отправленные данные? Как корректно обрабатывать SETUP запросы, содержащие данные (в направлении OUT).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
galjoen
сообщение Mar 7 2009, 14:26
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(ArkZel @ Mar 7 2009, 10:32) *
...
Никаких прерываний по EP0RX не получаю. Где должны находится отправленные данные? Как корректно обрабатывать SETUP запросы, содержащие данные (в направлении OUT).

С ISP1583 не работал. Но по логике нужно сначала разобрать сетупный пакет, а затем приём данных разрешить. А м.б. в данном случае нужно не данные принимать, а STALL хосту послать. Микросхема откуда об этом знать может? Она пока вы не решите NAK-овать будет...
Go to the top of the page
 
+Quote Post
Alex11
сообщение Mar 8 2009, 21:26
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Не знаю, как для 1583, но у меня в 1581 сделано так (и все работает): считывается setup-пакет, затем в endpoint index ставится 0, далее дожидаемся, пока в регистре длины не окажется нужное число байт (пришедшее в setup'e или 64, что меньше). Затем считываем пришедшие данные. Если их было больше 64, остальное принимаем по прерываниям. Я уже не помню за давностию лет, почему так сделано, но работает.
PS. В драйвере запрос правильный. Единственно, я бы вместо URB_FUNCTION_VENDOR_DEVICE поставил URB_FUNCTION_VENDOR_INTERFACE и изменил, соответственно, разборку в устройстве.
Go to the top of the page
 
+Quote Post
ArkZel
сообщение Mar 9 2009, 06:51
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 15-12-08
Из: Томск
Пользователь №: 42 479



Пробую передать данные на 0-ю конечную точку с помощью Driver Wizard. Эффект тот же. Принимаю setup:

bmRequestType = 0x40
bRequest = 0x0C
wValue = 0x0000
wIndex = 0x0000
wLength = 0x0004.

После этого пытаюсь забрать данные с EP0OUT. Однако длина принятых данных = 0, никакого прерывания я тоже не ловлю.

Как вообще забрать данные с контрольной нулевой точки.
Пробовал делать инициализацию Ep0Out, ни к чему не привело.
Go to the top of the page
 
+Quote Post
ArkZel
сообщение Mar 9 2009, 07:58
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 15-12-08
Из: Томск
Пользователь №: 42 479



Все нашел ошибку!

Нужно было установить бит USB_ISP1583_regs->Control_Function.BITS.DSEN = 1; для приема данных.
Надо лучше читать документацию smile.gif

Всем спасибо можно считать тему закрытой.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016