Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Аппаратное обеспечение -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 133

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — БВХ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interfeysusbpraktikaispolzovaniya2004.djvu
Предыдущая << 1 .. 127 128 129 130 131 132 < 133 > 134 135 136 137 138 139 .. 168 >> Следующая

{
ATDriverDevice * pDevice = new (
static_cast<PCWSTR>(KUnitizedName(LnATDriverDevice", m_Unit)),
FILE_DEVICE_UNKNOWN,
static_cast<PCWSTR>(KUnitizedName(L"ATDriverDevice", m_Unit)),
0,
D0_BUFFERED_I0
)
ATDriverDevice(Pdo, m_Unit);
m_Unit++;
DbgPrint("Unit number is %d", m_Unit);
return status;
}
Собственно работа с устройством сосредоточена в методах класса
ATDriverDevice. Как мы описывали в разд. 14.2.1, в конструкторе этого
класса создаются экземпляры объектов драйвера нижнего уровня (m_Lower),
интерфейса (m interface) и конечной точки (m EndpointiiN). При
необходимости здесь же можно создать другие интерфейсы и конечные точки,
если они поддерживаются устройством. Листинг 14.5 показывает конструктор
класса нашего устройства (мы позволили себе сократить проверки для
повышения читабельности кода).
?1нс(tm),,г
ATDriverDevice::ATDriverDevice(PDEVICE_QBJECT Pdo, ULONG Unit) :
KPnpDevice(Pdo, NULL)
{
DbgPrint("ATDriverDevice::ATDriverDevice START");
NTSTATUS status;
DbgPrint("Unit number is %d", Unit); // Запомнить номер устройства m Unit
- Unit;
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
425
II Создание объекта драйвера нижнего уровня status =
m_Lower.Initialize(this, Pdo);
II Создание объекта интерфейса status = m_Interface.Initialize(
m_Lower, II Объект драйвера нижнего уровня
0, II Номер интерфейса
1, II Номер конфигурации
О II Номер альтернативного интерфейса
);
II Создание конечной точки
status = m_EndpointlIN.Initialize(m_Lower, 0x81 /* 8 */); II
Информирование драйвера нижнего уровня о создании II нового интерфейса
SetLowerDevice(bm_Lower);
II Инициалиазция политики РпР SetPnpPolicy();
>
Важно
По умолчанию конструктор конечной точки принимает три параметра:
указатель на объект драйвера нижнего уровня, номер конечной точки и
максимальный размер пакета. Последний параметр нужно самостоятельно
удалить из конструктора, т. к. размер пакета будет указываться при
создании IRP-пакета.
Следующий важный метод - onstartDevice, вызываемый при начале работы
устройства. Код этого метода показан в листинге 14.6. Если устройство
поддерживает несколько конфигураций, можно изменить номер активной
конфигурации.
миезхоттр:....................ГЖ"1
-¦¦¦гг:............¦¦...... ....................................
4СТИНГ 14.6. Метод ATDriverDevi"el"ri^"^^y?cp?.4%*ii^^eilf*
Янн______________ ... .. •*¦¦¦•
NTSTATUS ATDriverDevice::OnStartDevice(KIrp I)
1
NTSTATUS status = STATUSJJNSUCCESSFUL;
AC_STATUS acStatus = AC_SUCCESS;
I.Information() - 0;
II Активизация конфигурации 1 acStatus - m_Lower.ActivateConfiguration(
426
Часть IV. Создание USB-устройств
1 II Номер конфигурации ) ;
if (acStatus = AC_SUCCESS)
{
II Конфигурация установлена успешно status = STATUS_SUCCESS;
}
if (acStatus = AC_FAILED_TO_OPEN_PIPE_OBJECT)
(
П Конфигурация установлена, но созданных конечных II точек в ней не
существует status - STATUS_SOCCESS;
}
return status;
}
Все остальные методы, кроме метода чтения данных (Read) и обработчика
пользовательской функции (ATDRivER_iocTL_800_Handier), мы оставляем без
изменений. Метод Read мы разберем в следующем разделе, а метод
пользовательских функций мы уже рассматривали в разд. 9.3.5 и повторяться
не будем. Его можно использовать, например, для чтения строковых
дескрипторов или других целей.
14.2.6. Реализация чтения данных
Метод Read вызывается, когда пользовательское приложение вызывает функцию
ReadFile. Код, генерируемый по умолчанию, не производит никаких действий,
возвращая пакет нулевой длины.
Нашей задачей является создание пакета URB для организации чтения данных
с конечной точки m_EndpointiiN. Листинг 14.7 показывает реализацию метода
Read для чтения данных с конечной точки типа INTERRUPT.
, Read ДЛЯ КОН|^
4ки типа
NTSTATUS ATDriverDevice:;Read(KIrp I)
{
II Если запрошено 0 байт, то всегда возвращаем успех if (I.ReadSize() -=
0)
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
427
К
I.Information() - 0;
return I.PnpConqplete(this, STATUS_SUCCESS);
>
NTSTATUS status - STATUS_SUCCESS;
// Указатель на буфер для чтения данных PVOID pBuffer -
I.BufferedReadOestO;
// Число запрошенных для чтения байт ULONG dwTotalSize -
I.ReadSize(CURRENT);
// Будет сохранять число реально прочитанных байт ULONG dwBytesRead - 0;
Н Если конечная точка не активна, то чтение невозможно if
(!m_EndpointlIN.IsOpen())
I.Information() - 0;
return I. PnpCoraplete (this, STATUS_INSUFFICIENT_RESOURCES) ;
}
// Максимальное число байтов для выбранной конечной точки ULONG dwMaxSize
- m_EndpointlIN.MaximumTransferSize();
// Если запрошено больше, чем можно прочитать, то // ограничим запрос
максимальным размером if (dwTotalSize > dwMaxSize) dwTotalSize -
dwMaxSize;
// Создает запрос для чтения данных типа INTERRUPT
FURB pUrb = m_EndpointlIN.BuildInterruptTransfer( pBuffer, // Буфер
для чтения
dwTotalSize, // Сколько данных нужно прочитать TRUE // разрешаем
Предыдущая << 1 .. 127 128 129 130 131 132 < 133 > 134 135 136 137 138 139 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.