Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблеммы с Usb драйвером. Помогите please !!!!!  (Прочитано 8960 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
AlexArt
Гость
« : 25-11-2005 10:54 » 

Привет, народ!!!
Есть свой Usb девайс, взял Numegu DriverStudio 3.2, визардом сгенерил проект объявил пайпы и прочее... Втыкаю драйвер а он дает ошибку на ActivateConfiguration. Причем GetDeviceDescriptor проходит на ура, а Preconfigure (т.е. запрос на CONFIGURATION_DESCRIPTOR) не проходит. Я и так и сяк, изучил чё там в numeg'овской библиотеке делается - все вроде провильно, те же SubmitUrb, но не работает. Причем ошибка выдается 0xc000009d типа Device not connected, а он коннектед и причем другой прогой писаной на WinDriver все считывает, по пайпам туда-сюда пакеты гоняет. Не пойму в чем прикол!!! Может я чё недоделал? иль может лишнего чего? Кстати, когда сгенерил проект, первое что бросилось в глаза так это баг при инициализации эндпоинта - визард воткнул адрес 81, а не 0х81. И мне подумалось, может он весь такой кривой да багнутый этот DriverStudio. Люди, помогите чем можете, а то спать не могу, всё в мозгу Irp да Urb туды-сюду носятся.  Так больше нельзя...
« Последнее редактирование: 15-12-2007 16:43 от Алексей1153++ » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 25-11-2005 11:39 » 

81 канал вместо 1 входного - все правильно... та же ерунда, когда для печально известной FTDI решил свой драйвер нумегой скомпилить.
видимо старший бит - вход/выход обозначает.
с первого раза не запустилась - как раз неправильно пайп указал. когда исправил - все тип-топ.
нумега - рулит...
все остальное пролетело на ура, дальше копаться не стал... увы, больше ничего сказать не могу.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexArt
Гость
« Ответ #2 : 29-11-2005 10:44 » 

Hi, народ!!!
А баг вот в чем был: Хреновая реализация драйвера USBD для запроса на  USB_CONFIGURATION_DESCRIPTOR. По  умолчанию ActivateConfiguration генерит URB запрос на 1024 байта, Usb спецификация определяет правило для такого запроса - больше иль меньше пришло - пофиг, ошибки не генерить отдать все наверх. Я в DDK глянул, как там в примерах делается - так там правильно делают - вначале считывают по sizeof (USB_CONFIGURATION_DESCRIPTOR), потом смотрют wTotalLength и затем финальное считывание нужной длинны. Так что подправил я Lib'ы DriverStudio и пока живу спокойно.
« Последнее редактирование: 15-12-2007 16:44 от Алексей1153++ » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 29-11-2005 11:39 » 

че та.... не надо грязи!!!!! :nottrue:)
Код:
    do
    {
        // we need to allocate an URB to talk
        // to usb bus driver
        urb = (PURB)ExAllocatePoolWithTag(
                        NonPagedPool,
                        sizeof(URB),
                        USB_FTDI_POOL_TAG
                        );

        if (urb == NULL)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        // first let's read device descriptor
        deviceDescriptor = (PUSB_DEVICE_DESCRIPTOR)ExAllocatePoolWithTag(
                                                    NonPagedPool,
                                                    sizeof(USB_DEVICE_DESCRIPTOR),
                                                    USB_FTDI_POOL_TAG
                                                    );
        if (deviceDescriptor == NULL)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        UsbBuildGetDescriptorRequest(
            urb,
            (USHORT)sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
            USB_DEVICE_DESCRIPTOR_TYPE,
            0,
            0,
            deviceDescriptor,
            NULL,
            sizeof(USB_DEVICE_DESCRIPTOR),
            NULL
            );

        status = usb_ftdiSubmitUrbSynch(DeviceExtension, urb);
        if (!NT_SUCCESS(status))
        {
            break;
        }

        // We have to read configuration descriptor twice.
        // First time to obtain its full length and second time
        // to read full configuration descriptor
        configDescriptor = (PUSB_CONFIGURATION_DESCRIPTOR)ExAllocatePoolWithTag(
                                                            NonPagedPool,
                                                            sizeof(USB_CONFIGURATION_DESCRIPTOR),
                                                            USB_FTDI_POOL_TAG
                                                            );

        if (configDescriptor == NULL)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        UsbBuildGetDescriptorRequest(
            urb,
            (USHORT)sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
            USB_CONFIGURATION_DESCRIPTOR_TYPE,
            0,
            0,
            configDescriptor,
            NULL,
            sizeof(USB_CONFIGURATION_DESCRIPTOR),
            NULL
            );

        status = usb_ftdiSubmitUrbSynch(DeviceExtension, urb);
        if (!NT_SUCCESS(status))
        {
            break;
        }

        size = configDescriptor->wTotalLength;
        ExFreePool(configDescriptor);

        configDescriptor = (PUSB_CONFIGURATION_DESCRIPTOR)ExAllocatePoolWithTag(
                                                            NonPagedPool,
                                                            size,
                                                            USB_FTDI_POOL_TAG
                                                            );

        if (configDescriptor == NULL)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        UsbBuildGetDescriptorRequest(
            urb,
            (USHORT)sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
            USB_CONFIGURATION_DESCRIPTOR_TYPE,
            0,
            0,
            configDescriptor,
            NULL,
            size,
            NULL
            );

        status = usb_ftdiSubmitUrbSynch(DeviceExtension, urb);
        if (!NT_SUCCESS(status))
        {
            break;
        }

        // now that we have configuration descriptor lets find our interface
        // and enable it
        numInterfaces = configDescriptor->bNumInterfaces;
        interfaceBuffer = interfaceList =
            (PUSBD_INTERFACE_LIST_ENTRY)ExAllocatePoolWithTag(
                                            NonPagedPool,
                                            sizeof(USBD_INTERFACE_LIST_ENTRY) * (numInterfaces + 1),
                                            USB_FTDI_POOL_TAG
                                            );

        if (interfaceBuffer == NULL)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        for (index = 0; index < numInterfaces; ++index)
        {
            interfaceDescriptor = USBD_ParseConfigurationDescriptorEx(
                                    configDescriptor,
                                    configDescriptor,
                                    index,
                                    0,
                                    -1,
                                    -1,
                                    -1
                                    );

            if (interfaceDescriptor != NULL)
            {
                interfaceList->InterfaceDescriptor = interfaceDescriptor;
                interfaceList->Interface = NULL;

                ++interfaceList;
            }
        }

        interfaceList->InterfaceDescriptor = NULL;
        interfaceList->Interface = NULL;

        ExFreePool(urb);
        urb = USBD_CreateConfigurationRequestEx(configDescriptor, interfaceBuffer);
        if (urb == NULL)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        interfaceInfo = &urb->UrbSelectConfiguration.Interface;

        // verify configuration
        interfaceDescriptor = interfaceBuffer->InterfaceDescriptor;
        if (interfaceDescriptor->bNumEndpoints != 2)
        {
            status = STATUS_DEVICE_CONFIGURATION_ERROR;
            break;
        }

        epDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)interfaceDescriptor;

        epDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)USBD_ParseDescriptors(
                                                    configDescriptor,
                                                    configDescriptor->wTotalLength,
                                                    epDescriptor,
                                                    USB_ENDPOINT_DESCRIPTOR_TYPE
                                                    );

        if ((epDescriptor == NULL) ||
            (epDescriptor->bEndpointAddress != 0x81) ||
            (epDescriptor->bmAttributes != USB_ENDPOINT_TYPE_BULK) ||
            (epDescriptor->wMaxPacketSize != 64))
        {
            status = STATUS_DEVICE_CONFIGURATION_ERROR;
            break;
        }
        else
        {
            interfaceInfo->Pipes[0].MaximumTransferSize = 4096;
            ++epDescriptor;
        }

        epDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)USBD_ParseDescriptors(
                                                    configDescriptor,
                                                    configDescriptor->wTotalLength,
                                                    epDescriptor,
                                                    USB_ENDPOINT_DESCRIPTOR_TYPE
                                                    );

        if ((epDescriptor == NULL) ||
            (epDescriptor->bEndpointAddress != 0x2) ||
            (epDescriptor->bmAttributes != USB_ENDPOINT_TYPE_BULK) ||
            (epDescriptor->wMaxPacketSize != 64))
        {
            status = STATUS_DEVICE_CONFIGURATION_ERROR;
            break;
        }
        else
        {
            interfaceInfo->Pipes[1].MaximumTransferSize = 4096;
            ++epDescriptor;
        }

        status = usb_ftdiSubmitUrbSynch(DeviceExtension, urb);
        if (!NT_SUCCESS(status))
        {
            break;
        }

        DeviceExtension->InterfaceInformation =
            (PUSBD_INTERFACE_INFORMATION)ExAllocatePoolWithTag(
                                            NonPagedPool,
                                            interfaceInfo->Length,
                                            USB_FTDI_POOL_TAG
                                            );

        if (DeviceExtension->InterfaceInformation == NULL)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        RtlCopyMemory(DeviceExtension->InterfaceInformation, interfaceInfo, interfaceInfo->Length);

        DeviceExtension->ConfigHandle = urb->UrbSelectConfiguration.ConfigurationHandle;
        DeviceExtension->ConfigDescriptor = configDescriptor;
        configDescriptor = NULL;
    }
    while (FALSE);
Кусок кода из нумуги  Молчу
« Последнее редактирование: 15-12-2007 16:44 от Алексей1153++ » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexArt
Гость
« Ответ #4 : 30-11-2005 09:20 » 

че та.... не надо грязи!!!!! :nottrue:)
...
Кусок кода из нумуги Молчу
Ангел Ну и незачем ножками топать...поискал я этот код поиском - ничё не выискал. Вроде Compuware DriverStudio 3.2 от Numega Labs, файл для kUsbLowerDevice там один - kusb.cpp, может я не то иль не всё установил  Молчу А может у тебя кака другая студия? 2005 года? откада взял? где качнуть? поделись линком
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 30-11-2005 11:03 » 

у меня версия 3.1

какие такие cpp?!?))))))
C:\NuMega\DriverWizard\Templates\Usb\UsbStartStopDevice.inc !!!

не используйте плюсы...  ненужное это дело ИМХО... я нумеговской генерилкой проектов начал пользоваться только тогда когда нумега наконец от своих идиотских классов оказалась. как раз с третьей кажется версии, или с 2.6-2.7?
а причина - следующая:
рассматривал несколько лет назад все выпущенные на тот момент генерилки... штук пять... и все они, за исключением помоему одной для VxD - использовали собственноручно написанные классы, + куций хелп по ним)
и суть - подменяли собственными классами базовые функции ядра - а это, на мой взгляд чистой воды идиотизм - изучать чужие классы, которые точь в точь повторяют ядровые функции майкрософта...ДЕТАЛЬНО описанные в ДДК...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines