<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/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/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>mouse + keyboard combo</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/4408/mouse-keyboard-combo</link><description>Hello Guys, 
 I successfully used ble_hids_mouse and ble_hids_keyboard on my hardware but my final solution is a mouse + keyboard combo. 
 I merged the mouse and keyboard functions but when I pair with Windows it shows driver error. I suspect my problem</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Wed, 07 Oct 2015 18:25:32 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/4408/mouse-keyboard-combo" /><item><title>RE: mouse + keyboard combo</title><link>https://devzone.nordicsemi.com/thread/15661?ContentTypeID=1</link><pubDate>Wed, 07 Oct 2015 18:25:32 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a9a35743-10d2-48c7-af36-c6842cb66b55</guid><dc:creator>Sad~Sugar</dc:creator><description>&lt;p&gt;Hi, I have the same problem with yours. Do you  solve it ? I really need help!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: mouse + keyboard combo</title><link>https://devzone.nordicsemi.com/thread/15660?ContentTypeID=1</link><pubDate>Tue, 11 Nov 2014 20:12:53 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f48e4c61-5a3c-4ee8-ab0d-b75ec4729839</guid><dc:creator>Gilson</dc:creator><description>&lt;p&gt;Hi Hakon,&lt;/p&gt;
&lt;p&gt;I changed the following #defines :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Mouse
#define MOVEMENT_SPEED                  5                                           /**&amp;lt; Number of pixels by which the cursor is moved each time a button is pushed. */
#define INPUT_REPORT_COUNT              4                                           /**&amp;lt; Number of input reports in this application. */
#define INPUT_REP_BUTTONS_LEN           3                                           /**&amp;lt; Length of Mouse Input Report containing button data. */
#define INPUT_REP_MOVEMENT_LEN          3                                           /**&amp;lt; Length of Mouse Input Report containing movement data. */
#define INPUT_REP_MEDIA_PLAYER_LEN      1                                           /**&amp;lt; Length of Mouse Input Report containing media player data. */
#define INPUT_REP_BUTTONS_INDEX         1                                           /**&amp;lt; Index of Mouse Input Report containing button data. */
#define INPUT_REP_MOVEMENT_INDEX        2                                           /**&amp;lt; Index of Mouse Input Report containing movement data. */
#define INPUT_REP_MPLAYER_INDEX         3                                           /**&amp;lt; Index of Mouse Input Report containing media player data. */
#define INPUT_REP_REF_BUTTONS_ID        2                                           /**&amp;lt; Id of reference to Mouse Input Report containing button data. */
#define INPUT_REP_REF_MOVEMENT_ID       3                                           /**&amp;lt; Id of reference to Mouse Input Report containing movement data. */
#define INPUT_REP_REF_MPLAYER_ID        4                                           /**&amp;lt; Id of reference to Mouse Input Report containing media player data. */
// == mouse

