Сноб-потребитель и USB: ужас летящий на крыльях ночи

для раздела Блоги

Только сегодня!

Наш сноб-потребитель выступит в новой, сложной, но почетной роли "редизайнера USB".

Очень поучительно.

А ведь об этом я еще до выхода новой версии USB

говорил с господином окружным начальником!

Содержание.



1. Шина USB и ее потребительское развитие

2. Как именно надо было апгрейдить шину USB

2.1 ударить по программной несовместимости устройств

2.2 принципиальное разделение портов для простых и сложных устройств

3. Выводы
 

 

 


1. Шина USB и ее потребительское развитие.
Изначальные проблемы при постановке задачи при проектировании шины USB привели к тому, что
а) версии шины успевали устаревать раньше, чем появлялась аппаратура способная ее реализовать
б) для сложных устройств шина оказывалась слишком медленной и с недостатном питания, а для простых устройств слишком сложной, плюс программная несовместимость устройств
в) новые версии шины выходили с апгрейдом, который не учитывал новые требования аппаратуры и выявленные проблемы
Близорукий дизайн уже в первой версии значительно ограничивал возможности апгрейда, особено если учесть что корни шины уходят в 1990 год, когда шина ISA, схемы малой интеграции со штырьевыми выводами и ручной монтаж на двухстороннюю плату являлись основными действующими лицами.
Есть только одна функция, по которой к шине USB нет вопросов, которая является "шинообразующей" функцией и с решением которой проектировщики справились на отлично - это защита авторских прав путем введения программной несовместимости устройств, когда множество однотипных устройств требуют множества несовместимого кода, который делает одно и то же.
Спрашивается, неужели инженеры этого всего не понимают? Понимают, ну некоторые по крайней мере. Тогда как же такое могло произойти, почему открыв статью популярного издания специализирующегося на IT там не увидишь ничего, кроме нечто отдаленно напоминающее сериал "универ" с рекламными вставками? Во-первых, квалифицированные наемные работники любого вида теперь молчат в тряпочку даже сильнее, чем при диктатуре пролетариата, поскольку потратив уйму сил и времени на учебу (хорошо если бесплатно) не хотят оказаться на улице без работы из-за своей неуемной жажды редизайна, а хобби у них явно иное, например, рыбалка. Ну а во-вторых, в нашем низкоморальном обществе где непойманное воровство или лжесвидетельство, например, не сильно большое преступление, трудновато будет сделать что-то полезное, но.
Как же в принципе апгрейдить USB, чисто теоретически? Это весьма актуально, поскольку ведущие производители вычислительныхъ систем даже потомков "IBM-PC с открытой архитектурой" категорически отказываются эту архитектуру открывать и лепят цельнометаллические монолитные платформы, единственным маневром по конфигурации для которой есть внешняя шина USB и внутренняя шина PCI. Хотя для шины PCI характерны все те же проблемы, что и для USB, для PCI есть отдельные требования, а мы поговорим о внешней шине USB, потому как к внешней шине делают подключения просто почти все потребители.
Проблемы апгрейда USB только в недостатке доброй воли, можно даже ничего не изобретать, введя для USB традиционную схему построения внешних шин, которая применялась, как мне известно, уже в 1970-х годах. Как именно?


 


2. Как именно надо было апгрейдить шину USB?
 
1) Перво-наперво, надо ударить по программной несовместимости устройств.
Для этого каждое легальное устройство USB должно уметь работать в двух основных режимах:  

- в режиме совместимости (compatible)  

- в оригинальном режиме (native)

Устройство USB, которое не может работать в режиме совместимости надо считать нестандартным и покупатель вправе знать является ли приобретаемое USB устройство портируемым или нет.
Режим совместимости это в общем просто дерево типовых устройств, например:  

"принтер" - "принтер с возможностью задать параметры a,b,c..." - "язык EPSON"  

"мышь" - "мышь с n кнопками"  

"клавиатура" - "клавиатура стандартная ххх клавиш"  

