<?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>Integrating HID mouse and HID keyboard.</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/66704/integrating-hid-mouse-and-hid-keyboard</link><description>Hi, 
 I want to integrate HID mouse and HID keyboard in a single device. Can you tell me the complete configuration procedure to integrate HID mouse and HID keyboard in a single HID device? 
 Thanks</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Thu, 08 Oct 2020 17:02:21 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/66704/integrating-hid-mouse-and-hid-keyboard" /><item><title>RE: Integrating HID mouse and HID keyboard.</title><link>https://devzone.nordicsemi.com/thread/273856?ContentTypeID=1</link><pubDate>Thu, 08 Oct 2020 17:02:21 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2b8dfbf5-83d6-4f5b-a278-81fce01b9d79</guid><dc:creator>awneil</dc:creator><description>&lt;p&gt;&lt;img alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/320x240/__key/communityserver-discussions-components-files/4/1541._5F00_Verify_2D00_answer_2D00_nordic_5F00_2.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Integrating HID mouse and HID keyboard.</title><link>https://devzone.nordicsemi.com/thread/273350?ContentTypeID=1</link><pubDate>Wed, 07 Oct 2020 05:37:00 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8d62556b-09d5-4762-9f5d-e6aed816a48b</guid><dc:creator>him</dc:creator><description>&lt;p&gt;Thanks, Kenneth my problem is solved.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Integrating HID mouse and HID keyboard.</title><link>https://devzone.nordicsemi.com/thread/273236?ContentTypeID=1</link><pubDate>Tue, 06 Oct 2020 12:59:18 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:dce60218-cb66-49c3-bdec-abe8726d088b</guid><dc:creator>Kenneth</dc:creator><description>&lt;p&gt;I recommend to parse the report map from the case I linked and yours here:&lt;br /&gt;&lt;a href="http://eleccelerator.com/usbdescreqparser/"&gt;http://eleccelerator.com/usbdescreqparser/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hopefully this should help you find differences between the two, e.g. have you tried using the report map as-is from the case I linked?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Integrating HID mouse and HID keyboard.</title><link>https://devzone.nordicsemi.com/thread/273074?ContentTypeID=1</link><pubDate>Tue, 06 Oct 2020 05:42:23 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:adb5cbf6-b270-491c-ac74-137bcfc50d15</guid><dc:creator>him</dc:creator><description>&lt;p&gt;Hi Kenneth&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Thanks for the reply. I have tested that report map and descriptor, HID connects successfully but does not send any data or show any error.&lt;/p&gt;
&lt;p&gt;Here are my&amp;nbsp;report ID, report map, and hids_init().&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Report ID&amp;#39;s&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;#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         0                                           /**&amp;lt; Index of Mouse Input Report containing button data. */
#define INPUT_REP_MOVEMENT_INDEX        1                                           /**&amp;lt; Index of Mouse Input Report containing movement data. */
#define INPUT_REP_MPLAYER_INDEX         2                                           /**&amp;lt; Index of Mouse Input Report containing media player data. */
#define INPUT_REP_REF_BUTTONS_ID        1                                           /**&amp;lt; Id of reference to Mouse Input Report containing button data. */
#define INPUT_REP_REF_MOVEMENT_ID       2                                           /**&amp;lt; Id of reference to Mouse Input Report containing movement data. */
#define INPUT_REP_REF_MPLAYER_ID        3                                           /**&amp;lt; Id of reference to Mouse Input Report containing media player data. */

#define INPUT_REPORT_KEYS_MAX_LEN           8   

