This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Zephyr HID mouse and keyboard sample

I need to implement a mouse and keyboard (combo) HOG device.

There are mouse and keyboard samples, but may I integrate them in just one?

Is there any samplecode?

I have already write the reports data describing mouse and keyboard, each one with its REPORT ID, but it is not working...

Thanks in advance!

Aleks

Parents
  • Hi  Thank you for your answer! 

    I have already created a unique report map, and i  am sending the reports with different "report id" (as i defined in the map) in the first byte, but it still not works. 

    It seems the report id is being ignored.

    Do i need to do something else when i define multiple devices?

    Regards, Aleks

    ps: I am using Zephyr framework

  • Hi Aleks

    Have you made sure that all the report ID's in the report map are unique, and that the values correspond to the ones you send in the payload?

    Also, I believe the report ID has to start at 1 and increment from there, not from 0. 

    Maybe you can share the HIDS init function with me so I can have a look at it?

    Best regards
    Torbjørn

  • Hi Torbjørn

    I am working in a project a little complex and we are trying to "materialize" all the proof of concepts to be sure that the project is really feasible.  

    So, one of them, is get the composite device working. 

    I got the hog (samples/bluetooth/peripheral_hids) sample in the zephyr repository and I already had success to make it work with keyboard and mouse report maps, but only in separate. 

    The report id starts in 1.

    I am not sure if the ATT must be changed when I use both devices at the same time.

    BT_GATT_SERVICE_DEFINE(
        hog_svc, BT_GATT_PRIMARY_SERVICE(BT_UUID_HIDS),
        BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_INFO, BT_GATT_CHRC_READ,
                               BT_GATT_PERM_READ, read_info, NULL, &info),
        BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_REPORT_MAP, BT_GATT_CHRC_READ,
                               BT_GATT_PERM_READ, read_report_map, NULL, NULL),
        BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_REPORT,
                               BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY,
                               BT_GATT_PERM_READ, read_input_report, NULL, //AUTHEN
                               NULL),
        BT_GATT_CCC(input_ccc_changed,
                    BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), //AUTHEN read e write
        BT_GATT_DESCRIPTOR(BT_UUID_HIDS_REPORT_REF, BT_GATT_PERM_READ, read_report,
                           NULL, &input),
        BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_CTRL_POINT,
                               BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE,
                               NULL, write_ctrl_point, &ctrl_point),
    
    
    );

    Thank you!

  • Hi Aleks

    It shouldn't be necessary to make any changes to the way the service is put together, no. 

    Either you have to setup a single HoG service that implements both mouse and keyboard as one (using different report ID's and a combined report map), or you would need to configure two independent HoG services that implement mouse and keyboard separately. 

    Have you tried to combine the hid_init() function from the two examples into one?

    Best regards
    Torbjørn

Reply
  • Hi Aleks

    It shouldn't be necessary to make any changes to the way the service is put together, no. 

    Either you have to setup a single HoG service that implements both mouse and keyboard as one (using different report ID's and a combined report map), or you would need to configure two independent HoG services that implement mouse and keyboard separately. 

    Have you tried to combine the hid_init() function from the two examples into one?

    Best regards
    Torbjørn

Children
  • Hi Torbjørn,

      I really do not understand what is happening.

      See, below is my report map:

        0x05, 0x01, // Usage Pg (Generic Desktop)
        0x09, 0x06, // Usage (Keyboard)
        0xA1, 0x01, // Collection: (Application)
        0x85, 0x01, // Report Id (1)
        //
        0x05, 0x07, //   Usage Pg (Key Codes)
        0x19, 0xE0, //   Usage Min (224)
        0x29, 0xE7, //   Usage Max (231)
        0x15, 0x00, //   Log Min (0)
        0x25, 0x01, //   Log Max (1)
        //
        //   Modifier byte
        0x75, 0x01, //   Report Size (1)
        0x95, 0x08, //   Report Count (8)
        0x81, 0x02, //   Input: (Data, Variable, Absolute)
        //
        //   Reserved byte
        0x95, 0x01, //   Report Count (1)
        0x75, 0x08, //   Report Size (8)
        0x81, 0x01, //   Input: (Constant)
        //
        //   LED report
        0x95, 0x05, //   Report Count (5)
        0x75, 0x01, //   Report Size (1)
        0x05, 0x08, //   Usage Pg (LEDs)
        0x19, 0x01, //   Usage Min (1)
        0x29, 0x05, //   Usage Max (5)
        0x91, 0x02, //   Output: (Data, Variable, Absolute)
        //
        //   LED report padding
        0x95, 0x01, //   Report Count (1)
        0x75, 0x03, //   Report Size (3)
        0x91, 0x01, //   Output: (Constant)
        //
        //   Key arrays (6 bytes)
        0x95, 0x06, //   Report Count (6)
        0x75, 0x08, //   Report Size (8)
        0x15, 0x00, //   Log Min (0)
        0x25, 0x65, //   Log Max (101)
        0x05, 0x07, //   Usage Pg (Key Codes)
        0x19, 0x00, //   Usage Min (0)
        0x29, 0x65, //   Usage Max (101)
        0x81, 0x00, //   Input: (Data, Array)
        //
        0xC0, // End Collection
        //
    
    
        0x05, 0x01, // Usage Page (Generic Desktop)
        0x09, 0x02, // Usage (Mouse)
        0xA1, 0x01, // Collection (Application)
        0x85, 0x02, // Report Id (2)
        0x09, 0x01, //   Usage (Pointer)
        0xA1, 0x00, //   Collection (Physical)
        0x05, 0x09, //     Usage Page (Buttons)
        0x19, 0x01, //     Usage Minimum (01) - Button 1
        0x29, 0x03, //     Usage Maximum (03) - Button 3
        0x15, 0x00, //     Logical Minimum (0)
        0x25, 0x01, //     Logical Maximum (1)
        0x75, 0x01, //     Report Size (1)
        0x95, 0x03, //     Report Count (3)
        0x81, 0x02, //     Input (Data, Variable, Absolute) - Button states
        0x75, 0x05, //     Report Size (5)
        0x95, 0x01, //     Report Count (1)
        0x81, 0x01, //     Input (Constant) - Padding or Reserved bits
        0x05, 0x01, //     Usage Page (Generic Desktop)
        0x09, 0x30, //     Usage (X)
        0x09, 0x31, //     Usage (Y)
        0x09, 0x38, //     Usage (Wheel)
        0x15, 0x81, //     Logical Minimum (-127)
        0x25, 0x7F, //     Logical Maximum (127)
        0x75, 0x08, //     Report Size (8)
        0x95, 0x03, //     Report Count (3)
        0x81, 0x06, //     Input (Data, Variable, Relative) - X & Y coordinate
        0xC0,       //   End Collection
        0xC0,       // End Collection
    

    When i connect the device (named SAFE), the OS (Linux) got 2 new devices :

    dmesg:
    
    [ 1556.472958] input: SAFE Keyboard as /devices/virtual/misc/uhid/0005:0000:0000.0050/input/input176
    [ 1556.473985] input: SAFE Mouse as /devices/virtual/misc/uhid/0005:0000:0000.0050/input/input177
    [ 1556.474294] hid-generic 0005:0000:0000.0050: input,hidraw3: BLUETOOTH HID v0.01 Keyboard [SAFE] on 00:1a:7d:da:71:0a

    From btmon, i am intending to send messages to mouse using '2' as preamble so i can verify:

    > ACL Data RX: Handle 71 flags 0x02 dlen 12                                                                                                                 #108 [hci2] 6.972096
          ATT: Handle Value Notification (0x1b) len 7
            Handle: 0x0024
              Data: 0200000000
    > ACL Data RX: Handle 71 flags 0x02 dlen 12                                                                                                                 #109 [hci2] 7.021703
          ATT: Handle Value Notification (0x1b) len 7
            Handle: 0x0024
              Data: 0201001400  <----- (button pressed dx=0, dy=20, wheel=0) ok!
    ...

    But it is being interpreted as keyboard output,  echoing only characters....

    Do you have any clue?

    Thanks, Aleks

  • Hi Aleks

    Are you able to share your sample with me so I can try to reproduce the issue on my side?

    If you don't want to share your code in a public case just let me know, and I will make the case private.

    Best regards
    Torbjørn

Related