Sevenfly 0 16 сентября, 2006 Опубликовано 16 сентября, 2006 · Жалоба Возник такой вопрос, пишу драйвер для 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 - т.е. он видимо не инициализируется, так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 17 сентября, 2006 Опубликовано 17 сентября, 2006 (изменено) · Жалоба Возник такой вопрос, пишу драйвер для 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. Изменено 17 сентября, 2006 пользователем Седой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sevenfly 0 17 сентября, 2006 Опубликовано 17 сентября, 2006 · Жалоба Возник такой вопрос, пишу драйвер для 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 Вы не пробовали осуществлять ассинхронное чтение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 17 сентября, 2006 Опубликовано 17 сентября, 2006 (изменено) · Жалоба Не обязательно использовать для чтения запрос read, используйте запросы ControlIo - один тип запроса для одной Endpoint. Что вы понимаете под асинхронным чтением? PS. Без чтения DDK не создать нормальный драйвер. Изменено 17 сентября, 2006 пользователем Седой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sevenfly 0 17 сентября, 2006 Опубликовано 17 сентября, 2006 · Жалоба Не обязательно использовать для чтения запрос read, используйте запросы ControlIo - один тип запроса для одной Endpoint. Что вы понимаете под асинхронным чтением? PS. Без чтения DDK не создать нормальный драйвер. На счёт чтения DDK - согласен, просто требуется это не для серьёзной работы. Под ассинхронным, то что после вызова BuildBulkTransfeк продолжение метода драйвера продолжается сразу, не зависимо от того, было ли произведено чтение или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 17 сентября, 2006 Опубликовано 17 сентября, 2006 · Жалоба Под ассинхронным, то что после вызова BuildBulkTransfeк продолжение метода драйвера продолжается сразу, не зависимо от того, было ли произведено чтение или нет. Наверное не BuildBulkTransfer, а SubmitUrb. Используйте асинхронную форму метода SubmitUrb. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 25 сентября, 2006 Опубликовано 25 сентября, 2006 · Жалоба А так ли необходимо сразу именно драйвер писать? Ведь: 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, то тогда я вылез не по делу... :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 29 сентября, 2006 Опубликовано 29 сентября, 2006 · Жалоба А так ли необходимо сразу именно драйвер писать? Можно и не писать, если есть готовый с документированным интерфейсом для устройства, а сделать только firmware в МК для этого драйвера. PS. Драйвер от Сypress удобен для этой задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pitpg 0 30 апреля, 2007 Опубликовано 30 апреля, 2007 · Жалоба 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. Кто-нибудь знает в чем причина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться