Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5-USB-исходник

.pdf
Скачиваний:
30
Добавлен:
03.05.2015
Размер:
393.59 Кб
Скачать

Рис 8 – Окно захвата пакетов, индикатор захвата Для анализа пакетов используется еще одна группа панелей

USBlyzer. Для вывода информации по определенному пакету,

достаточно выбрать его в таблице захвата.

На рис 9 показано окно «Request Summary», которое отображает краткую информацию о захваченном запросе, включает в том числе имя

IRP, URB, объект целевого устройства, статус операции для завершенных запросов и некоторой другой информации в зависимости от типа запроса и конкретных условий.

Рис 9 – Окно Request Summary

11

На панелях «URB Details», «IRP Details» выводятся структуры данных, связанные с IRP, IO_STACK_LOCATION и URB. Вывод осуществляется согласно положению структур в стеке. (Рис 10, 11)

Рис 10 – Окно «URB Details»

Рис 11 – Окно «URB Details»

USBlyzer также захватывает буфер данных, связанных с запросом,

если таковые имеются и передается устройству или от устройства.

12

Анализатор USB

трафик захватывает буфер передачи управления,

больших массивов

данных, прерывания и изохронных данных, а также

некоторых передач ввода/вывода пользовательского режима и режима ядра. На рис 12 показана панель вывода буфера данных.

Рис 12 – Окно «Raw Data»

2.Библиотека usb4java

usb4java является библиотекой классов Java, обеспечивающей средства доступа и обмена данными с USB устройствами. Она основана, в свою очередь, на библиотеке libusb 1.0 и использует

Java NIO буферы для информационного взаимодействия между libusb и Java.

Гарантированно поддерживаются следующие платформы: Linux (x86 32/64 bit, ARM 32 bit), OS X (x86 32/64 bit) и Windows (x86 32/64 bit).

usb4java включает два типа API: The high-level (javax-usb) API

(интерфейс прикладного программирования высокого уровня) и The

low-level (libusb) API (интерфейс прикладного программирования низкого уровня).

