<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.arm.com/utility/feedstylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>USB HID Report ID</title><link>https://community.arm.com/developer/tools-software/tools/f/keil-forum/22731/usb-hid-report-id</link><description> 
Hello, 

 
I am useing an SAM7S256 controller. I want to implement a USB HID
communication. I have already succeded to some degree with the Keil
sample code for HID. 

 
My problem is the Report descriptor. 
I want to be able to transmit 1 to 1024 bytes</description><dc:language>en-US</dc:language><generator>Telligent Community 10</generator><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/135480?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2008 20:29:45 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:2b0d38e4-003a-4fa2-bee7-70ec43f4e650</guid><dc:creator>Tsuneo Chinzei</dc:creator><description>&lt;p&gt;&lt;p&gt;
Auuu, sorry, you are right.&lt;/p&gt;

&lt;p&gt;
The usage just before the collection is required.&lt;/p&gt;

&lt;p&gt;
6.2.2.6 Collection, End Collection Items (HID1_11.pdf p34)&lt;br /&gt;
&lt;i&gt;&amp;quot;Remarks - Collection items do not generate data. However, a Usage
item tag must be&lt;br /&gt;
associated with any collection (such as a mouse or
throttle).&amp;quot;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
Even without this Usage, HID Descriptor Tool doesn&amp;#39;t put any
error, and Windows XP (SP2) accepts the report. Then, I wasn&amp;#39;t aware
of it.&lt;/p&gt;

&lt;p&gt;
Thank you for correcting me.&lt;/p&gt;

&lt;p&gt;
Tsuneo&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/124879?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2008 08:56:59 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:36ce4246-9352-4e97-8493-dddd9eb4b41e</guid><dc:creator>Oliver Debus</dc:creator><description>&lt;p&gt;&lt;p&gt;
Dear Tsuneo,&lt;/p&gt;

&lt;p&gt;
I have found out, when I put in the USAGE at the beginning -
enumeration works again and the compliance tool also says that my
descriptors are O.K..&lt;/p&gt;

&lt;p&gt;
I can also communicate using my PC application.&lt;/p&gt;

&lt;pre&gt;
/* HID Report Descriptor */

const BYTE HID_ReportDescriptor[] = {
    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
&lt;b&gt;    0x09, 0x01,                    //   USAGE (Vendor Usage 1)&lt;/b&gt;
    0xa1, 0x01,                    // COLLECTION (Application)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)

    0x85, 0x01,                    //   REPORT_ID (1)
    0x95, 0x3F,                    //   REPORT_COUNT (63)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    0xc0,                           // END_COLLECTION
};

&lt;/pre&gt;

&lt;p&gt;
looks good now - thanks Tsuneo ...&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/114185?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2008 07:19:02 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:4b17d6fa-fcae-4975-80d3-33920ab85ff1</guid><dc:creator>Oliver Debus</dc:creator><description>&lt;p&gt;&lt;p&gt;
Dear Tsuneo,&lt;/p&gt;

&lt;p&gt;
thanks again. I did what you said. But still I didn&amp;#39;t get it to
work. The strange thing is the USBCV13.exe command line verifier
programme - doing a compliance test (chapter 9 Test + HID Test)
everything is O.K. The tool even shows me all the Data like Vendor
ID, Product ID, String descriptor text. But when I switch back and
use USB View to check it only shows me the Device Descriptor and a
fragment of the next information block. The device descriptor seems
O.K. but the fragment shows low speed etc. which is not O.K.&lt;/p&gt;

&lt;p&gt;
Device Descriptor:&lt;br /&gt;
bcdUSB: 0x0110&lt;br /&gt;
bDeviceClass: 0x00&lt;br /&gt;
bDeviceSubClass: 0x00&lt;br /&gt;
bDeviceProtocol: 0x00&lt;br /&gt;
bMaxPacketSize0: 0x08 (8)&lt;br /&gt;
idVendor: 0x197D&lt;br /&gt;
idProduct: 0x0300&lt;br /&gt;
bcdDevice: 0x0100&lt;br /&gt;
iManufacturer: 0x04&lt;br /&gt;
iProduct: 0x26&lt;br /&gt;
iSerialNumber: 0x48&lt;br /&gt;
bNumConfigurations: 0x01&lt;/p&gt;

&lt;p&gt;
ConnectionStatus: DeviceConnected&lt;br /&gt;
Current Config Value: 0x00&lt;br /&gt;
Device Bus Speed: Low&lt;br /&gt;
Device Address: 0x00&lt;br /&gt;
Open Pipes: 0&lt;/p&gt;

&lt;p&gt;
I have used the simple Version of your ReportDescriptor:&lt;/p&gt;

&lt;pre&gt;
const BYTE HID_ReportDescriptor[] = {
    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)

    //0x85, 0x01,                    //   REPORT_ID (1)
    0x95, 0x40,                    //   REPORT_COUNT (64)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    0xc0,                           // END_COLLECTION
};

&lt;/pre&gt;

&lt;p&gt;
my configuration descriptor:&lt;/p&gt;

&lt;pre&gt;
/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const BYTE USB_ConfigDescriptor[] = {
/* Configuration 1 */
  USB_CONFIGUARTION_DESC_SIZE,       /* bLength */
  USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
  WBVAL(                             /* wTotalLength */
    USB_CONFIGUARTION_DESC_SIZE +
    USB_INTERFACE_DESC_SIZE     +
    HID_DESC_SIZE               +
    USB_ENDPOINT_DESC_SIZE*2
  ),
  0x01,                              /* bNumInterfaces */
  0x01,                              /* bConfigurationValue */
  0x00,                              /* iConfiguration */
  USB_CONFIG_BUS_POWERED /*|*/       /* bmAttributes */
/*USB_CONFIG_REMOTE_WAKEUP*/,
  USB_CONFIG_POWER_MA(100),          /* bMaxPower */
/* Interface 0, Alternate Setting 0, HID Class */
  USB_INTERFACE_DESC_SIZE,           /* bLength */
  USB_INTERFACE_DESCRIPTOR_TYPE,     /* bDescriptorType */
  0x00,                              /* bInterfaceNumber */
  0x00,                              /* bAlternateSetting */
  0x02,                              /* bNumEndpoints */

  USB_DEVICE_CLASS_HUMAN_INTERFACE,  /* bInterfaceClass */
  HID_SUBCLASS_NONE,                 /* bInterfaceSubClass */
  HID_PROTOCOL_NONE,                 /* bInterfaceProtocol */
  0x6A,                              /* iInterface */

// HID Class Descriptor
// HID_DESC_OFFSET = 0x0012
  HID_DESC_SIZE,                     /* bLength */
  HID_HID_DESCRIPTOR_TYPE,           /* bDescriptorType */
  WBVAL(0x0100), /* 1.00 */          /* bcdHID */
  0x00,                              /* bCountryCode */
  0x01,                              /* bNumDescriptors */
  HID_REPORT_DESCRIPTOR_TYPE,        /* bDescriptorType */
  WBVAL(HID_REPORT_DESC_SIZE),       /* wDescriptorLength */
// Endpoint, HID Interrupt In *
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_IN(3),                /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0040),                     /* wMaxPacketSize */
  0x20,          /* 32ms */          /* bInterval */
// Endpoint, HID Interrupt Out
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_OUT(2),               /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0040),                     /* wMaxPacketSize */
  0x20,          /* 32ms */          /* bInterval */
/* Terminator */
  0                                  /* bLength */
};
&lt;/pre&gt;

&lt;p&gt;
I really don&amp;#39;t know where to look at next. something seems to be
wrong somewhere else and there are some side effects which come
thru.&lt;/p&gt;

&lt;p&gt;
I&amp;#39;d be glad if you could help once more - thanks.&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/100987?ContentTypeID=1</link><pubDate>Wed, 20 Aug 2008 18:54:20 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:5b6ec86b-5292-4d6a-9dbd-68b36dab40a6</guid><dc:creator>Tsuneo Chinzei</dc:creator><description>&lt;p&gt;&lt;p&gt;
1) HID Descriptor Tool&lt;br /&gt;
Make up your report descriptor on HID Descriptor Tool, and check
it.&lt;/p&gt;