"сетевой адаптер" - "сетевой адаптер с параметрами a,b,c..."  

"сетевой адаптер" - "P2P подключение USB-USB"  

и т.д.

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


2) Второй момент, это принципиальное разделение портов для простых и сложных устройств.
Почему? Потому что подключение простого устройства к порту RS-232 потребует от вас 3 цента, а подключение простого устройства к порту существующего USB от 3 до 15 долларов, в зависимости от функционала примитивного устройства. Сейчас ситуация стала лучше, но в конце 90-х (можете посмотреть архивы форумов) производители аппаратуры были в тупом недоумении почему они должны закупить компонентов на 10 долларов только чтобы реализовать подключение по протоколу USB и сколько тогда будет стоить итоговое устройство? Это все не считая затрат на написание уникального драйвера для каждого вида ОС.
"Я только хочу знать во что это выльется?" - как говорил известный финансист. Это можно, RS232-мышь стоившая 2-3 доллара для USB версии стоит 10-15. Точно такая же. Дело конечно не в мышах, хотя до смешного доходит, USB-коврик для мыши стоит дороже чем процессор или иной важный и сложный компонент компьютера.
Что самое интересное, такой сложный протокол, как у USB, оказался совершенно непригоден для сложных устройств, которым действительно нужен протокол такого типа, и пошли USB апгрейдиться уже до версии 3.


а) Порт для простого устройства.
Порт для простого устройства это порт P2P типа (только одно устройство), обмен по которому может осуществляться простыми манипуляциями уровней и простыми кодировками без применения процессорных компонентов, у которого есть питание режима сна и основное питание, есть сигналы пробуждения компьютера ото сна без питания хоста и перекоммутацию на котором можно производить в режиме сна без питания хоста, устройство на котором не требует обязательной инициализации от хоста.
Фактически, это RS-232 порт с измененными электрическими характеристиками. Для простого порта нет нужды ограничиваться идеей "только пары проводов", особенно с учетом 5 метровой дальности, "лишний" провод в соедининении может оказаться дешевле, чем более сложный контроллер протокола.
Все виды USB обмена (прерывание/блочный/изохронный) можно реализовать таким портом. Самый простой обмен "прерывание", для него надо меньше всего проводов.
Рассмотрим пример устройства USB порта, который я сделал совершенно бесплатно и более того, для особого подчеркивания своей идеи я при создании не использовал бумагу и не рисовал диаграммы состояния, все делал в уме (никому не советую, это очень удлинняет процесс даже для такой простой задачи, как протокол простого порта USB), итак, пример сигналов модернизированного USB (* обязательные сигналы):
отдельный разъем питания от хоста (у USB его нет)
gnd (земля)  

Va+12 (питание +12)  

Va-12 (питание -12)  

Va+5 (питание +5)

gndA (опционально, аналоговая земля)  

Va+24 (опционально, аналоговое питание -24)  

Va-24 (опционально, аналоговое питание +24)

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

экран

*gnd

*V (основное питание)  

VSB (опционально, если хост и устройство поддерживают спящий режим, питание не используется после подтверждения инициализации)

-группа данных/управления
data-/link (опционально, сигнал от устройства указывающий на подключение устройства в режиме "порт данных")  

data+/*dev (сигнал от устройства указывающий на подключение регулярного устройства)   

  link=*req (подтверждение от хоста на работу устройства по линии data в режиме dev)   

 
*dev=rdy (опционально, подтверждение от хоста на работу устройства по линии data в режиме link)   

 
link+dev=conf (опционально, подтверждение от устройства на сигнал хоста id)

дифф пара data используется для обмена данными, опционально (если дифпара не используется, то провода могут быть не витые)
если информация по команде req не передается никогда (сигнал от хоста req не обслуживается никогда, активен режим обмена "порт данных"), то вместо сигнала dev, подключенным устройством выдается сигнал link, снятие сигнала link расценивается как отключение устройства
установив link устройство готово получать даные от хоста по линиям data, когда хост разрешает устройству передавать данные по линиям data в режиме link хост подтверждает это сигналом rdy. В любой момент хост может снять сигнал rdy и начать сам передавать данные по линиям data в устройство выдавшее сигнал link. Интерпретация данных программная, идентификация устройства программная, режим полудуплексный аппаратно (направление передачи задается сигналом rdy).
устройство которое может передавать конфигурационную информацию о себе в хост и настраиваться от хоста (обычное устройство) при подключении активирует сигнал dev, снятие сигнала dev расценивается как отключение устройства. Интерпретация данных, идентификация устройства и режим передачи для dev устройства аппаратно - согласно конфигурационной информации.


-первая группа дополнительных данных/управления
add1-/*reinit (запрос от хоста на реинициализацию, эквивалентно механическому переподключению разъема, в ответ устройство выдает init)  

add1+/*init (запрос от dev устройства на инициализацию устройства, ответ хоста сигнал req)   

 
*reinit=link2/asc  

 
link2 (опционально, аналог link для add1 и add2 дифф каналов)   

 
asc (опционально, ответ от устройства на запрос хоста ctrl)   

 
*init=rdy2/ctrl  

rdy2 (опционально, аналог rdy для add1 и add2 дифф каналов)   

    
ctrl (опционально, запрос от хоста на управление устройством по линии data, ответ от устройства asc)



дифф пара add1 используется для увеличения пропускной способности в дополнение к data, опционально
для устройства типа link дополнительные дифф каналы данных add1 и add2 управляются эквивалентной парой сигналов link2-rdy2, это позволяет организовать дуплексный обмен, по каждой паре в своем направлении, а также использовать третью пару для создания двойного (разделенного) канала (разделенные данные/управление) что позволит не упаковывать данные в пакеты PPP или программно управлять конфигурацией устройства типа link по отдельной паре данных (разделенный канал может потребовать master/slave конфигурации).
если dev устройство выдало сигнал init, то оно ждет от хоста ответ req, после получения req устройство отправляет блок данных конфигурации по линиям data, после окончания передачи сбрасывает init и после того как устройство у хоста зарегистрированно, хост сбрасывает req. После этого устройство переходит в обычное состояние S0, режим инициализации по умолчанию, возможная необходимость доп. инициализации указана для хоста в блоке данных посланому по req. Устройство выдает сигнал init при механическом подключении к порту или при внутреннем сбросе, эквивалентном для хоста механическому переподключению.
если хост хочет сбросить dev устройство в исходное состояние и получит его идент хост выставляет сигнал reinit, когда устройство выполнило сброс оно выставляет сигнал init, после этого хост снимает reinit и обслуживает init от устройства.
если хост хочет управлять dev устройством, он может активировать сигнал ctrl при пассивных init+asc. Если устройство поддерживает такое управление оно выставляет сигнал asc, после чего хост выдает в устройство команду по линиям data и снимает ctrl, в ответ устройство снимает asc. Если в момент обмена происходит init, то asc сбрасвается, и хост снимает ctrl.


-вторая группа дополнительных данных/управления
add2-/resume (опционально, ответ от хоста при выходе хоста из сна по команде от устройства ring)  

add2+/ring (опционально, запрос от устройства на пробуждение хоста, ответ от хоста сигнал resume)   

 
ring=standby (опционально, запрос от хоста "приостановка устройства и готовность к отключению")   

 resume+standby=id (опционально, от хоста запрос текущей конфигурации)

дифф пара add2 используется для увеличения пропускной способности в дополнение к add1, опционально
Сигналы init/dev/link не могут разбудить обесточеный хост, для этого устройству надо использовать сигнал ring.
сигнал ring выдается устройством по своему внутреннему событию wakeup, если устройство поддерживает спящий режим, до инициализации dev устройства (init активен) либо в режиме сна (после команды от хоста standby) на проинициализированом dev устройстве (init пассивен) или link устройстве.
сигнал resume выдается хостом в ответ на сигнал ring, когда хост вышел из сна готов обслуживать устройство, при этом устройство снимает сигнал ring, а после этого хост снимает сигнал resume.
сигнал standby выдается хостом, если хост поддерживает спящий режим, для перевода устройства в состояние "приостановка устройства и готовность к отключению", пока standby активен устройство не может выполнить ring, когда хост ушел в сон и готов принять ring от снимает standby, если устройство поддерживает состояние сна оно уходит в него по сигналу standby, в нем устройство может генерировать сигнал ring по своим событиям wakeup.  
если устройство обслуживает resume и standby оно должно обнаруживать id. Составной сигнал id от хоста формируется как выдача хостом resume, а затем standby, снятие id в обратном порядке.
сигнал id выдается хостом на link устройство в любое время или на dev устройство до инициализации (init активен), если устройство поддерживает id, то оно сообщает об этом переводя в активное состояние пару link+dev=conf (поднимая дополнительный сигнал в паре link+dev), на паре init+reinit омбинация сигналов указывает на номер протокола обмена по каналу data, номер от 0 до 3. Если id не поддерживается, устройство передает данные по каналу data по протоколу 0. Обмен по каналам addХ для link устройств задается программно, для dev устройств это указано в конфигурации по req.
Когда хост снимает id, устройство снимает conf (переводит в пассивное состояние дополнительный сигнал в паре link+dev).


Итого:

для любого устройства обязательна поддержка таких сигналов  

link/rdy - порт данных (2 провода)  

или  

*dev/*req/*init/*reinit - регулярное устройство (4 провода)

для работы с режимом сна хоста для любого устройства обязательна поддержка таких сигналов  

ring/standby/resume/id/VSB (4 или 6 проводов + провод VSB)

максимум надо проводов - 10 штук  

6 сигнальных проводов по трем диффпарам,  

2 провода основного питания,  

1 провод питания режима сна,  

1 защитный экран

Для USB 3 мы имеем максимум 9 штук, что дороже - провод питания длинной до 5 метров или контроллер протокола USB 3.0?
У нас уровнями (и очень простыми схемами на устройстве) реализуются запросы на "идентификацию устройства", "инициализацию устройства", "пробуждение хоста", "приостановка устройства и готовность к отключению". Это выгодно для таких простых устройств как "порт данных" или "мышь".
Чем хороши такие порты? А сколько у вас хабов висит на USB? У меня только один, плюс один хаб в составном устройстве "клавиатура", который представляет собой стандартную клавиатуру и блок ее расширения (Клавиатуру совсем необязательно делать как составное USB устройство, например режимы native/compatible позволят реализвать такую клавиатуру как одно устройство).
Очень многие внешние устройства это P2P подключения, которые можно сделать очень дешевыми и очень надежными, столь же надежными как RS-232 порт. Сюда же входят и подключения двух компьютеров по кросс-кабелю USB. До смешного доходит, когда два рядом стоящих компьютера приходится соединять адаптером ethernet. Поблагодарите создателей USB за такую заботу о вас (а вы знаете что они вам ответят? - лично у них нет двух рядом стоящих компьютеров и они их никогда не видели в таком виде).


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


 


Выводы:

Конечно, предлагаемого апгрейда не произойдет, но потребители должны знать почему это не произошло и кто персонально нажился на их личных неприятностях, потому что прогнозировал недостаток в росте сбыта. Надо знать своих героев, они не должны скромничать. После героической победы над коммунизмом в 1990-х рекламная компания под названием "свобода, права человека и т.д." в мире явно была свернута и теперь все напоминает период до первой мировой войны, сплошные рыночные амбиции и грустное молчание.





Обсуждение на форуме.


Создано: 21.03.13

Последний раз отредактировано: 21.03.13

Ссылка на оригинал этой статьи.
Telegram-канал @overclockers_news - это удобный способ следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.
Оценитe материал

Возможно вас заинтересует

Популярные новости

Сейчас обсуждают