Информационные технологииStfw.Ru 🔍
🕛

Работа программы (или драйвера) с шиной USB

USB обеспечивает более высокий уровень протокола передачи данных, при написании программы (или драйвера) в большинстве случаев не следует заботиться о размере пакетов и порядке передачи данн
USB обеспечивает более высокий уровень протокола передачи данных, при написании программы (или драйвера) в большинстве случаев не следует заботиться о размере пакетов и порядке передачи данных.
Организуя потоковую передачу данных USB подсистема операционной системы берет большую часть этих забот на себя. Кроме того, в силу централизованности управления шиной со стороны хоста, при взаимодействии программного модуля с устройством возникает гораздо меньше неоднозначностей чем в случае FireWire. Шина USB компьютерно-ориентированная и поэтому воспринимается как несколько более удобная для программирования.


Типичный API, предоставляемый операционными системами позволяет получить список всех подключенных устройств и узнать для каждого из них VendorlD и ProductID и выбрать устройство для своей работы. Или во всяком случае (как например в Windows) программа, являющаяся драйвером может сообщить системе, что ее интересуют только устройства из списка возможных пар значений VendorlD и ProductID. Какой бы способ ни был реализован, так или иначе наша программа сможет получить уведомление о подключении или отключении интересующего ее устройства.
Дальнейшее представляется достаточно простым. Программа должна знать протокол работы устройства. Большая часть информации об устройстве может быть получена и большая часть настроек могут быть выполнены при помощи default endpoint номер 0 выбранного устройства.
Каждое устройство может иметь несколько конфигураций и информация о них так же может быть получена от устройства. В каждый момент времени активной является только одна из конфигураций.
Некоторые из устройств, подключенных к шине могут являться устройствами типа HUB и API позволяет программам обойдя все дерево устройств узнать точную топологию шины.
Каналы передачи isochron, async, interrupt с точки зрения языка программирования представляются потоками ввода или вывода. Пожалуй основным отличием каналов interrupt является то, что если прерывание не пришло в течении некоторого интервала времени поток, может перейти в состояние stalled.
Как правило программы или драйверы владеют устройством монопольно и используют каналы, предоставляемые устройствами по своему усмотрению. Рисунок (Каналы передачи и уровни реализации протокола USB)
Доступ к каналам может осуществляться как через обычные потоки, так и через
функции ioctl. Данные для каналов типа control как уже говорилось должны передаваться в виде пакетов определенного формата, кроме того каналы control являются двунаправленными. Так или или иначе данные для каждого канала всегда передаются и принимаются последовательно. Поэтому с точки зрения программирования USB предоставляет более удобный интерфейс чем Fire Wire, где вся процедура усложняется в силу того, что требуется производить запись и чтение массивов данных по разным адресам виртуального адресного пространства При этом результат в принципе может зависеть например от того, будет ли тот или иной участок памяти прочитан (или записан) за одну операцию чтения/записи или за несколько. Последнее требует достаточно строгого соблюдения протокола работы с самой шиной и с устройством. Для USB похожая ситуация может иметь мемто только для control в силу того, что пакеты должны иметь правильный размер и структуру. В случае посылки неправильных данных при работе с control ошибка может наступить по истечении таймаута в качестве значения которого спецификация определяет значение 5 секунд. Однако API для данной ОС (в частности) может позволять указывать другое значение этого таймаута для каждой конкретной операции работы с каналом типа control.
Множество медленных устройств (low speed, 1.5Mbit/sec) использует каналы control (и в частности default pipe 0) в качестве канала для изохронной передачи данных в одну или даже в обе стороны. Таковыми,например, являются электронный ключ Aladdin Etoken и устройство чтения записи чиповых карт ACR30U, которые упоминались во введении. Напомним, что low speed устройства могут использовать только interrupt и isochron каналы!
Ридер смарткарт ACR30U получает от хоста команды через канал типа control и возвращает через канал типа interrupt.
EToken - это криптографическое устройство, поддерживающее различные алгоритмы шифрования и электронной подписи (DES,RSA,DSA...) и представляет из себе объединенный в одном корпусе ридер и смарткарту. Кроме того, EToken может иметь внутри себя до 64 килобайт памяти, представленной файловой системой. Для передачи команд и ответов на команды используется исключительно канал default pipe 0 типа control. Поверх этого канала реализован протокол команд яиповых карт IS07816.
Исходные тексты программ и драйверов для работы с этими устройствами можно найти на сайте www.linuxnet.com.
Более подробно с работой чиповых карт и протоколом IS07816 можно ознакомиться в книге [3], [6] .
Стоит так же упомянуть о Web-камере Logitech QuickCam, о которой так же говорилось во введении. Камеры этого типа не используют изохронную передачу, как это обычно делается когда необходимо передавать видео в реальном времени, вместо этого используется передача типа bulk. Очевидно что на фактическую скорость передачи изображения может влиять текущая загруженность шины. Напомним что при
использовании изохронного канала передача изображения не сможет начаться если шина не сможет выделить для этого канала необходимую полосу пропускания! Драйвер для ОС Linux этой камеры так же доступен в Интернет в виде исходных текстов на сайте SourceForge.
Использование изохронной передачи в настоящее время более характерно для устройств IEEE 1394 чем для USB в силу того что шина Fire Wire изначально предназначалась для передачи видео. Как видно каждая шина имеет свою характерную специфику и поэтому вопреки ожиданиям экспертов USB и Fire Wire так и не стали конкурирующими стандартами. Шина USB наиболее дешевая и технологичная для применения с компьютером, в отличие от нее FireWire, будучи более сложной и дорогой, обладает разветвленной
интеллектуальностью. Вероятно именно поэтому характерно что обе шины встроенные в в компьютер в настоящее время встречаются восновном в достаточно дорогих нотбуках, которые одновременно являются как бы и носимыми устройстваи как и видеокамеры Sony, стоимость которых так же довольно высока. Тем не менее FireWire имеет в этом случае и чисто компьютерное применение, такое как работа с внешними дисками и TCP/IP сеть
поверх протоколов IEEE 13 94.
Существует еще один достатлчно широкий класс медленных USB устройств. Это так называемые HID устройства (HID расшифровывается как Human Interface Device). HID -это протокол, реализованный поверх USB, основной целью которго является формализация работы компьютера с устройствами ввода типа мышей джойстиков и.т.п., этот протокол имеет дело уже не с каналами предачи а с кнопками, расположенными на внешних устройствах. ОС Windows позволяет обращаться к HID устройствам не только драйверам, но и пользовательским программам, поУгому HID устройства легко могут быть использованы в качестве "тренажера" по использованию USB. В качестве более полной возможности ознакомится с работой USB можно рекомендовать API для Java в ОС Linux. 3 Существует два таких API (javax.usb и jUSB), каждое из которых позволяет полностью использовать все возможности шины по работе с устройствами. Подробную информацию о них можно найти в Интернете на сайтах SourceForge и java.sun.com.

Также по теме:
Новые программы для Windows, Linux и Android.