&lt;p&gt;
&amp;quot;HID Descriptor Tool&amp;quot; on USB.org&lt;br /&gt;
&lt;a href="http://www.usb.org/developers/hidpage/dt2_4.zip"&gt;www.usb.org/.../dt2_4.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
The GUI of this tool is troublesome to make up a huge report on
it.&lt;br /&gt;
Make up this minimum descriptor on the GUI first.&lt;/p&gt;

&lt;pre&gt;
/* HID Report Descriptor */
const BYTE HID_ReportDescriptor[] = {
    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)

&lt;b&gt;    0x85, 0x01,                    //   REPORT_ID (1)
    0x95, 0x40,                    //   REPORT_COUNT (64)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)&lt;/b&gt;

    0xc0                           // END_COLLECTION
};
&lt;/pre&gt;

&lt;p&gt;
The next block is copy-pasted as follows,&lt;br /&gt;
- Click on REPORT_ID(1) line, and click on OUTPUT(Data,Var,Abs) line
with shift key -- above REPORT_ID (1) block is selected&lt;br /&gt;
- Copy these lines (CTRL-C)&lt;br /&gt;
- Click on END_COLLECTION line&lt;br /&gt;
- Paste it (CTRL-V)&lt;/p&gt;

&lt;p&gt;
To modify the new block,&lt;br /&gt;
- Double click on REPORT_ID (1) and enter new report ID&lt;br /&gt;
- Double click on REPORT_COUNT (64) and enter new report count&lt;/p&gt;

&lt;p&gt;
Repeat this paste and modify process for more blocks&lt;br /&gt;
- block is already copied, then just paste it.&lt;/p&gt;

&lt;p&gt;
In this way, you can make up the huge report descriptor in a few
minute.&lt;br /&gt;
When you finish the descriptor, check it using &amp;quot;Parse Descriptor&amp;quot;&lt;/p&gt;

&lt;p&gt;
As you can see, no HID_Usage(0x01) before the
HID_Collection(HID_Application) line is required.&lt;/p&gt;

&lt;p&gt;
When the descriptor passes the check, save it with &amp;quot;Save As&amp;quot;.&lt;br /&gt;
- File type -- Header File&lt;br /&gt;
Then, you&amp;#39;ll get a text file like above. Copy the contents to your
code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Descriptor definitions&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;&amp;quot;Do I have to change something else in a different
descriptor?&amp;quot;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
The size of the report descriptor is altered.&lt;br /&gt;
- wDescriptorLength on the HID class descriptor&lt;br /&gt;
- Get_Descriptor( HID Report ) handling&lt;/p&gt;

&lt;p&gt;
Using sizeof() as follows, compiler automatically takes care of
it.&lt;/p&gt;

&lt;pre&gt;
#if defined BIG_ENDIAN
  #define LE(x)   ((((x)&amp;amp;0x00FF)&amp;lt;&amp;lt;8)|(((x)&amp;amp;0xFF00)&amp;gt;&amp;gt;8))  // convert to little endian
#else
  #define LE(x) (x)                                      // no conversion
#endif

/* HID Report Descriptor */
const BYTE HID_ReportDescriptor[] = {
    //
    // your descriptor comes here
    //
};

&lt;b&gt;const unsigned int HID_ReportDescriptor_size = sizeof( HID_ReportDescriptor );
                                // export the size of report descriptor for Get_Descriptor&lt;/b&gt;
/* Device Descriptor */
...
/* Configuration Descriptor set */
const BYTE USB_ConfigDescriptor[] = {
   ...
   {
      // HID class descriptor
      sizeof(THID_class_descriptor),        // bLength
      DSC_SUBTYPE_CS_HID_CLASS,             // bDescriptorType
      LE( 0x0111 ),                         // bcdHID (ver1.11)
      0x00,                                 // bCountryCode
      0x01,                                 // bNumDescriptors
      HID_REPORT_DESCRIPTOR,                // bDescriptorType
&lt;b&gt;      LE( sizeof( HID_ReportDescriptor ) ), // wDescriptorLength&lt;/b&gt;
   },
   ...
};
&lt;/pre&gt;

