Размер репорта -
8 байт, там даже для удобства ввел константу REPORT_LEN. Хосту передаю 5 байт, 3 оставшиеся не важно какие.
Код: Выделить всё
PROGMEM char usbHidReportDescriptor[22] = { /* дескриптор репорта USB */
0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, REPORT_LEN, // REPORT_COUNT (8)
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
0xc0 // END_COLLECTION
};
Как я понял, REPORT_SIZE - это собственно длина одной посылки, в байтах. А REPORT_COUNT - это общее число байт в репорте (в примере hid_data - 128).
Хост отправляет такой же репорт (8 байт), в 0 байте команда. Проверка текущего режима (mode) для игнорирования повторной отправки одной команды. Дальше простой выбор. Условные коды 21,3,89 - выдуманные (или не совсем

), можно сделать просто 1,2,3 (в хосте тоже поправить).
Нечто под названием check device - инкремент второго байта из посылки и возврат этого значения через cback. Таким макаром я 100% определяю отсутствие устройства

, потому как были проблемы с этим.
owstate - текущее состояние линии 1-ware. В хосте ниакак не используется (или почти никак

).
Temperature - целое значение абс. величины температуры.
szero - знак (0 +/1 -)
cel_frac_bits - младшие биты абс. величины температуры (дробная часть).
Про хост:
Прием репорта:
WorkDevice.GetFeature(MyReport, FeatureReportLen); При успехе возвращает true.
MyReport - буффер, куда копируются данные.
FeatureReportLen - собственно длина этих данных.
Точно также отправка репорта:
WorkDevice.SetFeature(MyReport, FeatureReportLen); При успехе возвращает true.
MyReport - буффер, откуда берутся данные.
FeatureReportLen - собственно длина этих данных.