STM32 и USB. Отправка данных с хоста

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

Всем привет. Недавно реализовал USB на STM32F103. По некоторым причинам пришлось быстро переброситься на STM32F4.
Создал на Кубе проект с custom HID device. Настроил. Написал репорт. Устройство определяется в системе. Но при попытке открыть
его с хоста (CreateFile), неизменно возвращается INVALID. Другие устройства открываются успешно (кроме мыши и
клавиатуры, что понятно по естественным причинам). Но свое открыть не могу. :(
Использую код.(кусок)

Код: Выделить всё

file = CreateFile ( wstr,
								GENERIC_READ   /*| GENERIC_WRITE */,
								0/*|FILE_SHARE_WRITE*/,
								0, // no SECURITY_ATTRIBUTES structure
								OPEN_EXISTING, // No special create flags
								FILE_FLAG_OVERLAPPED, // No special attributes
								NULL);

			if (file == INVALID_HANDLE_VALUE) {
					ShowMessage("Cannot Open");
			}
тут я и параметры менял и дескрипторы репортов разные ставил. Хоть бы что. Влез с головой в буржуйские
мануалы. Хоть начал больше понимать, как дескриптор репорта строится. Но.. проблема главная с CreateFile.
В какую сторону ткнуться, чтобы получить валидный handle устройства?? :dont_know:

Вот скрин моей программы. Полностью рабочая. Другие девайсы успешно открываются поэтому причина не на стороне хоста.
Изображение
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 и USB. Отправка данных с хоста

Сообщение Z_h_e »

Наверное у Вас путь к устройству wstr неверен .

Найдите в инете вот такую библиотечку hidlibrary.h. Очень удобная штучка. Спасибо ее создавшему. Она легко ищется. Просто я "свою" всю перепахал и где у меня оригинал я не знаю. Она правда работает с репортами типа Фьюч, но или добавите что нужно или тоже через фьючи работать будете. По крайней мере файл то откроете ей точно. Вообщем то представляет собой имена функций библиотеки HID.dll (не все) и простенькие функции.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: STM32 и USB. Отправка данных с хоста

Сообщение BorisSPB »

К выводу сообщения "Cannot Open" добавьте код ошибки GetLastError, может станет понятнее в чем дело...
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

Z_h_e писал(а):Наверное у Вас путь к устройству wstr неверен .

Найдите в инете вот такую библиотечку hidlibrary.h. Очень удобная штучка. Спасибо ее создавшему. Она легко ищется. Просто я "свою" всю перепахал и где у меня оригинал я не знаю. Она правда работает с репортами типа Фьюч, но или добавите что нужно или тоже через фьючи работать будете. По крайней мере файл то откроете ей точно. Вообщем то представляет собой имена функций библиотеки HID.dll (не все) и простенькие функции.
У меня HidD - функции работают некоторые. Ну а по поводу пути к устройству :dont_know: . Вроде всё верно. STM Link открывается. есть джойстик, и тот открывается, хотя запись фьючеров на него возвращается с ошибкой. По идее все пути должны быть верными (в одном же цикле устройства перечисляю).
А то без открытия устройства я даже прочесть пакеты не могу, хотя я точно знаю, что оно их отсылает (наблюдал через FDMS-сниффер). :solder:

Да, и класс интерфейса один и тот же. Но меня смущает немного поле адреса 00000000001A Оно ставится в проекте по умолчанию. Но у других устройств формат данного куска в строке пути совсем другой. :dont_know:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 и USB. Отправка данных с хоста

Сообщение Z_h_e »

Не знаю, может ли Вам пригодится такая информация, но вот путь по которому я подключаюсь к своему HID. Изображение А этот путь получен функцией GetDevicePath. Ну это все есть в той библитеке что я уже говорил.

Сначала пробовал подключиться безо всяких библиотек и читать данные методом ReadFile. Тоже вроде как получилось, но мне как то не понравилось. Примеры брал у Агурова (так что там смотрите тоже), но там на Паскале зачем-то. Пришлось переводить все.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

Z_h_e писал(а):Не знаю, может ли Вам пригодится такая информация, но вот путь по которому я подключаюсь к своему HID. Изображение А этот путь получен функцией GetDevicePath. Ну это все есть в той библитеке что я уже говорил.

Сначала пробовал подключиться безо всяких библиотек и читать данные методом ReadFile. Тоже вроде как получилось, но мне как то не понравилось. Примеры брал у Агурова (так что там смотрите тоже), но там на Паскале зачем-то. Пришлось переводить все.
Получилось соединиться. Но.. Каким образом читать данный с устройства. Какие события при этом возникают?? Вообще по документации по АПИ команд просто куча. Это и известные writefile и readfile и deviceIOcontrol и HidD.... Но все возвращают или ошибку. Или ноль.
К примеру, каждые 10 секунды HID девайс шлет мне байт данных.
Как его..поймать на хосте?? :dont_know:
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 и USB. Отправка данных с хоста

Сообщение Z_h_e »

Я сейчас уже точно не помню как читал с 1ой конечной точки. Читал ReadFileом. Размер данных будет на один байт больше, первый байт номер конечной точки. И отправлять так же. Опять же, если данных нет, то ридфайл там и зависнет до поступления данных.

http://radiokot.ru/forum/viewtopic.php? ... 2#p2745552

Я сейчас предполагаю что функция flag=HidD_GetInputReport(h,&buffer[0],11); не сработала потому, что на самом деле отправлялся некий запрос для 1 ой точки (buffer[0]=1, остальные 10 байт полезных данных) и работа по прерываниям в ней не требуется. Функция USB должна была обработать этот запрос. Так как я ничего этого не делал, программа проваливалась в HidD_GetInputReport на несколько секунд, а затем выдавала фальш. В этом я не уверен, но такая мысль пишла в голову потому, что так работает запрос Фьючей для 0 точки. Когда я с ними разобрался, подумал что можно попробовать так, но уже не проверял.

Я думаю стоит попробовать разобраться с этой функцией, т.к. она не подвешивает программу, если нет данных. Но мне вроде это уже не надо.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

Z_h_e писал(а):Я сейчас уже точно не помню как читал с 1ой конечной точки. Читал ReadFileом. Размер данных будет на один байт больше, первый байт номер конечной точки. И отправлять так же. Опять же, если данных нет, то ридфайл там и зависнет до поступления данных.

http://radiokot.ru/forum/viewtopic.php? ... 2#p2745552

Я сейчас предполагаю что функция flag=HidD_GetInputReport(h,&buffer[0],11); не сработала потому, что на самом деле отправлялся некий запрос для 1 ой точки (buffer[0]=1, остальные 10 байт полезных данных) и работа по прерываниям в ней не требуется. Функция USB должна была обработать этот запрос. Так как я ничего этого не делал, программа проваливалась в HidD_GetInputReport на несколько секунд, а затем выдавала фальш. В этом я не уверен, но такая мысль пишла в голову потому, что так работает запрос Фьючей для 0 точки. Когда я с ними разобрался, подумал что можно попробовать так, но уже не проверял.

Я думаю стоит попробовать разобраться с этой функцией, т.к. она не подвешивает программу, если нет данных. Но мне вроде это уже не надо.
не совсем понял.. Но, правильно, что ReadFile должен быть в непрерывном цикле?? Да, но тогда программа виснет, конечно. Чего-то я не понял. Данные от девайса идут по нажатии кнопки. Всего 4 байта (все 0x53). Вот код.

Код: Выделить всё

        DWORD BytesRead = 0;
	 char Report[8];
	 bool pr = false;
	  memset(&Report, 0, 8);
	  pr = ReadFile (filed,&Report[0],9,&BytesRead,0);
	  if (pr = true)
		   {
			if(Report[0]>1)
			{
			Form1->ListBox1->Items->Add("Read OK:");
			}

		   }
Да, само устройство откликается на команды записи и чтения замечательно. Но через утилиту STM HID Demonstrator.
Поэтому, очевидно, что-то не так у меня с кодом для прикладного софта.. :(
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

Вопрос еще появился по поводу OUT event.
Вот событие, куда попадаем при записи

Код: Выделить всё

static int8_t CUSTOM_HID_OutEvent_HS  (uint8_t event_idx, uint8_t state)
{ 
  USBD_CUSTOM_HID_HandleTypeDef     *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceHS.pClassData;  
 
  for (uint8_t i = 0; i < 9; i++)
  {
    USB_RX_Buffer[i] = hhid->Report_buf[i]; // To read usb data from PC
  }
	HAL_GPIO_WritePin(GPIOG,GPIO_PIN_13,GPIO_PIN_SET); //Green LED on
  HAL_Delay(2000);
	HAL_GPIO_WritePin(GPIOG,GPIO_PIN_13,GPIO_PIN_RESET); //Green LED off
  return (0);
  /* USER CODE END 10 */ 
}
Вроде, по идее светодиод должен погореть 2 секунды и погаснуть. Но этого не происходит. Почему?? Просграмма как-то странно висит в этой функции :dont_know:
Опять же. Это с STM HID Demonstrator. А вот со своей программой пока проблема что-то прочесть
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

На практике выяснилось, что такая команда как HidD_SetOutputReport не передает обычных данных (если так выразиться). Эта команда по умолчанию отправляет запросы через контрольную точку. И точка. Т.е. данная команда может отправлять команды типа - REQUEST.. (Например, получить дескриптор, установить адрес и т.п.)Вот так.. Для передачи и чтения полезных данных только writefile и readfile походу..
До сих бьюсь головой, почему не работает ReadFile. :facepalm:
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 и USB. Отправка данных с хоста

Сообщение Z_h_e »

Serg1987 писал(а):На практике выяснилось, что такая команда как HidD_SetOutputReport не передает обычных данных
Ну вот , по ходу как я и думал. Как только ваш МК примет запрос от нее, переведите эту же точку в состояние RX valid и наверняка тут же придет репорт для этой точки.

Вот у меня такой запрос приходит для нулевой точки, поди тот же ?
Спойлер

Код: Выделить всё

case 0x2109://пришле Фьюч Set Report (HidD_SetFeature от компа) От компа будут данные типа Фуча
                                                {

                                               FlagEventUSB=NadoPrinyatDannie; //будем ожидать еще данные
                                               Set_Status_EPR(0,Valid,RX);

                                               break;
                                                } //case 0x2109:
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

Z_h_e писал(а):
Serg1987 писал(а):На практике выяснилось, что такая команда как HidD_SetOutputReport не передает обычных данных
Ну вот , по ходу как я и думал. Как только ваш МК примет запрос от нее, переведите эту же точку в состояние RX valid и наверняка тут же придет репорт для этой точки.

Вот у меня такой запрос приходит для нулевой точки, поди тот же ?
Спойлер

Код: Выделить всё

case 0x2109://пришле Фьюч Set Report (HidD_SetFeature от компа) От компа будут данные типа Фуча
                                                {

                                               FlagEventUSB=NadoPrinyatDannie; //будем ожидать еще данные
                                               Set_Status_EPR(0,Valid,RX);

                                               break;
                                                } //case 0x2109:
Да, запрос похож.)

У меня запросы для нулевой точки хорошо работают и читаются. Для контроля и мониторинга шины USB я использую программку Free Device Monitor Studio. С контрольной точкой всё ок.
Но проблема в том, что есть ещё 2 точки типа Interrupt. И я не могу ничего им отправить или прочесть (ReadFile и WriteFile). И..!, я кажется понял почему. Оказывается, процедуру CreateFile надо повторять для каждой контрольной точки. Прочел на других форумах. А вот цитата от майкрософт (там пример для 3-х контрольных точек)
For this device, if you want to use interrupt endpoint 0, bulk IN endpoint 1, and bulk OUT endpoint 3, call CreateFile three times, specifying port names of "usbscan0\0", "usbscan0\1", and "usbscan0\3".
Сижу, разбираюсь :solder:
Вот ещё подобная проблема на зарубежном форуме
https://social.msdn.microsoft.com/Forum ... vclanguage

Но всё обошлось. Оказалось, вышеприведенные процедуры надо делать, если у нескольких точек одинаковый тип и одинаковое направление. А если тип одинаков, но одна OUT, а другая IN, то всё ОК.

Да, и ещё. Это не для обсуждения, хотя... Но может кому полезно будет. Вкуривал я недавно алгоритм инициализации USB через код, сформированный CUBE для custom HID на низком уровне. Вышло примерно вот так. Файл во вложении - Порядок инициализации Там есть неточности, правда в названиях операций. Например пункт 18 - там не отключение, а очистка масок прерываний. И.. судя по алгоритму, какая то странная там инициализация :shock: Во наворотили. :o Думаю, в случае оптимизации код уменьшится ощутимо. А файл Структура.txt - это отправилось случайно. А как с форума удалить не знаю. Не выходит.
Вложения
порядок инициализации.txt
(3.39 КБ) 233 скачивания
Структура.txt
(553 байт) 188 скачиваний
Последний раз редактировалось Serg1987 Пт июл 08, 2016 17:59:08, всего редактировалось 1 раз.
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: STM32 и USB. Отправка данных с хоста

Сообщение BorisSPB »

Чтобы все открывалось как надо, у устройства должны быть соответствующие дескрипторы, например такие:
Спойлер

Код: Выделить всё

/* Device Descriptor */
const USB_DEVICE_DESCRIPTOR device_dsc=
{
    0x12,    // Size of this descriptor in bytes
    USB_DESCRIPTOR_DEVICE,                // DEVICE descriptor type
    0x0200,                 // USB Spec Release Number in BCD format
    0x00,                   // Class Code
    0x00,                   // Subclass code
    0x00,                   // Protocol code
    USB_EP0_BUFF_SIZE,          // Max packet size for EP0, see usb_config.h
    0x04D8,                 // Vendor ID
    0x003F,                 // Product ID: Custom HID device demo
    0x0100,                 // Device release number in BCD format
    0x01,                   // Manufacturer string index
    0x02,                   // Product string index
    0x00,                   // Device serial number string index
    0x01                    // Number of possible configurations
};

/* Configuration 1 Descriptor */
const uint8_t configDescriptor1[]={
    /* Configuration Descriptor */
    0x09,//sizeof(USB_CFG_DSC),    // Size of this descriptor in bytes
    USB_DESCRIPTOR_CONFIGURATION,                // CONFIGURATION descriptor type
    0x29,0x00,            // Total length of data for this cfg
    1,                      // Number of interfaces in this cfg
    1,                      // Index value of this configuration
    0,                      // Configuration string index
    _DEFAULT | _SELF,               // Attributes, see usb_device.h
    50,                     // Max power consumption (2X mA)
							
    /* Interface Descriptor */
    0x09,//sizeof(USB_INTF_DSC),   // Size of this descriptor in bytes
    USB_DESCRIPTOR_INTERFACE,               // INTERFACE descriptor type
    0,                      // Interface Number
    0,                      // Alternate Setting Number
    2,                      // Number of endpoints in this intf
    HID_INTF,               // Class code
    0,     // Subclass code
    0,     // Protocol code
    0,                      // Interface string index

    /* HID Class-Specific Descriptor */
    0x09,//sizeof(USB_HID_DSC)+3,    // Size of this descriptor in bytes
    DSC_HID,                // HID descriptor type
    0x11,0x01,                 // HID Spec Release Number in BCD format (1.11)
    0x00,                   // Country Code (0x00 for Not supported)
    HID_NUM_OF_DSC,         // Number of class descriptors, see usbcfg.h
    DSC_RPT,                // Report descriptor type
    HID_RPT01_SIZE,0x00,//sizeof(hid_rpt01),      // Size of the report descriptor
    
    /* Endpoint Descriptor */
    0x07,/*sizeof(USB_EP_DSC)*/
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
    CUSTOM_DEVICE_HID_EP | _EP_IN,                   //EndpointAddress
    _INTERRUPT,                       //Attributes
    0x40,0x00,                  //size
    0x01,                        //Interval

    /* Endpoint Descriptor */
    0x07,/*sizeof(USB_EP_DSC)*/
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
    CUSTOM_DEVICE_HID_EP | _EP_OUT,                   //EndpointAddress
    _INTERRUPT,                       //Attributes
    0x40,0x00,                  //size
    0x01                        //Interval
};
У HID устройства не может быть bulk эндпойнтов, вот цитата из Википедии:
Each USB HID interface communicates with the host using either a control pipe or an interrupt pipe. Isochronous and bulk pipes are not used in HID class devices. Both IN and OUT control transfers are required for enumeration; only an IN interrupt transfer is required for HID reports. OUT interrupt transfers are optional in HID-class devices.
Единственной особенностью не понятной для меня является то, что если у конечной точки интерфейса размер пакета, скажем 64 байта, WriteFile должен получить 65 байт, нулевой байт должен быть равен нулю. То же самое и с ReadFile: читаем в буфер 65 байт, принятые данные начинаются не с нулевого, а с первого индекса. Формат пакета произвольный. И не требуется никаких фича репортов.
Путь к устройству анализирует ОС и драйвер устройства, если драйвер не поддерживает обращения к отдельному пайпу, значит и CreateFile не сработает.
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

Итак, опять здравствуйте, коты.
Вкурил я эту тему, так что слушайте да ешьте.
Итак.. Если в созданном нами устройстве несколько конечных точек одного типа (например
2 точки Interrupt OUT), тогда при вызове функции CreateFile система откроет только 2 точки: контрольную (нулевую)
и одну из Interrupt точек. Но.. Из 2-х откроется одна interrupt-точка, адрес которой выше.
Получается, если у нас 2 точки Interrupt OUT (одинаковость направления тоже обязательна)
одна с адресом 0x02 а вторая 0x80, то откроется та, у которой адрес 0x80.
Точка с адресом 0x02 останется недоступной. Повторюсь, одинаковость направления тоже важна!!!
А не только тип..


Итак, имеем один CONTROL и несколько!! INTERRUPT OUT
Для того, чтобы в нашем примере открыть все точки как полагается, то предстоит сложная работа/ :?
1.Вызываем функцию DeviceIoControl, проставляем необходимые аргументы.
Тут я буду без подробностей. Только скажу, что обязательно включите в проект 2 хидера,
которые идут с поставкой Windows WDK: <devioctl.h> <Usbscan.h> Пути к ним найдете..)
2. Одним из аргументов этой функции будет ссылка на структуру USBSCAN_PIPE_CONFIGURATION
Из этой структуры выуживаем :hunger: параметр NumberOfPipes (это число наших точек). Необязательно,
но интересно, для проверки. Но тут нас интересует второй параметр - ссылка на структуру USBSCAN_PIPE_INFORMATION
3. Из структуры USBSCAN_PIPE_INFORMATION для конкретной системной точки
(параметр PipeInfo[нужный номер] из USBSCAN_PIPE_CONFIGURATION)удим параметр EndpointAddress.
Это и есть наш системный адрес для контрольной точки. Внимание, данный адрес не совпадает с тем адресом,
который имеется в микроконтроллере.
Таким образом находим адреса для всех контрольных точек.
4.Теперь адрес полученной конечной точки добавляем к пути нашего устройства. Т.е. склеиваем строчки.
Допустим, при первом вызове CreateFile у нас будет путь path.
Тогда, чтобы открыть следующую конечную точку, путь должен быть - path\адрес конт.точки. (через слэш)