#define OUTPUT_REPORT_INDEX              0                                              /**&amp;lt; Index of Output Report. */
#define OUTPUT_REPORT_MAX_LEN            1                                              /**&amp;lt; Maximum length of Output Report. */
#define INPUT_REPORT_KEYS_INDEX          0                                              /**&amp;lt; Index of Input Report. */
#define OUTPUT_REPORT_BIT_MASK_CAPS_LOCK 0x02                                           /**&amp;lt; CAPS LOCK bit in Output Report (based on &amp;#39;LED Page (0x08)&amp;#39; of the Universal Serial Bus HID Usage Tables). */
#define INPUT_REP_REF_ID                 1                                              /**&amp;lt; Id of reference to Keyboard Input Report. */
#define OUTPUT_REP_REF_ID                1                                              /**&amp;lt; Id of reference to Keyboard Output Report. *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;/
I changed the report IDs in the array also. now it looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static uint8_t report_map_data[] =
{
0x05, 0x01,                 // Usage Page (Generic Desktop)
0x09, 0x06,                 // Usage (Keyboard)
0xA1, 0x01,                 // Collection (Application)
// Report ID 1:
0x85, 0x01,                 //     Report Id 1
0x05, 0x07,                 //     Usage Page (Key Codes)
0x19, 0xe0,                 //     Usage Minimum (224)
0x29, 0xe7,                 //     Usage Maximum (231)
0x15, 0x00,                 //     Logical Minimum (0)
0x25, 0x01,                 //     Logical Maximum (1)
0x75, 0x01,                 //     Report Size (1)
0x95, 0x08,                 //     Report Count (8)
0x81, 0x02,                 //     Input (Data, Variable, Absolute)

0x95, 0x01,                 //     Report Count (1)
0x75, 0x08,                 //     Report Size (8)
0x81, 0x01,                 //     Input (Constant) reserved byte(1)

0x95, 0x05,                 //     Report Count (5)
0x75, 0x01,                 //     Report Size (1)
0x05, 0x08,                 //     Usage Page (Page# for LEDs)
0x19, 0x01,                 //     Usage Minimum (1)
0x29, 0x05,                 //     Usage Maximum (5)
0x91, 0x02,                 //     Output (Data, Variable, Absolute), Led report
0x95, 0x01,                 //     Report Count (1)
0x75, 0x03,                 //     Report Size (3)
0x91, 0x01,                 //     Output (Data, Variable, Absolute), Led report padding

0x95, 0x06,                 //     Report Count (6)
0x75, 0x08,                 //     Report Size (8)
0x15, 0x00,                 //     Logical Minimum (0)
0x25, 0x65,                 //     Logical Maximum (101)
0x05, 0x07,                 //     Usage Page (Key codes)
0x19, 0x00,                 //     Usage Minimum (0)
0x29, 0x65,                 //     Usage Maximum (101)
0x81, 0x00,                 //     Input (Data, Array) Key array(6 bytes)

0x09, 0x05,                 //     Usage (Vendor Defined)
0x15, 0x00,                 //     Logical Minimum (0)
0x26, 0xFF, 0x00,           //     Logical Maximum (255)
0x75, 0x08,                 //     Report Count (2)
0x95, 0x02,                 //     Report Size (8 bit)
0xB1, 0x02,                 //     Feature (Data, Variable, Absolute)

0xC0,                        // End Collection (Application)

0x09, 0x02,                     // Usage (Mouse)
0xA1, 0x01,                     // Collection (Application)
// Report ID 2: Mouse buttons + scroll/pan
0x85, 0x02,                     //     Report Id 2
0x09, 0x01,                     //     Usage (Pointer)
0xA1, 0x00,                     //     Collection (Physical)
0x95, 0x05,                     //         Report Count (3)
0x75, 0x01,                     //         Report Size (1)
0x05, 0x09,                     //         Usage Page (Buttons)
0x19, 0x01,                     //             Usage Minimum (01)
0x29, 0x05,                     //             Usage Maximum (05)
0x15, 0x00,                     //             Logical Minimum (0)
0x25, 0x01,                     //             Logical Maximum (1)
0x81, 0x02,                     //             Input (Data, Variable, Absolute)
0x95, 0x01,                     //             Report Count (1)
0x75, 0x03,                     //             Report Size (3)
0x81, 0x01,                     //             Input (Constant) for padding
0x75, 0x08,                     //             Report Size (8)
0x95, 0x01,                     //             Report Count (1)
0x05, 0x01,                     //         Usage Page (Generic Desktop)
0x09, 0x38,                     //             Usage (Wheel)
0x15, 0x81,                     //             Logical Minimum (-127)
0x25, 0x7F,                     //             Logical Maximum (127)
0x81, 0x06,                     //             Input (Data, Variable, Relative)
0x05, 0x0C,                     //         Usage Page (Consumer)
0x0A, 0x38, 0x02,               //             Usage (AC Pan)
0x95, 0x01,                     //             Report Count (1)
0x81, 0x06,                     //             Input (Data,Value,Relative,Bit Field)
0xC0,                           //     End Collection (Physical)

// Report ID 3: Mouse motion
0x85, 0x03,                     //     Report Id 3
0x09, 0x01,                     //     Usage (Pointer)
0xA1, 0x00,                     //     Collection (Physical)
0x75, 0x0C,                     //         Report Size (12)
0x95, 0x02,                     //         Report Count (2)
0x05, 0x01,                     //         Usage Page (Generic Desktop)
0x09, 0x30,                     //             Usage (X)
0x09, 0x31,                     //             Usage (Y)
0x16, 0x01, 0xF8,               //             Logical maximum (2047)
0x26, 0xFF, 0x07,               //             Logical minimum (-2047)
0x81, 0x06,                     //             Input (Data, Variable, Relative)
0xC0,                           //     End Collection (Physical)
0xC0,                           // End Collection (Application)

// Report ID 3: Advanced buttons
0x05, 0x0C,                     // Usage Page (Consumer)
0x09, 0x01,                     // Usage (Consumer Control)
0xA1, 0x01,                     // Collection (Application)
0x85, 0x04,                     //     Report Id 4
0x15, 0x00,                     //     Logical minimum (0)
0x25, 0x01,                     //     Logical maximum (1)
0x75, 0x01,                     //     Report Size (1)
0x95, 0x01,                     //     Report Count (1)

0x09, 0xCD,                     //     Usage (Play/Pause)
0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
0x0A, 0x83, 0x01,               //     Usage (AL Consumer Control Configuration)
0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
0x09, 0xB5,                     //     Usage (Scan Next Track)
0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
0x09, 0xB6,                     //     Usage (Scan Previous Track)
0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)

