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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Номер ID HID репорта, может ли быть нулевым?
IgorAVR2
сообщение Dec 25 2014, 05:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Стал использовать впервые USB контроллер в новых STM (до этого именно в STM не использовал) и столкнулся с проблемой совместимости с предыдущем устройством, сделанным на микроконтроллере от NXP. Дело в том, что в репорте HID устройства с USB библиотекой для STM не могу выставить номер ID репорта равным 0. Если ставлю, то устройство висит в диспетчере устройств как HID, но с восклицательным знаком, то есть Винде такое описание репорта сразу не нравиться. Любой другой номер пожалуйста, главное не 0.

Старое же моё аналогичное устройство сделанное на LPC1343, как выяснилось теперь, шлёт репорт, а главное писать в него можно, репорт у которого номер равен 0. В LPC1343 это было скрыто для разработчика и я в этот вопрос при разработке не вдавался.

Из-за этого не могу сделать новое устройство на микроконтроллере STM, что бы его поддерживал старый софт на PC.

Может ли этот номер быть нулевым и почему пример от ST не даёт этого сделать?
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 25 2014, 05:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(IgorAVR2 @ Dec 25 2014, 08:46) *
Может ли этот номер быть нулевым и почему пример от ST не даёт этого сделать?


Спецификацию читали?

Report ID zero is reserved and should not be used.
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Dec 25 2014, 06:05
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Цитата(SM @ Dec 25 2014, 08:55) *
Спецификацию читали?

Report ID zero is reserved and should not be used.


Нет, спецификацию не читал, оставил это последним путём, вот и хотел что бы ткнули носом на конкретную строчку, как это Вы и сделали.

Но тогда остаётся вопрос - почему старое устройство на микроконтроллере LPC1343 делало именно такие репорты и Винда это съедает? И не только Винда - iOS тоже замечательно работает с этим устройством.
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 25 2014, 06:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(IgorAVR2 @ Dec 25 2014, 09:05) *
Но тогда остаётся вопрос - почему старое устройство на микроконтроллере LPC1343 делало именно такие репорты и Винда это съедает?

Видимо (не знаю), оно туда само что-то не нулевое подставляло. Возьмите сниффер, да посмотрите, что там реально по шине шло.
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Dec 25 2014, 06:10
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Цитата(SM @ Dec 25 2014, 09:07) *
Видимо (не знаю), оно туда само что-то не нулевое подставляло. Возьмите сниффер, да посмотрите, что там реально по шине шло.

Так вот в том то и дело что в сниффере оттуда и идут репорты, с нулевым ID. И всё прекрасно работает. А главное, пишутся в него репорты ТОЛЬКО, если ID у них 0. С ненулевыми не пишутся!
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 25 2014, 06:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(IgorAVR2 @ Dec 25 2014, 09:10) *
Так вот в том то и дело что в сниффере оттуда и идут репорты, с нулевым ID. И всё прекрасно работает. А главное, пишутся в него репорты ТОЛЬКО, если ID у них 0. С ненулевыми не пишутся!

тогда сравните, что там при энумерации отдает LPC и STM. Чудес же не бывает, где-то разница будет обязательно. Восклицательный знак ведь тоже не с потолка взялся
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Dec 25 2014, 06:36
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Цитата(toweroff @ Dec 25 2014, 09:18) *
тогда сравните, что там при энумерации отдает LPC и STM. Чудес же не бывает, где-то разница будет обязательно. Восклицательный знак ведь тоже не с потолка взялся


А чем можно посмотреть на стадии энумерации, не посоветуете? Просто мой снифер, которым я пользуюсь, может только уже определившиеся устройства показывать.

Одно только уже для себя понял, что и пытался собственно выяснить - было сделано не правильно. Но почему работало: вопрос-загадка?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 25 2014, 07:27
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(IgorAVR2 @ Dec 25 2014, 09:36) *
А чем можно посмотреть на стадии энумерации, не посоветуете?

