Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2021, 15:56   #1
vladfs
Новичок
Джуниор
 
Регистрация: 13.04.2021
Сообщений: 1
По умолчанию Работа с точкой Ep0 в режиме SetuppacketКоманды на

Добрый день!

Прошу у ГУФов помощи. Установил драйвер к контроллеру ардуино Atmega32u4
Контроллер определился в диспетчере устройств, как Atmega32U4. Выяснилось, что устройство может работать только в режиме DFU (обновления программ), через конечную точку EP0. Через EP0 оно работает и в режиме чтения дескрипторов (SetupPacket) и в режиме передачи данных. Не могу найти библиотеку по функциям Делфи, которые дают возможность хосту общаться с устройством . Ведь если я правильно понимаю, то точку EP0 необходимо командами перенастраивать из режима Control в режим Bulk (In, OUT). Если, кто поможет или приведет пример буду очень признателен.
П.С. Функции WriteFile и ReadFile не работают.

Последний раз редактировалось vladfs; 13.04.2021 в 15:57. Причина: тема
vladfs вне форума Ответить с цитированием
Старый 14.04.2021, 15:24   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,418
По умолчанию

Цитата:
Сообщение от vladfs Посмотреть сообщение
Ведь если я правильно понимаю, то точку EP0 необходимо командами перенастраивать из режима Control в режим Bulk (In, OUT).
Функция DeviceIoControl() с кодом IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_ CONNECTION может решить вопрос. Для начала, этой функцией и засылкой соответствующего пакета "Setup" нужно определить, какие вообще режимы поддерживает устройство и есть-ли среди них BULK. Режим Control присутствует всегда и вы его не сможете отключить - с его помощью контролёр посылает сервисные команды точке EP0 девайса. Однако помимо ЕР0, поддерживающее диалог устройство будет иметь ещё и точки ЕР1(In) и ЕР2(Out).

Проблема в том, что при помощи DeviceIoControl() запросы нужно отправлять не самому устройству, а хабу, к которому он подключён. Соответственно сначала нужно будет найти Handle этого хаба, и номер порта. Поэтому (чтобы сократить код) обычно функцией SetupDiEnumDeviceInfo() из системной библиотеки setupapi.dll находят имя нужно хаба, и подставляют его в заранее подготовленный шаблон, как в примере ниже (код asm):

Код:
.data
hubName    db  '\\?\'
hubStr     db  128 dup(0)
hubGuid    db  '#{f18a0e88-c30c-11d0-8815-00a0c906bed8}',0
То-есть имя хаба заканчивается GUID'ом (для всех хабов он одинаков).
Теперь можно открыть его обычной CreateFile() и получив Handle отправлять ему конфигурационные пакеты, и читать дескрипторы через DeviceIoControl() примерно так:

Код:
.code
start:  invoke  CreateFile,hubName, GENERIC_READ + GENERIC_WRITE,\
                                    FILE_SHARE_READ + FILE_SHARE_WRITE,\
                                    0,OPEN_EXISTING,0,0
        mov     [usbHndl],eax    ;//<------------------- Handle хаба

        mov     eax,[usbPort]    ;//<------------------- номер порта (узнать заранее)

;// Оформляем пакет Setup
        mov     [packet.ConnectionIndex],eax
        mov     [packet.SetupPacket.bRequest  ], GET_DESCRIPTOR
        mov     [packet.SetupPacket.wValueHigh], USB_DEVICE_DESCRIPTOR_TYPE
        mov     [packet.SetupPacket.wValueLow ], 0
        mov     [packet.SetupPacket.wIndex    ], 0
        mov     [packet.SetupPacket.wLenght   ], sizeof.USB_DEVICE_DESCRIPTOR

;// Читаем дескриптор "Device" устройства
        invoke  DeviceIoControl,[usbHndl],IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,\
                                packet, sizeof.USB_DESCRIPTOR_REQUEST,\
                                packet, sizeof.USB_DESCRIPTOR_REQUEST, retSize, 0
В результате получим дескриптор, из которого можно узнать, поддерживает-ли устройство режим Bulk/BOT. Если да, то таким-же макаром меняешь конфиг устройства при помощи записи пакета SET_CONFIG. Здесь можно ознакомиться с деталями: https://www.beyondlogic.org/usbnutshell/usb6.shtml
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с точкой в польской записи Motoka Общие вопросы Delphi 2 17.05.2015 17:38
Работа в графическом режиме Надюша808 Паскаль, Turbo Pascal, PascalABC.NET 0 16.05.2013 09:51
«Работа в графическом режиме» Антонова Евгения Паскаль, Turbo Pascal, PascalABC.NET 3 27.04.2010 09:33
Работа в графическом режиме adgam Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.04.2010 16:56

Реклама для незарегистрированных, регистрация на форуме