Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB SETUP Request
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
amw
Устройство на базе AT91SAM7S256, CDC ACM.
Софт собственный, не из примеров.

После подключения происходит следующее:
Получаю SETUP Request GetDescriptor(Device)
Отсылаю DeviceDescriptor
Получаю SETUP Request SetAddress
Устанавливаю, подтверждаю.
Получаю SETUP Request GetDescriptor(Device)
Отсылаю DeviceDescriptor
Получаю SETUP Request GetDescriptor(DeviceQualifier)
Отсылаю STALL, потому как устройство FullSpeed USB 2.0
Получаю SETUP Request GetDescriptor(Configuration)
Отсылаю ConfigurationDescriptor. Описывает два интерфейса - ACM и Data, с тремя конечными точками в соответствии со спецификацией CDC.
Затем серия запросов на StringDescriptor.
Отсылаю запрошенное.
Получаю SETUP Request SET_LINE_CODING с параметрами (скорость, стопбиты, четность ...).
Подверждаю.
Получаю SETUP Request SET_CONTROL_LINE_STATE.
Подверждаю.
И получаю недокументированный запрос (байты пакета):
Код
0x80 0x25 0x00 0x00 0x00 0x00 0x08 0x00

Запрос с кодом 0x25 не описан в USB спецификации, а в спецификации Communication Device Class в Table 46 сказано:
Цитата
RESERVED (future use) 24h-2Fh

Пробовал отсылать в ответ и пустой пакет и STALL, результат одинаковый.
Хост как с Linux так и с Windows молчит по этому поводу (т.е. не сообщает об ошибке).
Появляется последовательный порт, но открыть его не удается: Input/Output Error в обоих ОС.

На конечные точки (кроме нулевой) никаких пакетов не приходит.

Что я пропустил?
Где искать описание на этот запрос?
Что с этим запросом делать?
Толик
Я конечно не очень разбираюсь:

А если STALL послать?....хотя он по умолч посылается. blush.gif

Раз уж пошёл такой разговор,
а я в нём мало что понимаю, то возникли вопросы:
- как подтвердить LINE_CODING и CONTROL_LINE_STATE?
- данные через Bulk'и произвольно посылаются или как-то
с согласованием Inter.endpoint?

судя по примеру для 5131 interupt endpoint
вообще не на что не влияет
amw
Цитата(Толик @ Apr 20 2007, 21:52) *
Я конечно не очень разбираюсь:

А если STALL послать?....хотя он по умолч посылается. blush.gif

Обратите внимание на вот это в первом посте:
Цитата
Устройство на базе AT91SAM7S256...

STALL автоматом не посылается. Для этого есть специальный бит в регистре CSR.
Цитата
Раз уж пошёл такой разговор,
а я в нём мало что понимаю, то возникли вопросы:
- как подтвердить LINE_CODING и CONTROL_LINE_STATE?

Подтверждения "посылаются" путем установки/сброса битов в регистрах контроллера.
Как результат - контроллер посылает ACK.
Цитата
- данные через Bulk'и произвольно посылаются или как-то
с согласованием Inter.endpoint?

Данные вообще не посылаются, так как не закончена процедура инициализации (через EP0).
Цитата
судя по примеру для 5131 interupt endpoint
вообще не на что не влияет
Толик
Цитата(amw @ Apr 21 2007, 12:46) *
Обратите внимание на вот это в первом посте:

STALL автоматом не посылается. Для этого есть специальный бит в регистре CSR.

Подтверждения "посылаются" путем установки/сброса битов в регистрах контроллера.
Как результат - контроллер посылает ACK.

Данные вообще не посылаются, так как не закончена процедура инициализации (через EP0).


Так что же получается запросы
LINE_CODING и CONTROL_LINE_STATE
посылаются только, чтобы их подтверждать?
Неужели он не несёт никакой информации?
Что-то я сомневаюсь....
Для 5131-микроконтроллера они сохраняют в памяти line_coding, а потом посылают на запрос get_line_coding(но это не точно, тк пишу по памяти)

