PORTS Forum

Ports and Interfaces => USB => Topic started by: samulasun on August 09, 2010, 09:43:46 pm

Title: HID Data Cannot exceed 128 bytes !!??
Post by: samulasun on August 09, 2010, 09:43:46 pm
Hi all,

I met a strange situation, I send 0x86 bytes from device to PC,
but PC only show 0x06 bytes on the screen (by Bushound),
the rest 0x80 bytes disappear. I use an USB analyzer to capture
the physical transaction, the data is correct, there are 0x86 bytes
in the USB BUS, but I can only see 0x06 bytes !!??


It looks like the PC reset automatically when receive data more than 128 bytes.

I think this may cause by the report descriptor, the following is my descriptor:
{
   0x06,0x0A,0xFF,          // Usage Page (FFA0h, vendor defined)
   0x09,0x01,                // Usage (vendor defined)
   0xA1,0x00,                // Collection (Application)
   0x09,0x02,                 // Usage (vendor defined)
   0xA1,0x00,                // Collection (Physical)
   0x06,0xA1,0xFF,          // Usage Page (vendor defined)
                                                   
// The Input report                               
   0x09,0x03,              // Usage (vendor defined)
   0x09,0x04,            // Usage (vendor defined)
   0x15,0x00,            // Logical minimum (80h or -128)
   0x26,0x00,0x01,         // Logical maximum (7Fh or 127)
   0x35,0x00,            // Physical minimum (0)
   0x45,0x7F,            // Physical maximum (255)
   0x75,0x08,            // Report size (8 bits)
   0x96,0x00,0x01,         // Report count (2 fields)
   0x81,0x02,                // Input (data, variable, absolute)
                               
   0x09,0x05,             // Usage (vendor defined)
   0x09,0X06,              // Usage (vendor defined)
   0x15,0x00,            // Logical minimum (80h or -128)
   0x26,0x00,0x01,         // Logical maximum (7Fh or 127)
   0x35,0x00,            // Physical minimum (0)
   0x45,0xFF,            // Physical maximum (255)
   0x75,0x08,            // Report size (8 bits)
   0x96,0x00,0x01,         // Report count (2 fields)
   0x91,0x02,            // Output (data, variable, absolute)
                                                   
   0xC0,                  // End Collection (Physical)
   0xC0,                  // End Collection (Application)
};

Could someone please help me to understand why this happen, Thank you all.

Title: Re: HID Data Cannot exceed 128 bytes !!??
Post by: Jan Axelson on August 09, 2010, 11:31:26 pm
All HID data is in defined reports. Your report descriptor shows a 2-byte Input report. Thus your device should send 2 bytes to the host in each interrupt IN transfer. The host will likely ignore data that doesn't fit the HID's report format.

Jan
Title: Re: HID Data Cannot exceed 128 bytes !!??
Post by: Guido Koerber on August 10, 2010, 05:11:36 am
The descriptor looks all wrong, you seem to have forgotten the second byte for some of the values. Your report size is 256 bytes as per your descriptor. Depending on the speed your device uses the report may need to be broken down into multiple transfers, they size of interrupt data packets is limited depending on the device speed.
Title: Re: HID Data Cannot exceed 128 bytes !!??
Post by: Jan Axelson on August 10, 2010, 08:03:30 am
Guido is correct. I was looking at the comments, not the actual data.

Jan
Title: Re: HID Data Cannot exceed 128 bytes !!??
Post by: samulasun on August 10, 2010, 09:29:45 pm
Hi Jan,Guido,

Thanks for your help. Very important and useful information.

"forgotten the second byte for some of the values"==> I will use DT to re-check the descriptor

"Depending on the speed your device uses"==> Did you mean the diference of USB1.1 and 2.0. Or did you mean the
endpoint size?? I set the endpoint size to 0xFF.

"report may need to be broken down into multiple transfers"==> Did you mean the original 0x86 size data may become 2 transaction ??

Thank you all, I will use DT to re-design first.
Title: Re: HID Data Cannot exceed 128 bytes !!??
Post by: Guido Koerber on August 11, 2010, 04:37:03 am
The transfer size (endpoint size) depends on the speed your device uses, low speed allows 8 bytes max, full speed 64 bytes max for interrupt transfers.