Часть 1. Подготовка порта
Для начала, рассмотрим Type-C порт, чтобы понять, как можно протянуть линии SWD через него. Первое, что приходит на ум - это конечно, же, заменить D+/D- линии на свои, однако без специального переходника наше устройство нельзя будет подключить в обычный порт.
Не буду затягивать и подробно рассказывать про все сигнальные линии в USB Type-C, эта тема прекрасно раскрыта в этой статье, на которую я и опирался при разработке.
В общем, нас интересуют пины SBU1/SBU2:
Да, мы собираемся использовать эти пины для того, чтобы протянуть по ним SWDIO и SWCLK. Да, прошивка и отладка будут работать только при определенной ориентации кабеля.
Часть 2. Проверка идеи
Для проверки работоспособности этой идеи, я собрал адаптер для J-Link. И тут важное примечание - подойдет далеко не любой кабель, обычно эти пины никак не задействованы и физически не подключены.
Опираясь на вышеупомянутую статью, я расковырял два кабеля - переходник USB Type-C - 3.5mm jack от Google Pixel и нерабочий переходник USB Type-C - HDMI. Оба варианта были с нужными проводниками, однако по аудио-переходнику невозможно было запитать линию VBUS, поэтому я остановился на кабеле от HDMI переходника.
И спаял я такое:
эстетов пайки попрошу отойти от экранов
Концепт оказался на 100% работоспособным и данный кабель работает по сей день.
Часть 3. Программатор
Теперь, когда сомнений уже не осталось, я спроектировал плату-переходник, со входом и выходом Type-C. Схему ST-Link я перерисовал с документации на платы Discovery.
Прошивка кастомного ST-Link в первый раз может занять приличное время на гугление, поэтому вот мой рецепт.
Скачиваем бутлоадер ST-Link здесь, выбираем (в моем случае) Unprotected-2-0-Bootloader.bin. На моей плате версии 2.1 не завелась, скорее всего дело в дополнительной схеме USB ренумератора (пытался добавить навесным монтажом, красный проводок на плате - это оно, но не вышло).
После прошивки бутлодера, скачиваем старую версию ST-Link Utility (у меня сработала версия 3.6), новые версии отказываются прошивать ST-Link.
Ну и все, теперь отладка через USB Type-C порт вам доступна, при этом обычные возможности порта полностью сохранены, у меня на этом порте висит USB-UART преобразователь, через который тоже можно прошивать ваше устройство через системный или самописный бутлоадер.
Зачем так заморачиваться?
В моем случае, мне хотелось отлаживать устройство в собранном виде, без подпаянных проводов, в корпусе, прямо по месту его установки. И это очень удобно! Однако, следует помнить, что для отладки программатор нужно втыкать определенной стороной.
Неправильное подключение не ведет к каким-то неприятным последствиям на моих платах, однако этот момент следует держать в голове.
Комментарии (9)
skyazimuth
28.10.2023 11:03+1Прям дежавю :) С COM-портами в былинные времена так извращались, то модемные линии как эрзац-GPIO использовали, то вообще "лишние" контакты не по назначению использовали (например, +5V подвести) :)
Megobari
28.10.2023 11:03+3А я плюсанул.
Вот серьёзно, читаю и думаю, ну для чего это может пригодиться, ну ведь отлаживаемся всегда и так на проводках и нормально. И в продакт такое не закинешь: если есть вариант не так воткнуть кабель, то его именно не так и будут всегда втыкать.
А потом дочитал, что отлаживать изделие в корпусе. И тут что-то проникся идеей. Ну реально есть такие кейсы, когда не удобно, или опасно вскрывать корпус при отладке, или вообще корпус на работу завязан.Так что автору спасибо, в копилку интересных идей себе закину.
iDoka
28.10.2023 11:03+1Однако, следует помнить, что для отладки программатор нужно втыкать определенной стороной.
Так возьмите microUSB - там не перепутаешь, тем паче вы выбрали SWD (2 сигнала всего). Зачем с тайп-си так заморачиваться?
stiger19 Автор
28.10.2023 11:03Так я же написал, USB должен работать как нормальный порт. Я считаю плохой практикой вешать на D+/D- (и RXn/TXn+/- тоже) что-то левое, тем более в устройствах, которые выпускаются не в единичном экземпляре
iDoka
28.10.2023 11:03+2Т.е. в доступном пользователю тайп-си будет в числе прочего прямой доступ к SWD? Считаю плохой практикой вешать на пользовательский что-то левое, способное окирпичить девайс, тем более в устройствах, которые выпускаются не в единичном экземпляре.
Когда деревья были зеленее, а контактов в разъёме USB было меньше, использовались аппаратные решения на базе микросхем USB-switch: в кабель на стороне device добавлялся резистор на пин ID, а USB-switch на основе анализа номинала сопротивления внутри девайса аппаратно коммутировал DP/DN к USB/UART/SWD/whatever you want...
solarplexus
28.10.2023 11:03Я сейчас погуглил назначение пина ID, и мне ваш вариант автосвитчинга понравился. То есть, если установить определенное напряжение на ID со стороны устройства (не ноль и не питание), и пользователь воткнет в устройство OTG-кабель (ID в ноль установится), то он ничего не нарушит в логике работы. И при этом, зная "кодовый" уровень напряжения на ID, мы (разработчики) можем переключить функционал D+\D-.
osmanpasha
28.10.2023 11:03Один минус - отладить USB не получится, т.к. ноги заняты другим интерфейсом.
Dark_Purple
Ахаха. Всё давным-давно украдено до нас, например: https://habr.com/ru/companies/ruvds/articles/766250/