Здравствуйте, vsb, Вы писали:
vsb>Встречаю очень многие устройства (да по сути 100% в интересующей меня нише), у которых USB-выход и через этот выход идёт UART over USB. Причём, насколько я могу судить, он идёт прямо из микроконтроллера. vsb>Я глубоко пока в это не погрузился, поэтому может чего не понимаю?
Так значительно проще и дешевле.
vsb>Выходит следующая схема: в микроконтроллере программируют код по переводу последовательности байтов в этот квази-стандартный протокол, который потом через USB отправляется на целевой компьютер. В целевом компьютере эти байты дешифровываются и ими пользуются.
Ну не совсем, где то может и делают так, но на то, чтобы полноценный usb потянуть, у слабых микроконтроллеров силёнок маловато. Я чаще видел спецчип usb uart bridge типа ft232 или cp2102.
Таким образом получается слабый МК, который usb ну никак сам не осилит, но при этом удобно к компу подключать, да и драйверы стандартные.
Да и сразу в МК такой чип тоже имеет смысл встроить, удобно же.
Здравствуйте, vsb, Вы писали:
vsb>Встречаю очень многие устройства (да по сути 100% в интересующей меня нише), у которых USB-выход и через этот выход идёт UART over USB. Причём, насколько я могу судить, он идёт прямо из микроконтроллера.
У этих устройств не было предыдущих версии с UART без USB, в которых этот протокол уже был реализован?
Здравствуйте, vsb, Вы писали:
vsb>Программы от этих производителей единственные, только под Windows
В Windows никогда не было родных высокоуровневых API для работы с USB — только универсальный DeviceIoControl для взаимодействия с любым драйвером ядра. Для устройств известных классов (HID, Mass Storage, Audio и т.п.) есть стандартные драйверы с известными интерфейсами, а все остальное требует собственных ядерных драйверов. Разработка ядерного драйвера под Windows, который будет работать эффективно, надежно, и никому не мешать — задача не совсем тривиальная, плюс с 2015-го действует жесткая политика подписывания.
Адаптеров USB/UART есть несколько разных, для каждого есть готовый драйвер, API со стороны системы стандартный и достаточно удобный, поэтому куда проще сделать устройство, подключаемое к UART, чем каждый раз городить всю обвязку заново.
Здравствуйте, vsb, Вы писали:
vsb>Почему? Вот сейчас у меня довольно слабый МК STM32F103. Стоит меньше доллара оптом, насколько я знаю. 20 КБ SRAM, 64 КБ флеша. USB умеет.
этот умеет, а какой нибудь AVR/PIC или что там ещё не умеет.
в подключении USB-UART то смысл не в том, что вот мы так под USB общаемся, а в том, чтобы UART к компу удобно подключить. первичен тут UART, а не USB.
vsb>Я, если что, говорю об устройствах, которые в рознице продаются за тысячи долларов. И там цена этого МК много роли не играет.
если контроллер мощный и всё умеет, то аппаратный UART очень удобен, например, для отладки ядра ОС.
запустить соединение по USB по своему протоколу требует загруженного ядра и драйверов, а UART доступен, насколько я понимаю, чуть ли не сразу при подаче питания.
навесить поверх UART еще и usb bridge это просто элемент обеспечения удобства подключения к компу.
Здравствуйте, vsb, Вы писали:
vsb>Я делаю navigator.usb.requestDevice({filters:[]}) и оно мне показывает все USB-девайсы с возможностью подключиться к любому из них и работать на низком уровне
На насколько низком? Асинхронный DMA зарядить можно?
vsb>без всяких драйверов.
Такого не бывает. За любое устройство всегда отвечает один драйвер или несколько. Судя по описанию, Chrome и Firefox работают через WinUSB. А то, что почти все остальные браузеры его не поддерживают, говорит о том, что это было добавлено относительно недавно.
Вообще, интерфейс к USB для браузера — это редкостное извращение с точки зрения программной иерархии. Это следствие явного дурдома, в котором браузер пытается подменить собой ОС.
vsb>девайса, под которого у меня в винде нет драйвера, под рукой сейчас нет, проверить, можно ли так работать вообще с любым девайсом, я не могу.
Так удалите драйверы для любого из устройств (только полностью), и сразу увидите.
Встречаю очень многие устройства (да по сути 100% в интересующей меня нише), у которых USB-выход и через этот выход идёт UART over USB. Причём, насколько я могу судить, он идёт прямо из микроконтроллера.
Выходит следующая схема: в микроконтроллере программируют код по переводу последовательности байтов в этот квази-стандартный протокол, который потом через USB отправляется на целевой компьютер. В целевом компьютере эти байты дешифровываются и ими пользуются.
Протокол там непростой и не тривиальный, тут, к примеру, есть неполная реализация этого протокола на Java для андроид.
При этом, опять же в 100% случаев поверх этого потокового протокола делают сообщения, с границами и прочим.
Насколько я понял, в "чистом" USB уже есть запросы и ответы. Единственный нюанс — хост всегда должен запрашивать девайс, но это в любом случае происходит.
Т.е. я просто не понимаю — зачем всё это усложнение, если можно выкинуть пару слоёв, кучу кода и работать с USB "напрямую". Для работы с USB, например в андроиде и в браузере есть API, а для UART в андроиде нет. Для нативного кода есть годами отлаженная libusb.
Я глубоко пока в это не погрузился, поэтому может чего не понимаю?
Здравствуйте, vsb, Вы писали:
vsb>зачем всё это усложнение
Затем же, зачем и I2C, TCP/IP и прочие протоколы — ради стандартизации. Есть хренова гора аппаратных интерфейсов на базе UART, есть хренова гора софта для работы с ним, а вот софта, работающего напрямую с USB, на порядки меньше.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>зачем всё это усложнение
ЕМ>Затем же, зачем и I2C, TCP/IP и прочие протоколы — ради стандартизации. Есть хренова гора аппаратных интерфейсов на базе UART, есть хренова гора софта для работы с ним, а вот софта, работающего напрямую с USB, на порядки меньше.
Речь о том, когда нет никаких аппаратных интерфейсов, обмен идёт от USB к USB. На устройстве USB и на компьютере USB.
Здравствуйте, vsb, Вы писали:
vsb>Речь о том, когда нет никаких аппаратных интерфейсов, обмен идёт от USB к USB.
Если это устройство, существующее в виде единственной модели, ни на что не похожее, и программа, работающая только в одной ОС, только с этим устройством, никуда не переносимая, и ни к чему другому не применимая, то, возможно, это делали из каких-то особых соображений.
Если же оно переносимо, допускает стыковку с разными типами хостов и т.п., то средства работы с UART в разных ОС для разного железа гораздо более схожи, чем средства работы с USB.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>Речь о том, когда нет никаких аппаратных интерфейсов, обмен идёт от USB к USB.
ЕМ>Если это устройство, существующее в виде единственной модели, ни на что не похожее, и программа, работающая только в одной ОС, только с этим устройством, никуда не переносимая, и ни к чему другому не применимая, то, возможно, это делали из каких-то особых соображений.
Это не одно устройство, это куча устройств схожего типа от разных производителей. Возможно часть этих устройств имела предыдущие версии без USB, тут не знаю. Программы от этих производителей единственные, только под Windows, никакой переносимости или стандартизации не предполагающие.
Здравствуйте, LuciferSaratov, Вы писали:
LS>Ну не совсем, где то может и делают так, но на то, чтобы полноценный usb потянуть, у слабых микроконтроллеров силёнок маловато.
Почему? Вот сейчас у меня довольно слабый МК STM32F103. Стоит меньше доллара оптом, насколько я знаю. 20 КБ SRAM, 64 КБ флеша. USB умеет.
Я, если что, говорю об устройствах, которые в рознице продаются за тысячи долларов. И там цена этого МК много роли не играет.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>Программы от этих производителей единственные, только под Windows
ЕМ>В Windows никогда не было родных высокоуровневых API для работы с USB — только универсальный DeviceIoControl для взаимодействия с любым драйвером ядра. Для устройств известных классов (HID, Mass Storage, Audio и т.п.) есть стандартные драйверы с известными интерфейсами, а все остальное требует собственных ядерных драйверов. Разработка ядерного драйвера под Windows, который будет работать эффективно, надежно, и никому не мешать — задача не совсем тривиальная, плюс с 2015-го действует жесткая политика подписывания.
Звучит странно. Как тогда браузер может с USB работать? Не припоминаю, чтобы хром какие-то драйверы мне устанавливал.
Здравствуйте, vsb, Вы писали:
vsb>Протокол там непростой и не тривиальный, тут, к примеру, есть неполная реализация этого протокола на Java для андроид.
Здравствуйте, cppguard, Вы писали:
vsb>>Протокол там непростой и не тривиальный, тут, к примеру, есть неполная реализация этого протокола на Java для андроид.
C>Linux умеет из коробки. Речь про Win/Mac?
Андроид не умеет из коробки. С Win там всё сложно, вообще код драйвера там идёт давным давно, но до последних версий чтобы его активировать, нужно специальный inf-файл установить. Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
Здравствуйте, vsb, Вы писали:
vsb>Андроид не умеет из коробки. С Win там всё сложно, вообще код драйвера там идёт давным давно, но до последних версий чтобы его активировать, нужно специальный inf-файл установить. Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
Здравствуйте, vsb, Вы писали:
vsb>сейчас у меня довольно слабый МК STM32F103.
"Слабый" он на фоне каких-нибудь ARM'ов для телефонов, а на фоне традиционных 8- и 16-разрядных контроллеров, которые преобладают в простых устройствах, он супермощный. Технология-то складывалась "для МК вообще", а не для их продвинутых представителей.
vsb>Я, если что, говорю об устройствах, которые в рознице продаются за тысячи долларов. И там цена этого МК много роли не играет.
Если есть готовая, наработанная технология и железо/софт под нее, и они решают имеющиеся задачи, то какой смысл использовать более сложные и затратные решения?
Здравствуйте, vsb, Вы писали:
vsb>Как тогда браузер может с USB работать?
Вот так просто взять и начать "работать с USB" — никак. Он может использовать WinUSB API, которое есть на уровне Win32, но и оно в общем случае требует поддержки от исполняющей системы языка. Из JS его можно полноценно использовать только при наличии поддержки в самом браузере.
vsb>Не припоминаю, чтобы хром какие-то драйверы мне устанавливал.
Да, есть такое, начиная с семерки (я давно за этим не следил). Но для того, чтобы winusb.sys начал обслуживать устройство, это устройство нужно установить при помощи INF-файла, о чем Вы упоминали. Для этого придется создать CAT-файл и как-то подписать его.
Здравствуйте, vsb, Вы писали:
vsb>до последних версий чтобы его активировать, нужно специальный inf-файл установить.
В любых нужно. Иначе откуда винда догадается, что к этому устройству нужно подключить именно winusb, а не другой драйвер?
vsb>Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
Какое именно устройство заработало? Такое возможно в двух случаях: устройство стало достаточно известным, чтобы MS включила его в стандартные списки, или в этой системе оно уже когда-то устанавливалось, и описание сохранилось.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
ЕМ>Какое именно устройство заработало? Такое возможно в двух случаях: устройство стало достаточно известным, чтобы MS включила его в стандартные списки, или в этой системе оно уже когда-то устанавливалось, и описание сохранилось.
Китайские переходники USB-UART заработали. Я думаю, что они уже давным давно достаточно известны, по крайней мере в линуксе и макоси с этим проблем не припомню.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>Как тогда браузер может с USB работать?
ЕМ>Вот так просто взять и начать "работать с USB" — никак.
Я делаю navigator.usb.requestDevice({filters:[]}) и оно мне показывает все USB-девайсы с возможностью подключиться к любому из них и работать на низком уровне без всяких драйверов.
Ок, девайса, под которого у меня в винде нет драйвера, под рукой сейчас нет, проверить, можно ли так работать вообще с любым девайсом, я не могу. Но API не подразумевает драйвера, там низкоуровневые USB-запросы и ответы.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>Я делаю navigator.usb.requestDevice({filters:[]}) и оно мне показывает все USB-девайсы с возможностью подключиться к любому из них и работать на низком уровне
ЕМ>На насколько низком? Асинхронный DMA зарядить можно?
При чём тут DMA? Можно сделать запрос к устройству и получить ответ. Я про протоколы. В протоколе USB нет никакого DMA.
ЕМ>Вообще, интерфейс к USB для браузера — это редкостное извращение с точки зрения программной иерархии. Это следствие явного дурдома, в котором браузер пытается подменить собой ОС.
Ну что поделаешь, если традиционные ОС для пользователей и программистов настолько неудобны, что даже браузер удобней.
ЕМ>Так удалите драйверы для любого из устройств (только полностью), и сразу увидите.
Здравствуйте, vsb, Вы писали:
vsb>При чём тут DMA? Можно сделать запрос к устройству и получить ответ.
Эти ответы можно получать асинхронно — тот же видеопоток? Или только то, что устройство может отдать на текущий момент?
vsb>Ну что поделаешь, если традиционные ОС для пользователей и программистов настолько неудобны, что даже браузер удобней.
Или программистам стало настолько лень изучать API ОС, что они добились его дублирования в браузерах...
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, vsb, Вы писали:
vsb>>до последних версий чтобы его активировать, нужно специальный inf-файл установить.
ЕМ>В любых нужно. Иначе откуда винда догадается, что к этому устройству нужно подключить именно winusb, а не другой драйвер?
vsb>>Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
ЕМ>Какое именно устройство заработало? Такое возможно в двух случаях: устройство стало достаточно известным, чтобы MS включила его в стандартные списки, или в этой системе оно уже когда-то устанавливалось, и описание сохранилось.
Собственно этот механизм нормально работает начиная с восьмерки, о которой уже все забыли. Должен был работать и в Win7, но M$ забыли одну строчку в winusb.inf...
По уму, конечно, не должно быть "WinUSB-совместимых" устройств, а должна быть возможность принудительно назначить устройству общий драйвер, а не только частный. Но уж как сделали, так сделали.
SIG>Должен был работать и в Win7, но M$ забыли одну строчку в winusb.inf...
Не строчку, а две секции, и не забыли, а явно оговорили, что этот INF они дают исключительно в качестве шаблона.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>При чём тут DMA? Можно сделать запрос к устройству и получить ответ. ЕМ>Эти ответы можно получать асинхронно — тот же видеопоток? Или только то, что устройство может отдать на текущий момент?
Здравствуйте, mike_rs, Вы писали:
_>для этого есть режим usb bulk transfer
Он есть в протоколах USB, его поддерживает WinUSB, но в обсуждаемом WebUSB я его не вижу. Там есть что-то про выполнение transferIn/transferOut "in parallel", но я недостаточно знаком с этой кухней, чтобы оценить степень параллелизма.