Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка vendor-запросов в USB устройстве на базе ISP1583
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
ArkZel
На стороне хоста использую функцию 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).
galjoen
Цитата(ArkZel @ Mar 7 2009, 10:32) *
...
Никаких прерываний по EP0RX не получаю. Где должны находится отправленные данные? Как корректно обрабатывать SETUP запросы, содержащие данные (в направлении OUT).

С ISP1583 не работал. Но по логике нужно сначала разобрать сетупный пакет, а затем приём данных разрешить. А м.б. в данном случае нужно не данные принимать, а STALL хосту послать. Микросхема откуда об этом знать может? Она пока вы не решите NAK-овать будет...
Alex11
Не знаю, как для 1583, но у меня в 1581 сделано так (и все работает): считывается setup-пакет, затем в endpoint index ставится 0, далее дожидаемся, пока в регистре длины не окажется нужное число байт (пришедшее в setup'e или 64, что меньше). Затем считываем пришедшие данные. Если их было больше 64, остальное принимаем по прерываниям. Я уже не помню за давностию лет, почему так сделано, но работает.
PS. В драйвере запрос правильный. Единственно, я бы вместо URB_FUNCTION_VENDOR_DEVICE поставил URB_FUNCTION_VENDOR_INTERFACE и изменил, соответственно, разборку в устройстве.
ArkZel
Пробую передать данные на 0-ю конечную точку с помощью Driver Wizard. Эффект тот же. Принимаю setup:

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

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

Как вообще забрать данные с контрольной нулевой точки.
Пробовал делать инициализацию Ep0Out, ни к чему не привело.
ArkZel
Все нашел ошибку!

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

Всем спасибо можно считать тему закрытой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.