Usb hs что это
Попросил меня как-то один уважаемый заказчик организовать ему передачу данных с контроллера (stm32f407) в компьютер. Всё бы ничего, но скорость ему требовалась аж 40 мегабит в секунду.
Надо сказать, что железка была уже готова, основной код написан, в качестве интерфейса передачи выбран USB High Speed с внешним PHY (USB3300). У программиста заказчика с USB что-то не заладилось, посему решили произвести усиление коллектива вашим покорным слугой. Для полноты картины следует добавить, что весь код контроллера был написан при помощи CubeMX, а программа на ПК — на Delfi.
Решив, что в чужой монастырь со своим уставом не лезут (ну не люблю я Куб), стал я прикидывать, как в такой ситуации можно решить проблему заказчика малой кровью.
Пример с Virtual Com Port из Куба заработал практически сразу, но, по опыту работы с VCP, я не ожидал от него каких-то рекордных скоростей. И точно, более 14 мегабит в секунду я получить не смог. Скорее всего, узкое место находилось в драйвере VCP, но разбираться с ним совершенно не хотелось. Писать свой полноценный драйвер для ПК я счёл нехорошим излишеством, поэтому выбор был сделан в пользу libusbK. Что касается libusb(которая просто, без «К»), то под Линуксом она божественна, а вот её работа под Windows порой вызывает недоумение. Кроме того, у libusbK есть бинд для так любимого заказчиком Delfi.
Zadig мне в помощь, и я написал тест, который по запросу с ПК гнал буфер с 16-разрядным счётчиком, программа на ПК синхронизировалась с ним и далее проверялась правильность принимаемых данных. По факту, я использовал endpoint 1 из примера VCP, цепляясь к ним напрямую из libusbK. Обмен происходил посредством bulk-transfer, что мне и было нужно, так как данные терять было нельзя.
Запустил, подкрутил размер буферов, получил скорость аж в 20 мегабит в секунду. Нужно было искать ещё резервы для повышения производительности.
До этого я пробовал включать в контроллере USB DMA и выделенные прерывания на endpoint 1, но любое из этих действий как по отдельности, так и вместе выводило USB из строя, так что устройство совсем не опознавалось компьютером. Гугление ни к чему не привело. Везде народ гонял по USB небольшие объёмы данных и с DMA совершенно не заморачивался, но именно в нём намечался источик дополнительной производительности.
Wireshark и usbpcap особой ясности не внесли, ибо даже контрольные пакеты ходить по шине отказывались напрочь.
Трассировка отладчиком тоже была малоэффективна, так как любое вмешательство в работу USB приводило к ошибке по таймауту, и приходилось перезапускать процесс, тыкать туда-сюда разъёмы, глядя на окошко диспетчера устройств.
Пришлось открыть Reference manual на контроллер и медитировать, сравнивая написанное там с тем, что реально происходит в коде.
Ошибка со включением DMA нашлась в функции USB_EP0StartXfer файла stm32f4xx_ll_usb.c. Внимательно следим за руками:
Как видно, сначала включается и запускается endpoint, а потом инициализируются регистры DMA. Харе Кришна, дорогие индусы! Я вижу, вы неплохо сэкономили на тестах.
Не буду здесь писать весь код, diff-файлы для HAL от CubeMX v 4.20.1 приаттачены к данному посту.
После исправления указанных ошибок и немного поигравшись с размерами буферов, я легко получил скорость обмена 50 мегабит в секунду. Заказчик был счастлив.
Не уверен, в каком блоге следует публиковать всю эту лирику, посему пишу здесь, надеюсь, кому-то эта информация будет полезна.
Комментарии ( 55 )
решили произвести усиление коллектива вашим покорным слугой.Не берусь судить что и где этот специалист усилил, но язык программирования называется ObjectPascal, а IDE для его написания Delphi.
Не являюсь специалистом в данном вопросе, посему терминологией не владею. Последний раз писал на ТурбоПаскале 5.5 в лихие девяностые.
Саму программу на ПК я в глаза не видел. Сказали — Дельфи, ну и ладно. Использовал библиотеку, которая имеет бинд для Паскаля, что позволило использовать множество ранее написанного кода.
Что касается усиления, то брали меня для решения конкретной задачи, которую я выполнил. API программистам отдал, все счастливы. Надо будет сделать что-то ещё в пределах моей компетенции — сделаю, тем более, что заказчик хороший, работать с ним одно удовольствие.
круто, интересно, но хотелось бы посмотреть чуть больше кода :) Полностью проект выложить не могу — заказчик несколько специфичный.Скажите, что именно вас интересует, постараюсь показать ключевые моменты. тогда пока не надо, буду иметь в виду :) заказчиков нельзя нервировать :) Спасибо, полезная статья. Если еще опишете работу с оным PHY и чем именно он хорош или плох будет еще лучше.
Главное его достоинство — это то, что его можно легко купить. Ну и в Терре отладочная платка продаётся недорого. Нареканий по работе у меня тоже нет.
Про подключение могу написать в отдельным постом, хотя каких-то сакральных знаний там нет. Соединил провода, проинициализировал пины контроллера, и всё заработало, по крайней мере на физическом уровне.
Самое полезное (кому-то, видимо HAL'о-говноCube'рам) в этой статье — это коротенький рассказ про Ctrl+X и затем Ctrl+V (перенос одной строки кода ниже на 12 строк).
Wireshark, ну туды-сюды, тык-тык, кстати, и референс мануал был стимул прочитать наконец-то полностью и внимательно, короче: "джентельмен в поисках десятки". Хотя самого себя автор представил, как некоего Мистера Вульфа в сфере MCU-електроники: серьезный и богатый заказчик, прибыл для усиления команды говнокодеров(видимо «дебилов»), не говоря уже о говнокодерах индусах.
Но судя по откликам — глупая и недалекая публика ждала чего-то большего.
Боюсь разрушить вашу картину мира, но люди решают свои задачи теми способами, которые считают оптимальными. Заказчик весьма компетентен в своей области, и тот прибор, для которого всё делалось, достаточно интересный. Для него мой код всего лишь средство, а не цель.
Выбрали они в своё время Куб — значит сочли наиболее подходящим для себя. Для меня это был первый опыт работы с ним, и надо сказать, я ожидал внутри большего ужаса. На практике — достаточно юзабельная вещь, местами неоптимальная, но для быстрого подъёма железа вполне подходящая.
Заказчик в данном случае знал, чего хотел, и то, что я решил задачу в установленных им рамках, его полностью удовлетворило. Кстати, с чего вы взяли, что он богатый? Вменяемый и адекватный — да, хотя сейчас это дорогого стоит.
Про глупую и недалёкую публику вы это зря. Это не обучающий пост. Мне хотелось поделиться полученными патчами с обитателями сообщества, на сайте которого я нахожу много полезной информации. А рассказанная история просто в довесок, чтобы не было скучно. На сайте и так последнее время затишье.
Честно говоря, мне за индусов было обидно: у нас же как — индусы-говнокодеры, индусский код и т.п., ясно же, что у нас каждый «гигант мысли», но почему мы тогда в дерьме, а эти индусы(в том числе) двигают забугорный хайтек?
В коде Куба я, кстати, не нашел никакого лютого и конкретного именно говнокода. Просто многие считают, что такие прослойки сами по себе являются говнокодом, вне зависимости от качества его закодирования. А к Кубу я, на самом деле, отношусь чисто коммерчески.
А там просто ошибка(типа опечатки) — видимо красноглазят очень много — ну графики там, сроки, дедлайны… Чужие ошибки искать намного легче, чем выдавать на гора объемы по жесткому графику.
Чужие ошибки искать намного легче, чем выдавать на гора объемы по жесткому графику.
Обычно хватает просто прогнать и посмотреть в отладчике.
А в данном конкретном случае челу просто необходим был трассировщик J-Trace за 1-2 килобакса, хороший DSO (цифр.осцилл) или 100/200 МГц логич.анализатор. Возможно, что тогда можно было бы все сделать быстрее и даже без долгого медитирования над реф.мануалом.
Я даже год назад так вот решил проблему в 1С 8.3 (которую я нихуя не знаю — там только описание — 4 толстенных талмуда) одному «уважаемому и солидному челу». Нашел модуль/документ в конфигурации, с которым была проблема, и прогнал в отладчике — там просто оказалось, что не заполнена какая-то константа или поле в одном из справочников. Заполнили, и ошибка перестала вылетать и все стало считаться очень чудесно. Все сказали, что я «голова» и «гений», даже «заработал десятку» на один раз поесть в ресторане. А что там делается в этих портянках (а они там сотни и тысячи строк кода) я так и не понял и даже не смотрел, что смотреть, если ничего не понимаешь. Ну так-то все понятно: условия, циклы, свойства, методы, но что конкретно делают и для чего эти все объекты из объектной модели 1С — полный ноль понимания, только очень смутно, чисто по названию.
Обычно хватает просто прогнать и посмотреть в отладчике.
Рад, что мы достигли некоторого понимания.
Индусы — понятие скорее нарицательное, отражающее подход. Понятно, что ST зарабатывает не софтом. Спасибо, что раздаёт библиотеки и примеры бесплатно, ибо в том же референсе не всё всегда сразу понятно: желело сложное, протоколы тоже (это я всё про своё USB). Плохо то, что обратная связь, фактически, отсутствует. Завели бы багтрекер что ли. Думаю, и это, и отсутствие тестирования вина скорее менеджмента, нежели программистов.
Совершенно не хотелось казаться д'Артаньяном, который пришёл весь в белом и одной левой починил всё. Мне эти ошибки стоили неделю красноглазия. Печально, что библиотек для работ с USB было уже выпущено немеряно версий, а готового решения, работающего «из коробки», если сделать шаг в сторону от примеров всё ещё нет.
Например, нигде до сих пор не проверяется, открыт ли endpoint, в который вы собираетесь писать. Если данные шлются не по запросу, будет беда.
А скорости при обычном (не DMA) обмене точно не хватало? Вроде 5 мБайт не так, чтобы запредельно при тактовой под сотню метров, или у Вас частота была зарезана?Более 20 мбит/с не получал. Это на тактовой 168 МГц на железе, на котором больше ничего не крутилось. В реале там ещё сбор и предобработка данных с кучи АЦП, так что будет хуже.
Но надо понимать, что в текущей работе всё происходит по запросу от ПК. ПК шлёт запрос и ему в ответ приезжает блок данных. Потом опять запрос. Здесь сам ПК вносит задержку, поскольку код на нём крутится в user-mode, на него влияют переключения контекста задач.
Я, в своё время, пробовал непрерывно писать в bulk-endpoint на контроллере, а на ПК всё время вычитывал. Получал 26 МБайт/сек (с DMA на старой, до HAL-овской библиотеке), но данные периодически портились из-за переполнения буферов на ПК.
Если написать честный низкоуровневый драйвер с большими буферами, всё будет хорошо, но это задача несколько другого уровня.
Человек нашел ошибку в библиотеке, которая делает невозможным определенны режим работы.Это было нелегко, это Вам кажется что искать ошибки в чужом коде намного легче, чем выдавать на гора тонны мусора, на самом деле совсем наоборот — можете попробовать.
И вместо того, чтобы поблагодарить за проделанную работу, кое-кто встает грудью на защиту, не побоюсь этого слова, говнокодеров, с аргументами «а там просто ошибка (типа опечатки)».
Не знаю как кому, а мне глубоко по фигу на их сроки и почему ошибка возникла — мне достаточно того факта, что она есть и она принципиальная — не снижает скорость, а делает невозможным применение библиотеки.
А что касается кода Куюа — или Вы недостаточно внимательно его читали, либо у нас совершенно разные представления о качественном коде. В свое время Тойота за код именно в таком стиле заплатила весьма неслабые бабки. Просто включите правила MISRA и посмотрите на результат компиляции Куба, в котором Вы, кстати, ничего плохого не нашли.
MISRA — это говно. Это мое ИМХО. Ну или чисто для автомобильных кодеров, т.к. это ихний стандарт и это ИХ проблема и ИХ попоболь. Что, почему-то, совершенно не помешало Тойоте говнозакодировать монолитный спагетти говнокод c гоуту и с магическими цифрами.
Писать в 21 веке на ANSI Си 89-го года, да еще кастрированном и выхолощенном MISRA по самое не могу на 70% его возможностей (это нельзя, это тоже нельзя, это опасно). Пусть эти мудаки идут нахуй, или создают себе для автопромышленности язык типа Паскаля или еще чего изначально ограниченного и защищенного. А лучше всего — пусть юзают готовые системы на ПЛК — там это уже все продумано — все что можно уже защищено и анально огорожено.
Нехуй им лезть в Си, да и ваще в MCU. Хорошо, что я не работаю на автопром (как и Линус и многие и многие другие) и могу спокойно обходиться без ихних иезуитских инквизиторских нравоучений. Лучше уже тогда ваще не изучать Си и не писать на нем, а сразу же уходить в программирование ПЛК или в говнокодирование на Java, ПХП или 1С.
Бля, у меня аж подгорает! Так-то я не особо писатель комментариев клавиатурой не по делу, но.
Зачем вы себя ведете как школьник? Ну что это, блять, за херня? Или что это? Тут говно, там говно — везде говно! Или у вас весна, что ли? Вышли на улицу прогуляться, насобирали подснежников, и теперь «везде говно»? Не удивительно.
MISRA — нормальный стандарт. Все эти «тут нельзя, там нельзя», динамически нельзя, инициализировать только тут, и прочее. Все это имеет под собой здравое зерно и призвано обрисовать менее эфемерные рамки для того, чтобы создавать более безопасные системы. Прикладывать нужно просто правильной точкой, а не жопою, и все будет нормально.
Какая разница, на чем, блять, писать в каком веке? Есть бизнес (у вас от этого, что ли, бомбит?), есть бизнес-задачи, есть стандарты и инструменты, есть исполнители и есть результат. Если исполнители отлично справляются с задачей бизнеса, не гонят говнокод, то какая нахуй разница, какие они при этом используют стандарты и инструменты? Да хоть из палочек, камешков и желудей. Работает, стабильно, выполняет? Ок. Тем более, речь идет о проверенных временем палочках и камешках, а не о том, как сейчас принято у «модных и молодых»: возьмем NodeJS, и напишем на нем сервер нагруженной и важной информационной системы! Вот где мудаки живут. Да там хоть идеальный код вгони, сраный NodeJS сыпется сам по себе от каждого чиха. Поэтому и палочки, поэтому желуди, поэтому камешки. И клетка 2х2. Не нравится — не еште. А говнокод можно и из палочек сложить, будто бы тяжело очень.
Отладчик — хорошая штука и полезное подспорье. Но иногда валиться может в таком непредсказуемом месте, что отладчик не особо выручит (хоть и немного поможет). А еще бывают эрраты. Надо курить маны, читать существующие эрраты, вкуривать в код. Все равно. Мы находили пару эррат в 407, промудохались знатно. И таки-да, что-то пробовали писать в ST — толку ноль. Забили хуй.
Касательно куба. Это инструмент, хороший коммерческий инструмент с хорошей задумкой, на самом деле. Более того, пользуемся им в разной степени постоянно. Особенно по лапкам пощелкать, чтоб мозги не напрягать понапрасну. Что касается его библиотек. Ну, как сказать. Дареному коню в зубы не смотрят. Код там странный, местами неоптимальный, много косяков (косяков, а не опечаток!). Периодически то железо косо инициализируется, то маллочница пробирает, то еще что-то. За индусов (индийцев все же?) говорить не буду — китайцы, русские, СШПцы, европейцы (блять! какой у них криворукий код в большинстве) — все косячат одинаково. Просто применять все это надо, опять же, с умом. Где-то, где надо релёй щелкнуть, лампочкой мигнуть и уснуть — пойдет (хотя, с кубом можно внезапно не проснуться после этого). Где-то, где нужно быстродействие и уверенность, а не слабоумие и отвага — курить маны, писать код. Можно и кубовский за основу взять, хотя, как выяснилось в работе, проще сразу начать свой писать. Вот и все. А чужие косяки искать — очень муторная тема.
Опять же, все выщелачивается до тупо точки приложения, которая должна быть не жопою, а головою.
P.S. А что, если Java, то сразу говнокодирование? За такой гниловатый базар можно и ответить ведь.
Воу-воу-воу, сколько экспрессии! :) Я даже с трудом вспомнил пароль и авторизовался тут, чтобы расставить плюсы-минусы и написать этот комментарий. :D
Так-то я тоже адепт MISRA и периодически воинствующий противник кубических ардуин. :) Давайте глубоко вдохнем, выдохнем и пойдем дальше рисовать схемы и писать код, оставив некоторых наших коллег за изготовлением мультивибратора из STM32F4. Все равно заказчик, намучившись с такими решениями, в итоге придет к нам. ;)
Вроде мы слышали, что USB 3.0 — это круче, чем USB 2.0. Но чем именно — знают не все. А тут еще появляются какие-то форматы Gen 1, Gen 2, маркировки Superspeed. Разбираемся, что значат все эти маркировки и чем они отличаются друг от друга. Спойлер: версий USB всего четыре.
USB 2.0
Когда-то было слово только USB 1.0. Сейчас это уже практически архаика, которую даже на старых устройствах почти не встретить. Еще 20 лет назад на смену первопроходцу USB 1.0 пришел улучшенный USB 2.0. Как и первая версия, эта спецификация использует два вида проводов. По витой паре идет передача данных, а по второму типу провода — питание устройства, от которого и идет передача информации. Но такой тип подключения подходил только для устройств с малым потреблением тока. Для принтеров и другой офисной техники использовались свои блоки питания.
USB версии 2.0 могут работать в трех режимах:
- Low-speed, 10–1500 Кбит/c (клавиатуры, геймпады, мыши)
- Full-speed, 0,5–12 Мбит/с (аудио и видеоустройства)
- High-speed, 25–480 Мбит/с (видеоустройства, устройства для хранения данных)
USB 3.0
Стандарт USB 3.0 появился в 2008 году и до сих пор используется во многих устройствах. Скорость передачи данных выросла с 480 Мбит/с до 5 Гбит/с. Помимо скорости передачи данных, USB 3.0 отличается от версии 2.0 и силой тока. В отличие от более ранней версии, которая выдавала 500 мА, USB 3.0 способен отдавать до 4.5 Вт (5 В, 900 мА).
Новое поколение USB обратно совместима с предыдущими версиями. То есть USB 3.0 может работать и с разъемами USB 2.0 и даже 1.1. Но в этом случае буду ограничения по скорости. Подключив USB 3.0 к устройству с USB 2.0 скорость, вы получите не больше 480 Мбит/с — стандарт для версии 2.0. И наоборот, кабель 2.0 не станет более скоростным, если подключить его в устройство с USB 3.0. Это связано с количеством проводов, используемых в конкретной технологии. В версии USB 2.0 всего 4 провода, тогда как у USB 3.0 их 8.
Если вы хотите получить скорость передачи, заявленную стандартом USB 3.0, оба устройства и кабель должны быть именно версии 3.0.
USB 3.1
В 2013 году появляется версия USB 3.1 с максимальной заявленной скорость передачи данных до 10 Гбит/с, выходной мощностью до 100 Вт (20 В, 5 А). С появлением USB 3.1 произошла революция в маркировках всех стандартов. Но с ней мы разберемся чуть позже. А пока запомним главное: пропускная способность USB 3.1 увеличилась вдвое по сравнению с версией 3.0. И одновременно с обновленным стандартом появился и принципиально новый разъем — USB type-С. Он навсегда решил проблему неправильного подключения кабеля, так как стал симметричным и универсальным, и теперь все равно, какой стороной подключать провод к устройству.
USB 3.2
В 2017 году появилась информация о новой версии — USB 3.2. Она получила сразу два канала (больше проводов богу проводов) по 10 Гбит/с в каждую сторону и суммарную скорость в 20 Гбит/с. Стандарт USB 3.2 также обратно совместим с режимами USB 3.1, 3.0 и ниже. Поддерживается типом подключения USB-C на более современных гаджетах.
Типы разъемов
Версий разъемов USB несколько, и для каждого есть свое предназначение.
- type-А — клавиатуры, флешки, мышии т. п.
- type-B — офисная техника (принтеры, сканеры) и т. п.
- mini type-B — кардридеры, модемы, цифровые камеры и т. п.
- micro type-B — была наиболее распространенной в последние годы . Большинство смартфонов использовали именно этот тип подключения, пока не появился type-C. До сих пор остается довольно актуальным.
- type-C — наиболее актуальный и перспективный разъем, полностью симметричный и двухсторонний. Появился одновременно со стандартом USB 3.1 и актуален для более поздних версий стандартов USB.
Superspeed, Gen или как разобраться в маркировках стандартов USB
Как только в типах стандартов появилась USB 3.1, привычная цифровая маркировка изменилась и здорово запуталась. Вполне понятный и простой USB 3.0 автоматически превратился в USB 3.1 Gen 1 и ему была присвоена маркировка SuperSpeed. А непосредственно сам USB 3.1 стал называться USB 3.1 Gen 2 с маркировкой SuperSpeed +.
Но и это уже потеряло свою актуальность с выходом стандарта USB 3.2. Он получил название USB 3.2 Gen 2×2 и маркировку SuperSpeed ++. В итоге маркировка всех предшествующих стандартов опять меняется. Теперь USB 3.0, она же USB 3.1 Gen 1, превращается задним числом в USB 3.2 Gen 1 с прежней маркировкой SuperSpeed. А USB 3.1, ставшая USB 3.1 Gen 2, тоже поднялась до USB 3.2 Gen 2. При этом конструктивно все стандарты остались прежними — изменяются только названия. Если вы уже запутались во всех этих цифрах и маркировках, таблица ниже поможет внести ясность в актуальных названиях.
Если еще более кратко, то сейчас опознать стандарты USB можно так:
USB 3.0 — это USB 3.2 Gen 1, он же Superspeed
USB 3.1 — это USB 3.2 Gen 2, он же Superspeed+
USB 3.2 — это USB 3.2 Gen 2x2, он же Superspeed++
Коротко о USB - откуда все начинается. D+ и D- это дифференциальная пара, данные передаются в противофазе с одной лишь целью уменьшить помехи. То есть линия передачи по сути одна ! Есть ведущее устройство (Хост) и ведомое (Device).
Ведущее и ведомое могут одновременно что-то посылать в канал. Поэтому протокол USB очень требовательно распределяет , что ведущий и когда посылает и что (и когда) ведомый должен ответить. Иначе никак нельзя.
Вот на картинке ниже все отчетливо видно (один пакет от ведомого):
Сначала все просто:
Пакет всегда начинается с SYN (10000000).
Завершается пакет всегда EOP (End Of Packet ) . На картинке выше видна единственная ассиметрия в конце пакета, когда : 2 линии DP и DM различаются.
Примерная последовательность пакетов.
Инициализацию устройства пропускаем (запрос дескриптора, интерфейсов , конечных точек и т.д.), чтобы не терять времени (переходим к сути).
Периодические пакеты "НЕ СПАТЬ" SOF (Start Of Frame) - это примерно 1раз/1мс посылка от хоста ведомому ("не спи"). Их лучше сразу как-то отфильтровывать для понимания.
Далее остается три типа пакетов типа . Ниже их PID (Packet Identificator) , он же токен :
SETUP это служебные пакеты стандартного протокола настройки устройства
OUT это хост передает данные
IN это хост запрашивает данные от девайса
Эти пакеты вкладываются между SYNK и EOP .
Получается примерно такая структура [SYNC] [PID] [Address(7 бит)] [EndPoint] (4 бит) [EOP ]. На картинке выше видно как девайс отвечает NAK практически сразу и это нормально. Это означает , что девайсу надо подумать и сразу он не может ответить на команду.
PID это токен или (Program Identificator) SETUP, IN , OUT.
Address - это адрес нашего устройства на шине USB . Сначала он всегда 0 после подключения USB. Потом хост перенумеровывает все устройства на шине и присваивает каждому устройству уникальный адрес (размер всего 1 байт).
EndPoint - хост всегда общается не просто с устройством по адресу , а еще и с конкретной конечной точкой (end-point) устройства , которых может быть несколько. Как же хост узнает какие значения у конечных точек (EP) ? Правильно для этого зарезервировано значение 0 (конечная точка EP0), служебный end-point , через который хост получает первичную информацию от других конечных точках. Как всегда все просто.
Допустим наш хост уже получил всю информацию о конечных точках , интерфейсах, конфигурациях через EP0.
Как происходит дальше работа на примере обычной клавиатуры
Хост долбит периодически PID IN по адресу устройства плюс Endpoint устройства (у нас EndP 0x01), который отвечает за прием данных от клавиатуры (IN для хоста).
Если никакая клавиша не нажата ведомый обязан ответить и отвечает NAK. Такие пакеты хост передает примерно 1 раз в 10ms и устройство если не нажата клавиша передает NAK.
А вот когда на клавиатуре нажимается какая-нибудь клавиша, ведомый ответит сначала DATA0 пакетом и следом пакет ACK.
Количество передаваемых байт в DATA0 зависит от типа клавиатуры, то есть каждый решает сколько использовать байт для передачи скан кода нажатой клавиши. Клавиатура сообщает по стандартному протоколу через EP0 о своих настройках.
Тут есть нюанс , что хост всегда посылает запрос устройству на конкретный EP. Если запрос идет на EP для передачи данных (у нас EP1 ) это одно , если запрос идет на служебный EP0 - это хост хочет подключить , настроить устройство. То есть хост всегда определяет логику обмена , а девайс обязан подстраиваться под запрос.
Вообще кто есть хост? Это драйвер например клавиатура или сетевого адаптера и у каждого драйвера соответственно свой протокол , своя логика.
Таким образом если вы разрабатываете USB устройство и ПК шлет вам все пакеты на EP0 , а до других EP не доходит дело, то значит что-то еще не закончено с настройками устройства, что-то хосту не нравится.
Хост вообще говоря может ждать ответ одновременно от 2 и более конечных точек . Это абсолютно нормально. Выглядит это в логах анализатора LA1010 примерно так:
Видно как хост тупо чередует EP0 и EP2.
Если не возникает какого-то прерывания у девайса
То есть если на шине пакеты бегут, а прерывание необходимое не возникает. Например тупо не возникает прерывание IN bulk у RNDIS адаптера (DataIn у EP2). То есть на шине вижу , что девайс отсылает NAK на IN EP2, но самого прерывания в девайсе не возникает.
Тут надо в регистры лезть и отсрочки уже не будет. Какие мысли возникают в первую очередь. Прерывания маскируются вроде (надо проверить).
Так как у нас есть один рабочий проект но без FreeRTOS , то сначала тупо начинаем сверять регистры USB ( OTG_FS_GLOBAL и OTG_FS_DEVICE ): после инициализации , после открытия конечных точек, после приема нужного пакета и т.д. Эти регистры кстати удобно просматривать на закладке SFRS (в Atollic true Studio), тут видна их внутренняя структура. И еще с момента последней точки остановки подсвечиваются изменения.
В процессе сверки регистров мы находим отличия в OTG_FS_GLOBAL, исправляем, заодно изучаем назначение регистров и в какой-то момент даже ловим __HAL_PCD_IS_INVALID_INTERRUPT (на картинке выше видно). Ура хоть что-то.
На самом деле не знач - не ведая мы подошли к главному моменту. Мы наконец-то обратили внимание на USBD_LL_Init, а точнее на загадочные функции HAL_PCDEx_SetRxFiFo(..) и HAL_PCDEx_SetTxFiFo(..) .
Момент истины
И выяснилось , что мы не понимаем и половины логики работы USB . Не зная регистры вообще нет возможности понять что делать. В данном случае HAL это вред.
Итак HAL_PCDEx_SetRxFiFo / HAL_PCDEx_SetTxFiFo создает таблицу во внутренней памяти контроллера USB. Да именно контроллера USB , а не контроллера STM32. Так как у STM32F имеется как-бы свой встроенный контроллер , отвечающий за USB. И у него есть своя память 512К, в которой надо создать таблицу с буферами приема / передачи для каждой конечной точки.
Где эта таблица, где ее адреса.
А вот сама структура USB_OTG_GlobalTypeDef .
HAL - кий код становится намного прозрачнее теперь.
Опять момент истины
Дальше , если интересно немного о передаваемых скан кода клавиатуры . Проводная клавиатура Low Speed
Скан коды USB HID клавиатур это не ASCII коды и не не коды PS/2 клавы.
Каждый из типов подразделяется на три группы:
USB 1.x и 2.0
Спецификация 1.0 регламентировала два типа разъёмов:
A – на стороне контроллера или концентратора USB
B – на стороне периферийного устройства
Для USB 1.x регламентировано два режима работы:
режим с низкой пропускной способностью (Low-Speed) — 1,5 Мбит/с
режим с высокой пропускной способностью (Full-Speed) — 12 Мбит/с
Для USB 2.x регламентировано три режима работы:
Low-speed, 10—1500 Кбит/c (клавиатуры, мыши, джойстики)
Full-speed, 0,5—12 Мбит/с (аудио-, видеоустройства)
High-speed, 25—480 Мбит/с (видеоустройства, устройства хранения информации)
31 июля 2013 года USB 3.0 Promoter Group объявила о принятии спецификации следующего интерфейса, USB 3.1, скорость передачи которого может достигать 10 Гбит/с.
Также в стандарте USB 3.1 был добавлен usb type-c
Примеры переходников
female - куда суют
Примеры разъемов 1
Примеры разъемов 2
взято с портала, чей домен запрещен на пикабу
Текст поста содержит запрещенный домен
M - Male - Папа (что суют)
F - Female - Мама (куда суют)
бывает у людей включаются школьные знания иностранных языков и у них получается Fазер и Mазер
Это уже не юсб вообще ни разу. Бля, вот решили чуваки придумать ОДИН, сука, УНИВЕРСАЛЬНЫЙ разъем. И пошло-поехало.
тег гифка для чего? если я не затупил, то убери пжалуста))
запрещенный домен состоит из двух частей
первая .pp
вторая .ua
сохранил. наглядно и все почти собрал, спасибо
Вопрос к знатокам. В USB 3.0, насколько мне известно, помимо повышения скорости передачи данных, повысили ещё и мощность питания. Компьютеры через USB 2.0 заряжают современный смартфон ну ооочень медленно, а то и едва в состоянии поддерживать заряд на одном уровне. а вот если закоротить в питании шины 3.0 на 2.0, можно выдавать более высокие токи заряда, и заряжать телефоны за час-полтора, как в родной зарядке. Реально ли такое реализовать, или я нагородил чушь? =)
ещё раз, кратко: комп с разьёмом 3.0, телефон с 2.0. модифицированный кабель, который включает питание шины 3.0 в питание 2.0, как результат — более быстрая зарядка. Возможно или нет?
А чего тут 1394 делает, он из соооовсем из другой оперы)))Для тех, кто не может зайти на wikipedia?
Подумалось тут.
Ответ на пост «Не прокатило»
у всех есть такие родственники.
есть у меня замечательный дядя, которого я видел последний раз лет в 10. Спустя 20 лет он приехал в гости. По дороге его уставший от жизни жигуль тройка немного рыгнул трамблером. Приехал к нему с подкатом, жигуля погрузили и поехали на место семейной сходки.
по приезду дядя очень нахваливал мою машину, а потом, уже за столом, выдал что дарит мне свой жигуль: мол хоть и ломается, но это уже почти ретро и скоро я её смогу продать за все деньги мира. Ну пьяные базары, обычное дело.
после чего уже все тёти\дяди начали хором вещать что я должен в ответ отдать ему свою машину. На резонный вопрос "а схуяле я должен отдавать машину стоимостью на два ноля больше чем его отрыга" был получен ответ "он старый, хорошей машины уже не купит, а ты молодой и ещё на такую-же заработаешь. Да и ваще он твой дядя, семейные узы нужно чтить". Предложил им обменять их трёшку на мою дачу в 75км от города, почему-то отказались. Когда начал аппелировать к семейным узам - был послан нахуй. Послал всех в ответ, свалил. Бонусом получил пожизненный отпуск от всех обязательных семейных мероприятий, ведь мало того что отказался помогать родственнику, так ещё и после посыла нахуй не остался ночевать в летней кухне чтобы по утру за свои бабки чинить отрыгу и потом развозить всю эту пиздобратию по домам (как оказалось они на это расчитывали, ведь я хорошо зарабатываю, значит могу весь день быть бесплатным таксистом)
потому радуйтесь что проебали отношения с таким замечательнейшим родственником :)
Добрый КиШ
Мотивации пост
. а в пустыне она вообще бесценна.
ХедХантер и кладмены
На днях листал ХХ.
Штук 5 вакансий курьера. От найка и адидас до ксиаоми и секс-шопа . Вакансии в самом верху в топе, смотрело со мной около 150 человек. Оклад 15к в неделю и 350 за точку. Нормально так для курьера?
В итоге все эти вакансии - кладмена. Работодатель зовёт в телегу.
Мне просто интересно , ХХ настолько похуй, что у него там творится? Очевидно вакансия левая, ибо заработок нереальный для курьера. Где пожаловаться не нашёл, выливаю свой гнев сюда. Вообще подозреваю, что все все знают.
Рамзан Кадыров замечен в сепаратизме?
Как все уже знают, Кадыров пригрозил силой отнять у ингушей их земли.
Как это: часть страны решила отобрать территорию у другой части этой же страны?
Интересно, почему на него не заводят дело за призывы к силовому захвату или отчуждение территории?
А ведь это сепаратизм. Развал СССР тоже начался с взаимных претензий его республик. Если какой-то регион России, собирается силой захватить другой регион, то это уже не субьект Российской Федерации. Это самостоятельная государственная единица.
Как вы считаете, можно ли расценивать действия Рамзана Кадырова как прямой отказ подчиняться действущему законодательству России и проявлением сепаратизма?
Галя! У нас отмена!
В свете последних событий.
Прошу юридической помощи, напали чеченцы в метро
Здравствуйте, я очень сомневался писать пост или нет, но сил уже нет бороться в одиночку с нашей правоохранительной системой. 30 августа я ехал на работу к 14:00, на выходе из метро Юго-Восточная на меня напали 2 чеченца ( https://www.m24.ru/shows1/14/308198 сюжет на Москва 24, правда они вырезали специально тот кусок, когда я отмахивался, разрывая дистанцию, уже после нескольких минут избиения в голову и назвали это "дракой", хотя ни одного удара я не нанес), я подбежал к службе безопасности метрополитена, одна из сотрудниц сразу убежала, вторая стояла и смотрела как меня избивают, ничего не делая. В итоге мне сломали нос и нанесли множественные повреждения в области головы. Когда они меня били они орали, что они из Чечни и всех русских вы**ут и ничего им не сделают, явный состав 282 статьи УК РФ, однако в итоге им инкриминировали лишь 115. После их задержания, когда я ждал скорую, полицейская сказала, что у них был нож и они орали, что воевали против русских в чеченскую войну, а также что они находятся под действием наркотиков (в таганском отделении опер потом также сказал). После меня отвезли в ГКБ им. Пирогова, в приемное отделение к нейрохирургу, где я пробыл более 6 часов, как в последствии выяснилось, принял со скорой меня санитар, а заключение выдал медбрат. В итоге в заключении прописаны препараты, которые мне якобы ввели, но их не вводили + заключение противоречит в некоторых моментах самому себе. Госпитализировать меня отказались, хотя по словам врачей скорой должны были госпитализировать на 10-14 дней. На следующий день я пошел в травмпункт рядом с домом, чтобы снять всё-таки побои, но травматолог сказал, что поставил бы ушиб мягких тканей только в случае наличия разрыва кожи (хотя это уже должно быть рваной раной, в моём понимании).
На данном этапе мне не дали ознакомиться с материалами уголовного дела, нож по словам дознавательницы в деле не фигурирует, я просил ознакомить меня с записями с камер видеонаблюдения, мне было отказано, а также с дозоров полицейских, тоже было отказано. Дознавательница не присылает никаких повесток по следственным действиям, я посмотрел, её действия нарушают 164, 188 и 192 статьи УПК РФ, когда на очередной встрече я хотел написать заявление на отвод дознавателя. Я думаю, что дознавательница ангажирована к этим чеченцам и/или диаспоре. При первой встрече, назначенной на 10:00, она отказалась меня принять к оговоренному по телефону (повестки не было) времени, а когда из кабинета выходил другой сотрудник, я слышал, как она говорит кому-то из своих "мариную **анного терпилу".
Прошу оказать юридическую помощь, что делать с этой дознавательницей? Что делать с врачами, которые отказались меня принимать и госпитализировать? Мне назначена очная ставка на 20 ноября, но я боюсь туда идти, потому что возможен вариант, что эти чеченцы придут туда с оружием.
Подбегая к сотрудникам безопасности метро, я включил камеру, думал это их вразумит, я стал кричать, что они хотят меня убить, но люди даже не обернулись. У меня сохранился кусочек видео, до того момента, как один из нападавших выхватил телефон (когда он выхватил телефон, то прервал запись) у меня из рук и начал меня избивать.
Читайте также: