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

 
 
> 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
Ответов
esaulenka
сообщение Apr 10 2015, 12:02
Сообщение #2


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

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 11:17
Рейтинг@Mail.ru


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