Как стать автором
Обновить

Комментарии 22

Понимаю, что изобретение велосипедов греет душу, но
не проще ли использовать, например, контроллер с USB 2.0, например, CY768013A?
Статьи Дмитрий Чекунов. в журнале «Современная Электроника» за 2004-2006гг.

P.S. Данный контроллер популярен в изготовлении разных логических анализаторов. (
Не проще.

  1. он ни разу не DIP — на простую макетку его так просто не напаять
  2. программный USB более дешев, нет лишних корпусов и обвеса
  3. если требуется только HID — а он требуется в большинстве случаев — ставить такой контроллер — оверинжиниринг
  4. ну и у китайцев для VUSB уже все есть по цене 1$

Если уж хочется проще и без заморочек — надо просто брать процессор с USB на борту, а не городить огород контроллеров.
Я в самом начале написал для чего это делалось.
Если нужно готовое устройство, можно взять контроллер с аппаратным USB, можно взять ft232, можно взять ту же vusb и использовать без анализа внутренностей (как, полагаю, большинство и делает).
Но мне было интересно разобраться как USB работает, причем не на уровне «передаем такой дескриптор, передаем эдакий», а вплоть до уровней сигнала и таймингов. И, смею надеяться, я не один такой.
С таким ником как то странно критиковать велосипедостроение:)

Есть еще одно неплохое описание USB. На английском.

Для общения с HID-устройством есть прекрасная кросс-платформенная библиотека HIDAPI: https://github.com/signal11/hidapi
Спасибо. Видел ее, но чем-то она меня не устроила, уже точно не помню чем. То ли зависимости лишние тащить, то ли не удалось что-то реализовать, то ли собрать под windows.
Но в статью добавлю, почему бы и нет
Использую HIDAPI для коммуникации с Custom HID устройствами, под Windows, Mac и немного Linux. У меня не было никаких проблем со сборкой, внешние зависимости необходимы только для тестов.
Не менее интересный вопрос, зачем устройству передается его адрес, ведь кроме него в данный конкретный порт все равно ничего не воткнуть. Это сделано для упрощения разработки USB-хабов. Они могут быть достаточно «тупыми» и просто транслировать сигналы от хоста всем устройствам, не заботясь о сортировке.

Пардон, а если хаб умный, как он узнает, кому транслировать конкретную команду? Не по тому же ли адресу? Или для умного хаба есть отдельное управление роутингом?
Могли сделать адресацию по разъему (даже удобнее было бы), могли тоже по адресу, но скрыть его от устройства.
Какой устройству-то смысл знать свой «внешний» адрес, если оно им не может пользоваться, да и провода физически идут только от него и до хоста. Это же не I2C, где куча девайсов может параллельно висеть и где они действительно должны сами решать отвечать ли на запрос или игнорировать.
Не I2C говорите? А вот это как? 32*3+1=97 endpointов? или 8 FT4233H в ряд? Ну не I2C, но 32 порта на одном кабеле.

Ну и потом передача адреса может быть нужно всякому USB over IP или для проброса в виртуальную машину.
И? Физически каждое устройство висит на своем порту. Кроме него туда больше ничего не подключено. К чему этот порт подключен дальше его, по идее, волновать не должно.
Ну и потом передача адреса может быть нужно всякому USB over IP
Так а устройству-то зачем адрес? Или IP адрес? Или адрес еще чего-то через что оно подключено?
Вы не поняли. Это преобразователь 32 портов RS-232 в USB. Он подключается всего одним USB-проводом. Судя по datasheet — там чипы FTDI. Но у FTDI нету 32портовых чипов, максимум — 4х портовые. Получается, что на одном USB-проводе — минимум 8 чипов. Зато в API драйвера есть интересная функция FT_GetDeviceInfoDetail, выдающая device ID и device location ID.

Так а устройству-то зачем адрес? Или IP адрес? Или адрес еще чего-то через что оно подключено?
Устройство — это транслятор в IP. А вот софту на другой стороне IP-тоннеля адрес может быть полезен. При перезапуске, например.

Не, я не такой спец, чтобы утверждать, что без адреса — никуда. Но мне как-то кажется, что полезность его есть.

Кстати, а умные хабы как фильтруют? Не по этому ли адресу?

Как фильтруют хабы точно не знаю, наверняка именно по адресу. Но это не единственный вариант, просто вот такой выбрали. Могли завернуть в «матрешку», где адреса принадлежат «оболочке», а не данным.
Потому что, повторюсь, самому устройству адрес без надобности.
Поэтому я и считаю, что его решили встроить из соображений упрощения. Вроде того что устройству лишний запрос обработать несложно, зато разработчикам хабов и тому подобного задача упрощается. Да и топология шины становится более похожей на шину.
Устройству (прибору) адрес не нужен ровно до тех пор, пока это — не составное устройство (прибор) из нескольких USB-устройств.

Гм... напомнило...
«Поскольку несколько устройств были не в порядке, я в срочном порядке был призван к порядку, чтобы обрабатывать данные разных порядков на несколько порядков быстрее»


Ну и динамическое подключение программно имитируемого хаба так проще делается.

Но в целом вы правы — можно было не делать USB шиной. Но изначально сделали именно шиной, вики говорит, что там до 127 устройств на порт. Так что это атавизм времен первых дизайнов.

Умные хабы появились для решения двух проблем — внешнее питание (активный хаб) и подключение устройств USB 1.0 и USB 1.1 вместе с высокоскоростными USB 2.0 (трансляция протокола). Так что во времена USB 1.0 просто не было особой нужды в умных хабах. По сути — была чистая шина.
Составное устройство это все же не «хаб плюс несколько устройств» в одном, а просто несколько конечных точек, объединенных по функционалу и описанных в десрипторе. Адрес устройства при этом все равно один, а различие делается именно по номеру точки.
Если же точек не хватает и приходится городить именно «хаб плюс устройства» в одном, то все равно придется обрабатывать хабо-специфичные запросы. То есть эмулировать так эмулировать, полноценно и с поддержкой всего функционала.
Так что во времена USB 1.0 просто не было особой нужды в умных хабах.

Даже тогда было разделение low-speed / full-speed, оно было с самого начала. Просто разработчики посчитали лучшим перенести основную сложность на хост, а периферию максимально упростить. Даже ценой снижения скорости обмена.
И суммарно система, где устройства сами определяют адрес, похоже, оказалась проще, чем система с более умными хабами.
.
Так что мое мнение остается неизменным: по смыслу было бы правильнее отдать управление адресатами на хаб (топология «звезда» или даже «дерево»), но в целях упрощения выбрали топологию «шина». Иначе говоря, причина больше практическая, чем философская.
Даже тогда было разделение low-speed / full-speed, оно было с самого начала.
Я про Hi speed (до 480 мегабит). Именно он и потребовал умных хабов. Точнее, использующие его флэшки.

Иначе говоря, причина больше практическая, чем философская
. Думаю, что причина историческая, но мне лень искать старые спецификации для доказательств. Хабы описаны в последней главе спецификации USB 1.1, возможно это признак, что они появились позже остального. Но это надо смотреть USB 0.6 и ранее.
Про Hi-speed я не говорил, поскольку они появились несколько позже. И, если не ошибаюсь, теоретически тоже поддерживают совместимость с «тупыми» хабами, то есть совсем уж необходимости нет, просто общаться с флешкой на скорости 1.5 Мб/с как-то совсем грустно. А к тому времени и «умные» хабы подешевели и полностью (или почти полностью) вытеснили предшественников.
Хабы описаны в последней главе спецификации USB 1.1, возможно это признак, что они появились позже остального.
Мне казалось, что они входят в стандарт изначально, просто исходя из топологии и философии шины. Ведь пространство адресов изначально было 7-битным, а 127 портов на плату расширения не ставят. И просто соединить устройства впараллель нельзя, подтягивающие резисторы будут мешать.
Как бы то ни было, археологические раскопки изначальной причины проверки адреса на устройстве мне не слишком интересны. Пока что версия с упрощением конструкции (а она прослеживается везде, хотя и порой в странных формах) выглядит вполне правдоподобно.
Название USB намекает, что планировалось сделать именно BUS, то есть шину. 127 не 127, но 3-4 устройства вполне реально. В RS-485 тоже подтягивающие резисторы и что?

Но версия с упрощением — тоже вполне правдоподбна, не спорю.
Название USB намекает
Где-то читал, что это маркетинговый ход, не больше. Ничего в структуре USB не соответствует топологии «шина», даже адреса. На шине адреса обычно задаются вручную, и уж точно никто не полагается на поочередное включение-отключение отдельных портов, чтобы на 0-й адрес отозвалось только одно устройство.
127 не 127, но 3-4 устройства вполне реально
Особенно если половина high-speed, а вторая — low-speed, то есть тянут своими резисторами в разные стороны. В RS485 резисторы нужны для создания токовой петли, а не для определения скорости устройства. Там вообще не важно какой номинал, лишь бы источник сигнала потянул, да помех не слишком много было.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории