Перейти к содержанию
    

Драйвер USB с помощью Driver Studio - несколько Device Object

Возник такой вопрос, пишу драйвер для 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 - т.е. он видимо не инициализируется, так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возник такой вопрос, пишу драйвер для USB устройства с помощью книги Агурова. Требуется несколько Device Object, чтобы читать с разных конечных точек, но не знаю, как это сделать.

 

1. Выкинуть Агурова. Читать DDK и Walter Oney http://club.shelek.com/download.php?id=9

2. Зачем несколько Device Object? Для одного PDO - один FDO.

3. В Driver Studio есть прекрасный Wizard для генерации кода драйвера, пользуйтесь.

4. Посмотрите пример EZUsb - полнофункциональный драйвер для USB чипов Cypress.

 

PS. Извините за резкость, но прежде чем писать код драйвера, не мешало бы понять - что такое драйвер в Windows.

Изменено пользователем Седой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возник такой вопрос, пишу драйвер для USB устройства с помощью книги Агурова. Требуется несколько Device Object, чтобы читать с разных конечных точек, но не знаю, как это сделать.

 

1. Выкинуть Агурова. Читать DDK и Walter Oney http://club.shelek.com/download.php?id=9

2. Зачем несколько Device Object? Для одного PDO - один FDO.

3. В Driver Studio есть прекрасный Wizard для генерации кода драйвера, пользуйтесь.

4. Посмотрите пример EZUsb - полнофункциональный драйвер для USB чипов Cypress.

 

PS. Извините за резкость, но прежде чем писать код драйвера, не мешало бы понять - что такое драйвер в Windows.

 

1.Выкинуть Агурова - вариант хороший, но нет много времени осваивать DDK

2.Хочется читать с нескольких Endpoint'ов.

3. Пользуемся, но получается, что функция read есть только одна, а конечных точек несколько.

4. Смотрим, пытаюсь создать ассинхронное чтение с конечной точки, пока вылетают BSOD, хотя вроде все сделал как в basicusb

 

Вы не пробовали осуществлять ассинхронное чтение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Изменено пользователем Седой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

Под ассинхронным, то что после вызова BuildBulkTransfeк продолжение метода драйвера продолжается сразу, не зависимо от того, было ли произведено чтение или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Под ассинхронным, то что после вызова BuildBulkTransfeк продолжение метода драйвера продолжается сразу, не зависимо от того, было ли произведено чтение или нет.

 

Наверное не BuildBulkTransfer, а SubmitUrb.

Используйте асинхронную форму метода SubmitUrb.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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;

if (endpt->Attributes == 2) { // Bulk

if (endpt->Address == MY_STREAM1_ENDPOINT_ADDRESS) {

MyStream1InEndpt = endpt;

}

if (endpt->Address == MY_STREAM2_ENDPOINT_ADDRESS) {

MyStream2InEndpt = endpt;

}

}

}

 

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

 

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

 

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

 

USBDevice->BulkOutEndPt->XferData

USBDevice->BulkInEndPt->XferData

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Можно и не писать, если есть готовый с документированным интерфейсом для устройства, а сделать только firmware в МК для этого драйвера.

 

PS. Драйвер от Сypress удобен для этой задачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C помощью Driver Studio Пытаюсь написать драйвер для обмена ПК с FT245BM.

Не отрываются конечные точки. Результатом выполнения

acStatus = m_Lower.ActivateConfiguration

оказывается

AC_FAILED_TO_OPEN_PIPE_OBJECT:

// NOTE: this may not be an error. It could mean that

// the device has an endpoint for which a KUsbPipe object has

// not been instanced. If the intention is to not use this endpoint,

// then it's likely not a problem.

 

Кто-нибудь знает в чем причина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...