Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/120: Рейтинг темы: голосов - 120, средняя оценка - 4.83
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160

Свой драйвер COM порта для USB устройства

19.12.2016, 19:22. Показов 26364. Ответов 128
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здрасте...
Хотелось бы услышать мнения профессионалов. В частности Убежденного видел много сообщений от него..
Итак. Есть устройство usb, в данный момент используется виндовый usbser, но говорят работает плохо.
Мне поставили задачу(я на первом своём испытательном сроке) написать драйвер для данного устройства. Драйвер должен эмулировать COM порт(основной приоритет), а также возможно как сетевое устройство или сырой обмен, можно все вместе.
Знания драйверов у меня на уровне хелловорлд. Английский очень плохо. Читаю Уолтер Они, Комиссарова, Агуров, USB in Nutshell.
Вопрос первый - реально ли с моими знаниями хорошо сделать это за 2 месяца?
Вопрос второй - направьте меня на путь истинный)) дельные советы дайте
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.12.2016, 19:22
Ответы с готовыми решениями:

Свой драйвер для устройства ...
Здравствуйте друзья. Мне очень интересна схематехника, но минус мой в том что я плохо ее знаю. А очень хочется сделать какую либо...

Возможно ли создать драйвер для usb-устройства на шарпе?
Создал usb-девайс, воткнул в компьютер, и в операционной системе windows в диспетчере устройств он отображается восклицательным знаком и,...

Драйвер USB устройства
Задача состоит в написании драйвера для флешки или USB мыши. Перечитал массу статей, начал читать книгу Уолтера Они. Пытаюсь собирать и...

128
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
09.02.2017, 10:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от VD Посмотреть сообщение
Хост вроде как опрашивает все устройства на шине.
Сам по себе хост ничего не опрашивает.
Цитата Сообщение от VD Посмотреть сообщение
Ну по идее он должен бы моему сообщить драйверу что есть данные для приема и я уже сигнализировать об этом приложению чтоб оно выдало запрос на чтение.
Нет, хост тебе сообщать ничего не будет. Ты сам должен это запросить у usb устройства. Вот как раз interrupt транзакции выполняются как бы в фоне. Если нет других задач, то хост их выполняет и ответ на них постоянно приходит. Вот, например, от клавиатуры приходит постоянно 8 байт: массив скан-кодов нажатых клавишей. Если ни одна клавиша не нажата, то придут нули, но ответы приходят всегда.

Добавлено через 1 минуту
Вроде есть открытая спецификация на cdc устройства. Если совсем у тебя тяжко будет, то может как-нибудь гляну.
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
15.02.2017, 19:44  [ТС]
Ну да спецификацию CDC я почти сразу скачал с usb.org только с английским туго. Не могу в ней найти о том где про com порт написано. Если бы кто то название раздела сказал который именно надо читать
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
17.02.2017, 15:45  [ТС]
Вопрос к знатокам стэка драйверов USB в Windows NT и к остальным!!!
1. КАК ДРАЙВЕР USB УЗНАЁТ О ТОМ ЧТО В УСТРОЙСТВЕ ЕСТЬ ДАННЫЕ ДЛЯ СЧИТЫВАНИЯ ?

