- •Введение 5
- •1 Исследовательский раздел
- •1.1 Анализ существующих аналогичных систем
- •1.1.1 Обзор архитектуры устройств usb
- •1.2 Обоснование выбора программно-аппаратных средств
- •1.3 Постановка задачи
- •1.4 Развернутое техническое задание
- •1.4.1 Общие сведения
- •2.1.1 Основные дескрипторы usb драйвера
- •2.1.1.1 Дескриптор устройства
- •2.1.1.2 Дескриптор расширения устройства
- •2.1.1.3 Дескриптор конфигурации
- •2.1.1.4 Дескриптор интерфейса
- •2.1.1.5 Дескриптор конечной точки
- •2.2 Разработка функциональной схемы драйвера
- •2.2.1 Драйвер в иерархии wdm
- •2.2.2 Уровни обмена данными usb устройств
- •2.2.3 Архитектура системного драйвера usb
- •2.2.4 Основные рабочие процедуры драйвера
- •2.2.5 Управление перемещаемостью кода в драйвере
- •2.3 Разработка алгоритмического обеспечения
- •2.3.1 Инициализация драйвера
- •2.3.3 Обработка расширенных запросов ioctl
- •2.3.4 Поддержка запросов Plug and Play
- •2.3.5 Управление питанием
- •2.3.5.1 Обработка запросов irp_mj_power
- •2.3.6 Процедура деинициализации драйвера
- •2.4 Разработка программного обеспечения
- •2.4.1 Процедура DriverEntry
- •2.4.2 Процедура DriverUnload
- •2.4.3 Процедура AddDevice
- •2.4.4 Процедура передачи запроса usbd
- •2.4.5 Обработчики usbCreate и usbClose
- •2.4.6 Обработчик ConfigureDevice
- •2.4.7 Обработчики запросов на чтение и запись
- •3 Технологический раздел
- •3.1 Технология разработки драйверов для операционных систем семейства Windows
- •3.1.1 Архитектура Windows Driver Model
- •3.1.2 Выбор типа разрабатываемого драйвера
- •3.1.3 Разработка usb драйвера
- •3.2 Технология отладки драйверов в операционных системах семейства Windows
- •3.2.1 Основные отладочные тесты
- •3.2.2 Основные «проблемы», возникающие при отладке драйвера
- •3.2.2.1 Аппаратные проблемы
- •3.2.2.2 Программные проблемы
- •3.2.3 Основные отладчики и утилиты для проверки драйвера
- •3.2.3.1 Отладчик WinDbg
- •3.2.3.2 Driver Verifier
- •3.2.4 Общие приемы отладки драйвера
- •3.2.4.1 Установка фиксированных точек прерывания
- •3.2.4.2 Промежуточный вывод на экран
- •3.2.4.3 Сохранение отладочного кода в исходном тексте драйвера
- •3.2.4.4 Перехват некорректных условий
- •3.2.4.5 Обнаружение утечек памяти
- •3.2.5 Замечания по отладке драйверов
- •4 Безопасность жизнедеятельности
- •4.1 Анализ эргономических параметров рабочего места пользователя пэвм
- •4.1.1 Общие эргономические аспекты рабочего места
- •4.2 Организация рабочего места пользователя с учётом эргономических требований
- •4.2.1 Организация рабочего стола
- •4.2.2 Рабочее кресло
- •4.2.3 Работа с клавиатурой и мышью
- •4.2.4 Расположение и эргономические характеристики монитора
- •4.2.5 Внутренний объем
- •4.2.6 Рабочая поза пользователя пэвм
- •4.3 Экологическая оценка и переработка узлов компьютерной техники содержащих платину
- •4.3.1 Извлечение платины из отработанных катализаторов
- •4.3.2 Извлечение платины из радиооборудования и сплавов для электрических контактов
- •5 Экономический раздел
- •5.1 Планирование разработки драйвера с построением графика выполнения работ
- •5.1.1 Определение этапов и работ по созданию программного продукта
- •5.1.2 Расчет трудоемкости и продолжительности работ
- •5.1.3 Построение графика выполнения работ
- •5.2 Расчет затрат на разработку
- •5.3 Оценка экономической эффективности проекта
- •1 К исследовательскому разделу
- •2 К специальному разделу
- •3 К технологическому разделу
- •4 К разделу «Безопасность Жизнедеятельности»
- •5 К экономическому разделу
- •Приложение а Установка драйвера с помощью inf-файла
- •Приложение б Графические материалы
2.1.1.4 Дескриптор интерфейса
Стандартный дескриптор интерфейса (standard interface descriptor) содержит информацию об одном из интерфейсов, доступных при определенной конфигурации USB-устройства. Структура дескриптора интерфейса приведена ниже, а описание полей показано в таблице 2.5 [2.3].
typedef struct _USB_INTERFACE_DESCRIPTOR
{
UCHAR bLength;
UCHAR bDescriptorType;
UCHAR InterfaceNumber;
UCHAR bAlternateSetting;
UCHAR bNumEndpoints;
UCHAR bInterfaceClass;
UCHAR bInterfaceSubClass;
UCHAR bInterfaceProtocol;
UCHAR iInterface;
} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
Таблица 2.5 – Структура дескриптора интерфейса
Смещение поля данных, байт |
Наименование поля |
Размер, байт |
Описание |
0 |
bLength |
1 |
Размер дескриптора в байтах |
1 |
bDescriptorType |
1 |
Тип дескриптора (usb_interface_descriptor_type) |
2 |
bInterfaceNumber |
1 |
Номер данного интерфейса (нумеруются с 0) в наборе интерфейсов, поддерживаемых в данной конфигурации |
3 |
bAlternateSetting |
1 |
Альтернативный номер интерфейса |
4 |
bNumEndpoints |
1 |
Число конечных точек для этого интерфейса без учета нулевой конечной точки |
5 |
bInterfaceClass |
1 |
Код класса интерфейса |
6 |
bInterfaceSubClass |
1 |
Код подкласса интерфейса |
7 |
bInterfaceProtocol |
1 |
Код протокола |
8 |
iInterface |
1 |
Индекс дескриптора строки, описывающей интерфейс |
Размер дескриптора интерфейса всегда составляет 9 байт. При идентификации и нумерации USB-устройств на шине дескриптор интерфейса может использоваться для определения типа устройства по кодам класса, подкласса и протокола.
Дескриптор интерфейса возвращается USB-устройством при выполнении запроса GET_DESCRIPTOR и не может быть запрошен или установлен напрямую вызовами GET_ DESCRIPTOR или SET_ DESCRIPTOR.
USB-устройство может иметь альтернативный набор установок (alternate settings), что позволяет изменять настройки после конфигурирования. По умолчанию всегда устанавливаются обычные настройки интерфейса, а с помощью запроса SET_INTERFACE могут быть установлены альтернативные настройки или возвращены настройки по умолчанию.
Если интерфейс использует только нулевую конечную точку, то поле bNumEndpoints должно быть равно нулю.
2.1.1.5 Дескриптор конечной точки
Стандартный дескриптор конечной точки (standard endpoint descriptor) содержит информацию об одной из конечных точек, доступных при использовании определенного интерфейса. Структура дескриптора конечной точки показана в табл. 2.6 [2.3].
typedef struct _USB_ENDPOINT_DESCRIPTOR
{
UCHAR bLength;
UCHAR bDescriptorType;
UCHAR bEndpointAddress;
UCHAR bmAttributes;
USHORT wMaxPacketSize;
UCHAR bInterval;
} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
Таблица 2.6 – Структура дескриптора конечной точки
Смещение поля данных, байт |
Наименование поля |
Размер, байт |
Описание |
0 |
bLength |
1 |
Размер дескриптора в байтах (7 байт) |
1 |
bDescriptorType |
1 |
Тип дескриптора (usb_endpoint_descriptor_type) |
2 |
bEndpointAddress |
1 |
Код адреса конечной точки |
3 |
bmAttributes |
1 |
Атрибуты конечной точки |
4 |
wMaxPacketSize |
2 |
Максимальный размер пакета для конечной точки
|
6 |
bInterval |
1 |
Интервал опроса конечной точки при передаче данных (задается в миллисекундах) |
Код адреса bEndpointAddress и байт атрибутов bmAttributes для многих классов периферийных USB-устройств позволяет однозначно определить функциональное назначение конечной точки. Код адреса bEndpointAddress содержит следующие биты [2.3]:
[7 бит] направление передачи (игнорируется для каналов сообщений):
0 − OUT (от хоста);
1 − IN (к хосту);
[6-4 биты] зарезервированы и должны содержать нули;
[3-0 биты] номер конечной точки.
Байт атрибутов bmAttributes содержит следующие биты:
[7-6] зарезервированы и должны быть равны нулю;
[5-4] тип использования конечной точки:
00 — конечная точка (данные);
01 — конечная точка для явной обратной связи;
10 — конечная точка неявной обратной связи;
11 — зарезервировано;
[3-2] тип синхронизации:
00 — нет синхронизации;
01 — асинхронная;
10 — адаптивная;
11 — синхронная;
[1-0] тип конечной точки:
00 — канал сообщений;
01 — изохронный канал;
10 — канал передачи данных;
11 — канал прерываний.
Интервал опроса конечной точки (поле binterval) имеет значение только в том случае, если точка используется для передачи данных по прерываниям. Для изохронных конечных точек это поле всегда равно 1. Для остальных типов конечных точек значение этого поля игнорируется.
В HighSpeed-режиме для изохронных передач и прерываний биты 12 и 11 поля wMaxPacketSize определяют число транзакций внутри фрейма, определяемого значением поля bInterval [2.3].