Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Драйвер USB с помощью Driver Studio - несколько Device Object
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Sevens
Возник такой вопрос, пишу драйвер для 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.
Sevens
Цитата(Седой @ Sep 17 2006, 14:05) *
Цитата
Возник такой вопрос, пишу драйвер для 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 не создать нормальный драйвер.
Sevens
Цитата(Седой @ Sep 17 2006, 20:23) *
Не обязательно использовать для чтения запрос read, используйте запросы ControlIo - один тип запроса для одной Endpoint.

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

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


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

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


Наверное не BuildBulkTransfer, а SubmitUrb.
Используйте асинхронную форму метода SubmitUrb.
jur
А так ли необходимо сразу именно драйвер писать? Ведь:

Цитата(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, то тогда я вылез не по делу... :-)
Седой
Цитата
А так ли необходимо сразу именно драйвер писать?


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

PS. Драйвер от Сypress удобен для этой задачи.
pitpg
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.

Кто-нибудь знает в чем причина?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.