The high-level (javax-usb) API реализует интерфейс javaxusb(JSR80)API (http://javax-usb.sourceforge.net/). Несомненными

преимуществами являются независимость прикладного кода от

платформы и реализации интерфейса, а также его ориентированность на объекты, события и исключения. К сожалению спецификация была утверждена в 2001 г. и некоторые новые возможности, например, usb 3.0, могут не поддерживаться.

13

The low-level (libusb) API обеспечивает функциональность libusb.

Недостатком является отсутствие многих механизмов, привычных java

разработчиком, например, проброска исключений. Вместо этого библиотека в случае ошибки только возвращает ее код.

Интерфейс The low-level (libusb) API

Наименования свойств, методов, классов имеют аналоги C API libusb.

Все глобальные функции и константы libusb определены как статические члены класса org.usb4java.LibUsb. Все структуры libusb

определяются в отдельных классах, которые имеют названия, схожие с оригинальными именами этих структурe: убраны префикс ‘libusb’ и

подчеркивания, а также, каждое простое слово, в составе сложного начинается с заглавной буквы, например: структура libusb_device_handle (libusb) имеет в качестве аналога класс

DeviceHandle (usb4java libusb). Struct members are represented by static methods in the corresponding class.

Существуют следующие заметные отличия между libusb 1,0 API и usb4java API:

1.Интерфейс в дескрипторе конфигурации называется IFACE, потому что interface является зарезервированным словом в Java.

2. MaxPower в дескрипторе конфигурации

называется bMaxPower.

Таким образом это

имя совместимо со спецификацией USB и при

этом начинается со

строчной буквы, как

это принято в Java.

3.Всякий раз, когда libusb ожидает указатель байт и длину,

необходимо использовать Java NIO ByteBuffer.

4.Методы, которые возвращают строки через буфер байтов, имеют эквивалентный в Java метод, возвращающий строку напрямую.

Перед применением usb4java требуется инициализировать libusb.

Делается это следующим образом: Context context = new Context();

int result = LibUsb.init(context);

if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to initialize libusb.", result);

14

Указание контекста не является обязательным. Если для работы приложения требуется только один контекст libusb, то можно в качестве него указать NULL.

Перед закрытием приложения необходимо корректно завершить работу с libusb:

LibUsb.exit(context);

На следующем шаге, как правило, выполняется поиск usb

устройства, с которым будет работать программа. Для этого необходимо сформировать список подключенных устройств и убедиться,

что целевое устройство, однозначно определяемое идентификатором поставщика и идентификатором продукта, доступно:

public Device findDevice(short vendorId, short productId)

{

// Формируем список доступных usb устройств

DeviceList list = new DeviceList();

int result = LibUsb.getDeviceList(null, list);

if (result < 0) throw new LibUsbException("Невозможно получить список устройств", result);

try

{

// Проходим цикл по всем устройствам и ищем целевое

for (Device device: list)

{

DeviceDescriptor descriptor = new DeviceDescriptor();

result = LibUsb.getDeviceDescriptor(device,

descriptor);

if (result != LibUsb.SUCCESS) throw new LibUsbException("Невозможно прочитать дескриптор usb устройства", result);

15

if (descriptor.idVendor() == vendorId && descriptor.idProduct() == productId) return device;

}

}

finally

{

// Освобождаем список устройств

LibUsb.freeDeviceList(list, true);

}

// Устройство не найдено

return null;

}

3. Лабораторное задание и содержание отчета

Необходимо разработать свой USB-драйвер, расширяющий базовый

функционал USB-устройства.

Основные шаги работы:

1.С помощью USBlyzer определите основные параметры дескриптора выбранного устройства.

2.Выполните перехват USB пакетов, передаваемых при подключении USB устройства.

3.Выполните перехват USB пакетов, передаваемых при взаимодействии устройства с «родным» драйвером в штатном режиме.

4.Проанализируйте транзакции, в рамках которых выполняется

необходимое воздействие на устройство (управляющие

транзакции)

и/или транзакции, в рамках которых

осуществляется

прием

необходимых

данных

от

устройства.

 

 

 

 

 

5.

Реализуйте программу,

выполняющую поиск устройства по

 

PID и VID, формирующую необходимые транзакции и

 

обработку принятых

от устройства данных. В случае

16

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

6. Реализуйте программу с пользовательским интерфейсом для управления устройством посредством вашего драйвера.

Выбор конкретного устройств и реализуемый дополнительный функционал необходимо согласовать с преподавателем.

Отчет в общем случае должен содержать:

1.Точную формулировку задания.

2.Описание используемых параметров дескриптора, а также транзакций.

3.Содержательный алгоритм последовательности шагов при обмене данными с USB-устройством.

4.Результаты тестирования.

5.Краткие выводы по работе.

4.Контрольные вопросы

1.Что такое логическое и физическое USB-устройство?

2.Опишите основные типы передачи данных по шине USB. Как они влияют на приоритет, связанный с выделением программно-

аппаратного ресурса USB?

3.Какие типы идентификаторов применяются для организации канала передачи данных, что они включают?

4.Почему возможен перехват USB пакетов?

5.Для чего введены два типа пакетов данных Data0, Data1?

6.Как связаны между собой понятия конечной точки, конфигурации и интерфейса?

7. Опишите по шагам применяемый способ кодирования сигнала NRZI

bit staffing?

8.Существует ли связь скоростного режима USB (LS, FS, HS) c

ограничениями на размер пакетов?

9.Для чего используется пакет EOF?

17

5.Список используемой литературы

1.Агуров П.В. Интерфейс USB. Практика использования и программирования СПб.:БХВ-Петербург, 2005 ISBN 5-94157-202-6

2.Лапин А.А. Интерфейсы. Выбор и реализация. М.:Техносфера, 2005 ISBN 5-94836-058-X

3.Спецификация USB 2.0 // Compaq Hewlett-Packard Intel Lucent Microsoft NEC Philips // Revision 2.0 April 27, 2000 http://www.gaw.ru/pdf/interface/usb/usb_2.0_english.pdf

4.Don Anderson, USB System Architecture (USB 2.0) http://www.gaw.ru/pdf/interface/usb/USB%20System%20Architectur e%20(USB%202.0).pdf

18