//---------------------------
#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             3                                          /**&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                    0                                          /**&amp;lt; Id of reference to Keyboard Input Report. */
#define OUTPUT_REP_REF_ID                   0                                          /**&amp;lt; Id of reference to Keyboard Output Report. */
#define FEATURE_REP_REF_ID                  0                                          /**&amp;lt; ID of reference to Keyboard Feature Report. */
#define FEATURE_REPORT_MAX_LEN              2                                          /**&amp;lt; Maximum length of Feature Report. */
#define FEATURE_REPORT_INDEX                0  &lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;hids_init()&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;static void hids_init(void)
{
    ret_code_t                    err_code;
    ble_hids_init_t               hids_init_obj;

    ble_hids_init_t               hids_init_obj_keyboard;
    ble_hids_init_t               hids_init_obj_mouse;

    ble_hids_inp_rep_init_t     * p_input_report;
    ble_hids_outp_rep_init_t    * p_output_report;
    ble_hids_feature_rep_init_t * p_feature_report;
    uint8_t                       hid_info_flags;

    static ble_hids_inp_rep_init_t input_report_array[INPUT_REPORT_COUNT];
    static ble_hids_outp_rep_init_t    output_report_array[1];
    static ble_hids_feature_rep_init_t feature_report_array[1];
    static uint8_t report_map_data[] =
    {
        0x05, 0x01, // Usage Page (Generic Desktop)
        0x09, 0x02, // Usage (Mouse)

        0xA1, 0x01, // Collection (Application)

        // Report ID 1: Mouse buttons + scroll/pan
        0x85, 0x01,       // Report Id 1
        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 2: Mouse motion
        0x85, 0x02,       // 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 3: Advanced buttons
        0x05, 0x0C,       // Usage Page (Consumer)
        0x09, 0x01,       // Usage (Consumer Control)
        0xA1, 0x01,       // Collection (Application)
        0x85, 0x03,       // 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
		
//------------------------------------------------------		
        0x05, 0x01,       // Usage Page (Generic Desktop)
        0x09, 0x06,       // Usage (Keyboard)
        0xA1, 0x01,       // Collection (Application)
	0x85, 0x04,       // Report Id 4
        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 Size (8 bit)
        0x95, 0x02,       // Report Count (2)
        0xB1, 0x02,       // Feature (Data, Variable, Absolute)

        0xC0              // End Collection (Application)
    };

    memset((void *)input_report_array, 0, sizeof(ble_hids_inp_rep_init_t));
    memset((void *)output_report_array, 0, sizeof(ble_hids_outp_rep_init_t));
    memset((void *)feature_report_array, 0, sizeof(ble_hids_feature_rep_init_t));

    // Initialize HID Service
    p_input_report                      = &amp;amp;input_report_array[INPUT_REPORT_KEYS_INDEX];
    p_input_report-&amp;gt;max_len             = INPUT_REPORT_KEYS_MAX_LEN;
    p_input_report-&amp;gt;rep_ref.report_id   = INPUT_REP_REF_ID;
    p_input_report-&amp;gt;rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT;

    p_input_report-&amp;gt;sec.cccd_wr = SEC_JUST_WORKS;
    p_input_report-&amp;gt;sec.wr      = SEC_JUST_WORKS;
    p_input_report-&amp;gt;sec.rd      = SEC_JUST_WORKS;

    p_output_report                      = &amp;amp;output_report_array[OUTPUT_REPORT_INDEX];
    p_output_report-&amp;gt;max_len             = OUTPUT_REPORT_MAX_LEN;
    p_output_report-&amp;gt;rep_ref.report_id   = OUTPUT_REP_REF_ID;
    p_output_report-&amp;gt;rep_ref.report_type = BLE_HIDS_REP_TYPE_OUTPUT;

    p_output_report-&amp;gt;sec.wr = SEC_JUST_WORKS;
    p_output_report-&amp;gt;sec.rd = SEC_JUST_WORKS;

    p_feature_report                      = &amp;amp;feature_report_array[FEATURE_REPORT_INDEX];
    p_feature_report-&amp;gt;max_len             = FEATURE_REPORT_MAX_LEN;
    p_feature_report-&amp;gt;rep_ref.report_id   = FEATURE_REP_REF_ID;
    p_feature_report-&amp;gt;rep_ref.report_type = BLE_HIDS_REP_TYPE_FEATURE;

    p_feature_report-&amp;gt;sec.rd              = SEC_JUST_WORKS;
    p_feature_report-&amp;gt;sec.wr              = SEC_JUST_WORKS;

//--------------------------------------
    // Initialize HID Service.
    p_input_report                      = &amp;amp;input_report_array[INPUT_REP_BUTTONS_INDEX];
    p_input_report-&amp;gt;max_len             = INPUT_REP_BUTTONS_LEN;
    p_input_report-&amp;gt;rep_ref.report_id   = INPUT_REP_REF_BUTTONS_ID;
    p_input_report-&amp;gt;rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT;

    p_input_report-&amp;gt;sec.cccd_wr = SEC_JUST_WORKS;
    p_input_report-&amp;gt;sec.wr      = SEC_JUST_WORKS;
    p_input_report-&amp;gt;sec.rd      = SEC_JUST_WORKS;

    p_input_report                      = &amp;amp;input_report_array[INPUT_REP_MOVEMENT_INDEX];
    p_input_report-&amp;gt;max_len             = INPUT_REP_MOVEMENT_LEN;
    p_input_report-&amp;gt;rep_ref.report_id   = INPUT_REP_REF_MOVEMENT_ID;
    p_input_report-&amp;gt;rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT;

    p_input_report-&amp;gt;sec.cccd_wr = SEC_JUST_WORKS;
    p_input_report-&amp;gt;sec.wr      = SEC_JUST_WORKS;
    p_input_report-&amp;gt;sec.rd      = SEC_JUST_WORKS;

    p_input_report                      = &amp;amp;input_report_array[INPUT_REP_MPLAYER_INDEX];
    p_input_report-&amp;gt;max_len             = INPUT_REP_MEDIA_PLAYER_LEN;
    p_input_report-&amp;gt;rep_ref.report_id   = INPUT_REP_REF_MPLAYER_ID;
    p_input_report-&amp;gt;rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT;

    p_input_report-&amp;gt;sec.cccd_wr = SEC_JUST_WORKS;
    p_input_report-&amp;gt;sec.wr      = SEC_JUST_WORKS;
    p_input_report-&amp;gt;sec.rd      = SEC_JUST_WORKS;


    hid_info_flags = HID_INFO_FLAG_REMOTE_WAKE_MSK | HID_INFO_FLAG_NORMALLY_CONNECTABLE_MSK;

    memset(&amp;amp;hids_init_obj, 0, sizeof(hids_init_obj));

    hids_init_obj.evt_handler                    = on_hids_evt;
    hids_init_obj.error_handler                  = service_error_handler;
    hids_init_obj.is_kb                          = true;
    hids_init_obj.is_mouse                       = true;
    hids_init_obj.inp_rep_count                  = 4;
    hids_init_obj.p_inp_rep_array                = input_report_array;
    hids_init_obj.outp_rep_count                 = 1;
    hids_init_obj.p_outp_rep_array               = output_report_array;
    hids_init_obj.feature_rep_count              = 1;
    hids_init_obj.p_feature_rep_array            = feature_report_array;
    hids_init_obj.rep_map.data_len               = sizeof(report_map_data);
    hids_init_obj.rep_map.p_data                 = report_map_data;
    hids_init_obj.hid_information.bcd_hid        = BASE_USB_HID_SPEC_VERSION;
    hids_init_obj.hid_information.b_country_code = 0;
    hids_init_obj.hid_information.flags          = hid_info_flags;
    hids_init_obj.included_services_count        = 0;
    hids_init_obj.p_included_services_array      = NULL;

    hids_init_obj.rep_map.rd_sec         = SEC_JUST_WORKS;
    hids_init_obj.hid_information.rd_sec = SEC_JUST_WORKS;

    hids_init_obj.boot_kb_inp_rep_sec.cccd_wr = SEC_JUST_WORKS;
    hids_init_obj.boot_kb_inp_rep_sec.wr      = SEC_JUST_WORKS;
    hids_init_obj.boot_kb_inp_rep_sec.rd      = SEC_JUST_WORKS;

    hids_init_obj.boot_kb_outp_rep_sec.rd = SEC_JUST_WORKS;
    hids_init_obj.boot_kb_outp_rep_sec.wr = SEC_JUST_WORKS;
	
    hids_init_obj.boot_mouse_inp_rep_sec.cccd_wr = SEC_JUST_WORKS;
    hids_init_obj.boot_mouse_inp_rep_sec.wr      = SEC_JUST_WORKS;
    hids_init_obj.boot_mouse_inp_rep_sec.rd      = SEC_JUST_WORKS;


    hids_init_obj.protocol_mode_rd_sec = SEC_JUST_WORKS;
    hids_init_obj.protocol_mode_wr_sec = SEC_JUST_WORKS;
    hids_init_obj.ctrl_point_wr_sec    = SEC_JUST_WORKS;

    err_code = ble_hids_init(&amp;amp;m_hids, &amp;amp;hids_init_obj);
    APP_ERROR_CHECK(err_code);
}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Integrating HID mouse and HID keyboard.</title><link>https://devzone.nordicsemi.com/thread/273022?ContentTypeID=1</link><pubDate>Mon, 05 Oct 2020 14:38:37 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:01a2d4a8-77d0-449c-bc52-051617d63bb6</guid><dc:creator>Kenneth</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;You will need to combine the hid keyboard and hid mouse example in this case, in specific look at the implementation of hids_init() in terms of updating the report_map and adjusting the number of input reports and report indexes.&lt;/p&gt;
&lt;p&gt;This old answer should still be valid for most part, since the report map show how it looks for a combined keyboard+mouse:&lt;br /&gt;&lt;a href="https://devzone.nordicsemi.com/f/nordic-q-a/4408/mouse-keyboard-combo/15659#15659"&gt;https://devzone.nordicsemi.com/f/nordic-q-a/4408/mouse-keyboard-combo/15659#15659&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;br /&gt;Kenneth&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>