Привет, Хабр! В этой статье рассказываем о созданном нами устройстве, которое помогает тестировать электронные девайсы в процессе разработки. Речь идет об устройстве для автоматизации и имитации процесса отключения/переподключения USB-гаджетов. Подробности разработки и самого устройства – под катом. Сейчас самые популярные типы USB-подключений – USB Type A и Type C. Стоит отметить, что с каждым годом все больше производителей пытаются унифицировать тип используемого разъема. Речь идет о USB Type C с поддержкой протокола USB Power Delivery для обеспечения необходимых 9-48В. Ну и большинство флеш-накопителей и ряд различных устройств подключаются по USB Type A. Именно поэтому эти два разъема выбраны целевыми для нашего "USB-Разрывателя". Автоматизация процесса тестирования устройств с USB-разъемом. В процессе тестирования устройств, особенно тех, у которых имеется большое количество различных функций, необходимо постоянно переподключать устройства к компьютеру для корректной перезагрузки устройства и имитации его полного отключения. Для этого необходимо изобретать какие-то различные оснастки для автоматизации или же работать руками, в прямом смысле. С помощью USB-Разрывателя данный процесс удается упросить или даже полностью автоматизировать за счет возможности управления коммутацией USB-разъема с управляющего компьютера. Автоматизация для тестирования аппаратной составляющей так же важна. Конкретный пример тестирования, которое необходимо было провести у нас в компании для одного из USB-устройств, – необходимость переподключить устройство N раз, где N могло достигать и 100, и 1000 раз. Во-первых, это сложно реализовать вручную. Во-вторых, есть далеко ненулевая вероятность повреждения разъема. Упрощение процесса разработки устройств с USB-разъемом. На начальных этапах разработки присутствуют только макетные образцы изделия, которые страшно иногда просто трогать, не говоря уже о сотнях итераций с переподключением. Но на этапе разработки ПО без этого просто не обойтись, хотя и возникает проблема возможного повреждения устройства в результате ручного прерывания.  "USB-Разрыватель" этот риск сводит к минимуму. Наш собственный кейс – разработка устройства, работающего по USB3.2 интерфейсу. Так как все USB3.1 Type A разъемы поддерживают устройства, работающие как по USB3.2, так и по USB2.0, то при неудачном подключении к более высокочастотному интерфейсу компьютер попытается проинициализировать устройство по другим линиям передачи данных (USB2.0). Здесь и применили "USB-Разрыватель", поскольку он позволил отключить линии передачи данных USB2.0 интерфейса, тем самым инициализация проходила по USB3.2 интерфейсу или не происходила вовсе. Важно понимать отличие аппаратного отключения устройства от программного. Для некоторых устройств процесс переподключения возможно сымитировать программными средствами, но это не одно и тоже, и во многих случаях этого будет просто недостаточно. Кстати, мы не первые, кому пришла идея разработать подобное устройство! Вот несколько конкурентов, предлагаемых зарубежными компаниями: MCCI® USB 3.0 Connection Exerciser. Недостаток: нет поддержки USB Type C разъема. Цена: $595; Model 3201 Enhanced Type-C Connection Exerciser. Недостатки: нет поддержки USB Type A разъема без использования адаптеров/переходников, плюс нет поддержки Thunderbolt 3 интерфейса. Цена: $795; Model 3141 USB4™ Switch. Недостатки: нет поддержки USB Type A разъема без использования адаптеров/переходников. Не поддерживает разрыв шины питания (Vbus). Цена: $795. У систем, представленных выше, есть как преимущества, так и недостатки, но, в целом, свою задачу они выполняют. Но их стоимость – весьма высокая. Это одна из причин, почему мы решили разработать "Разрыватель". Давайте рассмотрим, какие функции и характеристики устройства мы хотели получить. Разработать прототип устройства, удовлетворяющий следующим требованиям: Поддержка мультиплексирования нескольких линий передач. USB2.0 интерфейс передается через дифференциальную пару D+/D-. Максимальная скорость передачи данных на данной линии составляет 480 Мбит/c. USB3.2 интерфейс передается через несколько дифференциальных пар, необходимых для передачи высокочастотного сигнала, RX+/RX- и TX+/TX-. Для передачи таких интерфейсов, как USB3.2 Gen2x2 и USB4 / Thunderbolt 3 (работающих через USB Type C разъем), количество линий передачи данных увеличивается вдвое, RX1+/RX1-, RX2+/RX2-, TX1-/TX+, TX2-/TX2+. Максимальная частота передачи данных, которую необходимо поддерживать, составляет 10 Гбит/с (USB4 Gen 2) через каждую из указанных линий передач данных. Кроме того, нужна возможность коммутации линий передачи данных SBU1/SBU2 с максимальной скоростью передачи данных 1МБит/c. Протокол Power Delivery используется только для USB Type C разъема и в основном используется для согласования режимов питания устройства. Для поддержки передачи данного протокола нужна возможность коммутировать СС линии USB Type C разъема. Так как максимальное значение мощности, которое можно согласовать с помощью протокола Power Delivery 3.1 – 240 Ватт (напряжение 48 Вольт и ток потребления 5А), для возможности коммутации и разрыва шины питания необходимо использовать реле с возможностью поддержки передачи такого питания. Для возможности измерения напряжения питания целевого устройства необходимо установить делитель напряжения и операционный усилитель для возможности измерения напряжения в диапазоне [0..48 В]. Для возможности измерения потребляемого тока целевого устройства необходимого установить шунтирующий резистор на шину питания и токочувствительный усилитель для возможности измерения тока в диапазоне [0..5А]. В любой момент времени мы должны обеспечивать возможность разрыва или коммутации любой линии передачи данных или питания без необходимости разрыва или коммутации других. Схема разрядки нужна для ускорения скорости разряда после разрыва шины питания между целевым устройством и "хостом". А именно – для увеличения скорости тестирования сложных устройств, которые имеют большое значение накопленного заряда на шине питания в момент работы. Важно иметь возможность включать или отключать данный функционал по мере необходимости. Конечно, требуется и ПО для возможности управления "USB-Разрывателем" и автоматизации процесса тестирования целевого устройства. "USB-Разрыватель" должен работать по интерфейсу USB HID для поддержки необходимого функционала без использования сторонних драйверов. Требуется минимизировать воздействие на каждую из коммутируемых линий для сохранения целостности сигнала и передаваемых данных между целевым устройством и компьютером. Также нужно добавить дополнительный разъем для возможности слушать трафик с дополнительных линий и возможности более точно отслеживать процесс изменения тока и напряжения на шине питания (Vbus) с помощью осциллографа или иных средств. Необходимо разработать два варианта устройства: без дисплея и с дисплеем, для отображения вспомогательной информации. А именно – отображение потребляемого на данный момент напряжения и тока целевым устройством, плюс понимание, каким образом скоммутированы линии на данный момент. Для возможности управления без ПО требуется добавить кнопки на верхнюю панель устройства. После формулирования критериев мы разработали структурную схему устройства.  Ниже – ее упрощенная схема. Основной узел – схема коммутации линий, необходимая для разрыва или коммутации линий данных и питания между хост разъемом с USB Type C и одним из двух разъемов для целевого устройства. Это разъем для устройства №1 (USB Type A) и разъем для устройства №2 (USB Type С) соответственно. Для управления всеми компонентами системы используется микроконтроллер STM32 F4 серии. Для взаимодействия "USB-Разрывателя" с управляющим ПК используется управляющий разъем (USB Type C) и протокол USB HID. Он обеспечивает питание для всех систем устройства. Для взаимодействия микроконтроллера с дисплеем используется SPI интерфейс. Размер дисплея – 2 дюйма, разрешение – 320х240 пикселей. Есть и кнопки для автономного управления устройством. Схема разрядки питания нужна для уменьшения длительности разряда шины питания после ее разрыва. Функция вовсе необязательная, она включается с помощью GPIO сигнала от микроконтроллера. Разъем для параллельного подключения к линиям расположен рядом с хост разъемом. Он нужен для облегчения получения доступа к SBU, CC, D+/D- и шины питания Vbus, тип данного разъема PBD. Схемы питания для микроконтроллера и дисплея, схемы измерения тока и напряжения на шине питания не отображены на данной схеме. Первые мысли по разработке подобного устройства появились еще в 2019 году. Тогда стажеру мы дали задачу разработать устройство с возможностью коммутации и разрыва всех линий между USB2.0 устройством и целевым компьютером. И он неплохо справился. Так, ему удалось пройти все основные этапы разработки устройства: проработка концепции разрабатываемого устройства (создание структурной схемы); разработка принципиальной схемы; трассировка печатной платы; сборка разработанной печатной платы; разработка корпуса; изготовление корпуса путем доработки готового корпуса на фрезерном станке с ЧПУ; разработка ВПО (прошивка микроконтроллера); разработка ПО (простое GUI для взаимодействия с устройством). По результатам стажировки под чутким руководством старших коллег был разработан первый прототип устройства. Девайс был создан "во плоти", он успешно применялся в нескольких проектах компании. Мы поняли, что "разрыватель" будет полезным в процессе разработки и тестирования. Поэтому проект решили дорабатывать. Мы решили доработать девайс, добавив поддержку любых устройств, работающих по протоколу USB. То есть "разрыватель" должен был иметь возможность коммутировать такие интерфейсы, как USB3.2 Gen2x2, USB PowerDelivery. Но кое-что потребовалось добавить: дисплей для отображения текущего напряжения и тока целевого устройства; возможность подключения устройств с USB Type A и USB Type C разъемами. Все получилось, но после тестирования данной версии были выявлены несколько недочетов. Их мы решили исправить уже в новой версии. Вот, что добавили: поддержку интерфейсов USB4 и Thunderbolt 3. В "USB3.2-Разрывателе" ее не было; кнопки для возможности автономного управления устройством. Это просто удобно – переключать состояние линий автономно; более качественный дисплей. Изначально использовался монохромный дисплей с низким разрешением; компактный корпус. Мы заменили реле на более компактное по высоте, но большее по площади. И мы приступили к созданию новой версии девайса. Дело в том, что появился USB 4, и в проекте потребовалось поддерживать двухстороннюю передачу данных по всем SuperSpeed линиям, плюс поддерживать коммутацию SBU линии. Да, мы хорошо понимали, что нужно делать, но требовалось решить несколько проблем. Главная проблема – определение метода подключения хост разъема к ПК. При подключении хост разъема к ПК с помощью USB Type C <-> USB Type C кабеля  и подключении устройства через разъем для устройства №2 (USB Type C) происходит процесс подключения двух USB Type C кабелей последовательно друг другу.  С этим возникли сложности, поскольку при последовательном подключении один из кабелей просто не сможет быть проинициализирован. В этом случае он не инициализирует передачу данных с необходимой скоростью или нужным напряжением (USB Power Delivery). Для проверки возможности подключения кабелей в данной конфигурации мы разработали специальный адаптер. Мы его испытали, и оказалось, что все работает.  Важно понимать, что для данного адаптера верное подключение двух кабелей произойдет только при определенной ориентации обоих кабелей (СС линии обоих кабелей должны быть скоммутированы друг на друга). Сложно? Если да, то давайте вспомним, как устроен USB Type C кабель, а точнее – CC линия (структурная схема ниже). При подключении активных кабелей вторая СС линия внутри кабеля разорвана и обеспечивает питание внутренних микросхем кабеля (VConn). То есть при последовательном подключении двух USB Type C кабелей питание (VConn) до второго кабеля не доходит, его инициализация не происходит и он ведет себя как простой пассивный кабель. При этом неважно, что питание не доходит до второго кабеля, ведь хост определит возможности кабеля по маркировке именно первого кабеля. Соответственно, необходимо использовать два одинаковых кабеля, которые должны обеспечивать пропускание максимальной мощности и скорости сигнала. Ну и на этом использование СС линии не заканчивается, по ней еще определяется необходимые параметры питания устройства и для этого требуется правильно скоммутировать СС линии двух кабелей, чтобы сигнал от хоста дошел до устройства. В результате экспериментов мы пришли к такому варианту определения ориентации двух кабелей: для определения ориентации подключения первого кабеля (к хост разъему) подключаемся к одному из 2х СС пинов. Микроконтроллер определяет есть ли там какой-либо сигнал или нет. Если нет, значит этот пин – VConn; для определения ориентации подключения второго кабеля (к разъему для устройства №2) разрываем СС линии между двумя кабелями и подаем напряжение через подтягивающий к питанию резистор на один из СС пинов второго USB Type C разъема. Соответственно, подтягивающий резистор образует с одним из двух подтянутых к земле резисторов (Rd, Ra – смотри схему выше), делитель напряжения. Так как сопротивление данных резисторов отличается, измерив напряжение на делителе напряжения, мы определим ориентацию подключенного кабеля. В итоге мы реализовали этот алгоритм в устройстве и он работает как и было задумано! Для устройства мы разработали шестислойную печатную плату. Для поддержки подключения дисплея используется дополнительная двухслойная печатная плата. Подключение между двумя платами реализовано при помощи двух штыревых разъемов. Теперь нужно было выбрать корпус с отдельными боковыми панелями. Мы выбрали корпус от Takachi (на момент публикации статьи компания с Россией не сотрудничает). Все разъемы расположились на сторонах двух боковых панелей. Правда, для дисплея и кнопок понадобилось отфрезеровать крышку корпуса. Всего три детали: боковая панель 1 – отверстия для хост-разъема, управляющего разъема и PBD-разъема; боковая панель 2 – отверстия для разъема устройства №1 и разъема устройства №2; крышка корпуса – отверстие для дисплея и четырех кнопок. Для защиты дисплея от внешних воздействий используется оргстекло толщиной 1,5 мм. Ну и один из последних этапов – ПО для взаимодействия с устройством. Есть два варианта взаимодействия с устройством: консольное приложение; дисплей с кнопками. Консольное приложение написали на Python. Собираем его при помощи пакета pyinstaller. Поддерживаются ОС Windows/Linux. Команды для взаимодействия с устройством: при подключении устройства необходимо проинициализировать кабели: переключение/коммутация конкретных линий: переключение всех линий определенное количество раз с заданным периодом: сброс устройства в состояние по умолчанию: Дисплей с кнопками: Для инициализации кабеля нужно нажать на любую кнопку после включения "USB-Разрывателя". После этого на дисплее отобразится основное окно. В левом верхнем углу отображается текущее напряжение и потребляемый на данный момент ток. Справа по центру отображается меню с выбором разъема, который на данный момент подключен к хосту, и текущие состояния основных линий. Управлять меню можно с помощью кнопок. Вот фото. Тестирование проходило в 3 этапа, с тестированием с разной ориентацией кабеля: 1 этап – тестирование одновременно подключенных флеш-накопителей на каждый из разъемов для устройства. При этом необходимо скоммутировать SuperSpeed линии на один разъем, а HighSpeed линии на другой разъем. Тест можно считать пройденным успешно, если на ПК, подключенном к хост-разъему проинициализируются 2 флеш-накопителя. Тест прошли! 2 этап – зарядка ноутбука. К хост-разъему требуется подключить зарядку, а к Разъему для устройства №2 (USB-C) – ноутбук. Тест можно считать пройденным успешно, если ноутбук будет заряжаться и показания напряжения будут превышать стандартные 5В. Тест пройден успешно! 3 этап – подключение Thunderbolt 3 устройства. К хост-разъему требуется подключить ноутбук с поддержкой Thunderbolt 3 интерфейса, а к разъему для устройства №2 (USB-C) – Thunderbolt 3 устройство. Тест можно считать пройденным успешно, если Thunderbolt 3 устройство успешно проинициализируются. Тест пройден успешно! К слову, мы тестировали быстрый диск, и он выдал такую же скорость как без разрывателя. Мы разработали две версии девайса. Первый – без дисплея, второй – с дисплеем и кнопками. После тестирования убедились, что "Разрыватель" удовлетворяет всем требования технического задания. Сейчас мы успешно его используем в разных проектах компании. Ниже представлены фото устройства в рабочем режиме. К сожалению, итоговая стоимость подобного устройства не сильно отличается от представленных выше аналогов. Так как производство данного устройства в любом случае будет мелкосерийным, нет возможности оптимизировать такие процессы, как закупка компонентов, изготовление печатной платы, монтаж печатной платы, фрезеровка корпуса и другое. Но если кого-то из вас заинтересовало подобное устройство, пишите нам, задавайте вопросы, и мы с радостью обсудим все предложения или комментарии. Писать можно как в личку, так и в комментариях. А как вы тестируете USB-устройства? Возможно, у вас возникала необходимость в аппаратном тестировании USB-устройств?