реклама на сайте
подробности

 
 
> Драйвер USB с помощью Driver Studio - несколько Device Object
Sevens
сообщение Sep 16 2006, 22:07
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 5-08-06
Пользователь №: 19 337



Возник такой вопрос, пишу драйвер для USB устройства с помощью книги Агурова. Требуется несколько Device Object, чтобы читать с разных конечных точек, но не знаю, как это сделать. Пробовал так в методе NTSTATUS DV2::AddDevice(PDEVICE_OBJECT Pdo) класса KDriver создаю два экземпляра объекта KPnpDevice:

DV2Device * pDevice = new (
static_cast<PCWSTR>(KUnitizedName(L"DV2Device", m_Unit)),
FILE_DEVICE_UNKNOWN,
static_cast<PCWSTR>(KUnitizedName(L"DV2Device", m_Unit)),
0,
DO_BUFFERED_IO
)
DV2Device(Pdo, m_Unit,1);

if (pDevice == NULL)
{
return STATUS_INSUFFICIENT_RESOURCES;
}

NTSTATUS status = pDevice->ConstructorStatus();

if ( !NT_SUCCESS(status) )
{
delete pDevice;
}
else
{
m_Unit++;
DbgPrint("Unit Number is %d",m_Unit);
}



DV2Device * pDeviceEP = new (
static_cast<PCWSTR>(KUnitizedName(L"DV2DeviceT", m_UnitEP)),
FILE_DEVICE_UNKNOWN,
static_cast<PCWSTR>(KUnitizedName(L"DV2DeviceT", m_UnitEP)),
0,
DO_BUFFERED_IO
)
CandDV2Device(Pdo, m_UnitEP,2);

if (pDeviceEP == NULL)
{
return STATUS_INSUFFICIENT_RESOURCES;
}

status = pDeviceEP->ConstructorStatus();

if ( !NT_SUCCESS(status) )
{
delete pDeviceEP;
}
else
{
m_UnitEP++;
DbgPrint("Unit EP Number is %d",m_UnitEP);
}

В конструкторе класса kPNPDevice есть строки
status = m_Lower.Initialize(this, Pdo);

if (status == STATUS_SUCCESS){
DbgPrint("m_Lower.Initialize OK");
} else {
DbgPrint("ERROR: m_Lower.Initialize");
}
Для DV2Device все нормально, а для DV2DeviceT - ERROR: m_Lower.Initialize

И ещё, метод OnStartDevice вызывается только для DV2Device, а для DV2DeviceT - т.е. он видимо не инициализируется, так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Седой
сообщение Sep 17 2006, 16:23
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



Не обязательно использовать для чтения запрос read, используйте запросы ControlIo - один тип запроса для одной Endpoint.

Что вы понимаете под асинхронным чтением?

PS. Без чтения DDK не создать нормальный драйвер.

Сообщение отредактировал Седой - Sep 17 2006, 16:33
Go to the top of the page
 
+Quote Post
Sevens
сообщение Sep 17 2006, 16:54
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 5-08-06
Пользователь №: 19 337



Цитата(Седой @ Sep 17 2006, 20:23) *
Не обязательно использовать для чтения запрос read, используйте запросы ControlIo - один тип запроса для одной Endpoint.

Что вы понимаете под асинхронным чтением?

PS. Без чтения DDK не создать нормальный драйвер.


На счёт чтения DDK - согласен, просто требуется это не для серьёзной работы.

Под ассинхронным, то что после вызова BuildBulkTransfeк продолжение метода драйвера продолжается сразу, не зависимо от того, было ли произведено чтение или нет.
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 25 2006, 10:30
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



А так ли необходимо сразу именно драйвер писать? Ведь:

Цитата(Sevens @ Sep 17 2006, 16:19) *
2. Хочется читать с нескольких Endpoint'ов.
Никаких проблем с использованием сайпрессовской USB Developer's uStudio.

Сначала узнаёшь, сколько имеется девайсов:

num = USBDevice->DeviceCount();

Затем сканируешь девайсы (или открываешь прямо нужный девайс) и "выхватываешь" требуемые ендпойнты:

int epts = USBDevice->EndPointCount();
CCyUSBEndPoint *endpt;
for (int i=1; i<epts; i++) { // Skip endpoint 0, which we know is the Control Endpoint
endpt = USBDevice->EndPoints[i];
if (endpt->Attributes == 2) { // Bulk
if (endpt->Address == MY_STREAM1_ENDPOINT_ADDRESS) {
MyStream1InEndpt = endpt;
}
if (endpt->Address == MY_STREAM2_ENDPOINT_ADDRESS) {
MyStream2InEndpt = endpt;
}
}
}

Все это превосходно рассматривается в примерах (примеров, правда, не много, но достаточно).

Цитата(Sevens @ Sep 17 2006, 19:54) *
На счёт чтения DDK - согласен, просто требуется это не для серьёзной работы.
Изучение DDK, да еще и не имея опыта - тяжелое занятие. Тем более, что "не для серьёзной работы" :-) Тогда уж сам Бог велел применять сайпрессовскую USB Developer's uStudio. Уж удобнее их API трудновато что-нибудь найти.

Цитата(Sevens @ Sep 17 2006, 19:54) *
Под ассинхронным, то что после вызова BuildBulkTransfeк продолжение метода драйвера продолжается сразу, не зависимо от того, было ли произведено чтение или нет.
Я использую асинхронное чтение на скорости до 8 МБ/сек из одной эндпойнты и двунаправленный обмен управляющей информацией по двум другим ендпойнтам. Работает как часы (швейцарские). Использую функции BeginDataXfer / WaitForXfer / FinishDataXfer для быстрой передачи и простейшие:

USBDevice->BulkOutEndPt->XferData
USBDevice->BulkInEndPt->XferData

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

P.S. Правда, неясно, о какой микросхеме идет речь... Я говорил о сайпрессовской микросхеме.

P.P.S. Если речь идет о желании научиться писать именно драйверы для USB, то тогда я вылез не по делу... :-)


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016