<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: LPC1343 USB HID example in LPCXpresso IDE</title>
    <link>https://community.nxp.com/t5/LPCXpresso-IDE/LPC1343-USB-HID-example/m-p/538071#M5835</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Tue May 21 11:11:10 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;To ask on code modification, you have to specify the target code, exactly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Are you working on usbhid example on examples.lpc13xx.new.zip, in \nxp\LPCXpresso_5.2.4_2122\lpcxpresso\Examples\NXP\LPC1000\LPC13xx folder?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;But i need a rough idea of which areas I need to look at modifying in order to create an InReport of about 255 bytes in the LPC example code.&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You may simplify the report descriptor, as follows,&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
usbdesc.c

#define HID_INPUT_REPORT_BYTES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // up to 255 bytes
#define HID_OUTPUT_REPORT_BYTES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // up to 255 bytes
#define HID_FEATURE_REPORT_BYTES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // up to 255 bytes

const BYTE HID_ReportDescriptor[] = {
&amp;nbsp; HID_UsagePageVendor( 0x00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp; HID_Usage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 0x01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp; HID_Collection&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( HID_Application&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_LogicalMin&amp;nbsp;&amp;nbsp; ( 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),&amp;nbsp; // value range: 0 - 0xFF
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_LogicalMaxS&amp;nbsp; ( 0xFF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportSize&amp;nbsp;&amp;nbsp; ( 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),&amp;nbsp; // 8 bits
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount&amp;nbsp; ( HID_INPUT_REPORT_BYTES&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Usage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 0x01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Input&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( HID_Data | HID_Variable | HID_Absolute ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount&amp;nbsp; ( HID_OUTPUT_REPORT_BYTES&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Usage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 0x01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Output&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( HID_Data | HID_Variable | HID_Absolute ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount&amp;nbsp; ( HID_FEATURE_REPORT_BYTES ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Usage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 0x01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Feature&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( HID_Data | HID_Variable | HID_Absolute ),
&amp;nbsp; HID_EndCollection,
};
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In this thread, I explained the reason why such a simple descriptor is fine for vendor-specific HID implementation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://" rel="nofollow noopener noreferrer" target="_blank"&gt;http://www.keil.com/forum/11793/&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Ah, to extend the size of data to more than 255, up to 0xFFFF, replace "HID_ReportCount" macro into this one,&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
#define HID_ReportCountS(x)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x96,((x)&amp;amp;0xFF),(((x)&amp;gt;&amp;gt;8)&amp;amp;0xFF)
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;2). Which other functions will require modification?&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The host application can send/receive 255 bytes of report in single call.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This report is split/gathered into 64 bytes (or less) transactions (packets) by the host controller, when the endpoint wMaxPacketSize is 64 bytes. And then, the HID device exchanges four transactions, 64, 64, 64, 63 bytes for every 255 bytes report.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;As the example supposes just single transaction per report, you have to change the code flow intensively.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;a) Output report (host --&amp;gt; device) over the interrupt OUT endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In the first place, this example doesn't have the interrupt OUT endpoint.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This endpoint is added to the config descriptor set.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(1) Increase the wTotalLength field of Config descriptor by the size of the extra OUT endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(2) Increase bNumEndpoints on the interface descriptor from 1 to 2&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(3) additionally, increase the wMaxPacketSize to 64 bytes on the IN endpoint. Also, decrease the bInterval to 1 ms&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(4) Append the OUT endpoint definition&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;usbdesc.c

const uint8_t USB_ConfigDescriptor[] = {
/* Configuration 1 */
&amp;nbsp; USB_CONFIGUARTION_DESC_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&amp;nbsp; USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
&amp;nbsp; WBVAL(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wTotalLength */
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_CONFIGUARTION_DESC_SIZE +
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_INTERFACE_DESC_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_DESC_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_ENDPOINT_DESC_SIZE * 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (1)
&amp;nbsp; ),
&amp;nbsp; ...
/* Interface 0, Alternate Setting 0, HID Class */
&amp;nbsp; USB_INTERFACE_DESC_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&amp;nbsp; USB_INTERFACE_DESCRIPTOR_TYPE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bDescriptorType */
&amp;nbsp; 0x00,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bInterfaceNumber */
&amp;nbsp; 0x00,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bAlternateSetting */
&amp;nbsp; 0x02, /*0x01*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bNumEndpoints */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (2)
&amp;nbsp; ...
/* Endpoint, HID Interrupt In */
&amp;nbsp; USB_ENDPOINT_DESC_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&amp;nbsp; USB_ENDPOINT_DESCRIPTOR_TYPE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bDescriptorType */
&amp;nbsp; USB_ENDPOINT_IN(1),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bEndpointAddress */
&amp;nbsp; USB_ENDPOINT_TYPE_INTERRUPT,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bmAttributes */
&amp;nbsp; WBVAL(0x0040 /*0x0004*/),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wMaxPacketSize */&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (3)
&amp;nbsp; 1, /*0x20*/&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 1ms */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bInterval */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (4) append the definition of interrupt OUT endpoint
/* Endpoint, HID Interrupt Out */
&amp;nbsp; USB_ENDPOINT_DESC_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&amp;nbsp; USB_ENDPOINT_DESCRIPTOR_TYPE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bDescriptorType */
&amp;nbsp; USB_ENDPOINT_OUT(1),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bEndpointAddress */
&amp;nbsp; USB_ENDPOINT_TYPE_INTERRUPT,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bmAttributes */
&amp;nbsp; WBVAL(0x0040),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wMaxPacketSize */
&amp;nbsp; 1,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 1ms */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bInterval */

/* Terminator */
&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Every time when an interrupt OUT transaction comes from host, USB_EndPoint1( USB_EVT_OUT ) callback is called. The OUT transactions are concatenated on OutReport[] buffer on this routine.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;USB_Configure_Event() is a good place to initialize the endpoint context (variables and flags)&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
usbuser.c

#define HID_OUTPUT_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp; 255

uint8_t&amp;nbsp; OutReport[ HID_OUTPUT_SIZE ];
uint32_t out_pos = 0;

void USB_EndPoint1 (uint32_t event) {
&amp;nbsp; uint32_t len;

&amp;nbsp; switch (event) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; case USB_EVT_OUT:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = USB_ReadEP( USB_ENDPOINT_OUT(1), OutReport + out_pos );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out_pos += len;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( out_pos &amp;gt;= HID_OUTPUT_SIZE ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out_pos = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the entire output report has been received
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // process it, here
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp; }
}


void USB_Configure_Event (void) {

&amp;nbsp; if (USB_Configuration) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check if USB is configured */
&amp;nbsp;&amp;nbsp;&amp;nbsp; out_pos = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // initialize interrupt OUT EP context
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;b) Input report (device --&amp;gt; host) over the interrupt IN endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The input report (255 bytes) is also split into 64 bytes (or less) transactions. Start_input_report_transfer() of this code sends the first transaction. Your firmware calls this routine, when it finishes to fill the input report on InReport[] buffer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
#define HID_IN_PACKET_SIZE&amp;nbsp; 64
#define HID_INPUT_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255

uint8_t&amp;nbsp; InReport[ HID_INPUT_SIZE ];
uint32_t in_pos = 0;
bool&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in_occupied = FALSE;

bool Start_input_report_transfer( void )
{
&amp;nbsp; if ( in_occupied ) return FALSE;
&amp;nbsp; in_occupied = TRUE;
&amp;nbsp; USB_WriteEP( USB_ENDPOINT_IN(1), InReport + in_pos, HID_IN_PACKET_SIZE );
&amp;nbsp; in_pos = HID_IN_PACKET_SIZE;
}

void USB_EndPoint1 (uint32_t event) {
&amp;nbsp; uint32_t len;

&amp;nbsp; switch (event) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; case USB_EVT_IN:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = HID_INPUT_SIZE - in_pos;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // split the report into packets
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( len &amp;gt; HID_IN_PACKET_SIZE )&amp;nbsp; len = HID_IN_PACKET_SIZE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send a packet to host
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_WriteEP( USB_ENDPOINT_IN(1), InReport + in_pos, len );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // is the 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in_pos += len;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( in_pos &amp;gt;= HID_IN_PACKET_SIZE ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in_pos = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in_occupied = FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp; }
}

void USB_Configure_Event (void) {

&amp;nbsp; if (USB_Configuration) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check if USB is configured */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; in_pos = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // initialize interrupt IN EP context
&amp;nbsp;&amp;nbsp;&amp;nbsp; in_occupied = FALSE;
&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;c) Input/output/feature report over the default endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The stack code already has split/gather process for control transfer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;And then, you don't need to touch to it for large report.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But the example uses EP0Buf[] for the report exchange, which is assigned just 64 bytes.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;You'll need to increase the buffer size.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;usbcore.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//uint8_t&amp;nbsp; EP0Buf[USB_MAX_PACKET0];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint8_t&amp;nbsp; EP0Buf[HID_OUTPUT_SIZE];&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;usbcore.h&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//extern uint8_t&amp;nbsp; EP0Buf[USB_MAX_PACKET0];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;extern uint8_t&amp;nbsp; EP0Buf[HID_OUTPUT_SIZE];&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, HID_GetReport() and HID_SetReport() in hiduser.c is coded just for single byte.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;You'll modify these routines, so that they process the full report size (255 bytes).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Lastly, this example is also a BAD HID example, as I explained on this post&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://" rel="nofollow noopener noreferrer" target="_blank"&gt;http://knowledgebase.nxp.com/showpost.php?p=27906&amp;amp;postcount=10&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For practical HID implementation, the WriteEP() code in USB_Configure_Event() is not required.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 16 Jun 2016 00:25:52 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-16T00:25:52Z</dc:date>
    <item>
      <title>LPC1343 USB HID example</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/LPC1343-USB-HID-example/m-p/538070#M5834</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by deBoogle on Tue May 21 04:33:29 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi folks,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Just did a search for USB and got an error back from the engine, so in lieu of being able to search for my topic first....&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am new to USB and could do with a few pointers on something.&amp;nbsp; I have programmed the LPC1343 with the USB HID example and can read and connect to it fine using some C# code I have got from Jan Axelson's page (which is a great resource).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But i need a rough idea of which areas I need to look at modifying in order to&amp;nbsp; create an InReport of about 255 bytes in the LPC example code.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1). HID report descripto will need to modified, exspecially report count and size and probably logical max as it will be numerical vals up to maximum binary val.&amp;nbsp; But, which bits need changing as there are a few report count/size parts to the descriptor:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;const uint8_t HID_ReportDescriptor[] = {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; HID_UsagePageVendor(0x00),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; HID_Usage(0x01),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; HID_Collection(HID_Application),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_UsagePage(HID_USAGE_PAGE_BUTTON),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_UsageMin(1),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_UsageMax(3),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [COLOR=Blue]HID_LogicalMin(0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_LogicalMax(1),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount(3),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportSize(1),[/COLOR]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Input(HID_Data | HID_Variable | HID_Absolute),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount(1),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportSize(5),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Input(HID_Constant),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_UsagePage(HID_USAGE_PAGE_LED),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Usage(HID_USAGE_LED_GENERIC_INDICATOR),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[COLOR=Lime]&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_LogicalMin(0),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_LogicalMax(1),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount(8),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportSize(1),[/COLOR]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Output(HID_Data | HID_Variable | HID_Absolute),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; HID_EndCollection,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The bit marked in green seems to be the OutReport which the LPC receives, if I modify the first reference to report counts sizes (in Blue) I fail to enumerate.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;2).&amp;nbsp; Which other functions will require modification?, I have seen the GetInReport fumction, which is called by the USB_EndPoint1 when it receives a request for InReport and also the USB_WriteEP function.&amp;nbsp; Are there any other parts I should be looking at... &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;if anybody has written some code that already does something similar that I could take a peek at, I would be very grateful. Many thanks in advance&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;D&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 00:25:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/LPC1343-USB-HID-example/m-p/538070#M5834</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T00:25:51Z</dc:date>
    </item>
    <item>
      <title>Re: LPC1343 USB HID example</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/LPC1343-USB-HID-example/m-p/538071#M5835</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Tue May 21 11:11:10 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;To ask on code modification, you have to specify the target code, exactly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Are you working on usbhid example on examples.lpc13xx.new.zip, in \nxp\LPCXpresso_5.2.4_2122\lpcxpresso\Examples\NXP\LPC1000\LPC13xx folder?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;But i need a rough idea of which areas I need to look at modifying in order to create an InReport of about 255 bytes in the LPC example code.&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You may simplify the report descriptor, as follows,&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
usbdesc.c

#define HID_INPUT_REPORT_BYTES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // up to 255 bytes
#define HID_OUTPUT_REPORT_BYTES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // up to 255 bytes
#define HID_FEATURE_REPORT_BYTES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // up to 255 bytes

const BYTE HID_ReportDescriptor[] = {
&amp;nbsp; HID_UsagePageVendor( 0x00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp; HID_Usage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 0x01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp; HID_Collection&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( HID_Application&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_LogicalMin&amp;nbsp;&amp;nbsp; ( 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),&amp;nbsp; // value range: 0 - 0xFF
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_LogicalMaxS&amp;nbsp; ( 0xFF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportSize&amp;nbsp;&amp;nbsp; ( 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),&amp;nbsp; // 8 bits
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount&amp;nbsp; ( HID_INPUT_REPORT_BYTES&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Usage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 0x01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Input&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( HID_Data | HID_Variable | HID_Absolute ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount&amp;nbsp; ( HID_OUTPUT_REPORT_BYTES&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Usage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 0x01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Output&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( HID_Data | HID_Variable | HID_Absolute ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_ReportCount&amp;nbsp; ( HID_FEATURE_REPORT_BYTES ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Usage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 0x01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_Feature&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( HID_Data | HID_Variable | HID_Absolute ),
&amp;nbsp; HID_EndCollection,
};
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In this thread, I explained the reason why such a simple descriptor is fine for vendor-specific HID implementation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://" rel="nofollow noopener noreferrer" target="_blank"&gt;http://www.keil.com/forum/11793/&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Ah, to extend the size of data to more than 255, up to 0xFFFF, replace "HID_ReportCount" macro into this one,&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
#define HID_ReportCountS(x)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x96,((x)&amp;amp;0xFF),(((x)&amp;gt;&amp;gt;8)&amp;amp;0xFF)
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;2). Which other functions will require modification?&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The host application can send/receive 255 bytes of report in single call.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This report is split/gathered into 64 bytes (or less) transactions (packets) by the host controller, when the endpoint wMaxPacketSize is 64 bytes. And then, the HID device exchanges four transactions, 64, 64, 64, 63 bytes for every 255 bytes report.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;As the example supposes just single transaction per report, you have to change the code flow intensively.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;a) Output report (host --&amp;gt; device) over the interrupt OUT endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In the first place, this example doesn't have the interrupt OUT endpoint.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This endpoint is added to the config descriptor set.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(1) Increase the wTotalLength field of Config descriptor by the size of the extra OUT endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(2) Increase bNumEndpoints on the interface descriptor from 1 to 2&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(3) additionally, increase the wMaxPacketSize to 64 bytes on the IN endpoint. Also, decrease the bInterval to 1 ms&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(4) Append the OUT endpoint definition&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;usbdesc.c

const uint8_t USB_ConfigDescriptor[] = {
/* Configuration 1 */
&amp;nbsp; USB_CONFIGUARTION_DESC_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&amp;nbsp; USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
&amp;nbsp; WBVAL(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wTotalLength */
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_CONFIGUARTION_DESC_SIZE +
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_INTERFACE_DESC_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +
&amp;nbsp;&amp;nbsp;&amp;nbsp; HID_DESC_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_ENDPOINT_DESC_SIZE * 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (1)
&amp;nbsp; ),
&amp;nbsp; ...
/* Interface 0, Alternate Setting 0, HID Class */
&amp;nbsp; USB_INTERFACE_DESC_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&amp;nbsp; USB_INTERFACE_DESCRIPTOR_TYPE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bDescriptorType */
&amp;nbsp; 0x00,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bInterfaceNumber */
&amp;nbsp; 0x00,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bAlternateSetting */
&amp;nbsp; 0x02, /*0x01*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bNumEndpoints */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (2)
&amp;nbsp; ...
/* Endpoint, HID Interrupt In */
&amp;nbsp; USB_ENDPOINT_DESC_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&amp;nbsp; USB_ENDPOINT_DESCRIPTOR_TYPE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bDescriptorType */
&amp;nbsp; USB_ENDPOINT_IN(1),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bEndpointAddress */
&amp;nbsp; USB_ENDPOINT_TYPE_INTERRUPT,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bmAttributes */
&amp;nbsp; WBVAL(0x0040 /*0x0004*/),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wMaxPacketSize */&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (3)
&amp;nbsp; 1, /*0x20*/&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 1ms */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bInterval */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;---- (4) append the definition of interrupt OUT endpoint
/* Endpoint, HID Interrupt Out */
&amp;nbsp; USB_ENDPOINT_DESC_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&amp;nbsp; USB_ENDPOINT_DESCRIPTOR_TYPE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bDescriptorType */
&amp;nbsp; USB_ENDPOINT_OUT(1),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bEndpointAddress */
&amp;nbsp; USB_ENDPOINT_TYPE_INTERRUPT,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bmAttributes */
&amp;nbsp; WBVAL(0x0040),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wMaxPacketSize */
&amp;nbsp; 1,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 1ms */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bInterval */

/* Terminator */
&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* bLength */
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Every time when an interrupt OUT transaction comes from host, USB_EndPoint1( USB_EVT_OUT ) callback is called. The OUT transactions are concatenated on OutReport[] buffer on this routine.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;USB_Configure_Event() is a good place to initialize the endpoint context (variables and flags)&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
usbuser.c

#define HID_OUTPUT_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp; 255

uint8_t&amp;nbsp; OutReport[ HID_OUTPUT_SIZE ];
uint32_t out_pos = 0;

void USB_EndPoint1 (uint32_t event) {
&amp;nbsp; uint32_t len;

&amp;nbsp; switch (event) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; case USB_EVT_OUT:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = USB_ReadEP( USB_ENDPOINT_OUT(1), OutReport + out_pos );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out_pos += len;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( out_pos &amp;gt;= HID_OUTPUT_SIZE ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out_pos = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the entire output report has been received
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // process it, here
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp; }
}


void USB_Configure_Event (void) {

&amp;nbsp; if (USB_Configuration) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check if USB is configured */
&amp;nbsp;&amp;nbsp;&amp;nbsp; out_pos = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // initialize interrupt OUT EP context
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;b) Input report (device --&amp;gt; host) over the interrupt IN endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The input report (255 bytes) is also split into 64 bytes (or less) transactions. Start_input_report_transfer() of this code sends the first transaction. Your firmware calls this routine, when it finishes to fill the input report on InReport[] buffer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
#define HID_IN_PACKET_SIZE&amp;nbsp; 64
#define HID_INPUT_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255

uint8_t&amp;nbsp; InReport[ HID_INPUT_SIZE ];
uint32_t in_pos = 0;
bool&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in_occupied = FALSE;

bool Start_input_report_transfer( void )
{
&amp;nbsp; if ( in_occupied ) return FALSE;
&amp;nbsp; in_occupied = TRUE;
&amp;nbsp; USB_WriteEP( USB_ENDPOINT_IN(1), InReport + in_pos, HID_IN_PACKET_SIZE );
&amp;nbsp; in_pos = HID_IN_PACKET_SIZE;
}

void USB_EndPoint1 (uint32_t event) {
&amp;nbsp; uint32_t len;

&amp;nbsp; switch (event) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; case USB_EVT_IN:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = HID_INPUT_SIZE - in_pos;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // split the report into packets
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( len &amp;gt; HID_IN_PACKET_SIZE )&amp;nbsp; len = HID_IN_PACKET_SIZE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send a packet to host
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_WriteEP( USB_ENDPOINT_IN(1), InReport + in_pos, len );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // is the 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in_pos += len;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( in_pos &amp;gt;= HID_IN_PACKET_SIZE ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in_pos = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in_occupied = FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp; }
}

void USB_Configure_Event (void) {

&amp;nbsp; if (USB_Configuration) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check if USB is configured */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; in_pos = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // initialize interrupt IN EP context
&amp;nbsp;&amp;nbsp;&amp;nbsp; in_occupied = FALSE;
&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;c) Input/output/feature report over the default endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The stack code already has split/gather process for control transfer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;And then, you don't need to touch to it for large report.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But the example uses EP0Buf[] for the report exchange, which is assigned just 64 bytes.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;You'll need to increase the buffer size.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;usbcore.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//uint8_t&amp;nbsp; EP0Buf[USB_MAX_PACKET0];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint8_t&amp;nbsp; EP0Buf[HID_OUTPUT_SIZE];&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;usbcore.h&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//extern uint8_t&amp;nbsp; EP0Buf[USB_MAX_PACKET0];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;extern uint8_t&amp;nbsp; EP0Buf[HID_OUTPUT_SIZE];&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, HID_GetReport() and HID_SetReport() in hiduser.c is coded just for single byte.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;You'll modify these routines, so that they process the full report size (255 bytes).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Lastly, this example is also a BAD HID example, as I explained on this post&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://" rel="nofollow noopener noreferrer" target="_blank"&gt;http://knowledgebase.nxp.com/showpost.php?p=27906&amp;amp;postcount=10&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For practical HID implementation, the WriteEP() code in USB_Configure_Event() is not required.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 00:25:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/LPC1343-USB-HID-example/m-p/538071#M5835</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T00:25:52Z</dc:date>
    </item>
  </channel>
</rss>

