Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Categories:

Нафиг не нужная поделка

Зашел на одном из форумов спор, что невозможно поднять (N-1) устройство CDC-ACM на микроконтроллере с N концевыми точками (N<=8). ОК, держите СЕМЬ CDC на одном устройстве.
Правда, я стал реализовывать это на STM32F103, подзабыв, какое он Г по сравнению с нулевой серией. А ведь там буфер под USB — всего-то 512 байт! Из них 64 уже занято описанием конечных точек плюс минимум 16 байт надо выделить на EP0. Получается 61 с небольшим байт на каждое устройство. Ближайшее круглое число — 32, так что пришлось буферы Rx/Tx каждого CDC урезать до 16 байт. Дескриптор конфигурации — просто ад! В полпервого ночи я его с первой попытки правильно заполнить не осилил (хоть и выделил те места, в которые нужно вносить изменения). Таки нужно такие вещи автоматом генерировать. Как же это работает без INTERRUPT IN? Да очень просто: я еще когда лепил эмуляцию PL2303, обратил внимание на то, что вообще никогда хост не работает с этой конечной точкой. И ее можно даже не инициализировать! Но, однако, она должна быть указана в дескрипторе. Как победить ситуацию? Ответ увидел где-то на SO или забугорном форуме: нужно просто указывать "виртуальную" конечную точку. На STM32F103/0x2 всего 8 конечных точек, а стандарт USB допускает использование шестнадцати. Следовательно, т.к. у нас EP0 занята, остается еще 7 конечных точек. Каждую настраиваем как INOUT (и в обработчике не забываем, что и на IN, и на OUT необходимо выставлять Tx valid — я с этим уже немного потупить успел), а вот для INTERRUPT IN указываем несуществующие точки, начиная с номера восемь!
Понятно, что всякие обработчики вроде SET_CONTROL_LINE_STATE использовать для выставления флага установленного соединения нельзя: ведь теперь аж 7 независимых каналов! И каждый работает с этой EP0. Поэтому писать приходится постоянно в каждый канал (разве что можно поставить флажок, что канал пока что не активен; а потом не писать в этот канал, пока не получим прерывание IN, в нем флажок и сбросим; но мне такой вариант городить лень было).
Пока могу лишь одно применение этой штуке придумать: когда я делал хронометр, меня просили сделать возможным подключение "малинки" для проксирования на нее данных с GPS. Либо этот UART можно было использовать как отладку. С таким диким устройством можно все в один USB запихать ☺ Только перейти на более вменяемый микроконтроллер (может, на 303?).
Tags: stm32, usb, велосипедостроение, железяки, идиотия
Subscribe

  • Хеши строковых команд для МК

    Долго я к этому шел, но, похоже, пора уже: однобуквенные команды сложно запоминать (особенно если команд толпа, и большая часть с этими буквами…

  • Разбираемся с утечками

    Занялся полным рефакторингом кода системы управления оптоволоконным спектрографом. А глаз уже "замыленный": ну вот не могу сходу обнаружить, где я…

  • Шо, товарищи, facebook и watsapp — тыгыдым?

    Собственно, уже часа 2 с хвостиком не работают. Интересно: это роскомпозор охренел или что? Reposted from dreamwidth:…

promo eddy_em september 3, 12:13 8
Buy for 10 tokens
Уже больше полугода занимаюсь разработкой, вот, наконец-то в мастерских взялись за меня и начали выдавать первые детали. Сегодня сделал тестовую сборку (как обычно, местами пришлось "доработать напильником"): Пока прибор без названия (да и как-то не лезет в голову ничего, у меня нет…
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments