Стандарт usb 2.0 описание. Технические характеристики Возможности usb

USB (Universal Serial Bus - «универсальная последовательная шина») - последовательный интерфейс передачи данных для среднескоростных и низкоскоростных периферийных устройств. Для подключения используется 4-х проводный кабель, при этом два провода используются для приёма и передачи данных, а 2 провода - для питания периферийного устройства. Благодаря встроенным линиям питания USB позволяет подключать периферийные устройства без собственного источника питания.

Основные сведения

Кабель USB состоит из 4 медных проводников - 2 проводника питания и 2 проводника данных в витой паре, и заземленной оплётки (экрана).

Кабели USB имеют физически разные наконечники «к устройству» и «к хосту». Возможна реализация USB устройства без кабеля, со встроенным в корпус наконечником «к хосту». Возможно и неразъёмное встраивание кабеля в устройство (например, USB-клавиатура, Web-камера, USB-мышь) , хотя стандарт запрещает это для устройств full и high speed.

Шина USB строго ориентирована, т. е. имеет понятие «главное устройство» (хост, он же USB контроллер, обычно встроен в микросхему южного моста на материнской плате) и «периферийные устройства».

Устройства могут получать питание +5 В от шины, но могут и требовать внешний источник питания. Поддерживается и дежурный режим для устройств и разветвителей по команде с шины со снятием основного питания при сохранении дежурного питания и включением по команде с шины.

USB поддерживает «горячее» подключение и отключение устройств . Это возможно благодаря увеличения длинны проводника заземляющего контакта по отношению к сигнальным. При подключении разъёма USB первыми замыкаются заземляющие контакты , потенциалы корпусов двух устройств становятся равны и дальнейшее соединение сигнальных проводников не приводит к перенапряжениям, даже если устройства питаются от разных фаз силовой трёхфазной сети.

На логическом уровне устройство USB поддерживает транзакции приема и передачи данных. Каждый пакет каждой транзакции содержит в себе номер оконечной точки (endpoint) на устройстве. При подключении устройства драйверы в ядре ОС читают с устройства список оконечных точек и создают управляющие структуры данных для общения с каждой оконечной точкой устройства. Совокупность оконечной точки и структур данных в ядре ОС называется каналом (pipe) .

Оконечные точки , а значит, и каналы, относятся к одному из 4 классов:

1) поточный (bulk),

2) управляющий (control),

3) изохронный (isoch),

4) прерывание (interrupt).

Низкоскоростные устройства, такие, как мышь, не могут иметь изохронные и поточные каналы .

Управляющий канал предназначен для обмена с устройством короткими пакетами «вопрос-ответ». Любое устройство имеет управляющий канал 0, который позволяет программному обеспечению ОС прочитать краткую информацию об устройстве, в том числе коды производителя и модели, используемые для выбора драйвера, и список других оконечных точек.

Канал прерывания позволяет доставлять короткие пакеты и в том, и в другом направлении, без получения на них ответа/подтверждения, но с гарантией времени доставки - пакет будет доставлен не позже, чем через N миллисекунд. Например, используется в устройствах ввода (клавиатуры, мыши или джойстики).

Изохронный канал позволяет доставлять пакеты без гарантии доставки и без ответов/подтверждений, но с гарантированной скоростью доставки в N пакетов на один период шины (1 КГц у low и full speed, 8 КГц у high speed). Используется для передачи аудио- и видеоинформации.

Поточный канал дает гарантию доставки каждого пакета, поддерживает автоматическую приостановку передачи данных по нежеланию устройства (переполнение или опустошение буфера), но не дает гарантий скорости и задержки доставки. Используется, например, в принтерах и сканерах.

Время шины делится на периоды, в начале периода контроллер передает всей шине пакет «начало периода». Далее в течение периода передаются пакеты прерываний, потом изохронные в требуемом количестве, в оставшееся время в периоде передаются управляющие пакеты и в последнюю очередь поточные.

Активной стороной шины всегда является контроллер, передача пакета данных от устройства к контроллеру реализована как короткий вопрос контроллера и длинный, содержащий данные, ответ устройства. Расписание движения пакетов для каждого периода шины создается совместным усилием аппаратуры контроллера и ПО драйвера, для этого многие контроллеры используют Прямой доступ к памяти DMA (Direct Memory Access ) - режим обмена данными между устройствами или же между устройством и основной памятью, без участия Центрального Процессора (ЦП). В результате скорость передачи увеличивается, так как данные не пересылаются в ЦП и обратно.

Размер пакета для оконечной точки есть вшитая в таблицу оконечных точек устройства константа, изменению не подлежит. Он выбирается разработчиком устройства из числа тех, что поддерживаются стандартом USB.


Технические характеристики

Возможности USB:

Высокая скорость обмена (full-speed signaling bit rate) - 12 Мб/с
- Максимальная длина кабеля для высокой скорости обмена - 5 м
- Низкая скорость обмена (low-speed signaling bit rate) - 1.5 Мб/с
- Максимальная длина кабеля для низкой скорости обмена - 3 м
- Максимум подключенных устройств (включая размножители) - 127
- Возможно подключение устройств с различными скоростями обмена
- Отсутствие необходимости в установке пользователем дополнительных элементов, таких как терминаторы для SCSI
- Напряжение питания для периферийных устройств - 5 В
- Максимальный ток потребления на одно устройство - 500 mA

Распайка разъема USB 1.1 и 2.0

Сигналы USB передаются по двум проводам экранированного четырёхпроводного кабеля.

Здесь:

GND - цепь «корпуса» для питания периферийных устройств
V BUS - +5V также для цепей питания
Шина D+ предназначена для передачи данных

Шина D- для приема данных.

Недостатки USB 2.0

Хотя максимальная скорость передачи данных USB 2.0 составляет 480 Мбит/с (60 Мбайт/с), в реальной жизни достичь таких скоростей нереально (~33,5 Мбайт/сек на практике). Это объясняется большими задержками шины USB между запросом на передачу данных и собственно началом передачи. Например, шина FireWire , хотя и обладает меньшей пиковой пропускной способностью 400 Мбит/с, что на 80 Мбит/с (10 Мбайт/с) меньше, чем у USB 2.0, в реальности позволяет обеспечить бо́льшую пропускную способность для обмена данными с жёсткими дисками и другими устройствами хранения информации. В связи с этим разнообразные мобильные накопители уже давно «упираются» в недостаточную практическую пропускную способность USB 2.0.

В конце 2008 года. Как и можно было ожидать, новый стандарт увеличил пропускную способность, хотя прирост не такой значительный, как 40-кратное увеличение скорости при переходе от USB 1.1 на USB 2.0. В любом случае, 10-кратное повышение пропускной способности можно приветствовать. USB 3.0 поддерживает максимальную скорость передачи 5 Гбит/с. Пропускная способность почти в два раза превышает современный стандарт Serial ATA (3 Гбит/с с учётом передачи информации избыточности).

Логотип USB 3.0

Каждый энтузиаст подтвердит, что интерфейс USB 2.0 является основным «узким местом» современных компьютеров и ноутбуков, поскольку его пиковая «чистая» пропускная способность составляет от 30 до 35 Мбайт/с. Но у современных 3,5″жёстких дисков для настольных ПК скорость передачи уже превысила 100 Мбайт/с (появляются и 2,5″ модели для ноутбуков, приближающиеся к данному уровню). Скоростные твёрдотельные накопители успешно превзошли порог 200 Мбайт/с. А 5 Гбит/с (или 5120 Мбит/с) соответствует 640 Мбайт/с.

Мы не думаем, что в обозримом будущем жёсткие диски приблизятся к уровню 600 Мбайт/с, но следующие поколения твёрдотельных накопителей могут превысить это число уже через несколько лет. Увеличение пропускной способности становится всё более важным, поскольку количество информации увеличивается, соответственно, растёт и время её резервирования. Чем быстрее работает хранилище, тем меньше будет время резервирования, тем проще будет сделать «окна» в расписании резервирования.

Таблица сравнения скоростных характеристик USB 1.0 – 3.0

Цифровые видеокамеры сегодня могут записывать и хранить гигабайты видеоданных. Доля HD-видеокамер увеличивается, а им требуются более ёмкие и быстрые хранилища для записи большого количества данных. Если использовать USB 2.0, то на передачу нескольких десятков гигабайт видеоданных на компьютер для монтажа потребуется значительное время. USB Implementers Forum считает, что пропускная способность останется принципиально важной, и USB 3.0 будет достаточно для всех потребительских устройств на протяжении ближайших пяти лет.

Кодирование 8/10 бит

Чтобы гарантировать надёжную передачу данных интерфейс USB 3.0 использует кодирование 8/10 бит, знакомое нам, например, по Serial ATA. Один байт (8 бит) передаётся с помощью 10-битного кодирования, что улучшает надёжность передачи в ущерб пропускной способности. Поэтому переход с битов на байты осуществляется с соотношением 10:1 вместо 8:1.

Сравнение пропускной способности USB 1.x – 3.0 и конкурентов

Режимы энергосбережения

Конечно, основной целью интерфейса USB 3.0 является повышение доступной пропускной способности , однако новый стандарт эффективно оптимизирует энергопотребление . Интерфейс USB 2.0 постоянно опрашивает доступность устройств, на что расходуется энергия. Напротив, у USB 3.0 есть четыре состояния подключения, названные U0-U3. Состояние подключения U0 соответствует активной передаче данных, а U3 погружает устройство в «сон».

Если подключение бездействует, то в состоянии U1 будут отключены возможности приёма и передачи данных. Состояние U2 идёт ещё на шаг дальше, отключая внутренние тактовые импульсы. Соответственно, подключённые устройства могут переходить в состояние U1 сразу же после завершения передачи данных, что, как предполагается, даст ощутимые преимущества по энергопотреблению, если сравнивать с USB 2.0.

Больший ток

Кроме разных состояний энергопотребления стандарт USB 3.0 отличается от USB 2.0 и более высоким поддерживаемым током . Если USB 2.0 предусматривал порог тока 500 мА, то в случае нового стандарта ограничение было сдвинуто до планки 900 мА. Ток при инициации соединения был увеличен с уровня 100 мА у USB 2.0 до 150 мА у USB 3.0. Оба параметра весьма важны для портативных жёстких дисков, которые обычно требуют чуть большие токи. Раньше проблему удавалось решить с помощью дополнительной вилки USB, получая питание от двух портов, но используя только один для передачи данных, пусть даже это нарушало спецификации USB 2.0.

Новые кабели, разъёмы, цветовое кодирование

Стандарт USB 3.0 обратно совместим с USB 2.0 , то есть вилки кажутся такими же, как и обычные вилки типа A. Контакты USB 2.0 остались на прежнем месте, но в глубине разъёма теперь располагаются пять новых контактов. Это означает, что вам нужно полностью вставлять вилку USB 3.0 в порт USB 3.0, чтобы удостовериться в режиме работы USB 3.0, для которого требуются дополнительные контакты. Иначе вы получите скорость USB 2.0. USB Implementers Forum рекомендует производителям использовать цветовое кодирование Pantone 300C на внутренней части разъёма.

Ситуация получилась схожей и для USB-вилки типа B, хотя различия визуально более заметны. Вилку USB 3.0 можно определить по пяти дополнительным контактам .

USB 3.0 не использует волоконную оптику , поскольку она слишком дорога для массового рынка. Поэтому перед нами старый добрый медный кабель. Однако теперь у него будет девять, а не четыре провода. Передача данных осуществляется по четырём из пяти дополнительных проводов в дифференциальном режиме (SDP–Shielded Differential Pair). Одна пара проводов отвечает за приём информации, другая – за передачу. Принцип работы похож на Serial ATA, при этом устройства получают полную пропускную способность в обоих направлениях. Пятый провод – «земля».

Всем привет. Иногда людям интересно узнать, чем USB 3.0 отличается от USB 2.0, иногда хотят понять какая версия или какой тип USB разъема имеется у них на компьютере, что за динозавр такой USB 1.0 и так далее. Давайте немного углубимся в эту тему.

Стандарт USB появился еще в середине 90х годов. Расшифровывается USB вот как – универсальная последовательная шина (Universal Serial Bus) . Этот стандарт был разработан специально для коммуникации периферийных устройств с компьютером, и сейчас занимает лидирующие позиции среди всех типов коммуникационных интерфейсов. Это и неудивительно. Сейчас сложно себе представить хоть какой-то девайс без USB разъема, хоть эти разъемы и различаются по типам.

Типы USB разъемов

На сегодняшний день существует достаточно большое количество типов USB разъемов. Какие-то больше распространены, какие-то меньше. В общем, давай на них взглянем.

USB type- A – один из самых распространенных типов USB разъемов. Вы могли видеть его на вашем , на , на блоке зарядного устройства и не только. Имеет множество применений. С его помощью можно подсоединять мышки и клавиатуры к компьютеру (или другому устройству), флешки, внешние накопители, смартфоны и так далее. Этот список можно еще долго продолжать, если пораскинуть мозгами.

USB type- B – разъем используется в основном для того, чтобы подключить к компьютеру принтер либо другие периферийные устройства. Получил намного меньшее распространение, нежели USB type-A.

Mini USB был весьма распространен на мобильных устройствах до появления Micro USB. Сейчас встречается очень редко, но все же можно его встретить еще на некоторых старых устройствах. У меня на портативной аудиоколонке разъем Mini USB принимает электроэнергию для зарядки аккумулятора. Колонку эту покупал лет 5 назад (живучая оказалась).

Micro USB сейчас используется на смартфонах и мобильных телефонах почти всех производителей. Этот USB разъем обрел невероятную популярность среди мобильных устройств. Однако постепенно его позиции занимает USB Type-C.

Версия USB 1.0 – археологические раскопки

Прапрапрадед стандарта USB – USB 1.0 появился на свет холодным ноябрем 1995 года. Но родился он немного недоношенным и большой популярности не обрел. А вот его младший брат USB 1.1, появившийся на свет тремя годами позже, был более жизнеспособным экземпляром и смог привлечь к себе достаточно внимания.

Что касается технической части, то скорость передачи данных была небольшой, но по меркам тех времен этой скорости было более чем достаточно. Скорость составляла до 12 Мбит/с и это в режиме высокой пропускной способности.

Отличия разъемов USB 2.0 и USB 3.0

USB 2.0 и USB 3.0 – это два вполне современных USB стандарта, которые сейчас используются повсеместно в компьютерах и ноутбуках. USB 3.0, конечно же, новее и быстрее, а также имеет полную обратную совместимость с USB 2.0 устройствами. Но скорость в таком случае будет ограничена максимальной скоростью по стандарту USB 2.0.

Теоретически скорость передачи данных стандарта USB 3.0 примерно в 10 раз выше, чем у USB 2.0 (5 Гбит/с против 480 Мбит/с). Но на практике скорость обмена информацией между устройствами часто бывает ограничена самими устройствами. Хотя в целом, USB 3.0 все же выигрывает.

Технические отличия

Хоть стандарты USB 2.0 и USB 3.0 и обратносовместимы, но, тем не менее, они имеют некоторые технические отличия. USB 2.0 имеет 4 контакта – 2 для питания устройств и 2 для передачи данных. Эти 4 контакты были сохранены и в стандарте USB 3.0. Но кроме них были добавлены еще 4 контакта, которые нужны для высокой скорости передачи данных и более быстрой зарядки устройств. К слову, USB 3.0 может работать с силой тока до 1 Ампера.

В итоге шнур стандарта USB 3.0 стал толще, и его длина не превышает теперь 3 метра (в USB 2.0 максимальная длина достигала 5 метров). Зато вы сможете зарядить свой смартфон намного быстрее, даже если вы подсоедините несколько смартфонов в один разъем через разветвитель.

Естественно производители позаботились о визуальных отличиях. Можно не искать упаковку от материнской платы, чтобы посмотреть какие стандарты USB она поддерживает. И не нужно для этого лезть в настройки компьютера или в диспетчер устройств. Достаточно просто взглянуть на цвет вашего разъема. Разъем USB 3.0 почти всегда синего цвета. Очень редко он бывает еще красного цвета. В то время как USB 2.0 практически всегда черного цвета.

Так что теперь с одного меткого взгляда вы сможете определить у вас USB 2.0 или USB 3.0 на ноутбуке.

На этом, наверное, можно заканчивать разговор о том, чем отличается USB 2.0 от USB 3.0.

Вывод

Что мы узнали из этой статьи? Что USB делится на стандарты передачи данных, которые отличаются скоростью передачи данных. А также, что USB имеют большое количество типов разъемов.

И что самое интересное, о чем я забыл упомянуть в статье, это то, что типы разъемов могут комбинироваться следующим образом. Вы можете встретить полноразмерный разъем USB type-A и полноразмерный USB type-B, в то же время существует (но редко встречается) micro USB type-A и micro USB type-B (очень распространен). USB type-A может работать по протоколу USB 2.0, а может по протоколу USB 3.0. В общем при желании можно и запутаться.

А если вас беспокоит вопрос, с какими разъемами лучше выбрать себе ноутбук USB 2.0 или USB 3.0, то вообще не парьтесь. Сейчас все современные ноутбуки и компьютеры оснащены и тем и тем типом USB. Например, у меня на ноутбуке два разъема USB 2.0 и один разъем USB 3.0. И все три разъема типа USB type-A.

Вот такие они – USB!

Вы дочитали до самого конца?

Была ли эта статья полезной?

Да Нет

Что именно вам не понравилось? Статья была неполной или неправдивой?
Напишите в клмментариях и мы обещаем исправиться!

  • Mini-B Connector ECN : извещение выпущено в октябре 2000 года.
  • Errata, начиная с декабря 2000 : извещение выпущено в декабре 2000 года.
  • Pull-up/Pull-down Resistors ECN
  • Errata, начиная с мая 2002 : извещение выпущено в мае 2002 года.
  • Interface Associations ECN : извещение выпущено в мае 2003 года.
    • Были добавлены новые стандарты, позволяющие ассоциировать множество интерфейсов с одной функцией устройства.
  • Rounded Chamfer ECN : извещение выпущено в октябре 2003 года.
  • Unicode ECN : извещение выпущено в феврале 2005 года.
    • Данное ECN специфицирует, что строки закодированы с использованием UTF-16LE .
  • Inter-Chip USB Supplement : извещение выпущено в марте 2006 года.
  • On-The-Go Supplement 1.3 : извещение выпущено в декабре 2006 года.
    • USB On-The-Go делает возможным связь двух USB-устройств друг с другом без отдельного USB-хоста. На практике одно из устройств играет роль хоста для другого.

USB OTG

USB 3.0

USB 3.0 находится на финальных стадиях разработки. Созданием USB 3.0 занимаются компании: Microsoft, Texas Instruments, NXP Semiconductors. В спецификации USB 3.0 разъёмы и кабели обновлённого стандарта будут физически и функционально совместимы с USB 2.0. Кабель USB 2.0 содержит в себе четыре линии - пару для приёма/передачи данных, одну - для питания и ещё одну - для заземления. В дополнение к ним USB 3.0 добавляет пять новых линий (в результате чего кабель стал гораздо толще), однако новые контакты расположены параллельно по отношению к старым на другом контактном ряду. Теперь можно будет с лёгкостью определить принадлежность кабеля к той или иной версии стандарта, просто взглянув на его разъём. Спецификация USB 3.0 повышает максимальную скорость передачи информации до 4,8 Гбит/с - что на порядок больше 480 Мбит/с, которые может обеспечить USB 2.0. USB 3.0 может похвастаться не только более высокой скоростью передачи информации, но и увеличенной силой тока с 500 мА до 900 мА. Отныне пользователь сможет не только подпитывать от одного хаба гораздо большее количество устройств, но и само аппаратное обеспечение, ранее поставлявшееся с отдельными блоками питания, избавится от них.


Здесь GND - цепь «корпуса» для питания периферийных устройств, VBus - +5 В, так же для цепей питания. Данные передаются по проводам D+ и D− дифференциально (состояния 0 и 1 (в терминологии официальной документации diff0 и diff1 соответственно) определяются по разности потенциалов межу линиями более 0,2 В и при условии, что на одной из линий (D− в случае diff0 и D+ при diff1) потенциал относительно GND выше 2,8 В. Дифференциальный способ передачи является основным, но не единственным (например, при инициализации устройство сообщает хосту о режиме, поддерживаемом устройством (Full-Speed или Low-Speed), подтягиванием одной из линий данных к V_BUS через резистор 1.5 кОм (D− для режима Low-Speed и D+ для режима Full-Speed, устройства, работающие в режиме Hi-Speed, ведут себя на этой стадии как устройства в режиме Full-Speed). Так же иногда вокруг провода присутствует волокнистая обмотка для защиты от физических повреждений. .

Коннектор USB 3.0 тип B

Коннектор USB 3.0 тип А

Кабели и разъёмы USB 3.0

Недостатки USB

Хотя пиковая пропускная способность USB 2.0 составляет 480 Мбит/с (60 Мбайт/с), на практике обеспечить пропускную способность, близкую к пиковой, не удаётся. Это объясняется достаточно большими задержками шины USB между запросом на передачу данных и собственно началом передачи. Например, шина FireWire хотя и обладает меньшей пиковой пропускной способностью 400 Мбит/с, что на 80 Мбит/с меньше, чем у USB 2.0, в реальности позволяет обеспечить бо́льшую пропускную способность для обмена данными с жёсткими дисками и другими устройствами хранения информации.

USB и FireWire/1394

Протокол USB storage, представляющий собой метод передачи команд

Кроме того, USB storage не поддерживался в старых ОС (первоначальная Windows 98), и требовал установки драйвера. SBP-2 поддерживался и в них. Также в старых ОС (Windows 2000) протокол USB storage был реализован в урезанном виде, не позволяющем использовать функцию прожига CD/DVD дисков на подключенном по USB дисководе, SBP-2 никогда не имел таких ограничений.

Шина USB строго ориентирована, потому соединение 2 компьютеров или же 2 периферийных устройств требует дополнительного оборудования. Некоторые производители поддерживают соединение принтера и сканера, или же фотоапарата и принтера, но эти реализации сильно завязаны на конкретного производителя и не стандартизированы. Шина 1394/FireWire не подвержена этому недостатку (можно соединить 2 видеокамеры).

Тем не менее, ввиду лицензионной политики Apple, а также намного более высокой сложности оборудования, 1394 менее распространен, материнские платы старых компьютеров не имеют 1394 контроллера. Что касается периферии, то поддержка 1394 обычно не встречается ни в чем, кроме видеокамер и корпусов для внешних жестких дисков и CD/DVD приводов.

См. также

  • FireWire
  • TransferJet

Источники

Ссылки

  • USB News (нем.)
  • Tutorial

Иллюстрированная проекция модели сетевого взаимодействия OSI на универсальную последовательную шину.

Три «замечательных» уровня стека USB

Меня не устроил вид стека USB, который можно встретить чаще всего на просторах сети:

Не сильно полезный стек USB


Уровень шины, логический, функциональный… Это, конечно, замечательные абстракции, но они скорее для тех, кто собирается делать драйвер или прикладной софт для хоста. На стороне же микроконтроллера я ожидаю шаблонный конечный автомат, в узлы которого мы обычно встраиваем свой полезный код, и он сперва будет по всем законам жанра глючить. Или же глючить будет софт на хосте. Или драйвер. В любом случае кто-то будет глючить. В библиотеках МК тоже с наскока не разобраться. И вот я смотрю на трафик по шине USB анализатором, где происходящие события на незнакомом языке с тремя замечательными уровнями вообще не вяжутся. Интересно, это у меня от гриппозной лихорадки в голове такой диссонанс?

Если у читателя бывали сходные ощущения, предлагаю альтернативное, явившееся мне неожиданно ясно в перегретом мозгу видение стека USB, по мотивам любимой 7-уровневой модели OSI. Я ограничился пятью уровнями:

Я не хочу сказать, что весь софт и библиотеки уже сделаны или должны проектироваться, исходя из этой модели. Из инженерных соображений код c уровнями будет сильно перемешан. Но я хочу помочь тем, кто начинает своё знакомство с шиной USB, кто хочет понять протоколы обмена устройств и терминологию предметной области, подобраться поближе к готовым примерам, библиотекам и лучше ориентироваться в них. Эта модель не для загрузки в МК, но в ваши блестящие умы, дорогие друзья. А ваши золотые руки потом всё сами сделают, я не сомневаюсь:)

Итак, поехали, поправляйте, если увидите косяки. Это draft-версия, и если уже такое где-то было нарисовано, прошу простить, я не нашёл и потому скрутил сам. Думаю, картинка никуда не убежит, а я пока объясню почтенной публике, зачем вообще взялся за эту публикацию.

Очередной флэшбэк из девяностых

Свой первый баг из чужого кода я вытряхнул в конце девяностых, будучи студентом на подработках. Это был pppd под FreeBSD, который мы тогда прикрутили на модемный пул. Мотороловские модемы залипали в отбое, дозвониться никто не мог, линия пропадала зазря, и единственный оставшийся способ через PPP keep-alive почему-то глючил. Вот тогда я и выяснил, что pppd зачем-то ждёт шесть ответных байтов LCP вместо положенных четырёх. Почувствовал я себя тогда эдаким лихим жукотрясом из девяностых:-) При чём тут PPP? Просто он на USB похож: пакетный и двухточечный. Правда, в отличие от USB 2.0, полнодуплексный.


Хотим мы этого или нет, но эволюция микроконтроллеров на месте стоять явно не собирается. Нет, нет, да и мелькнёт в публикациях (http://habrahabr.ru/post/208026/ , http://habrahabr.ru/post/233391/) «тяжёлая периферия» - вмонтированные в МК реализации шины USB, с разборами примеров, использованием HID и т.п. Надо воздать должное автору RaJa : из восьми примеров, приведённых в стандартной библиотеке STSW-STM32121 (UM0424) и кое-как , он выбрал самый полезный (Custom HID), портировал его в бесплатную среду Em::Blocks, изложил понятным языком, немного приукрасил, браво! Это сэкономило мне уйму времени.

Как пройти в библиотеку?

Получив на GitHub любезно выложенный автором проект RHIDDemo для Em::Blocks, я начал портировать его в Keil (мой отладчик CoLink на базе FTDI; кто-нибудь, подскажите плагин от Coocox для Em::Blocks). Но никак не мог понять: где, чёрт возьми, автор раздобыл SPL 3.6.1 выпуска 2012г, если на сайте выложен 3.5.0 от 2011г? Я прошёл довольно скучный квест, который к моему удивлению привёл… прямо на готовый проект Custom HID для Keil в составе библиотеки USB FS 4.0.0. Лежит у всех на виду, как мышь под веником. Ну и ладно. Зато я раскурил, наконец, релизы STMicroelectronics, нашёл описание библиотеки USB FS STSW-STM32121 (UM0424) и пресёк попытки разработчика свести меня с ума. Вот скажите, это нормально подкладывать винтажный CMSIS 1.30 образца 2009г в набор SPL 3.5.0 выпуска 2011г, новый SPL 3.6.1 релиза 2012г прятать в USB-FS 4.0.0 релиза 2013г (подложив туда же и CMSIS 3.0.1 от 2012г), при том, что у них же выложена актуальная версия CMSIS 3.30 релиза 2014г? Кстати, в SPL 3.6.x для STM32F10X исправили пару багов с USART, касающихся сигналов о переполнении буфера. Спасибо, хоть release notes оставили…

HID vs SNMP

Итак, взявшись за STM32F103C8T6, я тоже решил слегка задвинуться по теме USB HID, уж больно хорошо абстракция USB HID укладывается в концепцию всяческих датчиков, сенсоров и прочих ШИМ-управляемых драйверов питания. Чем-то напомнило мне SNMP, только в сильно упрощённом виде: дескрипторы HID играют роль SNMP MIB. Когда устройство инициализируется хостом: «Привет, хост! Я кофеварка. У меня есть кнопка [старт], регуляторы [сливки], [сахар], датчики [остаток кофе], [остаток воды], [остаток сахара], [остаток сливок]. Подтягивай драйвера, дави на кнопку, кофейку попьём». Ничего не напоминает? Пример диалога по SNMP: «Ну, привет, управляющая станция с софтом за $100000. А я шасси коммутатора за $200000, и на мне сидят ещё 4 модуля по $100000 за штуку; в каждом ещё по 16 портов с неприличной скоростью, и всех функций тут просто не перечислить… спрашивай отдельно по каждому пункту; ах, да загрузка процессора такая-то, памяти столько-то…». И ещё на дюжину страниц в таком же духе.

Понравилась мне идея HID. Но стоило выйти из Windows за рамки учебных задач мигания светодиодами (вперёд к реальным окружениям UNIX!), как начало сквозить из всех незаделанных щелей , и я почувствовал себя каким-то беспомощным ламером. Отлаживая проект, я инстинктивно схватился за некое подобие tcpdump (так и называется: usbdump(8) , или usbmon), но увидел лишь сообщения на незнакомом языке.

Стало очевидно: не хватает фундаментальных знаний о шине USB. Если модель OSI и стек TCP/IP любой тёртый айтишник осознаёт где-то на уровне спинного мозга просто в силу необходимости, то с USB ситуация другая. Оно и понятно: там можно (нужно) подсмотреть трафик через тот же tcpdump да настроить железо с софтом, а тут полный plug and play, и исправить что-то можно, обновив драйвер или прошивку (или переустановив ОС). Но ведь мы тут с вами собрались как раз за тем, чтобы делать хорошие прошивки, не так ли? Почитав некоторые описания USB в сети, я был удивлён, насколько запутанной может быть документация. У меня даже возникло ощущение, что нас специально хотят сбить с пути истинного, напустив туману и избавившись от конкуренции в зародыше. Я не согласен с таким положением вещей!

Ещё одна замечательная схема

На просторах сети встретил ещё такую иллюстрацию (лежало в формате BMP, без шуток):

Сперва выглядит оптимистично. Наконец-то, стек в разобранном виде. Кадры, правда, обозначены неудачно: я бы нарисовал их вертикальными пунктирными линиями, а EOF - это просто пауза, реально данные не передаются. Но начинаем читать контекст и теряем понимаем истинный замысел автора (запутать нас):

Хост-контроллер интерфейса шины USB формирует кадры ;
Кадры передаются последовательной передачей бит по методу NRZI.
И вот ещё:
каждый кадр состоит из наиболее приоритетных посылок , состав которых формирует драйвер хоста;
каждая передача состоит из одной или нескольких транзакций;
каждая транзакция состоит из пакетов ;
каждый пакет состоит из идентификатора пакета, данных (если они есть) и контрольной суммы.

Вроде бы и нарисовано всё правильно, но по мере прочтения вопросов становится всё больше. Минимальная передаваемая структура данных по шине - это кадр или пакет? Вообще, это сверху вниз надо смотреть или наоборот? И что кодируется по методу NRZI - кадры, пакеты или просто весь битовый поток по шине? Из транзакций состоит посылка, передача, или, может быть, ценная бандероль какая?
Почему нельзя просто: хост группирует пакеты в транзакции и распределяет их по временным квантам, именуемым кадрами, чтобы давать приоритет критичным по времени данным (видео, аудио) исходя из текущей пропускной способности шины? Да, в USB есть нюансы с планированием передачи пакетов, я их пока не затрагиваю.

Моё видение стека USB

Хорошей документацией считаю упоминавшийся тут на хабре USB in a NutShell (ура, перевод), а также USB Made Simple . По ним я и собрал свою версию стека USB, нарисую её ещё раз.

Физический уровень
На физическом уровне используется набор электрических режимов дифференциальной пары проводников (вместе с землёй) для обозначения состояний, с помощью которых кодируется битовый поток по методу NRZI со вставкой битов (bit stuffing): здесь после шести идущих подряд «1» (ну захотелось передать, скажем, 0xffff) вставляется «0», чтобы приёмник подолгу не залипал в одном состоянии; приёмник узна ет вставленный «0» и как данные не засчитает, это довольно распространённый приём в кодировании для лучшей автоподстройки частот. Пара проводов вместе с землёй даёт возможность сформировать, как минимум, четыре статических состояния (они обозначаются J, K, SE0, SE1). В USB 2.0 SE1 не используется, а три оставшихся дополнительно разыгрываются в динамике (с часами и переходами) для передачи ещё нескольких управляющих символов (границы пакетов, сброс, подключение/отключение, энергосбережение/выход). Хорошие иллюстрации есть в USB Made Simple, Part 3 - Data Flow .
Т.е. в итоге передаются данные в виде ноликов и единичек, плюс всякие управляющие символы, чтобы можно было из всей этой электродинамической кухни готовить нормальные пакеты данных.
(дополнено по просьбе читателей)
Пакетный уровень
На пакетном уровне между хостом и устройством передаются безадресные пакеты (пара устройств на полудуплексной линии может обойтись и без адресации). Пакет состоит из маркера SYNC для синхронизации тактов приёмника, последовательности байт и символа EOP. Длина пакета переменная, но оговаривается через верхние уровни стека. Первый байт называется Packet Identifier (PID), имеет простой избыточный формат для помехоустойчивости и пригоден для скармливания автомату следующего уровня (для сборки транзакций из пакетов). Пакеты с начинкой (длиннее одного байта PID) снабжаются контрольной суммой (короткой CRC5 или длинной CRC16, в зависимости от типа пакета). Анализатор протоколов должен, как минимум, показывать нам пакеты.
Уровень транзакций
На следующем уровне из пакетов собираются транзакции . Транзакция - это малый набор пакетов (в Full Speed USB 1, 2 или 3), следующих строго друг за другом, которыми (в полудуплексном режиме) хост обменивается с оконечной точкой (endpoint), и только с одной. Очень важно, что транзакцию открывает только хост, это специфика USB (нам в прошивке МК меньше мороки). На уровне транзакций можно говорить о канале (pipe) между хостом и одной из оконечных точек устройства, но я намеренно избегаю термина «канальный уровень» (Data Link) из модели OSI. Анализатор протоколов должен хотя бы декодировать транзакции.
Уровень передач
Поверх транзакций расположим уровень передач (transfers). Их в USB используется четыре типа: контрольные с оконечной точкой №0 (control transfers), передачи с прерываниями (interrupt transfers), изохронные (isochronous transfers) и крупноблочные передачи (bulk transfers). Последние три являются вариантами потоковых каналов (stream pipe), про которые я ещё скажу несколько слов. Этот уровень тоже должен отобразить хороший анализатор протоколов.
Прикладной уровень
Венчает стек, как обычно, прикладной уровень. Здесь происходят: установка адреса устройству хостом, рассказ устройства о себе на языке дескрипторов, команды хоста на выбор конфигурации (контрольные передачи), обмен данными с HID-устройствами (в примерах пока нашёл передачу с прерываниями, хочу попробовать контрольную), печать на принтере и сканирование, доступ к накопителю USB (крупноблочные), общение через гарнитуры и веб-камеры (изохронные) и многие другие замечательные вещи.
Последний штрих
Сбежав на секунду вниз по уровням, можно добавить, что хост периодически вбрасывает по шине те самые пакеты Start of Frame (SOF), разбивая время на равные интервалы, но так, чтобы не разбить при этом сами транзакции. Поэтому пакеты SOF можно считать самостоятельными транзакциями. Не следует путать кадр (фрейм) USB с омонимом канального уровня модели OSI. Лучше уж вспомнить кадры (фреймы) аудио CD, это просто квант времени: хост «тикает» в шину пакетами SOF, чтобы подключённые устройства заранее планировали участие в т.н. изохронных передачах , гоняющих потоки данных в реальном времени. Ну или вот так: группы транзакций планируются хостом по временным интервалам, именуемым кадрами. Кадр составляет 1мс на Full Speed и 125мкс на High Speed USB, но High Speed - более сложный стандарт, его лучше изучать отдельно.
UPD:
Хороший вопрос задали читатели: а как насчёт фрагментации? Я не нашёл в USB 2.0 признаков фрагментации на уровне транзакций и ниже, т.е. транзакции для того и есть, чтобы передаваться целиком. Передачи же в ряде случаев могут и должны разбиваться на несколько транзакций, особенно с учётом изохронных режимов. И я повторю, что всем планированием у нас пока заведует хост (на стороне МК меньше думать приходится).

Смотрим на трафик по USB

Хорошая подборка иллюстраций есть в упомянутой книжке USB Made Simple, глава 5: www.usbmadesimple.co.uk/ums_5.htm

Вот одна из них


Итак, транзакция всегда инициируется хостом в отношении одной выбранной оконечной точки на устройстве (помимо специальной точки с номером 0, их может быть ещё до 15 штук на одном устройстве, например, комбинированная клавиатура с мышью, термометром, флэшкой, кофеваркой и кнопкой вызова сантехника заказа пиццы).
В случае приёма хостом данных с устройства последнее не может само открыть транзакцию, но может только дождаться нужного момента и поучаствовать в ней. Хост открывает транзакцию устройству пакетом с PID = IN (группа Token) и гарантирует на нужное время свободу шины, устройство вбрасывает пакет из группы Data, в зависимости от типа транзакции хост может подтвердить успех третьим пакетом из группы Handshake (ACK, NAK, STALL, NYET), транзакция закрыта.
При отправке данных на устройство (PID = OUT, группа Token) хост открывает транзакцию, отправляет пакет с данными (Data), также в зависимости от режима может принять пакет Handshake с подтверждением успешности транзакции.
По окончании транзакции всё вернётся на круги своя, устройство снова будет ждать управляющих пакетов от хоста.

Режимы передачи USB в примерах STM32 USB FS

Чтобы по одной паре проводов можно было гнать копирование с диска одновременно с аудио-видео потоком, жестами мышью и сигналом скоростного осциллографа, существуют разные типы сообщений и передач.
Чуть выше я только что описал простой потоковый канал (Stream Pipe) между хостом и оконечной точкой, где пакеты с начинкой (группы Data) не несут никакой специальной или управляющей информации самой подсистеме USB. Полная свобода переписки, библиотека контроллера должны предоставлять примитивы для закачки буфера произвольного размера из памяти МК хосту или обратно. Нарезкой на пакеты, пересылкой и «дефрагментацией» пусть занимаются библиотека МК на пару с драйвером хоста. В STM32 это USB_SIL_Write() и USB_SIL_Read(), описаны в UM0424. Они и есть тот самый логический уровень абстракции. На стороне хоста см. описание соответствующего драйвера (например, во FreeBSD это ugen(4)).
Однако использовать тяжёлую периферию вроде USB для организации простого потокового канала я считаю кощунством (спрашивается: чем USART не угодил?). Но ситуации, конечно, бывают всякие.
В любом случае, чтобы подсистема USB вообще ожила и устройство определилось, требуется обмен контрольными транзакциями.

DISCLAIMER

Дальше будут упоминаться примеры из той самой библиотеки UM0424 для работы с Full Speed USB от STMicroelectronics, но они рассчитаны под их родные демоплаты. Берите пример с автора Raja , проявляйте инженерную смекалку в адаптации проектов под свою демоплату.

По софту всё понятно: это примеры не для промышленного использования, там могут быть баги, некоторые части (типа таблицы ссылок в примере Mass storage) защищены патентом, и вы не имеете прав их использовать в коммерческом проекте. Но это ещё ничего, китайцы ухитряются потом продавать на рынке USB-изделия, у которых даже библиотечные VID и PID не удосужились поменять.

По железу, как я понял, надо начинать с кварца. У меня челябинский PinBoard II с кварцем 12Мгц (все библиотеки заточены под 8МГц), я менял умножитель ФАПЧ с 9 на 6 (ссылка с разъяснениями), иначе МК разгонится до 108МГц вместо 72МГц, а USB на 72МГц вместо положенных 48МГц вообще не поедет. Можно ещё сбавить обороты МК до 48МГц, поменяв делитель шины USB с полутора до единицы. Использовать внутренний генератор МК HSI спецы не любят : частота может слегка уплыть от нагрева, последствия для USB предсказать затрудняюсь. Ну и не забываем о периферии, конечно. Без флэш-памяти SPI/SDIO из примера Mass storage можно сделать разве что аналог /dev/null, но его ведь хрен отформатируешь:-)