Так вы послали Stall на этот несуществующий Setup-запрос?
Может и не надо на него реагировать, а браться уже за Bulki и слать данные?
Вот у меня допустим SAM7A3 и я сейчас с одной стороны не знаю как реагировать на те
2 запроса, а сдругой стороны ищу программу снифера(ну или тестера) для com-порта(но не для usb) чтобы узнать как работает моё устройство(В Диспетчере устройств говорит, что нормально....).

А на счёт закончена процедура инициализации(я как понимаю нумерации) или нет, то я даже не знаю, что и сказать. Ведь все дескрипторы посланы. Система знает, что у нового устр-ва есть 3 конечные точки.....мне кажется пора слать данные.....У меня честно говоря столько вопросов...
amw
Цитата(Толик @ Apr 22 2007, 21:40) *
Так что же получается запросы
LINE_CODING и CONTROL_LINE_STATE
посылаются только, чтобы их подтверждать?
Неужели он не несёт никакой информации?
Что-то я сомневаюсь....

Правильно делаете smile.gif.
CONTROL_LINE_STATE в поле wValue несет состояние сигнала RTS.
Для LINE_CODING после SETUP запроса приходит OUT пакет на нулевую конечную точку в котором указаны скорость, четность, стоп биты и длина символа.
В соответствии с этими запросами устанавливаются параметры и сигналы USB CDC ACM устройства, коим есть мой SAM7S.
Запросы нужно подтверждать, чтобы хост знал об успешном получении/выполнении запросов.
Цитата
Для 5131-микроконтроллера они сохраняют в памяти line_coding, а потом посылают на запрос get_line_coding(но это не точно, тк пишу по памяти)

Делаю то-же самое.
Цитата
Так вы послали Stall на этот несуществующий Setup-запрос?

Да.
Цитата
Может и не надо на него реагировать, а браться уже за Bulki и слать данные?
Вот у меня допустим SAM7A3 и я сейчас с одной стороны не знаю как реагировать на те
2 запроса, а сдругой стороны ищу программу снифера(ну или тестера) для com-порта(но не для usb) чтобы узнать как работает моё устройство(В Диспетчере устройств говорит, что нормально....).

Попытка открыть последовательный порт приводит к Input/Output Error.
Цитата
А на счёт закончена процедура инициализации(я как понимаю нумерации) или нет, то я даже не знаю, что и сказать. Ведь все дескрипторы посланы. Система знает, что у нового устр-ва есть 3 конечные точки.....мне кажется пора слать данные.....

Да, есть три конечных точки. IN, OUT, INTERRUPT. Все BULK. Хост все это видит, загружает драйвер (который и шлет запросы LINE_CODING и CONTROL_LINE_STATE). Появляется последовательный порт (COM3 в Windows и /dev/ttyACM0 в Linux). Но данные передавать не удается (см. выше).
Очевидно, я чего-то не понимаю и что-то делаю не так. Вопрос только что?
Цитата
У меня честно говоря столько вопросов...

Каких?

Пока отвечал отвечал не пост Толик осенила меня мысль.
Сейчас проверил.
В полном соответствии с традициями данного форума сообщаю:
Сам дурак! А именно:
Пакет SET_LENE_CODING обрабатывается программой дважды.
Сначала правильно, а потом данные за пакетом SETUP обрабатываются как новый пакет SETUP.
Если переписать байты пакета (см. первый пост) то получим структуру Line Coding:
0x80 0x25 0x00 0x00 - скорость 9600
0x00 - 1 stop bit
0x00 - No Parity
0x08 - 8 bits per symbol
0x00 - просто мусор в буфере от предыдущих транзакций.

Всем спасибо! И особое спасибо Толик!!!!
Толик
Ну если кратко:
- какую вы использовали литературу?

А если конкретно:
- что делать с данными из этих 2 запросов?
Вроде ни в какой регистр карты памяти USB-контроллера они не лезут.

- Для вашего устройства вы писали драйвер или ссылались inf-файлом на стандартный Windows'овский(на какой ссылались)?

- ну и непонятна, как я уже говорил, логика работы com'а. Т.е. как связаны interrupt EP и Bulk'и?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.