0x09, 0xEA,                     //     Usage (Volume Down)
0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
0x09, 0xE9,                     //     Usage (Volume Up)
0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
0x0A, 0x25, 0x02,               //     Usage (AC Forward)
0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
0x0A, 0x24, 0x02,               //     Usage (AC Back)
0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
0xC0                            // End Collection
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;But Windows 8.1 still shows Driver Error.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: mouse + keyboard combo</title><link>https://devzone.nordicsemi.com/thread/15659?ContentTypeID=1</link><pubDate>Tue, 11 Nov 2014 14:55:41 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:fd1c7c3a-32cc-46ee-bb62-c6d7f51e6c5e</guid><dc:creator>H&amp;#229;kon Alseth</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;The USB descriptor will most likely not be accepted by the OS on the central side.
This is because how you&amp;#39;ve setup the report IDs in report_map_data[] array.&lt;/p&gt;
&lt;p&gt;The only scenario when you are allowed to not specify a report ID on a descriptor is when this is the only descriptor present on your device. Then this will be interpreted as report ID &amp;#39;0&amp;#39; (which is not legal to specify directly in the USB spec).&lt;/p&gt;
&lt;p&gt;You need to alter two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start your keyboard descriptor with REPORT ID 1 and increment for each new usage&lt;/li&gt;
&lt;li&gt;Do the same with all defines being set in &amp;quot;p_input_report-&amp;gt;rep_ref.report_id&amp;quot;. &amp;quot;INPUT_REP_REF_ID&amp;quot; should be &amp;#39;1&amp;#39;, &amp;quot;INPUT_REP_REF_BUTTONS_ID&amp;quot; should be &amp;#39;2&amp;#39; etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that when you are sending data over the BLE-link, you should use the INDEX define, which should start from &amp;#39;0&amp;#39; again.
For instance, to send button data:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ble_hids_inp_rep_send(&amp;amp;m_hids, INPUT_REP_BUTTONS_INDEX, INPUT_REP_BUTTONS_LEN, buttons_buffer);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;edit&lt;/em&gt; Here&amp;#39;s the proposed fixes in the descriptor as well:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static uint8_t report_map_data[] =
{
    0x05, 0x01,                 // Usage Page (Generic Desktop)
    0x09, 0x06,                 // Usage (Keyboard)
    0xA1, 0x01,                 // Collection (Application)
    0x85, 0x01,                 //     Report Id 1
    0x05, 0x07,                 //     Usage Page (Key Codes)
    0x19, 0xe0,                 //     Usage Minimum (224)
    0x29, 0xe7,                 //     Usage Maximum (231)
    0x15, 0x00,                 //     Logical Minimum (0)
    0x25, 0x01,                 //     Logical Maximum (1)
    0x75, 0x01,                 //     Report Size (1)
    0x95, 0x08,                 //     Report Count (8)
    0x81, 0x02,                 //     Input (Data, Variable, Absolute)

    0x95, 0x01,                 //     Report Count (1)
    0x75, 0x08,                 //     Report Size (8)
    0x81, 0x01,                 //     Input (Constant) reserved byte(1)

    0x95, 0x05,                 //     Report Count (5)
    0x75, 0x01,                 //     Report Size (1)
    0x05, 0x08,                 //     Usage Page (Page# for LEDs)
    0x19, 0x01,                 //     Usage Minimum (1)
    0x29, 0x05,                 //     Usage Maximum (5)
    0x91, 0x02,                 //     Output (Data, Variable, Absolute), Led report
    0x95, 0x01,                 //     Report Count (1)
    0x75, 0x03,                 //     Report Size (3)
    0x91, 0x01,                 //     Output (Data, Variable, Absolute), Led report padding

    0x95, 0x06,                 //     Report Count (6)
    0x75, 0x08,                 //     Report Size (8)
    0x15, 0x00,                 //     Logical Minimum (0)
    0x25, 0x65,                 //     Logical Maximum (101)
    0x05, 0x07,                 //     Usage Page (Key codes)
    0x19, 0x00,                 //     Usage Minimum (0)
    0x29, 0x65,                 //     Usage Maximum (101)
    0x81, 0x00,                 //     Input (Data, Array) Key array(6 bytes)

    0x09, 0x05,                 //     Usage (Vendor Defined)
    0x15, 0x00,                 //     Logical Minimum (0)
    0x26, 0xFF, 0x00,           //     Logical Maximum (255)
    0x75, 0x08,                 //     Report Count (2)
    0x95, 0x02,                 //     Report Size (8 bit)
    0xB1, 0x02,                 //     Feature (Data, Variable, Absolute)

    0xC0,                        // End Collection (Application)

    0x09, 0x02,                     // Usage (Mouse)
    0xA1, 0x01,                     // Collection (Application)
    // Report ID 2: Mouse buttons + scroll/pan
    0x85, 0x02,                     //     Report Id 2
    0x09, 0x01,                     //     Usage (Pointer)
    0xA1, 0x00,                     //     Collection (Physical)
    0x95, 0x05,                     //         Report Count (3)
    0x75, 0x01,                     //         Report Size (1)
    0x05, 0x09,                     //         Usage Page (Buttons)
    0x19, 0x01,                     //             Usage Minimum (01)
    0x29, 0x05,                     //             Usage Maximum (05)
    0x15, 0x00,                     //             Logical Minimum (0)
    0x25, 0x01,                     //             Logical Maximum (1)
    0x81, 0x02,                     //             Input (Data, Variable, Absolute)
    0x95, 0x01,                     //             Report Count (1)
    0x75, 0x03,                     //             Report Size (3)
    0x81, 0x01,                     //             Input (Constant) for padding
    0x75, 0x08,                     //             Report Size (8)
    0x95, 0x01,                     //             Report Count (1)
    0x05, 0x01,                     //         Usage Page (Generic Desktop)
    0x09, 0x38,                     //             Usage (Wheel)
    0x15, 0x81,                     //             Logical Minimum (-127)
    0x25, 0x7F,                     //             Logical Maximum (127)
    0x81, 0x06,                     //             Input (Data, Variable, Relative)
    0x05, 0x0C,                     //         Usage Page (Consumer)
    0x0A, 0x38, 0x02,               //             Usage (AC Pan)
    0x95, 0x01,                     //             Report Count (1)
    0x81, 0x06,                     //             Input (Data,Value,Relative,Bit Field)
    0xC0,                           //     End Collection (Physical)

    // Report ID 3: Mouse motion
    0x85, 0x03,                     //     Report Id 2
    0x09, 0x01,                     //     Usage (Pointer)
    0xA1, 0x00,                     //     Collection (Physical)
    0x75, 0x0C,                     //         Report Size (12)
    0x95, 0x02,                     //         Report Count (2)
    0x05, 0x01,                     //         Usage Page (Generic Desktop)
    0x09, 0x30,                     //             Usage (X)
    0x09, 0x31,                     //             Usage (Y)
    0x16, 0x01, 0xF8,               //             Logical maximum (2047)
    0x26, 0xFF, 0x07,               //             Logical minimum (-2047)
    0x81, 0x06,                     //             Input (Data, Variable, Relative)
    0xC0,                           //     End Collection (Physical)
    0xC0,                           // End Collection (Application)

    // Report ID 4: Advanced buttons
    0x05, 0x0C,                     // Usage Page (Consumer)
    0x09, 0x01,                     // Usage (Consumer Control)
    0xA1, 0x01,                     // Collection (Application)
    0x85, 0x04,                     //     Report Id (3)
    0x15, 0x00,                     //     Logical minimum (0)
    0x25, 0x01,                     //     Logical maximum (1)
    0x75, 0x01,                     //     Report Size (1)
    0x95, 0x01,                     //     Report Count (1)

    0x09, 0xCD,                     //     Usage (Play/Pause)
    0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
    0x0A, 0x83, 0x01,               //     Usage (AL Consumer Control Configuration)
    0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
    0x09, 0xB5,                     //     Usage (Scan Next Track)
    0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
    0x09, 0xB6,                     //     Usage (Scan Previous Track)
    0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)

    0x09, 0xEA,                     //     Usage (Volume Down)
    0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
    0x09, 0xE9,                     //     Usage (Volume Up)
    0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
    0x0A, 0x25, 0x02,               //     Usage (AC Forward)
    0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
    0x0A, 0x24, 0x02,               //     Usage (AC Back)
    0x81, 0x06,                     //     Input (Data,Value,Relative,Bit Field)
    0xC0                            // End Collection

    };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cheers,
Håkon&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>