Повторяем CreateFile требуемое количество раз (сколько у нас точек) и всё. Теперь можем спокойно обращаться к данным точкам
через ReadFile и WriteFile.
Если количество всех точек по одной (например один контрол, один OUT и один IN) то хватит одного вызова
CreateFile.

И еще по аргументам CreateFile для HID девайсов. Третий аргумент, где пишется иногда FILE_SHARE_READ|FILE_SHARE_WRITE можно поставить ноль.
Флаг OVERLAPPED ставим 0. Иначе WriteFile работать не будет нормально.
Пока всё.

У меня получилось записать данные в МК. Пока проблема только с ReadFile. Он у меня при заходе в функцию
почему то виснет. Кто нибудь знает, отчего так..??? :dont_know:
Последний раз редактировалось Serg1987 Пт июл 08, 2016 17:51:30, всего редактировалось 11 раз.
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: STM32 и USB. Отправка данных с хоста

Сообщение BorisSPB »

Такое HID устройство с множеством эндпойнтов нормально открывается? Кроме INTERRUPT можно воткнуть BULK?
Адреса точек наверно необязательно выуживать через DeviceIoControl, ведь устройство наше, содержимое дескриптора интерфейса знаем, значит знаем адреса точек. Вот только адрес 0x80 - это CONTROL endpoint IN...
ReadFile ждет ответа от устройства.
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

BorisSPB писал(а):Такое HID устройство с множеством эндпойнтов нормально открывается? Кроме INTERRUPT можно воткнуть BULK?
Адреса точек наверно необязательно выуживать через DeviceIoControl, ведь устройство наше, содержимое дескриптора интерфейса знаем, значит знаем адреса точек. Вот только адрес 0x80 - это CONTROL endpoint IN...
ReadFile ждет ответа от устройства.
Да, кроме INTERRUPT можно ещё инициализировать BULK. В одном устройстве. Но это при условии, что устройство не HID, а полностью кастомное. На которое потребуются драйвера. Вот так.
А по поводу адресов эндпойнтов в дескрипторе интерфейса... Вы немного невнимательно читали. Я подправил предыдущий пост, чтобы было заметнее.
3. Из структуры USBSCAN_PIPE_INFORMATION для конкретной системной точки
(параметр PipeInfo[нужный номер] из USBSCAN_PIPE_CONFIGURATION)удим параметр EndpointAddress.
Это и есть наш системный адрес для контрольной точки. Внимание, данный адрес не совпадает с тем адресом,
который имеется в микроконтроллере.
Таким образом находим адреса для всех контрольных точек.
Так что, если у вас несколько эндпойнтов, они одного типа и одного направления, то без DeviceIOControl никак.. :?
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: STM32 и USB. Отправка данных с хоста

Сообщение BorisSPB »

Так с HID'ом то что? Можно ему насовать BULK эндпойнтов?
И еще вопрос по CreateFile. Если устройство кастомное, где искать путь к нему? Оно же будет висеть в неопознанных... Как получить HANDLE для DeviceIoControl?
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

BorisSPB писал(а):Так с HID'ом то что? Можно ему насовать BULK эндпойнтов?
И еще вопрос по CreateFile. Если устройство кастомное, где искать путь к нему? Оно же будет висеть в неопознанных... Как получить HANDLE для DeviceIoControl?
В HID bulk эндпойнты запихнуть нельзя. Только interrupt. Если устройство неопознанное, то путь к нему, увы, никак не найти.
Для того, чтобы воспользоваться командой CreateFile, система в первую очередь должна верно определить устройство.

Да, и учтите, такие HID устройства, как клавиатуру и мышь нельзя открыть с помощью CreateFile. Клаву и мышь Windows переводит в особый уникальный режим работы, блокируя доступ к ним. Но можно подключится к некоторым джойстикам и большинству геймпадов.

Вот недавно дописал программу обмена данными с HID устройством. Большая проблема была в том, что при установке в аргументах CreateFile поля FILE_FLAG_OVERLAPPED, переставала нормально работать команда WriteFile. И наоборот. Если overlapped поставить в ноль, тогда зависала команда ReadFile. Были ещё подвисания.
Выход был найден в создании многопоточного приложения. Я создал 2 потока. Один на запись, один на чтение. Тот, что на чтение -работает постоянно. Тот что на запись - приостановлен, и вызывается на время передачи данных от компьютера. После чего опять приостанавливается. Потестил, работает вроде без багов. :roll:
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

Re: STM32 и USB. Отправка данных с хоста

Сообщение Serg1987 »

И опять проблема. На этот раз с WriteFile. Пишу данные. Данные в МК приходят. Но.. они бьются уже внутри.
Отсылаю это:
Report[0]=2; //служебный байт (ID =2)
Report[1]=0x68;
Report[2]=0x65;
Report[3]=0x6c;
Report[4]=0x6f;
Report[5]=0x70;
Report[6]=0x64;
Report[7]=0x66;
Report[8]=0x63;

Все ок, приходит как надо, но потом происходит какая то хрень, и данные буфера меняются.
0x02
0x00
0x96
0x66
0x6f
0x70
0x64
0x66
0x00

Похоже на исходное. Особенно концовка. Но не то.. Кто сталкивался, не могу понять, что за глюк. :dont_know:
Ответить

Вернуться в «ARM»