я пользуюсь USBTrace 2.6
под Win7 x64 нормально работает. Там можно захватывать непосредственно порт и смотреть все, что с ним происходит
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 25 2014, 08:33
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Насколько я помню, если устройство работает только с одиним-единственным рапортом, то можно его обявить таки образом, что ID не будет использоваться и на его месте можно передавать обычный байт посылки. Возможно именно так и было сделано в вашем первом варианте.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Dec 25 2014, 13:29
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Цитата(toweroff @ Dec 25 2014, 10:27) *
я пользуюсь USBTrace 2.6
под Win7 x64 нормально работает. Там можно захватывать непосредственно порт и смотреть все, что с ним происходит

Спасибо, буду пробовать!


Цитата(Сергей Борщ @ Dec 25 2014, 11:33) *
Насколько я помню, если устройство работает только с одиним-единственным рапортом, то можно его обявить таки образом, что ID не будет использоваться и на его месте можно передавать обычный байт посылки. Возможно именно так и было сделано в вашем первом варианте.


Если оно и принимало и отправляло данные, то я так понимаю что это уже два репорта?
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Jan 5 2015, 01:03
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Проблему, совместимости решил - по сути как и посоветовал toweroff, проснифирел на стадии инициализации описание самого HID репорта от старого устройства, которое там оказалось каким то хитрым, и тупо байт в байт скопировал его в новое устройство. Это позволило отправлять данные без указания ID репорта и у которых это ID при передаче равен 0.
USBTrace 2.6 - оказалась замечательной программой! Давно бы такую...

Всем спасибо!
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 5 2015, 05:41
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



А скопируйте сюда этот репорт, попробуем разобраться
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Jan 7 2015, 01:12
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Цитата(toweroff @ Jan 5 2015, 08:41) *
А скопируйте сюда этот репорт, попробуем разобраться


Как правило байтики идут парами, но не всегда, опять же какой то там бит за это отвечает, сколько байт данных у поля. Поэтому я их и не стал группировать парами, а так вот:


const uint8_t CustomHID_ReportDescriptor[] =
{
0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x10, 0x09, 0x01,
0x81, 0x02, 0x95, 0x02, 0x09, 0x01, 0x91, 0x02, 0xC0
};
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 15 2015, 08:14
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(IgorAVR2 @ Jan 7 2015, 03:12) *
Поэтому я их и не стал группировать парами, а так вот:


Я позволил себе расшифровать этот дескриптор:
Код
const uint8_t CustomHID_ReportDescriptor[] =
{
    0x06, 0x00, 0xFF,   // Global: USAGE_PAGE(Vendor defined)
    0x09, 0x01,         // USAGE (01)
    0xA1, 0x01,         // COLLECTION(Application)
        0x15, 0x00,         // LOGICAL_MINIMUM (0)
        0x26, 0xFF, 0x00,   // LOGICAL_MAXIMUM (255) можно было сэкономить: 0x25, 0xFF
        0x75, 0x08,         // REPORT_SIZE(8)
        0x95, 0x10,         // REPORT_COUNT(16)
        0x09, 0x01,         // USAGE(01)
        0x81, 0x02,         // INPUT(Data, Variable, Absolute, Linear)
        0x95, 0x02,         // REPORT_COUNT(2)
        0x09, 0x01,         // USAGE(01)
        0x91, 0x02,         // OUTPUT(Data, Variable, Absolute, Linear)
    0xC0                // END_COLLECTION
};

В нем нет поля REPORT_ID. Поэтому в самом рапорте это поле тоже отсутствует, совсем.

Цитата(IgorAVR2 @ Jan 5 2015, 03:03) *
Это позволило отправлять данные без указания ID репорта и у которых это ID при передаче равен 0.

Нету там ID равного нулю. Это просто байт данных. У ваш рапорт состоит из 16 8-битовых полей(REPORT_SIZE(8), REPORT_COUNT(16)). Все байты этого рапорта являются данными, как я и писал вам в самом начале.

Вот описание пункта REPORT_ID из "Device class definition fort HID":
Цитата
Report ID 1000 01 nn Unsigned value that specifies the Report ID. If a Report ID tag is used anywhere in Report descriptor, all data reports for the device are preceded by a single byte ID field.
...


Цитата(IgorAVR2 @ Dec 25 2014, 15:29) *
Если оно и принимало и отправляло данные, то я так понимаю что это уже два репорта?
Это не более одного в каждую сторону.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Jan 19 2015, 16:24
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Спасибо за расшифровку, буду вникать!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:34
Рейтинг@Mail.ru


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