реклама на сайте
подробности

 
 
> Custom HID и stm32f105, Нужен драйвер
Still Enemy
сообщение Mar 19 2015, 07:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



В свете того, что я не справился(а помочь на этом форуме никто не смог) с re-connect VCP(plugged after unplugged), а проблему решать как то надо, сгенерировал код Custom HID в кубе. Ну собственно как обычно, работать это дело не стало: устройство в начале определяется нормально, а потом уже через секунду-две с ошибкой "Запуск этого устройства невозможен. (Код 10)". Обычный HID нормально определился без ошибок. Вопросы такие: где достать дрова? или под этот класс свои дрова писать надо будет?


Сообщение отредактировал Still Enemy - Mar 19 2015, 08:32
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Still Enemy
сообщение Mar 19 2015, 13:16
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Разобрался с одной проблемой, вылезла какая то другая. Нашел недоделку в коде от Куба: необходимо было допилить CUSTOM_HID_ReportDesc_FS - дескриптор репортов, что я собственно и сделал. Накидал туда цифр, для простейшего репорта (создавал с помощью HID Descripton Tool):
Код
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0xA1, 0x01,                    // COLLECTION (Application)
    0x85, 0x01,                    //   REPORT_ID (1)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x64,                    //   LOGICAL_MAXIMUM (100)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x91, 0x82,                    //   OUTPUT (Data,Var,Abs,Vol)
    
    0xc0                           // END_COLLECTION
  
};

Стало вот так определяться(мышь с кодом 10). Пока не пойму почему. Может кто поможет?


Сообщение отредактировал Still Enemy - Mar 19 2015, 13:19
Go to the top of the page
 
+Quote Post
Immortal_Buka
сообщение Apr 9 2015, 05:03
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969



попробуй в дескрипторе репорта
0x06, 0x00 ,0xff, // USAGE_PAGE (Vendor Defined Page 1)

Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 10 2015, 12:02
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Спасибо за подсказку.
Действительно, господа из ST в кубовском примере CustomHID потеряли report descriptor.

Подсунул следующее:
_
Код
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE       34

_ALIGN_BEGIN static const uint8_t Custom_HID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x95, 0x40,                    // REPORT_COUNT (64)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x95, 0x40,                    //   REPORT_COUNT (64)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
    0xc0                           //         END_COLLECTION
}


Также в USBD_HID_Setup() надо подправить запрос этого дескриптора:
Код
                case USB_REQ_GET_DESCRIPTOR:
                    if( req->wValue >> 8 == HID_REPORT_DESC)
                    {
                        len = MIN(sizeof(Custom_HID_ReportDesc) , req->wLength);
                        pbuf =  Custom_HID_ReportDesc;
                    }
                    else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
                    {
                        pbuf = USBD_HID_Desc;
                        len = MIN(sizeof(USBD_HID_Desc), req->wLength);
                    }


У меня, правда, и после всего этого он по-прежнему определялся мышкой - что-то где-то виндовс закэшировал. Не стал заморачиваться, просто увеличил PID (define USBD_PID_FS) на единичку.


Update.
Ещё надо увеличить
Код
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     64

и в USBD_HID_Setup() (или, скорее, USBD_CUSTOM_HID_Setup() ) дописать обработчик GET_REPORT. Простейший (эхо):
Код
                case HID_REQ_SET_REPORT:
                    hhid->IsReportAvailable = 1;
                    USBD_CtlPrepareRx (pdev, hhid->Report_buf, req->wLength);
                    break;

                case HID_REQ_GET_REPORT:
                    USBD_CtlSendData (pdev, hhid->Report_buf, req->wLength);
                    break;


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Apr 11 2015, 21:06
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Ну хоть кому то я помог)
Цитата(esaulenka @ Apr 10 2015, 15:02) *
Также в USBD_HID_Setup() надо подправить запрос этого дескриптора:

Я вот ничего не правил, у меня всё и так прокатило.
Цитата
У меня, правда, и после всего этого он по-прежнему определялся мышкой - что-то где-то виндовс закэшировал. Не стал заморачиваться, просто увеличил PID (define USBD_PID_FS) на единичку.

А я вот тут тупо нажал обновить драйвера устройства и винда у меня всё же додумалась перекинуть из устройства "мышь" в "hid составное устройство". Так и решил проблему. Винда оказывается определяет тип устройства HID именно по дескриптору репорта. Остальные дескрипторы при определении она игнорирует.
Цитата
...и в USBD_HID_Setup() (или, скорее, USBD_CUSTOM_HID_Setup() ) дописать обработчик GET_REPORT.

Или можно допилить в файле "usbd_custom_hid_if.c" функции USBD_CUSTOM_HID_SendReport_FS(она по непонятной мне причине была разработчиками закомментирована, я зря) и CUSTOM_HID_OutEvent_FS. С первой всё понятно - передал указатель и длину. Ко второй я прикрутил стек, в который по прерыванию от RxBufferNoEmpty(что то в этом роде) перекидываются полученные данные. Это как альтернатива)

P.S. А на самом деле с HID устройствами под STM32 не так всё сложно. Просто разработчики не особо замарачиваются насчёт документации. Местами при прочтении документации всплывала перед глазами картинка: "И так сойдёт" с пацаном на фоне из советского мульта)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016