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

Поддержка Fire Wire, USB различными платформами

Ни смотря на то, что в настоящее время USB устройства являются достсточно распространенными, поддержка их различными ОС несколько отставала от успехов производителей соответствующего железа.
Ни смотря на то, что в настоящее время USB устройства являются достсточно распространенными, поддержка их различными ОС несколько отставала от успехов производителей соответствующего "железа". Так, например, если возможность работать напрямую с собственным устройством, подключенным к последовательному порту RS232 при помощи стандартного компонента из программы Visual Basic или Delphi является весьма обычным делом, то это вряд ли можно сказать про USB, а тем более Fire Wire.
Существуют два осовных способа работы прикладной программы с USB/FireWire устройствами: первый - обращение к специализированным API драйверов верхнего уровня, которые обеспечивают доступ к абстрактному устройству (сканеру, принтеру, диску и.т.п.), скрывая при этом от программы детали, связанные с работой последовательной шины и второй способ, когда используется API нижнего уровня, предоставляющее доступ непосредственно к шине на уровне пакетов, каналов передачи, регистров CSR и.т.п.
Не все из ныне существующих ОС поддерживают второй способ, для таких систем приходится выбирать второй, означающий что для реализации "заветной мечты" электронщика увидеть как происходит передача данных из его устройства на микроконтроллере Atmel и USB чипе в настольный PC, ему придется писать специализированный драйвер и загружать его в ядро ОС! Неприятности этого пути очевидны:
1. требуется хорошее знание ядра и навыки написания драйверов
2. в случае ошибки можно не только "подвесить" систему, но и испортить содержимое диска
3. сложно вносить много мелких изменений, которые обычно необходимы при разработке собственного "железа"
Пожалуй единственной ОС, принципиально лишенной этих недостатков при использовании второго подхода, можно считать QNX [6]. В современных реализациях QNX драйверы работают в пространстве прикладных программ (user space). Если драйверы выполняются с правами суперпользователя, то им будут доступны все необходимые ресурсы. Вообще следует отметить, что QNX по-видимому обладает наиболее гибкой системой реализации драйверов по сравнению с другим распространенными ОС.
Но что делать если мы пока только лишь мечтаем об использовании подобных сверхгибких систем, что нам предлагают другие ОС, к которым мы уже привыкли, рассмотрим вкратце другие варианты:
Windows
ОС Windows как раз относится к тем системам в которых доступ пользовательских программ к USB/FireWire весьма ограничен. Пожалуй исключением является возможность использовать USB устройства типа HID. Прикладная программа, однако, может получить список всех устройств, подключенных к USB шине.
Возможность работы с HID все же позволяет организовать тестирование работы USB устройства "собственного производства", однако устройству придется реализовывать работу с протоколом HID (который будучи предназначенным для мышей, джойстиков, клавиатур может оказаться не совсем адекватным) и довольствоваться низкими скоростями передачи. Но все же это лучше чем ничего!
Другой альтернативой является написание собственного драйвера, в Интернет можно найти исходные тексты какого-либо драйвера USB устройства и приспособить его под свои задачи. Для этого понадобится Visual Studio .NET, а так же Microsoft SDK и DDK (Driver Developer's Kit). Пакет SDK можно бесплатно скачать сайта Microsoft, что же касается
DDK, то компакт диск содержащий его, Microsoft за небольшую плату высылает по почте всем желающим. Следует отметить что SDK должен соответствовать версии компилятора, а DDK должен так же соответствовать версии ОС. Для каждой из версий Windows98/2000/NT/XP придется делать свой вариант драйвера. Взятый за основу драйвер USB/Fire Wire устройства так же должен соответствовать всем перечисленным компонентам. Кроме того, потребуется еще соответствующая документация по kernel API. Если вы ставите перед собой задачу статьразработчиком драйверов для Windows - это безусловно ваш путь, но если вы занимаетесь разработкой устройств и пока не владеет всем этим, вам наверное следует выбрать другие пути. Можно начать с HID устройств, а можно еще попробовать другие ОС.
Исходя из всего вышесказанного естественным образом возникает следующая мысль: а нельзя ли сделать такой драйвер, чтобы он предоставлял прикладным программам возможность использовать USB или FireWire по своему усмотрению. Такие попытки существуют с разной степенью успешности и можно попытаться найти некоторые реализации драйверов в Интернет http://www.steelbrothers.ch/jusb/. Трудность состоит в том, что в Win32 драйверы строго привязаны KVendorlD и ProductID конкретного устройства. Поэтому наш специализированный драйвер должен будет при попытке прикладной программы создать в системе такую привязку. Последнее восновном сводится к занесению записи в системный реестр. Если нам интересно использовать драйвер для тестовых целей -эту привязку можно в принципе выполнить зараннее
вручную! К сожалению не все версии Windows позволяют сделать это без перезагрузки системы. Последнее так же может затруднить отладку подобного драйвера. И все же при большом желании это возможно, хотя вряд ли может быть рекомендовано для того, чтобы начать самостоятельно работать с USB устройствами. На SourceForge готовится к выходу версия реализации javax.usb API (JSR80, которая по-видимому тем или иным способом решит эту проблему http://cvs.sourceforge.net/viewcvs.py/iavax-usb/iavax-usb-ri-windows/ , javax.usb API создана восновном стараниями корпорации IBM, как одного из самых активных сторонников Java Community Process.
Linux
ОС Linux предлагает полный набор возможностей для использования доступа к USB и FireWire из прикладной программы. Кроме того, в исходных текстах системы и драйверов можно найти достаточное количество примеров с некоторым количеством комментариев.
Доступ программы к USB возможен при помощи так называемой USB File System (основные функции определены в файлах usb.h, usbdevicefs.h) при помощи IOCTL. В качестве примера можно например использовать программы для работы с USB ридером ACR или устройством Etoken (которые обсуждались выше), доступные на www.linuxnet.com. В качестве простого примера использования каждой USB функции можно рассматривать исходные тексты нативной библиотеки для JUSB (одного из известных API для Java, о котором пойдет речь чуть позднее).
Структуры IOCTL для работы пользовательской программы определены в файле /mr/include/linux/usbdevicebjs.h, соответственно константы в файле /usr/include/linux/usb.h. За информацией об использовании USB интерфейса Linux из драйверов отсылаем читателя к соответствующим руководствам по написанию модулей ядра. Файл usbdevicebys.h определяет множество структур, каждая из которых отвечает за IOCTL для соответствующей операции с шиной, на первый взгляд это может показаться достаточно сложно, в частности например для того, чтобы организовать потоковую передачу например через канал типа BULK или ISOCHRON, Кроме того, перед началом работы с устройством требуется выполнить еще несколько специальных IOCTL команд для того, чтобы затребовать соответствующий USB интерфейс. Для удобства имеет смысл скрыть все эти особенности
внутри специализированных оберточных классов на C++, Objective С или другом объектноориентированном языке. Все это довольно несложно сделать основываясь на вышеназванном примере из JUSB, к тому же проект JUSB предлагает готовый C++ интерфейс, дублирующий аналогичный интерфейс для Java.
Использование Fire Wire в Linux весьма аналогично использованию USB. Специальная библиотека Librawl394 предназначена для использования пользовательской программой, данная библиотека существенно упрощает использование команд IOCTL, предоставляя набор специализированных функций. Для использования этих функций нужно иметь достаточное представление о работе самой шины IEEE1394, мы надеемся что прочтение сего текста позволило читателю получить всю необходимую для этого информацию ;) Кроме того, к библиотеке прилагается описание ее API (которое так же должно быть понятно "посвященному в секреты FireWire") и несколько достаточно понятных примеров программ http://www.linuxl394.org/ , кроме того данная страница содержит краткое, но достаточно полезное описание самого стандарта FireWire.
Для доступа к USB и FireWire пользовательской программе потребуются права суперпользователя root. Если это ограничение покажется слишком обременительным, возможно переделать драйвер так, чтобы файлы, отвечающие за соответствующие устройства создавались с другими правами доступа нежели как доступные только root.
Во введении упоминалась WEB-камера Руго, это устройство вполне можно выбрать для первых экспериментов с драйверами FireWire устройств для Linux, дело в том, что работа с видеокамерой существенно проще чем с блочными устройствами типа внешних накопителей. Драйвер Linux для этого устройства достаточно простой для понимания, недостатком является более высокая цена камеры по сравнению с WEB-камерами USB. С другой стороны Руго является устройством более высокого класса чем большинство распространенных WEB-камер. Если в распоряжении имеются 2 компьютера с FireWire адаптерами, то можно попробовать и другие варианты: например FireWire TCP/IP сеть или даже просто запись/чтение через шину регистров при помощи одного компьютера в другом компьютере. Последнее впринципе достаточно несложно осуществить пользуясь библиотекой Hbrawl394.
Платформа Java.
Java в своих реализациях под существующие ОС использует нижележащее API системы, предоставляя лишь удобный хорошо документированный
объектноориентированный интерфейс программирования. Поэтому все ограничения ОС распространяются на соответствующие Java API. Тем не менее эти API могут быть использованы в качестве удобного средства, позволяющего сконцентрироваться на взаимодействии с устройством а не на особенностях программирования в данной платформе, для работы с USB устройствами в Linux.
В настоящее время существуют два стандартных API: GNU JUSB и JSR80 javax.usb. http://jusb.sourceforge.net/ http://sourceforge.net/proiects/iavax-usb/
В Linux доступ к USB устройствам осуществляется как к специальным файлам, , а поскольку при подсоединении эти файлы устройств возникают автоматически, необходимо чтобы текущий пользователь получил права на уровне разделения доступа, самый простой способ этого достичь - это использовать привелегии суперпользователя root для процесса, открывающего файл или же после подсоединения устройства изменить условия доступа к нему вручную. Пакет JUSB предлагает еще одно решение этой проблемы - запуск с правами root специализированной программы-демона JUSBD, тогда прикладная программа, соединившись по сети с JUSBD сможет получить доступ к USB, Кроме того эта прикладная
программа может выполняться на другом компьютере, в частности под Windows.
SUN Solaris
В ОС Solaris ситуация напоминает таковую в Windows, за тем лишь исключением, что исходные тексты ядра ОС могут быть доступны программисту, что может несколько облегчить задачу.

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