Контрольные передачи и каналы сообщений
Думая про USB, вспоминаю добрый старый протокол PPP с его LCP , IPCP , CCP и ещё хзCP . Обмен хоста с оконечной точкой №0 сообщениями особого вида и есть местный эквивалент xзCP.
Через контрольные передачи устройство инициализируется, получает адрес, рассказывает о себе хосту на языке дескрипторов (чтобы тот подыскал и активировал нужный драйвер). Без контрольных операций не «поедут» и простые потоковые передачи, если устройство не ответит по форме, хост поскорее заглушит порт: протокол надо соблюдать.
В принципе, протокол не запрещает повесить на контрольную точку №0 и обмен данными, аналогично режиму с прерываниями. Заодно задумайтесь: как будете обновлять прошивку МК, так сказать, в полевых условиях? Программатор наготове держать? Есть и другое решение.
Пример: Device firmware upgrade
Передачи с прерываниями
Эта разновидность (interrupt transfer ) предназначена для обмена небольшими транзакциями, сходными с контрольными. Нет, устройство не может прерывать хоста, оно ждёт опроса, их частота и размеры пакетов оговариваются заранее в дескрипторе устройства. Хорошо подходят для всевозможных пультов, датчиков, сенсоров, мышек, светодиодов и прочих HID-кофеварок. Канал с прерываниями каждой точки однонаправленный.
Примеры: Custom HID , Joystick mouse , Virtual COM port
Передачи изохронные
Χρόνος по-гречески значит «время». Изохронная передача (isochronous transfer ) - местный хайтек, позволяющий управлять потоками данных в реальном времени. Отличается гарантированной (но необязательно широкой) полосой пропускания и отсутствием подтверждающих транзакций, почти как UDP с QoS. Битый пакет? Это бог Хронос толкнул МК по ноге. Не надо пытаться отправить пакет заново, иначе бог огорчится. Контрольные суммы, тем не менее, проверяем втихую от Хроноса. Изохронные передачи хороши для аудио-видео и измерительных систем реального времени, а также прочих игрушек двойного назначения . Хотя на некоторые из них м.б. интереснее повесить какой-нибудь AVR, связав его с нашим ARM по USART или SPI. Изохронные операции участвуют во фреймовой сигнализации (вспомним про тиканье пакетом SOF).
Пример: USB voice speaker
Передачи крупноблочные
Нет, мешки с цементом таскать не будем. Я думаю, все узнали режим работы всевозможных накопителей USB. Передачи bulk transfer имеют цель отправить данных как можно больше и быстрее, обязательно с пересылкой битых пакетов, но без гарантий по полосе пропускания, уступая её изохронным передачам при необходимости (как в TCP без QoS). О внутреннем устройстве USB флэшек я как-то уже рассказывал , теперь можно скачать и запустить действующий прототип. Я сам его не пробовал, но таблица команд SCSI в описании примера (как-бы, между прочим) весьма символизирует. Признаков алгоритма управления износом для NAND-памяти я не нашёл:-)
ВНИМАНИЕ: местами действует патентная защита STM.
Пример: Mass storage

Что осталось нераскрытым

Я не имею цель сделать ещё один учебник по USB, их и без меня хватает, и там хорошо описаны: электрическая часть, подробности протоколов, работа с концентраторами, дескрипторный язык и уровень абстракции HID, проблемы с уникальностью VID/PID, USB 3.0 и многие другие замечательные возможности шины USB, как полезные нам, так и не очень. Айтишникам особо рекомендую экскурсию на тёмную сторону с обзором вражеских девайсов (флэшка с замаскированной HID-клавиатурой, которая будет делать страшные вещи).

Ссылки

Адаптация примера Custom HID к бесплатной среде Em::Blocks и бюджетной демо-плате STM32F103C8T6 производства LC-Tech Промэлектронщики и Айтишники . Это своего рода инженерный Инь и Ян, в каждом из нас есть доля того и другого.

Промэлектронщики имеют блестящие знания и навыки по железу, паяют радиодетали толщиной с волос левой рукой с закрытыми глазами (причём потом это работает). Взглянув на электронную схему, почти физически начинают ощущать все её токи с потенциалами, работают также и с силовыми схемами, и с (большими, быстрыми, опасными) промышленными изделиями. Подход к программированию МК соответствующий: он просто должен выдать нужные логические уровни на нужные ножки в нужное время, не столь важно каким способом. Консервативны в технологиях (не влезай - работает), тяжёлую периферию МК не особо жалуют. При обсуждении объектно-ориентированного программирования, информационной безопасности, гигантских проектов в миллион строк кода и всяких навороченных графических интерфейсов скучнеют. Вместо пакетно-ориентированной шины USB предпочитают потоковый режим USART, усиленный либо привычным RS-232, либо более брутальным RS-485 (последовательная шина для промышленных применений, до 10Мбит/с на 15м, до 100кБит/с на 1200м, до 32 устройств).

Айтишники воспитаны на понимании операционных систем, сетевой инфраструктуры и сложных взаимодействий, элита хорошо подкована в информационной безопасности и разбирается во всяких незримых способах проникновения в чужую систему. Некоторые при этом очень любят котиков (ну как их можно не любить? я, правда, не держу, не развожу и не готовлю:-). Многие любят свободу информации, ругать корпорации/правительства и побеждать силы природы усилием мысли. Паталогически ленивы, но обожают новые технологии и закрученные инженерные ребусы с дорогими игрушками (желательно решаемые на уровне софта или, в крайнем случае, перемычек). Отношения с паяльником настороженные: не спрашивайте у айтишника, любит ли он паяльник, может неправильно понять; лучше спросите, любит ли он паять электронные схемы.

К чему я? Мы просто видим этот мир по-разному… Ведь ядро Linux кроили такие же ребята, из модулей на С и ассемблерных вставок для конкретных платформ, и без холиваров вроде обошлись. По-настоящему серьёзный проект я вижу как многоядерную систему, сочетающую современнейшие МК с тяжёлой периферией, но не исключаю связки с классическими моделями типа AVR: ими можно обвесить какие-нибудь критичные быстровращающиеся острия технического прогресса. Если код проверенный годами, то почему нет?

Добавить метки

Похожие статьи

  • Почему css. Решение проблем с CSS. Зачем нужны стили CSS в отдельном файле

    Здравствуйте, уважаемые читатели блога сайт. Сегодня я хотел бы поговорить о том, зачем вам может понадобиться при вашей работе с сайтом знание языка HTML (читайте про то, что это такое ), основы работы с таблицами каскадных стилей CSS...

  • Инстаграм аккаунт Лены Миро (miss tramell) Оппоненты лены миро в жж

    Думаю, даже самые консервативные пользователи Сети, которые не заходят дальше любимых пабликов в избранной им социальной сети, хотя бы краем уха слышали о Лене Миро . Ее скандальные материалы известны во всех странах на территории бывшего...

  • Не работает USB-разъем, что делать Телефон не распознаёт USB-кабель

    Почему телефон не видит USB-кабель? USB-кабель является важным компонентом для любого смартфона. С его помощью можно как заряжать телефон, так и передавать данные с телефона на персональный компьютер или ноутбук. Однако случаются ситуации,...

  • Как увеличить файл подкачки?

    Операционная система изначально настроена так, чтобы обеспечивать оптимальную работу на всех моделях ноутбуков или стационарных компьютеров. Комплектующие и ресурсы у ПК могут быть разные, поэтому возникает необходимость пользователям...

  • Как очистить папку удаление на

    По всей видимости, практически каждый пользователь персонального компьютера сталкивался с ситуацией, когда какая-то папка не удаляется ни из «Проводника, ни из другого файлового менеджера, ни из командной строки. В чем секрет такого...

  • Простая программа для обработки фотографий

    Если у вас есть архив цифровых фотоснимков – хотя бы снятых на мобильный телефон, вам понадобится как минимум программа для просмотра фотографий. С ней вы упорядочите кадры по темам и периоду, удалите самые неудачные, подберете файлы для...