&lt;p&gt;
Tsuneo&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/76591?ContentTypeID=1</link><pubDate>Wed, 20 Aug 2008 14:24:02 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:fb1420df-c8e5-4174-85dd-eb6250dbb161</guid><dc:creator>Oliver Debus</dc:creator><description>&lt;p&gt;&lt;p&gt;
Dear Tsuneo - Thank you.&lt;/p&gt;

&lt;p&gt;
This all sounds logical and makes it better readable.&lt;br /&gt;
Unfortinately I didn&amp;#39;t get it to work.&lt;br /&gt;
Do I have to change something else in a different descriptor?&lt;br /&gt;
In the USB_ConfigDescriptor I am telling:&lt;br /&gt;
bNumDescriptors is 0x01&lt;br /&gt;
and bDescriptorType is HID_REPORT_DESCRIPTOR.&lt;/p&gt;

&lt;p&gt;
My problem is that if I delete the HID_Usage(0x01)&lt;br /&gt;
above the HID_Collection(HID_Application) line my PC application (the
C++ example from the USB complete book) cannot find my USB Device (my
SAM7 ARM uC) anymore - I guess enumeration has failed). If I put in
this line with your example at least the OUTPUT - (sending from Host
to device) works but I get a Read File Timeout &amp;quot;Can&amp;#39;t Read From
Device&amp;quot;.&lt;br /&gt;
I have changed the Report ID to 1 (PC application) for test for the
OutputReport[0]. I shouldn&amp;#39;t need to do it for the InputReport since
the PC has to takes what it gets on a request - sholdn&amp;#39;t it?&lt;/p&gt;

&lt;p&gt;
This was the problem with my Report descriptor even before I
started to use Report IDs.&lt;/p&gt;

&lt;pre&gt;
The INPUT (device to host) only worked when I used
HID_UsagePage(HID_USAGE_PAGE_GENERIC) and
HID_Usage(HID_USAGE_GENERIC_COUNTED_BUFFER)
together with
HID_OUTPUT(...)
&lt;/pre&gt;

&lt;p&gt;
&lt;br /&gt;
I don&amp;#39;t know why since I have the same opinion as you that detailed
usage is not required ...&lt;/p&gt;

&lt;p&gt;
Looking forward to hear from you again ... Thank you.&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/100986?ContentTypeID=1</link><pubDate>Wed, 20 Aug 2008 13:05:25 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:f2749c49-cb94-4e8c-9cc5-73e3f2aa7185</guid><dc:creator>Tsuneo Chinzei</dc:creator><description>&lt;p&gt;&lt;p&gt;
Al Bradford: &lt;i&gt;&amp;quot;A ZLP after sending the number of packets you
desire will terminate packet transfers prior to the maximum report
size.&amp;quot;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
Per Westermark: &amp;quot;A short packet will also signal the end of the
transfer.&amp;quot;&lt;/p&gt;

&lt;p&gt;
I agree with Per.&lt;br /&gt;
For Input report over the interrupt IN endpoint,&lt;br /&gt;
ZLP is attached to the transfer when the transfer size is just the
multiple of wMaxPacketSize ( usually 64 for FS ), to show the end of
transfer. That is, ZLP is attached as the short packet at the end of
transfer. On other transfer size, ZLP is not required, because it is
terminated by short packet.&lt;/p&gt;

&lt;p&gt;
The exception is the report of the greatest size. For the greatest
report, ZLP is not attached even when the transfer size is just the
multiple of wMaxPacketSize.&lt;/p&gt;

&lt;p&gt;
The host side doesn&amp;#39;t know which report comes from the device
next. Then, HID device driver always requests the greatest size
transfer as the &amp;quot;expected size&amp;quot; to host controller. The host
controller can terminate the greatest size transfer without short
packet, because it matches to &amp;quot;expected size&amp;quot;. But for shorter
report, short packet (including ZLP) is required to terminate this
&amp;quot;expected size&amp;quot; transfer.&lt;/p&gt;

&lt;p&gt;
For Output report over interrupt OUT endpoint, no ZLP is attached
even when the transfer size is just the multiple of
wMaxPacketSize.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&amp;quot;I don&amp;#39;t think there is any need to have multiple Report sizes
just to shorten a report from the maximum report size.&amp;quot;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
Report descriptor declares the report format(s). HID device driver
doesn&amp;#39;t accept any report out of this format. ie. it drops such a
report whose size doesn&amp;#39;t match to any report on the report
descriptor. Then, padding is required to fit to (one of) declared
report size.&lt;/p&gt;

&lt;p&gt;
Tsuneo&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/52248?ContentTypeID=1</link><pubDate>Wed, 20 Aug 2008 11:53:14 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:f1169840-f762-4cdd-993b-b9447ecb6d46</guid><dc:creator>Tsuneo Chinzei</dc:creator><description>&lt;p&gt;&lt;p&gt;
1) sub-collections are not required&lt;br /&gt;
In your report descriptor, you declare sub-collection to each report
ID, like&lt;/p&gt;

&lt;pre&gt;
  HID_Collection(     HID_Logical),
  ...
  HID_EndCollection,
&lt;/pre&gt;

&lt;p&gt;
&lt;br /&gt;
Just to declare report ID, these sub-collections are not
required.&lt;br /&gt;
Delete them all.&lt;/p&gt;

&lt;p&gt;
Just the top-level collection is required.&lt;/p&gt;

&lt;pre&gt;
  HID_Collection(     HID_Application),
  HID_EndCollection,
&lt;/pre&gt;

&lt;p&gt;
2) Declaration of duplicated report ID is not allowed throughout
entire report descriptor.&lt;br /&gt;
Rather, combine the Input and Output under the same report ID.&lt;/p&gt;

&lt;p&gt;
3) For Global items, one time declaration is enough&lt;br /&gt;
You don&amp;#39;t need to declare these global items every time, unless you
assign another value to them. The value is held once declared.&lt;br /&gt;
- LogicalMin&lt;br /&gt;
- LogicalMax&lt;br /&gt;
- ReportSize&lt;/p&gt;

&lt;p&gt;
4) Detailed usage is not required&lt;br /&gt;
For vendor specific HID, there isn&amp;#39;t so much advantage to specify the
detailed usage.&lt;/p&gt;

&lt;pre&gt;
/* HID Report Descriptor */
const BYTE HID_ReportDescriptor[] = {
    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)

    0x85, 0x01,                    //   REPORT_ID (1)
    0x95, 0x40,                    //   REPORT_COUNT (64)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    0x85, 0x02,                    //   REPORT_ID (2)
    0x95, 0x80,                    //   REPORT_COUNT (128)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    0x85, 0x03,                    //   REPORT_ID (3)
    0x95, 0xc0,                    //   REPORT_COUNT (192)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
    ...
    ...
    0xc0                           // END_COLLECTION
};
&lt;/pre&gt;

&lt;p&gt;
Tsuneo&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/89221?ContentTypeID=1</link><pubDate>Wed, 20 Aug 2008 10:13:59 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:9d28de17-ed56-49bf-990c-c3b9cc6991c3</guid><dc:creator>ImPer Westermark</dc:creator><description>&lt;p&gt;&lt;p&gt;
A short packet will also signal the end of the transfer.&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: USB HID Report ID</title><link>https://community.arm.com/thread/52242?ContentTypeID=1</link><pubDate>Wed, 20 Aug 2008 09:33:35 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:579833f6-da95-414e-8dc0-edd13cb1da01</guid><dc:creator>doubt that my ISP Al Bradford</dc:creator><description>&lt;p&gt;&lt;p&gt;
Search this forum for ZLP or Zero Length Packets. A ZLP after
sending the number of packets you desire will terminate packet
transfers prior to the maximum report size. I don&amp;#39;t think there is
any need to have multiple Report sizes just to shorten a report from
the maximum report size. Again search this forum.&lt;br /&gt;
Bradford&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>