Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Композитное USB устройство но мало эндпоинтов?
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Albun
Здравствуйте!
При написании прошивки под микроконтроллер AT91SAM7S128 cтолкнулся со следующей проблемой.
Необходимо сделать композитное устройство которое будет объединять в себе два виртуальных компорта (CDC). Соответственно делаю дескриптор конфигурации в котором описаны оба CDC. При этом в каждом CDC есть пункт описания BULK эндпоинтов входа и выхода а также один interrupt эндпоинт. Итого в сумме получается 6 эндпоинтов необходимо для реализации двух CDC в одном композитном устройстве.

Вот вырезка описания BULK эндпоинтов
для первого CDC:
0x07,0x05,0x01,0x02,0x40,0x00,0x00, (тут эднпоинт адрес = 1)
0x07,0x05,0x82,0x02,0x40,0x00,0x00, (тут эднпоинт адрес = 2)
для второго CDC:
0x07,0x05,0x04,0x02,0x40,0x00,0x00, (тут эднпоинт адрес = 4)
0x07,0x05,0x85,0x02,0x40,0x00,0x00 (тут эднпоинт адрес = 5)

Т.е. каждый эндпоинт должен иметь свой адрес который у меня равен 1,2, 4 и 5. Проблема в том что микроконтроллер имеет только 3 эндпоинта (не считая контрольного). Получается я могу задать адреса только
от 1 до 3, т.е. например только для первого CDC, а для второго уже не хватает свободных эндпоинтов. Есть ли возможность каким то образом обойти данное ограничение, т.е. задать дескриптор конфигурации
каким-то таким образом что и второму CDC я смогу задать адреса эндпоинтов от 1 до 3?

Или, вообще, допустим я хочу сделать композитное устройство с 10-ю CDC. Возможно ли такое или количество устройств которые я могу объеденить в одно композитное упирается в количество доступных эндпоинтов (что для AT91SAM7S128 равно 4, для AT91SAM7X128 равно 6 и вообще спецификацией USB зарезервировано 4 бита что равно максимально 16-ти возможным эндпоинтам)???
tAmega
Нет не можете. Если открыли USB устройство, то нельзя у него отнимать эндпойнты "на лету". И если у Вас 5 эндпойнтов, максимум что можно сделать, это mass storage + CDC.
Alex11
Сэкономить можно только на Interrupt endpoint. Если вы не используете изменение битов состояния COM-порта, а только передачу данных, то для нескольких CDC можно назначить один и тот же Interrupt endpoint. Формально некорректно, но работает.
Albun
Цитата(Alex11 @ Jun 18 2009, 10:50) *
Сэкономить можно только на Interrupt endpoint. Если вы не используете изменение битов состояния COM-порта, а только передачу данных, то для нескольких CDC можно назначить один и тот же Interrupt endpoint. Формально некорректно, но работает.


Да, именно так пришлось и поступить, назначить общую Interrupt эндпоинт. У меня используется простейшая конфигурация порта - RX & TX, так что по interrupt EP вообще ничего не отсылаю. Я пробовал вообще выбрасывать описание для interrupt EP из дескриптора конфигурации, но тогда системой воспринимался только первый отсылаемый bulk пакет, второй уже не отсылался - система не подтверждала его принятие. Фактически я проверил, если указан один и тот же адрес эндпоинта для двух устройств, то Windows приписывает эту эндпоинт первому устройству. Точно так же пришлось поступить для объединения CDC + CCID ридера - я разместил в дискрипторе конфигурации описание ридера первым а CDC вторым с общей interrupt эндпоинт и соответственно системой воспринимаются пакеты высланные по Interrupt EP как от CCID устройства.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.