Что бы выяснить я обложил usbser.sys (стандартный виртуальный com порт для usb от Microsoft) верхним и нижним фильтрами. Вот лог от них:
Кликните здесь для просмотра всего текста
Lower FILTER - DriverEntry: DriverObject 85C384A0
Upper FILTER - DriverEntry: DriverObject 85E0A040
Lower FILTER - Entering AddDevice: DriverObject 85C384A0, pdo 85C3DC40
Upper FILTER - Entering AddDevice: DriverObject 85E0A040, pdo 85C3DC40
Upper FILTER - IRP_MJ_PNP (IRP_MN_?????)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
Upper FILTER - IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
Upper FILTER - IRP_MJ_PNP (IRP_MN_START_DEVICE)
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
Upper FILTER - IRP_MJ_SYSTEM_CONTROL
Upper FILTER - IRP_MJ_SYSTEM_CONTROL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_SELECT_CONFIGURATION
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_CLASS_INTERFACE
UrbControlVendorClassRequest.TransferFla gs USBD_TRANSFER_DIRECTION_IN
UrbControlVendorClassRequest.TransferBuf ferLength 7
UrbControlVendorClassRequest.TransferBuf fer != NULL
30 4B FC
UrbControlVendorClassRequest.Request 21
UrbControlVendorClassRequest.Value 0
UrbControlVendorClassRequest.Index 0
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_CLASS_INTERFACE
UrbControlVendorClassRequest.TransferBuf ferLength 0
UrbControlVendorClassRequest.Request 22
UrbControlVendorClassRequest.Value 0
UrbControlVendorClassRequest.Index 0
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL /// <<--------------------------------------- Конечная точка bulk для записи в устройство
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL /// <<--------------------------------------- Конечная точка interrupt
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85D9DF84
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength A
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE)
Upper FILTER - IRP_MJ_PNP (IRP_MN_?????)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_TEXT)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_ID)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_INTERFACE)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_INTERFACE)
Upper FILTER - IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL
Lower FILTER - IRP_MJ_INTERNAL_DEVICE_CONTROL
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer.PipeHandleth 85E1B874
UrbBulkOrInterruptTransfer.TransferFlags USBD_TRANSFER_DIRECTION_IN
UrbBulkOrInterruptTransfer.TransferFlags USBD_SHORT_TRANSFER_OK
UrbBulkOrInterruptTransfer.TransferBuffe rLength 1000
UrbBulkOrInterruptTransfer.TransferBuffe r != NULL


Итак, я подключаю устройство и происходит загрузка драйвера. Сначала идут стандартные запросы получения дескрипторов, выбора конфигурации и некоторые настройки.
И ПОТОМ 2 ЗАПРОСА НА ЧТЕНИЕ И К ПРЕРЫВАЮЩЕЙ ТОЧКЕ ИЗ УСТРОЙСТВА(помечены стрелками), так он определяет можно читать или там пусто?? Потом то запросов нет к прерывающей точке.
И потом начинает вычитывать...и останавливается в какой то момент видимо пока не заполнится внутренний буфер.

И еще вопросец.
Цитата из книги Уолтера Они:
Устройства USB не генерируют асинхронные прерывания - они всегдна отвечают на вопрос. Полезно знать, что драйверы хостовых контроллеров Microsoft округляют интервал опроса, указанный в дескрипторе конечной точки...
Откуда следует что опрос ведет драйвер хоста. Вопрос вот в чем он ведет опрос постоянно или начинает только тогда когда поступает запрос на чтение например? И где про это читать понимаю что в msdn наверно, но не нашел что то.
Но может где на русском есть или на английском небольшая статья.

Добавлено через 1 час 19 минут
В общем то вроде об этом писал shmkv, но я сразу не въехал...
Вот как раз interrupt транзакции выполняются как бы в фоне.
Получается этот usbser.sys посылает запрос к прерывающей точке один раз, и не завершает его. Постоянно поддерживая активный запрос на чтение , многократно используя URB как написано у Они по прерывающим каналам?
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
17.02.2017, 16:11
VD, тебе ответы на interrupt транзакции должны приходить постоянно и независимо от того есть что нового на устройстве или нет. А вот как создавать и обрабатывать interrupt запросы в винде - это не ко мне.
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
17.02.2017, 16:26  [ТС]
Да как создавать я разберусь пример есть. Хотел просто понять правильно я понял или нет. Но походу по винде тут нет usb шников ((
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
17.02.2017, 16:33
Цитата Сообщение от VD Посмотреть сообщение
Хотел просто понять правильно я понял или нет.
Что конкретно? Физически interrupt транзакции устройству сыпятся постоянно и оно на них отвечает. Более того, на уровне драйвера хост-контроллера нужно правильно составить граф цепочек транзакций, чтобы не загрузить ими шину. Другое дело, что винда это делает сама и тебе скорее всего один раз достаточно отправить запрос и потом асинхронно будут сыпаться пакеты от устройства.
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
17.02.2017, 16:39  [ТС]
Другое дело, что винда это делает сама и тебе скорее всего один раз достаточно отправить запрос и потом асинхронно будут сыпаться пакеты от устройства.
Ну да винда сама это делает. Ну вот собственно это я и хотел выяснить. Скорее всего судя по логу так делает usbser.sys и мне надо делать также.
0
18.02.2017, 11:21

Не по теме:


Цитата Сообщение от VD Посмотреть сообщение
Но походу по винде тут нет usb шников ((
Программировать USB - ну его подальше.
Спецификация сильно переусложнена, даже просто для входа в тему придется изучать мануалы
на много страниц, а потом еще долго "въезжать" в особенности разработки под USB в Windows.
Я одно время пытался написать драйвер USB для одного простого устройства с тремя командами,
но когда понял, что вбухаю на это, как минимум, несколько месяцев работы, то плюнул и забыл.
А ведь USB хвалят, как удачное и универсальное решение. Вот только о "простоте" разработки забыли...

0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
18.02.2017, 12:24
Убежденный, я не согласен с тобой про сложностью. Очень сложно разрабатывать драйверы хост-контроллеров (что я делал), а вот самих устройств достаточно тривиально в большинстве случаев. Про Винду ничего ен скажу, возможно, что она вставляет палки в колеса.

Добавлено через 8 минут
Вот пример моей школьной поделки. Аналогичный (корректный) пример для PS/2 на порядок был бы длиннее.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
static int USBMouseInterrupt(BYTE *Package)
{
    MouseButtons = Package[0];
    MouseXCursorPosition += ((int)((signed char)Package[1])) << 1;
    MouseYCursorPosition += ((int)((signed char)Package[2])) << 1;
    //...
    return 1;
}
 
static void * USBInitMouse(USB_DEVICE *Device, USB_INTERFACE_DESCRIPTOR *Interface)
{
    USB_ENDPOINT_DESCRIPTOR *endp_ptr;
    DWORD cur_endp, endpt;
    void *p_buff;
    //USB_SETUP_PACKAGE usp;
    for(cur_endp = Interface->bNumEndpoints; cur_endp-- != 0; )
    {
        endp_ptr = &Interface->EndpointDescriptor[cur_endp];
        if( (endp_ptr->bmAttributes & 0x03) == 3)
        {
            if(endp_ptr->bEndpointAddress & 0x80)
            {
                endpt = endp_ptr->bEndpointAddress & 0x0F;
                p_buff = RealAlloc(64);
                USBSetInterruptHandler(Device, endpt, (_USBInterruptProcedure)&USBMouseInterrupt);
                /*usp.bmRequestType = 0x21;
                usp.bRequest = 0x0B;
                usp.wValue = 0;
                usp.wIndex = Interface->bInterfaceNumber;
                usp.wLength = 0;
                //printf("endpt = %d, intf = %d\n", endpt, Interface->bInterfaceNumber);
                Device->HostInterface->USBSendControlPackage(Device, &usp, 0);*/
                Device->HostInterface->USBSendInterruptPackage(Device, endpt, 0, p_buff, 0);
                if(MouseDriverEnable == 0)
                {   
                    InitMouseCursor();
                    MouseDriverEnable = 1;
                }
                return p_buff;
            }
        }
    }
    return 0;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.02.2017, 11:42
Цитата Сообщение от shmkv Посмотреть сообщение
Убежденный, я не согласен с тобой про сложность.
Понятие сложности у каждого свое.

Мне хотелось для начала понять, как работает USB на программном уровне и как эффективно
использовать возможности, которые он предоставляет. Когда оказалось, что для этого нужно
вникать в спецификацию на тысячу страниц (про книги Агурова я молчу), а затем еще постигать
многочисленные аспекты программирования USB в Windows (конфигурирование, PnP, управление
питанием, система установки), то я решил для себя, что никогда больше не хочу иметь дела с USB.
Пускай этим занимаются "аппаратчики", набивающие руку по двадцать лет на одном и том же
технологическом стеке. К формированию такой позиции подтолкнуло еще и то, что на вопросы,
связанные с программированием драйверов USB, которые чуть глубже тривиальных вещей, очень
трудно найти ответы в сети. Вот и VD уже застрял на USB-драйверах и висит на этой
теме уже два месяца. Пожелаем ему удачи.

А писать драйверы "вслепую", не понимая, как работает нижележащий слой, используя библиотеки
или чужой малопонятный эталонный код - это не наш метод.
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
19.02.2017, 12:37  [ТС]
Вишу я не из за сложности c usb, а из за сложности этой темы вообще. Синхронизация, очереди, отмена IRP, управление переходами PnP и все такое. Два месяца как ты и сказал оказалось мало, может еще надо 2 месяца
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
26.02.2017, 12:22  [ТС]
Кто подскажет как получить ассемблерный листинг в wdk 7600?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
26.02.2017, 20:09
Цитата Сообщение от VD Посмотреть сообщение
Кто подскажет как получить ассемблерный листинг в wdk 7600?
Ассемблерный листинг чего?
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
26.02.2017, 20:54  [ТС]
Моих творений которые на си, хочу посмотреть как это на асме выглядит
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
26.02.2017, 21:40
/FA, /Fa (Listing File)
https://msdn.microsoft.com/en-... y26c6.aspx

В WDK 7.1 можно добавить в файл sources такую строчку:
Code
1
USER_C_FLAGS = $(USER_C_FLAGS) /FAcs /Fa
Листинги будут с расширением .cod
1
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
02.03.2017, 10:19  [ТС]
Кажется в Windows есть какой то механизм который при ошибках не грузит новую версию драйвера. Вот допустим мой драйвер ошибся или еще чего. Ок, я его заменил в папке драйверов новым скомпилированным файлом. А винда все равно грузит не новый а тот который ошибся, пока не перегрузишься. Можно отключить как то
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.03.2017, 10:32
Чтобы загрузилась новая версия драйвера, сначала нужно выгрузить старую
(net stop mydriver - как пример). Для того, чтобы драйвер мог выгружаться по запросу, у
него должна быть реализована функция Unload (см. DRIVER_OBJECT->DriverUnload).

А PnP-драйверы выгружаются по сигналу IRP_MJ_PNP/IRP_MN_REMOVE_DEVICE,
когда удаляется соответствующий стек устройств.
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
02.03.2017, 11:12  [ТС]
Да нет это все понятно конечно. Я ж устройство отключаю, вижу сообщение что вызвано IRP_MN_REMOVE_DEVICE и unload. Меняю файл. Подключаю устройство - и загружен старый. Такое возникает время от времени. Если я ничего не путаю то это винда пытается защитится от кривых драйверов
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.03.2017, 14:31
Цитата Сообщение от VD Посмотреть сообщение
Если я ничего не путаю то это винда пытается защитится от кривых драйверов
Нет у Windows такой защиты и слава богу
Скорее всего, что-то неправильно делаешь. Может быть, остается ссылка
на один из объектов драйвера, поэтому он выгружается "не до конца".

Driver Verifier включи на максимум, лучше всего на Win8 или Win10
(все проверки, кроме эмуляции нехватки ресурсов) и смотри, выкинет он
что-нибудь при выгрузке драйвера или нет.
1
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
07.03.2017, 08:40  [ТС]
Кстати я неправильно интерпретировал тот лог, который выкладывал ранее. Стандартный драйвер кидает два запроса один к массовой точке для чтения а другой к прерывающей. Прерывающая так и не отвечает, так как используется для дополнительных нотификаций(вроде так в спецификации CDC указано) связанных со спецификой ком порта.
Меня же пока интересует только чтение и запись. То есть просто кидаем запрос нижнему драйверу к массовой точке для чтения. Когда на ней появятся данные он их прочитает и мы можем это узнать с помощью функции завершения.
Читая Они я составил алгоритм чтения какой в голову пришел. Через внутренний буфер и с использованием очереди ("наивные функции" из Они). Начал тестировать когда устройство отвечает эхом. Скорость чтения гораздо ниже записи. Вывод на экран идет со скоростью печати бабушки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2017, 08:40

Переводить команды USB WIFI Адаптера через компьютер по USB-USB для устройства
name: как передавать сигнал от требующего установку драйверов USB WIFI Адаптера через компьютер по USB-USB папа-папа кабелю для устройства...

USB-адаптер TL-WN727N: "Не удалось инициализировать драйвер этого устройства. (Код 37)"
Беспроводной сетевой USB-адаптер TL-WN727N. Все было нормально, пока не обновил 10-ку. Сейчас у меня Windows 10 Pro Insider Preveiw,...

Драйвер для COM-порта
Доброго времени суток. Подскажите нужен ли драйвер на порт RS232 под windos7? Зарание спасибо за ответ.

Драйвер-фильтр для COM порта
Всем привет и доброго времени суток! //Я надеюсь кто-нибудь сможет мне помочь Передо мной стоит задача создать драйвер-фильтр,...

Драйвер для устройства
Нужен срочно драйвер для этого устройства PCI\VEN_10EC&amp;DEV_8168&amp;SUBSYS_E0001458&amp;REV_02\4&amp;3A0400F3&amp;0&amp;00E1 помотрел понету немнго выяснил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru