bluez icon indicating copy to clipboard operation
bluez copied to clipboard

HP Elite Presenter Mouse fail

Open guilhem opened this issue 2 years ago • 22 comments

Product

2-in-1 mouse + presentation image image

https://www.hp.com/emea_africa-en/products/accessories/product-details/23564275

Symptom

Connection OK Movement KO Reconnection KO

Version

$ /usr/local/libexec/bluetooth/bluetoothd -v
5.64
$ uname -r
5.17.0-051700rc8-generic

Log with debug

connecting:

src/device.c:device_connect_le() Connection attempt to: E3:AC:9F:00:8E:12
src/adapter.c:connected_callback() hci0 device E3:AC:9F:00:8E:12 connected eir_len 31
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=1
src/device.c:load_gatt_db() Restoring E3:AC:9F:00:8E:12 gatt database from file
src/device.c:load_gatt_db() No cache for E3:AC:9F:00:8E:12
src/gatt-client.c:btd_gatt_client_connected() Device connected.
src/device.c:gatt_debug() MTU exchange complete, with MTU: 23
src/device.c:gatt_debug() Primary services found: 6
src/device.c:gatt_debug() start: 0x0001, end: 0x0007, uuid: 00001800-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() start: 0x0008, end: 0x000b, uuid: 00001801-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() start: 0x000c, end: 0x0012, uuid: 0000180a-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() start: 0x0013, end: 0x0016, uuid: 0000180f-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() start: 0x0017, end: 0x001e, uuid: 00001530-1212-efde-1523-785feabcd123
src/device.c:gatt_debug() start: 0x001f, end: 0xffff, uuid: 00001812-0000-1000-8000-00805f9b34fb
src/adapter.c:user_confirm_request_callback() hci0 E3:AC:9F:00:8E:12 confirm_hint 1
src/device.c:new_auth() Requesting agent authentication for E3:AC:9F:00:8E:12
src/agent.c:agent_ref() 0x55fbda071440: ref=2
src/agent.c:agent_request_authorization() Calling Agent.RequestAuthorization: name=:1.408, path=/org/bluez/agent/blueman
src/device.c:gatt_debug() Characteristics found: 22
src/device.c:gatt_debug() start: 0x0002, end: 0x0003, value: 0x0003, props: 0x0a, uuid: 00002a00-0000-1
src/device.c:gatt_debug() start: 0x0004, end: 0x0005, value: 0x0005, props: 0x02, uuid: 00002a01-0000-1
src/device.c:gatt_debug() start: 0x0006, end: 0x0008, value: 0x0007, props: 0x02, uuid: 00002a04-0000-1
src/device.c:gatt_debug() start: 0x0009, end: 0x000c, value: 0x000a, props: 0x20, uuid: 00002a05-0000-1
src/device.c:gatt_debug() start: 0x000d, end: 0x000e, value: 0x000e, props: 0x02, uuid: 00002a29-0000-1
src/device.c:gatt_debug() start: 0x000f, end: 0x0010, value: 0x0010, props: 0x02, uuid: 00002a26-0000-1
src/device.c:gatt_debug() start: 0x0011, end: 0x0013, value: 0x0012, props: 0x02, uuid: 00002a50-0000-1
src/device.c:gatt_debug() start: 0x0014, end: 0x0017, value: 0x0015, props: 0x12, uuid: 00002a19-0000-1
src/device.c:gatt_debug() start: 0x0018, end: 0x0019, value: 0x0019, props: 0x04, uuid: 00001532-1212-e
src/device.c:gatt_debug() start: 0x001a, end: 0x001c, value: 0x001b, props: 0x18, uuid: 00001531-1212-e
src/device.c:gatt_debug() start: 0x001d, end: 0x001f, value: 0x001e, props: 0x02, uuid: 00001534-1212-e
src/device.c:gatt_debug() start: 0x0020, end: 0x0021, value: 0x0021, props: 0x06, uuid: 00002a4e-0000-1
src/device.c:gatt_debug() start: 0x0022, end: 0x0025, value: 0x0023, props: 0x1a, uuid: 00002a4d-0000-1
src/device.c:gatt_debug() start: 0x0026, end: 0x0029, value: 0x0027, props: 0x1a, uuid: 00002a4d-0000-1
src/device.c:gatt_debug() start: 0x002a, end: 0x002d, value: 0x002b, props: 0x1a, uuid: 00002a4d-0000-1
src/device.c:gatt_debug() start: 0x002e, end: 0x0031, value: 0x002f, props: 0x1a, uuid: 00002a4d-0000-1
src/device.c:gatt_debug() start: 0x0032, end: 0x0035, value: 0x0033, props: 0x1a, uuid: 00002a4d-0000-1
src/device.c:gatt_debug() start: 0x0036, end: 0x0038, value: 0x0037, props: 0x0a, uuid: 00002a4d-0000-1
src/device.c:gatt_debug() start: 0x0039, end: 0x003a, value: 0x003a, props: 0x02, uuid: 00002a4b-0000-1
src/device.c:gatt_debug() start: 0x003b, end: 0x003d, value: 0x003c, props: 0x1a, uuid: 00002a33-0000-1
src/device.c:gatt_debug() start: 0x003e, end: 0x003f, value: 0x003f, props: 0x02, uuid: 00002a4a-0000-1
src/device.c:gatt_debug() start: 0x0040, end: 0xffff, value: 0x0041, props: 0x04, uuid: 00002a4c-0000-1
src/device.c:gatt_debug() Descriptors found: 2
src/device.c:gatt_debug() handle: 0x0024, uuid: 00002902-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() handle: 0x0025, uuid: 00002908-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() Descriptors found: 2
src/device.c:gatt_debug() handle: 0x0028, uuid: 00002902-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() handle: 0x0029, uuid: 00002908-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() Descriptors found: 2
src/device.c:gatt_debug() handle: 0x002c, uuid: 00002902-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() handle: 0x002d, uuid: 00002908-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() Descriptors found: 2
src/device.c:gatt_debug() handle: 0x0030, uuid: 00002902-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() handle: 0x0031, uuid: 00002908-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() Descriptors found: 2
src/device.c:gatt_debug() handle: 0x0034, uuid: 00002902-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() handle: 0x0035, uuid: 00002908-0000-1000-8000-00805f9b34fb
src/device.c:gatt_debug() Descriptors found: 1
src/device.c:gatt_debug() handle: 0x0038, uuid: 00002908-0000-1000-8000-00805f9b34fb
src/device.c:gatt_client_ready_cb() status: success, error: 10
src/device.c:update_gatt_uuids() UUID Added: 00001800-0000-1000-8000-00805f9b34fb
src/device.c:update_gatt_uuids() UUID Added: 00001801-0000-1000-8000-00805f9b34fb
src/device.c:update_gatt_uuids() UUID Added: 0000180a-0000-1000-8000-00805f9b34fb
src/device.c:update_gatt_uuids() UUID Added: 0000180f-0000-1000-8000-00805f9b34fb
src/device.c:update_gatt_uuids() UUID Added: 00001530-1212-efde-1523-785feabcd123
src/device.c:update_gatt_uuids() UUID Added: 00001812-0000-1000-8000-00805f9b34fb
src/device.c:device_probe_profiles() Probing profiles for device E3:AC:9F:00:8E:12
profiles/gap/gas.c:gap_probe() GAP profile probe (E3:AC:9F:00:8E:12)
src/service.c:change_state() 0x55fbda06e4f0: device E3:AC:9F:00:8E:12 profile gap-profile state changed: unavailable -> disconnected (0)
profiles/gap/gas.c:gap_accept() GAP profile accept (E3:AC:9F:00:8E:12)
profiles/gap/gas.c:handle_characteristic() Unsupported characteristic: 00002a04-0000-1000-8000-00805f9b34fb
src/service.c:change_state() 0x55fbda06e4f0: device E3:AC:9F:00:8E:12 profile gap-profile state changed: disconnected -> connected (0)
src/device.c:device_probe_profiles() Probing profiles for device E3:AC:9F:00:8E:12
src/device.c:device_probe_profiles() Probing profiles for device E3:AC:9F:00:8E:12
src/service.c:change_state() 0x55fbda0635b0: device E3:AC:9F:00:8E:12 profile deviceinfo state changed: unavailable -> disconnected (0)
profiles/deviceinfo/deviceinfo.c:deviceinfo_accept() deviceinfo profile accept (E3:AC:9F:00:8E:12)
profiles/deviceinfo/deviceinfo.c:handle_characteristic() Unsupported characteristic: 00002a29-0000-1000-8000-00805f9b34fb
profiles/deviceinfo/deviceinfo.c:handle_characteristic() Unsupported characteristic: 00002a26-0000-1000-8000-00805f9b34fb
src/service.c:change_state() 0x55fbda0635b0: device E3:AC:9F:00:8E:12 profile deviceinfo state changed: disconnected -> connected (0)
src/device.c:device_probe_profiles() Probing profiles for device E3:AC:9F:00:8E:12
profiles/battery/battery.c:batt_probe() BATT profile probe (E3:AC:9F:00:8E:12)
src/service.c:change_state() 0x55fbda063650: device E3:AC:9F:00:8E:12 profile batt-profile state changed: unavailable -> disconnected (0)
profiles/battery/battery.c:batt_accept() BATT profile accept (E3:AC:9F:00:8E:12)
src/service.c:change_state() 0x55fbda063650: device E3:AC:9F:00:8E:12 profile batt-profile state changed: disconnected -> connected (0)
src/device.c:device_probe_profiles() Probing profiles for device E3:AC:9F:00:8E:12
src/device.c:device_probe_profiles() Probing profiles for device E3:AC:9F:00:8E:12
profiles/input/hog.c:hog_probe() path /org/bluez/hci0/dev_E3_AC_9F_00_8E_12
src/service.c:change_state() 0x55fbda077a20: device E3:AC:9F:00:8E:12 profile input-hog state changed: unavailable -> disconnected (0)
src/device.c:device_set_auto_connect() E3:AC:9F:00:8E:12 auto connect: 1
src/device.c:device_set_auto_connect() Already connected
profiles/input/hog.c:hog_device_accept() name=HP Elite Presenter vendor=0x0, product=0x0, version=0x0
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=2
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=3
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=4
profiles/input/hog-lib.c:bt_hog_attach() HoG discovering characteristics
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=5
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=6
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=7
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=8
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=9
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=10
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=11
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=12
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=13
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=14
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=15
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=16
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=17
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=18
src/service.c:change_state() 0x55fbda077a20: device E3:AC:9F:00:8E:12 profile input-hog state changed: disconnected -> connected (0)
src/service.c:btd_service_ref() 0x55fbda077a20: ref=2
plugins/policy.c:service_cb() Added input-hog reconnect 0
src/gatt-client.c:btd_gatt_client_ready() GATT client ready
src/gatt-client.c:create_services() Exporting objects for GATT services: E3:AC:9F:00:8E:12
src/gatt-client.c:service_create() Exported GATT service: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0008
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0008/char0009
src/gatt-client.c:descriptor_create() Exported GATT characteristic descriptor: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0008/char0009/desc000b
src/gatt-client.c:service_create() Exported GATT service: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service000c
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service000c/char000d
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service000c/char000f
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service000c/char0011
src/gatt-client.c:service_create() Exported GATT service: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0013
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0013/char0014
src/gatt-client.c:descriptor_create() Exported GATT characteristic descriptor: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0013/char0014/desc0016
src/gatt-client.c:service_create() Exported GATT service: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0017
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0017/char0018
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0017/char001a
src/gatt-client.c:descriptor_create() Exported GATT characteristic descriptor: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0017/char001a/desc001c
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12/service0017/char001d
src/gatt-client.c:btd_gatt_client_ready() Features 0x00
src/gatt-client.c:btd_gatt_client_ready() Update Features 0x00
src/device.c:device_svc_resolved() /org/bluez/hci0/dev_E3_AC_9F_00_8E_12 err 0
src/adapter.c:add_device_complete() E3:AC:9F:00:8E:12 (2) added to kernel connect list
src/agent.c:agent_ref() 0x55fbda071440: ref=3
src/adapter.c:btd_adapter_confirm_reply() hci0 addr E3:AC:9F:00:8E:12 success 1
src/agent.c:agent_unref() 0x55fbda071440: ref=2
src/agent.c:agent_unref() 0x55fbda071440: ref=1
src/adapter.c:new_irk_callback() hci0 new IRK for E3:AC:9F:00:8E:12 RPA 00:00:00:00:00:00
src/adapter.c:new_long_term_key_callback() hci0 new LTK for E3:AC:9F:00:8E:12 type 0 enc_size 16
src/device.c:device_set_bonded()
src/device.c:device_bonding_complete() bonding (nil) status 0x00
src/adapter.c:resume_discovery()
src/device.c:gatt_debug() Registered handler for "Service Changed": 1
profiles/gap/gas.c:read_device_name_cb() GAP Device Name: HP Elite Presenter
profiles/gap/gas.c:read_appearance_cb() GAP Appearance: 0x03c2
profiles/deviceinfo/dis.c:read_pnpid_cb() source: 0x02 vendor: 0x03F0 product: 0x464A version: 0x0018
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=17
profiles/input/hog-lib.c:proto_mode_read_cb() HoG is operating in Report Protocol Mode
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=16
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=15
profiles/input/hog-lib.c:report_reference_cb() Report 0x0023: id 0x01 type input
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=16
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=15
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=14
profiles/input/hog-lib.c:report_reference_cb() Report 0x0027: id 0x02 type input
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=15
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=14
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=13
profiles/input/hog-lib.c:report_reference_cb() Report 0x002b: id 0x04 type input
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=14
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=13
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=12
profiles/input/hog-lib.c:report_reference_cb() Report 0x002f: id 0x05 type input
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=13
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=12
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=11
profiles/input/hog-lib.c:report_reference_cb() Report 0x0033: id 0x06 type input
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=12
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=11
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=10
profiles/input/hog-lib.c:report_reference_cb() Report 0x0037: id 0x03 type feature
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=9
profiles/input/hog-lib.c:info_read_cb() bcdHID: 0x0101 bCountryCode: 0x00 Flags: 0x03
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=8
src/battery.c:btd_battery_register() path = /org/bluez/hci0/dev_E3_AC_9F_00_8E_12
src/battery.c:btd_battery_register() registered Battery object: /org/bluez/hci0/dev_E3_AC_9F_00_8E_12
profiles/battery/battery.c:parse_battery_level() Battery Level updated: 100%
src/battery.c:btd_battery_update() path = /org/bluez/hci0/dev_E3_AC_9F_00_8E_12
profiles/battery/battery.c:batt_io_ccc_written_cb() Battery Level: notification enabled
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=7
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=6
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=5
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=4
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=3
profiles/input/hog-lib.c:report_ccc_written_cb() Report characteristic descriptor written: notifications enabled
profiles/input/hog-lib.c:report_ccc_written_cb() Report characteristic descriptor written: notifications enabled
profiles/input/hog-lib.c:report_ccc_written_cb() Report characteristic descriptor written: notifications enabled
profiles/input/hog-lib.c:report_ccc_written_cb() Report characteristic descriptor written: notifications enabled
profiles/input/hog-lib.c:report_ccc_written_cb() Report characteristic descriptor written: notifications enabled
attrib/gattrib.c:g_attrib_ref() 0x55fbda07d840: g_attrib_ref=4
src/adapter.c:new_conn_param() hci0 E3:AC:9F:00:8E:12 (2) min 0x0006 max 0x0006 latency 0x003c timeout 0x012c
src/adapter.c:store_conn_param()
profiles/input/hog-lib.c:uhid_create() HoG created uHID device
attrib/gattrib.c:g_attrib_unref() 0x55fbda07d840: g_attrib_unref=3
profiles/input/hog-lib.c:start_flags() uHID device flags: 0x               5

when moving mouse or clicking:

src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x55fbda07e2e0) ATT PDU received: 0x1b

guilhem avatar Mar 18 '22 16:03 guilhem

Looks like there is something preventing the input to be processed, try checking with hid-recorder if there is anything being processed by the kernel.

Vudentz avatar Mar 22 '22 05:03 Vudentz

Looks like there is something preventing the input to be processed, try checking with hid-recorder if there is anything being processed by the kernel.

hid-recorder:

# HP Elite Presenter
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        0
# 0x09, 0x02,                    // Usage (Mouse)                       2
# 0xa1, 0x01,                    // Collection (Application)            4
# 0x85, 0x01,                    //  Report ID (1)                      6
# 0x05, 0x09,                    //  Usage Page (Button)                8
# 0x19, 0x01,                    //  Usage Minimum (1)                  10
# 0x29, 0x05,                    //  Usage Maximum (5)                  12
# 0x15, 0x00,                    //  Logical Minimum (0)                14
# 0x25, 0x01,                    //  Logical Maximum (1)                16
# 0x95, 0x05,                    //  Report Count (5)                   18
# 0x75, 0x01,                    //  Report Size (1)                    20
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               22
# 0x95, 0x01,                    //  Report Count (1)                   24
# 0x75, 0x03,                    //  Report Size (3)                    26
# 0x81, 0x01,                    //  Input (Cnst,Arr,Abs)               28
# 0x05, 0x01,                    //  Usage Page (Generic Desktop)       30
# 0x09, 0x30,                    //  Usage (X)                          32
# 0x09, 0x31,                    //  Usage (Y)                          34
# 0x16, 0x00, 0xf8,              //  Logical Minimum (-2048)            36
# 0x26, 0xff, 0x07,              //  Logical Maximum (2047)             39
# 0x75, 0x0c,                    //  Report Size (12)                   42
# 0x95, 0x02,                    //  Report Count (2)                   44
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               46
# 0x09, 0x38,                    //  Usage (Wheel)                      48
# 0x15, 0x80,                    //  Logical Minimum (-128)             50
# 0x25, 0x7f,                    //  Logical Maximum (127)              52
# 0x75, 0x08,                    //  Report Size (8)                    54
# 0x95, 0x01,                    //  Report Count (1)                   56
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               58
# 0x05, 0x0c,                    //  Usage Page (Consumer Devices)      60
# 0x0a, 0x38, 0x02,              //  Usage (AC Pan)                     62
# 0x15, 0x80,                    //  Logical Minimum (-128)             65
# 0x25, 0x7f,                    //  Logical Maximum (127)              67
# 0x75, 0x08,                    //  Report Size (8)                    69
# 0x95, 0x01,                    //  Report Count (1)                   71
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               73
# 0xc0,                          // End Collection                      75
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        76
# 0x09, 0x02,                    // Usage (Mouse)                       78
# 0xa1, 0x01,                    // Collection (Application)            80
# 0x85, 0x02,                    //  Report ID (2)                      82
# 0x05, 0x09,                    //  Usage Page (Button)                84
# 0x19, 0x01,                    //  Usage Minimum (1)                  86
# 0x29, 0x05,                    //  Usage Maximum (5)                  88
# 0x15, 0x00,                    //  Logical Minimum (0)                90
# 0x25, 0x01,                    //  Logical Maximum (1)                92
# 0x95, 0x05,                    //  Report Count (5)                   94
# 0x75, 0x01,                    //  Report Size (1)                    96
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               98
# 0x95, 0x01,                    //  Report Count (1)                   100
# 0x75, 0x03,                    //  Report Size (3)                    102
# 0x81, 0x01,                    //  Input (Cnst,Arr,Abs)               104
# 0x05, 0x01,                    //  Usage Page (Generic Desktop)       106
# 0x09, 0x30,                    //  Usage (X)                          108
# 0x09, 0x31,                    //  Usage (Y)                          110
# 0x16, 0x00, 0xf8,              //  Logical Minimum (-2048)            112
# 0x26, 0xff, 0x07,              //  Logical Maximum (2047)             115
# 0x75, 0x0c,                    //  Report Size (12)                   118
# 0x95, 0x02,                    //  Report Count (2)                   120
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               122
# 0x09, 0x38,                    //  Usage (Wheel)                      124
# 0x15, 0x80,                    //  Logical Minimum (-128)             126
# 0x25, 0x7f,                    //  Logical Maximum (127)              128
# 0x75, 0x08,                    //  Report Size (8)                    130
# 0x95, 0x01,                    //  Report Count (1)                   132
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               134
# 0x05, 0x0c,                    //  Usage Page (Consumer Devices)      136
# 0x0a, 0x38, 0x02,              //  Usage (AC Pan)                     138
# 0x15, 0x80,                    //  Logical Minimum (-128)             141
# 0x25, 0x7f,                    //  Logical Maximum (127)              143
# 0x75, 0x08,                    //  Report Size (8)                    145
# 0x95, 0x01,                    //  Report Count (1)                   147
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               149
# 0xc0,                          // End Collection                      151
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        152
# 0x09, 0x07,                    // Usage (Keypad)                      154
# 0xa1, 0x01,                    // Collection (Application)            156
# 0x85, 0x05,                    //  Report ID (5)                      158
# 0x05, 0x07,                    //  Usage Page (Keyboard)              160
# 0x15, 0x00,                    //  Logical Minimum (0)                162
# 0x25, 0x01,                    //  Logical Maximum (1)                164
# 0x09, 0x29,                    //  Usage (ESCAPE)                     166
# 0x09, 0x3e,                    //  Usage (F5)                         168
# 0x09, 0x4b,                    //  Usage (PageUp)                     170
# 0x09, 0x4e,                    //  Usage (PageDown)                   172
# 0x09, 0xe3,                    //  Usage (Left GUI)                   174
# 0x09, 0xe8,                    //  Usage (Vendor Usage 0xe8)          176
# 0x09, 0xe8,                    //  Usage (Vendor Usage 0xe8)          178
# 0x09, 0xe8,                    //  Usage (Vendor Usage 0xe8)          180
# 0x75, 0x01,                    //  Report Size (1)                    182
# 0x95, 0x08,                    //  Report Count (8)                   184
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               186
# 0x95, 0x00,                    //  Report Count (0)                   188
# 0x81, 0x01,                    //  Input (Cnst,Arr,Abs)               190
# 0xc0,                          // End Collection                      192
# 0x05, 0x0c,                    // Usage Page (Consumer Devices)       193
# 0x09, 0x01,                    // Usage (Consumer Control)            195
# 0xa1, 0x01,                    // Collection (Application)            197
# 0x85, 0x06,                    //  Report ID (6)                      199
# 0x15, 0x00,                    //  Logical Minimum (0)                201
# 0x25, 0x01,                    //  Logical Maximum (1)                203
# 0x75, 0x01,                    //  Report Size (1)                    205
# 0x95, 0x01,                    //  Report Count (1)                   207
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          209
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               211
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          213
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               215
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          217
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               219
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          221
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               223
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          225
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               227
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          229
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               231
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          233
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               235
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          237
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               239
# 0xc0,                          // End Collection                      241
# 0x05, 0x0c,                    // Usage Page (Consumer Devices)       242
# 0x09, 0x01,                    // Usage (Consumer Control)            244
# 0xa1, 0x01,                    // Collection (Application)            246
# 0x85, 0x03,                    //  Report ID (3)                      248
# 0x09, 0x05,                    //  Usage (Headphone)                  250
# 0x15, 0x00,                    //  Logical Minimum (0)                252
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              254
# 0x75, 0x08,                    //  Report Size (8)                    257
# 0x95, 0x02,                    //  Report Count (2)                   259
# 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             261
# 0xc0,                          // End Collection                      263
# 
R: 264 05 01 09 02 a1 01 85 01 05 09 19 01 29 05 15 00 25 01 95 05 75 01 81 02 95 01 75 03 81 01 05 01 09 30 09 31 16 00 f8 26 ff 07 75 0c 95 02 81 06 09 38 15 80 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 15 80 25 7f 75 08 95 01 81 06 c0 05 01 09 02 a1 01 85 02 05 09 19 01 29 05 15 00 25 01 95 05 75 01 81 02 95 01 75 03 81 01 05 01 09 30 09 31 16 00 f8 26 ff 07 75 0c 95 02 81 06 09 38 15 80 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 15 80 25 7f 75 08 95 01 81 06 c0 05 01 09 07 a1 01 85 05 05 07 15 00 25 01 09 29 09 3e 09 4b 09 4e 09 e3 09 e8 09 e8 09 e8 75 01 95 08 81 02 95 00 81 01 c0 05 0c 09 01 a1 01 85 06 15 00 25 01 75 01 95 01 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 c0 05 0c 09 01 a1 01 85 03 09 05 15 00 26 ff 00 75 08 95 02 b1 02 c0
N: HP Elite Presenter
I: 5 03f0 464a
# ReportID: 5 / ESCAPE: 0 | F5: 0 | PageUp: 0 | PageDown: 0 | Left GUI: 0 | 0x700e8: 0 , 0 , 0 | # 
E: 000000.000000 3 05 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -3 | Wheel:    0 | AC Pan:    0 
E: 000002.895186 7 02 00 00 d0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000002.895586 7 02 00 00 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -3 | Wheel:    0 | AC Pan:    0 
E: 000002.910041 7 02 00 00 d0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -3 | Wheel:    0 | AC Pan:    0 
E: 000002.917457 7 02 00 00 d0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -4 | Wheel:    0 | AC Pan:    0 
E: 000002.924887 7 02 00 00 c0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000002.932500 7 02 00 00 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000002.947579 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -8 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000002.984976 7 02 00 f8 0f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000002.992526 7 02 00 fc 0f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -5 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000003.000555 7 02 00 fb 1f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000003.007383 7 02 00 fc 0f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000003.015682 7 02 00 fc 2f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -3 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000003.030082 7 02 00 fd 3f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -5 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000003.037399 7 02 00 fb 3f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     5 | Wheel:    0 | AC Pan:    0 
E: 000003.044909 7 02 00 fc 5f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     4 | Wheel:    0 | AC Pan:    0 
E: 000003.052443 7 02 00 fc 4f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -5 | Y:     5 | Wheel:    0 | AC Pan:    0 
E: 000003.060074 7 02 00 fb 5f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -5 | Y:     5 | Wheel:    0 | AC Pan:    0 
E: 000003.067578 7 02 00 fb 5f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -5 | Y:     6 | Wheel:    0 | AC Pan:    0 
E: 000003.075062 7 02 00 fb 6f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     6 | Wheel:    0 | AC Pan:    0 
E: 000003.082434 7 02 00 fc 6f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -5 | Y:     8 | Wheel:    0 | AC Pan:    0 
E: 000003.089965 7 02 00 fb 8f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -3 | Y:     7 | Wheel:    0 | AC Pan:    0 
E: 000003.097517 7 02 00 fd 7f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     7 | Wheel:    0 | AC Pan:    0 
E: 000003.104999 7 02 00 fc 7f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -3 | Y:     6 | Wheel:    0 | AC Pan:    0 
E: 000003.112434 7 02 00 fd 6f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -3 | Y:     5 | Wheel:    0 | AC Pan:    0 
E: 000003.119927 7 02 00 fd 5f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -3 | Y:     5 | Wheel:    0 | AC Pan:    0 
E: 000003.127514 7 02 00 fd 5f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -2 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000003.134975 7 02 00 fe 3f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -2 | Y:     4 | Wheel:    0 | AC Pan:    0 
E: 000003.142535 7 02 00 fe 4f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000003.150629 7 02 00 ff 3f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000003.165159 7 02 00 00 10 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     4 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.247437 7 02 00 04 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     4 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.248130 7 02 00 04 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     5 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000003.255016 7 02 00 05 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     3 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000003.262547 7 02 00 03 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     6 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.277629 7 02 00 06 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     4 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000003.284867 7 02 00 04 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     3 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.292529 7 02 00 03 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     3 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000003.300042 7 02 00 03 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     3 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000003.307560 7 02 00 03 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     3 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.315011 7 02 00 03 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.322477 7 02 00 02 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.329996 7 02 00 02 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000003.337451 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.344891 7 02 00 02 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.352404 7 02 00 02 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.359931 7 02 00 02 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.367430 7 02 00 02 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.374959 7 02 00 01 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000003.382649 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000003.510056 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.517526 7 02 00 01 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000003.540024 7 02 00 01 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000010.605186 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -1 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000010.605673 7 02 00 ff ef ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000010.612603 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000010.620191 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000010.732634 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     4 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000010.733076 7 02 00 04 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     7 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000010.740028 7 02 00 07 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     7 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000010.747619 7 02 00 07 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     6 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000010.762630 7 02 00 06 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000010.785280 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000010.800146 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000011.827795 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000011.887800 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000011.925226 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000011.985191 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000012.037715 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000012.630295 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000012.667760 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000013.087845 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000013.117771 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000013.515247 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000014.370189 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000014.587820 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000014.820245 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000014.947676 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    1 | AC Pan:    0 
E: 000015.240327 7 02 00 00 00 00 01 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000016.395312 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000016.500379 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000016.657959 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000016.830353 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000017.122832 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:   -1 | AC Pan:    0 
E: 000017.670311 7 02 00 00 00 00 ff 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000017.947720 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000017.955387 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000017.962743 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000018.187928 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000018.195529 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000018.232706 7 02 00 01 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000018.233275 7 02 00 01 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000018.262805 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000023.910649 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000023.911010 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000023.947892 7 02 00 ff 0f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -6 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000023.955380 7 02 00 fa 0f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -6 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000023.963194 7 02 00 fa ff ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:   -10 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000023.970398 7 02 00 f6 ff ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:   -10 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000023.977998 7 02 00 f6 0f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:   -11 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000023.985452 7 02 00 f5 0f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:   -10 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000023.992853 7 02 00 f6 1f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -7 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000024.000542 7 02 00 f9 1f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000024.007928 7 02 00 fc 1f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000024.015475 7 02 00 00 30 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000024.022848 7 02 00 02 30 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     4 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000024.030314 7 02 00 04 30 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     4 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000024.045459 7 02 00 04 10 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000024.052988 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 1  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000033.585671 7 02 01 00 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000033.608224 7 02 00 00 00 00 00 00
# ReportID: 5 / ESCAPE: 0 | F5: 0 | PageUp: 0 | PageDown: 0 | Left GUI: 0 | 0x700e8: 0 , 0 , 0 | # 
E: 000033.758188 3 05 00 00
# ReportID: 2 / Button: 1  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000033.788061 7 02 01 00 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000033.818077 7 02 00 00 00 00 00 00
# ReportID: 5 / ESCAPE: 0 | F5: 0 | PageUp: 0 | PageDown: 0 | Left GUI: 0 | 0x700e8: 0 , 0 , 0 | # 
E: 000033.975889 3 05 00 00
# ReportID: 5 / ESCAPE: 0 | F5: 0 | PageUp: 0 | PageDown: 0 | Left GUI: 0 | 0x700e8: 0 , 0 , 0 | # 
E: 000042.165709 3 05 00 00
# ReportID: 5 / ESCAPE: 0 | F5: 0 | PageUp: 0 | PageDown: 0 | Left GUI: 0 | 0x700e8: 0 , 0 , 0 | # 
E: 000044.888364 3 05 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.490947 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     4 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.491524 7 02 00 04 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     4 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.498663 7 02 00 04 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     3 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.505987 7 02 00 03 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.513371 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.520846 7 02 00 01 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000047.528397 7 02 00 01 e0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.535888 7 02 00 01 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.550897 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.551439 7 02 00 01 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.566010 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.580965 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.618540 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.633413 7 02 00 02 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.640935 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.648487 7 02 00 01 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.656054 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.663425 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.670998 7 02 00 00 f0 ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -1 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000047.685899 7 02 00 ff ef ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -5 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000047.693384 7 02 00 fb ef ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -8 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000047.700917 7 02 00 f8 ef ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -7 | Y:    -2 | Wheel:    0 | AC Pan:    0 
E: 000047.708369 7 02 00 f9 ef ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -6 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.715787 7 02 00 fa ff ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:    -1 | Wheel:    0 | AC Pan:    0 
E: 000047.723415 7 02 00 fc ff ff 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -4 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000047.730955 7 02 00 fc 1f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.738436 7 02 00 fe 0f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -2 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000047.745964 7 02 00 fe 2f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000047.753396 7 02 00 ff 2f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000047.760928 7 02 00 ff 2f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000047.768328 7 02 00 00 10 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000047.775832 7 02 00 01 30 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000047.783445 7 02 00 01 20 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000047.790774 7 02 00 00 10 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000047.805890 7 02 00 ff 1f 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:    -2 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000047.813284 7 02 00 fe 0f 00 00 00

What I see:

  • mouse movement and wheel are shown (but nothing happen on desktop)
  • when switching to presentation
    • only middle button do something.
    • other buttons do absolutely nothing

Note that I have this problem for years. I already post on mailing list (without answer) and I managed to get it working 1 time. sadly, I lost my code...

By memory, problem come because mouse is seen as multiple device and bluez code doesn't manage well multiple uhid devices.

guilhem avatar Mar 22 '22 11:03 guilhem

I've reported similar issue to ML, unfortunately the mouse is not with me anymore: Lenovo Legion M600 wireless bluetooth mouse connected and paired yet not working: https://www.spinics.net/lists/linux-bluetooth/msg96871.html

bam80 avatar Mar 22 '22 13:03 bam80

After using btmon, I confirm that absolutely no message is sent when pushing some buttons. Can it be something like an initialization problem?

guilhem avatar Mar 24 '22 11:03 guilhem

After using btmon, I confirm that absolutely no message is sent when pushing some buttons. Can it be something like an initialization problem?

Perhaps we didn't subscribe for it, we got 5 input and 1 feature reports perhaps something need to be programmed in order for it to work properly.

Vudentz avatar Mar 25 '22 18:03 Vudentz

Perhaps we didn't subscribe for it, we got 5 input and 1 feature reports perhaps something need to be programmed in order for it to work properly.

Just to be sure, this mouse works on windows and MacOS without any specific driver.

guilhem avatar Mar 26 '22 00:03 guilhem

It will probably also work on Android.

bam80 avatar Mar 26 '22 10:03 bam80

I do own a Lenovo Legion M600 and can confirm the issue. If you need any information/logs from me write me a message. Unfortunately my knowledge of the linux bluetooth stack is limited.

Update: I just checked, the M600 does work with android.

jostillmanns avatar Mar 31 '22 09:03 jostillmanns

@jostillmanns cool, thanks! Please follow up to ML then, there was some request apparently: Lenovo Legion M600 wireless bluetooth mouse connected and paired yet not working: https://www.spinics.net/lists/linux-bluetooth/msg97262.html

bam80 avatar Mar 31 '22 11:03 bam80

@bam80 The above change fixed the problem with M600 for me. @jostillmanns please give it a try to see if that is the problem for your device.

Vudentz avatar Apr 20 '22 20:04 Vudentz

Can confirm that it works now with my M600. Thank you very much!

jostillmanns avatar Apr 22 '22 08:04 jostillmanns

For the moment, it doesn't fix my HP elite presenter mouse. But I have to do more tests on a fresh installation.

guilhem avatar Apr 22 '22 13:04 guilhem

@guilhem check with hid-recorder if it does show the events, it perhaps is a device specific problem.

Vudentz avatar Apr 22 '22 20:04 Vudentz

Funny, I also just got myself such an HP Elite Presenter Mouse since I needed a presentation clicker and this thing is really neat. But ran into similar troubles.

For me with stock Debian testing:

# bluetoothd -v
5.66

and kernel 6.0.10 the presenter part works pretty much out of the box. The five buttons emit key press events, long pressing the center button activates the virtual mouse and I can move the mouse pointer.

But as soon as I twist the device into mouse only mode nothing happens anymore. The interesting part though is that I can see ATT HID events coming in using hcidump:

> ACL data: handle 3585 flags 0x02 dlen 13
    ATT: Handle notify (0x1b)
      handle 0x0027
      value 0x00 0xfa 0x0f 0x00 0x00 0x00 
> ACL data: handle 3585 flags 0x02 dlen 13
    ATT: Handle notify (0x1b)
      handle 0x0027
      value 0x00 0xfe 0x0f 0x00 0x00 0x00 
> ACL data: handle 3585 flags 0x02 dlen 13
    ATT: Handle notify (0x1b)
      handle 0x0027
      value 0x00 0xff 0x0f 0x00 0x00 0x00 
> ACL data: handle 3585 flags 0x02 dlen 13
    ATT: Handle notify (0x1b)
      handle 0x0027
      value 0x00 0x01 0x00 0x00 0x00 0x00 
> ACL data: handle 3585 flags 0x02 dlen 13
    ATT: Handle notify (0x1b)
      handle 0x0027
      value 0x00 0x02 0x00 0x00 0x00 0x00 
> ACL data: handle 3585 flags 0x02 dlen 13
    ATT: Handle notify (0x1b)
      handle 0x0027
      value 0x00 0x02 0x00 0x00 0x00 0x00 
> ACL data: handle 3585 flags 0x02 dlen 13
    ATT: Handle notify (0x1b)
      handle 0x0027
      value 0x00 0xff 0x0f 0x00 0x00 0x00 
> ACL data: handle 3585 flags 0x02 dlen 13
    ATT: Handle notify (0x1b)
      handle 0x0027
      value 0x00 0x00 0xf0 0xff 0x00 0x00 

The interesting part to me here is that these now come in on another handle than the virtual mouse events in presenter mode. So I suspect that this device in fact creates two and not just one HOG mouse and BlueZ only sets up one, the first, which is the mouse in presenter mode - which in my test came in on handle 0x0023. Here is a btmon trace switching from presenter to mouse mode, you can see the presenter mouse on handle 0x0023 then some notification when twisting the device over on handle 0x002f and from then on mouse HID reports on handle 0x0027:

> ACL Data RX: Handle 3585 flags 0x02 dlen 13                                       #1406 [hci0] 109.039640
      ATT: Handle Value Notification (0x1b) len 8
        Handle: 0x0023 Type: Report (0x2a4d)
          Data: 0000a0ff0000
> ACL Data RX: Handle 3585 flags 0x02 dlen 13                                       #1407 [hci0] 109.047114
      ATT: Handle Value Notification (0x1b) len 8
        Handle: 0x0023 Type: Report (0x2a4d)
          Data: 000090ff0000
> ACL Data RX: Handle 3585 flags 0x02 dlen 13                                       #1408 [hci0] 109.062004
      ATT: Handle Value Notification (0x1b) len 8
        Handle: 0x0023 Type: Report (0x2a4d)
          Data: 000090ff0000
> ACL Data RX: Handle 3585 flags 0x02 dlen 9                                        #1409 [hci0] 111.425823
      ATT: Handle Value Notification (0x1b) len 4
        Handle: 0x002f Type: Report (0x2a4d)
          Data: 0000
> ACL Data RX: Handle 3585 flags 0x02 dlen 13                                       #1410 [hci0] 113.449871
      ATT: Handle Value Notification (0x1b) len 8
        Handle: 0x0027 Type: Report (0x2a4d)
          Data: 000110000000
> ACL Data RX: Handle 3585 flags 0x02 dlen 13                                       #1411 [hci0] 113.457044
      ATT: Handle Value Notification (0x1b) len 8
        Handle: 0x0027 Type: Report (0x2a4d)
          Data: 000a60000000
> ACL Data RX: Handle 3585 flags 0x02 dlen 13                                       #1412 [hci0] 113.464593
      ATT: Handle Value Notification (0x1b) len 8
        Handle: 0x0027 Type: Report (0x2a4d)
          Data: 000a60000000

The same thing BTW also happens in Android, I tried this on a Xiaomi Mi9 Pro - presenter mode works, virtual mouse in presenter mode works but full mouse mode does not.

Sidenote: After the device connects I usually have to press the buttons several times until the keypad backlight comes on and button events are received. After that it works fine.

Not trying to advertise anything here, but this device is really neat and making it fully work with BlueZ/Linux (which does seem to work out of the box in Win and Mac?) would be really cool :-)

nica-f avatar Dec 07 '22 21:12 nica-f

@nica-f it looks like BlueZ does detect there are multiple reports since we do subscribe for notifications on both handles, but perhaps we need a dedicated kernel driver to handle the HID part, which explains why it doesn't work with Android either since their stack also use the kernel to process the HID reports. Btw, check out what handles bluetoothd (use -dn) have on cache when you connect to it should print in the logs.

Vudentz avatar Dec 07 '22 21:12 Vudentz

Yes, all services get connected resulting in multiple handles. I am not sure what you mean with 'dedicated kernel driver'? The reports that I can see are regular HID HOG mouse reports according to the HOG spec, for both mouse handles. So I do not think that an extra driver is needed, just the data from the second handle would need to get processed correctly.

I also just now tried hid-recorder and with it I can see all events:

$ sudo ./hid-recorder 
Available devices:
/dev/hidraw0:	ACPI0C50:00 18D1:5028
/dev/hidraw1:	WCOM50C1:00 2D1F:5143
/dev/hidraw2:	HP Elite Presenter
Select the device event number [0-2]: 2
# HP Elite Presenter
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        0
# 0x09, 0x02,                    // Usage (Mouse)                       2
# 0xa1, 0x01,                    // Collection (Application)            4
# 0x85, 0x01,                    //  Report ID (1)                      6
# 0x05, 0x09,                    //  Usage Page (Button)                8
# 0x19, 0x01,                    //  Usage Minimum (1)                  10
# 0x29, 0x05,                    //  Usage Maximum (5)                  12
# 0x15, 0x00,                    //  Logical Minimum (0)                14
# 0x25, 0x01,                    //  Logical Maximum (1)                16
# 0x95, 0x05,                    //  Report Count (5)                   18
# 0x75, 0x01,                    //  Report Size (1)                    20
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               22
# 0x95, 0x01,                    //  Report Count (1)                   24
# 0x75, 0x03,                    //  Report Size (3)                    26
# 0x81, 0x01,                    //  Input (Cnst,Arr,Abs)               28
# 0x05, 0x01,                    //  Usage Page (Generic Desktop)       30
# 0x09, 0x30,                    //  Usage (X)                          32
# 0x09, 0x31,                    //  Usage (Y)                          34
# 0x16, 0x00, 0xf8,              //  Logical Minimum (-2048)            36
# 0x26, 0xff, 0x07,              //  Logical Maximum (2047)             39
# 0x75, 0x0c,                    //  Report Size (12)                   42
# 0x95, 0x02,                    //  Report Count (2)                   44
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               46
# 0x09, 0x38,                    //  Usage (Wheel)                      48
# 0x15, 0x80,                    //  Logical Minimum (-128)             50
# 0x25, 0x7f,                    //  Logical Maximum (127)              52
# 0x75, 0x08,                    //  Report Size (8)                    54
# 0x95, 0x01,                    //  Report Count (1)                   56
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               58
# 0x05, 0x0c,                    //  Usage Page (Consumer Devices)      60
# 0x0a, 0x38, 0x02,              //  Usage (AC Pan)                     62
# 0x15, 0x80,                    //  Logical Minimum (-128)             65
# 0x25, 0x7f,                    //  Logical Maximum (127)              67
# 0x75, 0x08,                    //  Report Size (8)                    69
# 0x95, 0x01,                    //  Report Count (1)                   71
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               73
# 0xc0,                          // End Collection                      75
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        76
# 0x09, 0x02,                    // Usage (Mouse)                       78
# 0xa1, 0x01,                    // Collection (Application)            80
# 0x85, 0x02,                    //  Report ID (2)                      82
# 0x05, 0x09,                    //  Usage Page (Button)                84
# 0x19, 0x01,                    //  Usage Minimum (1)                  86
# 0x29, 0x05,                    //  Usage Maximum (5)                  88
# 0x15, 0x00,                    //  Logical Minimum (0)                90
# 0x25, 0x01,                    //  Logical Maximum (1)                92
# 0x95, 0x05,                    //  Report Count (5)                   94
# 0x75, 0x01,                    //  Report Size (1)                    96
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               98
# 0x95, 0x01,                    //  Report Count (1)                   100
# 0x75, 0x03,                    //  Report Size (3)                    102
# 0x81, 0x01,                    //  Input (Cnst,Arr,Abs)               104
# 0x05, 0x01,                    //  Usage Page (Generic Desktop)       106
# 0x09, 0x30,                    //  Usage (X)                          108
# 0x09, 0x31,                    //  Usage (Y)                          110
# 0x16, 0x00, 0xf8,              //  Logical Minimum (-2048)            112
# 0x26, 0xff, 0x07,              //  Logical Maximum (2047)             115
# 0x75, 0x0c,                    //  Report Size (12)                   118
# 0x95, 0x02,                    //  Report Count (2)                   120
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               122
# 0x09, 0x38,                    //  Usage (Wheel)                      124
# 0x15, 0x80,                    //  Logical Minimum (-128)             126
# 0x25, 0x7f,                    //  Logical Maximum (127)              128
# 0x75, 0x08,                    //  Report Size (8)                    130
# 0x95, 0x01,                    //  Report Count (1)                   132
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               134
# 0x05, 0x0c,                    //  Usage Page (Consumer Devices)      136
# 0x0a, 0x38, 0x02,              //  Usage (AC Pan)                     138
# 0x15, 0x80,                    //  Logical Minimum (-128)             141
# 0x25, 0x7f,                    //  Logical Maximum (127)              143
# 0x75, 0x08,                    //  Report Size (8)                    145
# 0x95, 0x01,                    //  Report Count (1)                   147
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               149
# 0xc0,                          // End Collection                      151
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        152
# 0x09, 0x07,                    // Usage (Keypad)                      154
# 0xa1, 0x01,                    // Collection (Application)            156
# 0x85, 0x05,                    //  Report ID (5)                      158
# 0x05, 0x07,                    //  Usage Page (Keyboard)              160
# 0x15, 0x00,                    //  Logical Minimum (0)                162
# 0x25, 0x01,                    //  Logical Maximum (1)                164
# 0x09, 0x29,                    //  Usage (ESCAPE)                     166
# 0x09, 0x3e,                    //  Usage (F5)                         168
# 0x09, 0x4b,                    //  Usage (PageUp)                     170
# 0x09, 0x4e,                    //  Usage (PageDown)                   172
# 0x09, 0xe3,                    //  Usage (Left GUI)                   174
# 0x09, 0xe8,                    //  Usage (Vendor Usage 0xe8)          176
# 0x09, 0xe8,                    //  Usage (Vendor Usage 0xe8)          178
# 0x09, 0xe8,                    //  Usage (Vendor Usage 0xe8)          180
# 0x75, 0x01,                    //  Report Size (1)                    182
# 0x95, 0x08,                    //  Report Count (8)                   184
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               186
# 0x95, 0x00,                    //  Report Count (0)                   188
# 0x81, 0x01,                    //  Input (Cnst,Arr,Abs)               190
# 0xc0,                          // End Collection                      192
# 0x05, 0x0c,                    // Usage Page (Consumer Devices)       193
# 0x09, 0x01,                    // Usage (Consumer Control)            195
# 0xa1, 0x01,                    // Collection (Application)            197
# 0x85, 0x06,                    //  Report ID (6)                      199
# 0x15, 0x00,                    //  Logical Minimum (0)                201
# 0x25, 0x01,                    //  Logical Maximum (1)                203
# 0x75, 0x01,                    //  Report Size (1)                    205
# 0x95, 0x01,                    //  Report Count (1)                   207
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          209
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               211
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          213
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               215
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          217
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               219
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          221
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               223
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          225
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               227
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          229
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               231
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          233
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               235
# 0x09, 0x3f,                    //  Usage (Vendor Usage 0x3f)          237
# 0x81, 0x06,                    //  Input (Data,Var,Rel)               239
# 0xc0,                          // End Collection                      241
# 0x05, 0x0c,                    // Usage Page (Consumer Devices)       242
# 0x09, 0x01,                    // Usage (Consumer Control)            244
# 0xa1, 0x01,                    // Collection (Application)            246
# 0x85, 0x03,                    //  Report ID (3)                      248
# 0x09, 0x05,                    //  Usage (Headphone)                  250
# 0x15, 0x00,                    //  Logical Minimum (0)                252
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              254
# 0x75, 0x08,                    //  Report Size (8)                    257
# 0x95, 0x02,                    //  Report Count (2)                   259
# 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             261
# 0xc0,                          // End Collection                      263
# 
R: 264 05 01 09 02 a1 01 85 01 05 09 19 01 29 05 15 00 25 01 95 05 75 01 81 02 95 01 75 03 81 01 05 01 09 30 09 31 16 00 f8 26 ff 07 75 0c 95 02 81 06 09 38 15 80 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 15 80 25 7f 75 08 95 01 81 06 c0 05 01 09 02 a1 01 85 02 05 09 19 01 29 05 15 00 25 01 95 05 75 01 81 02 95 01 75 03 81 01 05 01 09 30 09 31 16 00 f8 26 ff 07 75 0c 95 02 81 06 09 38 15 80 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 15 80 25 7f 75 08 95 01 81 06 c0 05 01 09 07 a1 01 85 05 05 07 15 00 25 01 09 29 09 3e 09 4b 09 4e 09 e3 09 e8 09 e8 09 e8 75 01 95 08 81 02 95 00 81 01 c0 05 0c 09 01 a1 01 85 06 15 00 25 01 75 01 95 01 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 09 3f 81 06 c0 05 0c 09 01 a1 01 85 03 09 05 15 00 26 ff 00 75 08 95 02 b1 02 c0
N: HP Elite Presenter
I: 5 03f0 464a

and here are reports from from mouse in presenter mode and then flipping over to mouse only mode:

# ReportID: 1 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000050.769393 7 01 00 00 10 00 00 00
# ReportID: 1 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000050.791807 7 01 00 00 10 00 00 00
# ReportID: 1 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000050.799386 7 01 00 ff 1f 00 00 00
# ReportID: 1 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000050.821924 7 01 00 ff 0f 00 00 00
# ReportID: 5 / ESCAPE: 0 | F5: 0 | PageUp: 0 | PageDown: 0 | Left GUI: 0 | 0x700e8: 0 , 0 , 0 | # 
E: 000065.472771 3 05 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000067.524964 7 02 00 00 20 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000067.532181 7 02 00 00 30 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000067.997449 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000069.789960 7 02 00 00 20 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000069.894643 7 02 00 00 10 00 00 00

All that is looking totally fine and good. Just the 'ReportID: 2' end in nirvana, it seems.

nica-f avatar Dec 07 '22 21:12 nica-f

# ReportID: 1 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000050.769393 7 01 00 00 10 00 00 00
# ReportID: 1 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000050.791807 7 01 00 00 10 00 00 00
# ReportID: 1 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000050.799386 7 01 00 ff 1f 00 00 00
# ReportID: 1 / Button: 0  0  0  0  0 | # | X:    -1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000050.821924 7 01 00 ff 0f 00 00 00
# ReportID: 5 / ESCAPE: 0 | F5: 0 | PageUp: 0 | PageDown: 0 | Left GUI: 0 | 0x700e8: 0 , 0 , 0 | # 
E: 000065.472771 3 05 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000067.524964 7 02 00 00 20 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     3 | Wheel:    0 | AC Pan:    0 
E: 000067.532181 7 02 00 00 30 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     1 | Y:     0 | Wheel:    0 | AC Pan:    0 
E: 000067.997449 7 02 00 01 00 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     2 | Wheel:    0 | AC Pan:    0 
E: 000069.789960 7 02 00 00 20 00 00 00
# ReportID: 2 / Button: 0  0  0  0  0 | # | X:     0 | Y:     1 | Wheel:    0 | AC Pan:    0 
E: 000069.894643 7 02 00 00 10 00 00 00

All that is looking totally fine and good. Just the 'ReportID: 2' end in nirvana, it seems.

Perhaps it is not being processed by the user session for some reason? Anyway this shows that the kernel is able to parse the reports just fine, so I don't think it is BlueZ/Kernel related, maybe only the first report ID is attached to your user session?

Vudentz avatar Dec 07 '22 22:12 Vudentz

Well, the thing is that while hid-record does see everything from the raw device but there is something not right with the actual input devices and these are what I think is relevant for the GUI session.

When the device is connected there are three input event interfaces created:

/dev/input/event20:	HP Elite Presenter Mouse
/dev/input/event21:	HP Elite Presenter Keypad
/dev/input/event22:	HP Elite Presenter Consumer Control

Using evtest I can get events for the virtual presenter mouse:

Select the device event number [0-22]: 20
Input driver version is 1.0.1
Input device ID: bus 0x5 vendor 0x3f0 product 0x464a version 0x18
Input device name: "HP Elite Presenter Mouse"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 272 (BTN_LEFT)
    Event code 273 (BTN_RIGHT)
    Event code 274 (BTN_MIDDLE)
    Event code 275 (BTN_SIDE)
    Event code 276 (BTN_EXTRA)
  Event type 2 (EV_REL)
    Event code 0 (REL_X)
    Event code 1 (REL_Y)
    Event code 6 (REL_HWHEEL)
    Event code 8 (REL_WHEEL)
    Event code 11 (REL_WHEEL_HI_RES)
    Event code 12 (REL_HWHEEL_HI_RES)
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
...
Event: time 1670452803.088238, -------------- SYN_REPORT ------------
Event: time 1670452803.096010, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1670452803.096010, type 2 (EV_REL), code 1 (REL_Y), value 8
Event: time 1670452803.096010, -------------- SYN_REPORT ------------
Event: time 1670452803.110741, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1670452803.110741, type 2 (EV_REL), code 1 (REL_Y), value 8
Event: time 1670452803.110741, -------------- SYN_REPORT ------------
Event: time 1670452803.118358, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1670452803.118358, type 2 (EV_REL), code 1 (REL_Y), value 9
Event: time 1670452803.118358, -------------- SYN_REPORT ------------
...

But flipping it over to full mouse mode then the /dev/input/event20: HP Elite Presenter Mouse is totally silent, nothing. So I would still think that there is some kind of issue in the BlueZ/HID/kernel driver space. But TBH I have too little knowledge about the current input event interfaces to pinpoint it.

nica-f avatar Dec 07 '22 22:12 nica-f

Well, the thing is that while hid-record does see everything from the raw device but there is something not right with the actual input devices and these are what I think is relevant for the GUI session.

When the device is connected there are three input event interfaces created:

/dev/input/event20:	HP Elite Presenter Mouse
/dev/input/event21:	HP Elite Presenter Keypad
/dev/input/event22:	HP Elite Presenter Consumer Control

Using evtest I can get events for the virtual presenter mouse:

Select the device event number [0-22]: 20
Input driver version is 1.0.1
Input device ID: bus 0x5 vendor 0x3f0 product 0x464a version 0x18
Input device name: "HP Elite Presenter Mouse"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 272 (BTN_LEFT)
    Event code 273 (BTN_RIGHT)
    Event code 274 (BTN_MIDDLE)
    Event code 275 (BTN_SIDE)
    Event code 276 (BTN_EXTRA)
  Event type 2 (EV_REL)
    Event code 0 (REL_X)
    Event code 1 (REL_Y)
    Event code 6 (REL_HWHEEL)
    Event code 8 (REL_WHEEL)
    Event code 11 (REL_WHEEL_HI_RES)
    Event code 12 (REL_HWHEEL_HI_RES)
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
...
Event: time 1670452803.088238, -------------- SYN_REPORT ------------
Event: time 1670452803.096010, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1670452803.096010, type 2 (EV_REL), code 1 (REL_Y), value 8
Event: time 1670452803.096010, -------------- SYN_REPORT ------------
Event: time 1670452803.110741, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1670452803.110741, type 2 (EV_REL), code 1 (REL_Y), value 8
Event: time 1670452803.110741, -------------- SYN_REPORT ------------
Event: time 1670452803.118358, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1670452803.118358, type 2 (EV_REL), code 1 (REL_Y), value 9
Event: time 1670452803.118358, -------------- SYN_REPORT ------------
...

But flipping it over to full mouse mode then the /dev/input/event20: HP Elite Presenter Mouse is totally silent, nothing. So I would still think that there is some kind of issue in the BlueZ/HID/kernel driver space. But TBH I have too little knowledge about the current input event interfaces to pinpoint it.

How about the other events, are they all silent as well? Also what happens if you connect already flipped in full mouse mode?

Vudentz avatar Dec 08 '22 21:12 Vudentz

@nica-f I end up ordering one, Im starting to suspect the is some bug enumerating the second instance mouse report, perhaps because it would be considered a duplicate of the first report so it would be a exact match for the Input device ID and name fields, that said why did HP need 2 different mouse reports I don't really get it, or they are 2 different sensors that be used simultaneously?

Vudentz avatar Dec 08 '22 22:12 Vudentz

/dev/input/event22: HP Elite Presenter Consumer Control

thought Consumer Control HID was removed since kernel 5.12 https://github.com/bluez/bluez/issues/319#issuecomment-1181774406

macmpi avatar Dec 09 '22 07:12 macmpi

@Vudentz Oh, great, thank you very much!

And yes, I think this enumeration thing could be the issue because it's the same ID etc. So most likely simply a second mouse input dev would need to be created for that second report ID. But I honestly have no idea which part of the code and where handles this enumeration and following input dev creation? I looked over the hog code in bluetoothd and - wow - that's a lot and failed to find a spot. Or is it in the kernel hidp? No clue, which also makes debugging and testing things impossible for me right now. I would need to know the spot in the code where the input device creation is triggered, then it should be pretty easy to debug and trace it and figure out where the code bails out too early.

Why HP did it this way, I have no idea. Maybe because the mouse mode and presenter mode act differently so they figured they make it appear separately? I mean, if you split it up this way you also get more control in user space, you could decide to ignore one of them if you wanted to.

And concerning your question, when you flip it over to mouse mode then all presenter functions stay radio silent (pun intended :) - no more events from any button etc. Which also makes kind of sense so that you do not accidentally cause weird actions. Especially in presenter mode the mouse buttons are on the back of the device and you can easily press them unintentionally and screw up your presentation ;)

nica-f avatar Dec 09 '22 11:12 nica-f

[ oh, that's wrong actually, I'm sorry, I messed up the nRF Connect screenshots I took where I saw the 0x1812 service doubled, just keeping the rest here for reference ]

Hmm... that's also interesting, though might also be normal, don't know. When looking at the device using bluetoothctl I see the following:

$ bluetoothctl info
Device xx:xx:xx:xx:xx:xx (random)
	Name: HP Elite Presenter
	Alias: HP Elite Presenter
	Appearance: 0x03c2
	Icon: input-mouse
	Paired: yes
	Bonded: yes
	Trusted: yes
	Blocked: no
	Connected: yes
	LegacyPairing: no
	UUID: Vendor specific           (00001530-1212-efde-1523-785feabcd123)
	UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
	UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
	UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
	UUID: Battery Service           (0000180f-0000-1000-8000-00805f9b34fb)
	UUID: Human Interface Device    (00001812-0000-1000-8000-00805f9b34fb)
	Modalias: usb:v03F0p464Ad0018
	Battery Percentage: 0x64 (100)

This is fine except for that the device actually exposes two 0x1812 HID services, which I can see e.g. with the nRF Connect app on Android. So I would expect also two HID services showing up with bluetoothctl ?

nica-f avatar Dec 16 '22 21:12 nica-f

Hmm... that's also interesting, though might also be normal, don't know. When looking at the device using bluetoothctl I see the following:

$ bluetoothctl info
Device xx:xx:xx:xx:xx:xx (random)
	Name: HP Elite Presenter
	Alias: HP Elite Presenter
	Appearance: 0x03c2
	Icon: input-mouse
	Paired: yes
	Bonded: yes
	Trusted: yes
	Blocked: no
	Connected: yes
	LegacyPairing: no
	UUID: Vendor specific           (00001530-1212-efde-1523-785feabcd123)
	UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
	UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
	UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
	UUID: Battery Service           (0000180f-0000-1000-8000-00805f9b34fb)
	UUID: Human Interface Device    (00001812-0000-1000-8000-00805f9b34fb)
	Modalias: usb:v03F0p464Ad0018
	Battery Percentage: 0x64 (100)

This is fine except for that the device actually exposes two 0x1812 HID services, which I can see e.g. with the nRF Connect app on Android. So I would expect also two HID services showing up with bluetoothctl ?

We don't duplicate them in the UUID list, that said that may explain why only one of instances is working since perhaps the second instance is either not creating its input node or uinput gets confused if we attempt to create a second instance with the exact same parameters.

Vudentz avatar Dec 16 '22 22:12 Vudentz

Would have been a nice one, but I'm afraid I made a mistake looking at nRF Connect.

I am still trying to wrap my head around the hog-lib code and how the input event interfaces are created and connected to the raw report interfaces, I think this is the place where the problem resides, the other report interface simply gets ignored whereas another mouse event input interface should be instantiated and connected to it.

nica-f avatar Dec 16 '22 22:12 nica-f

I think this is the place where the problem resides, the other report interface simply gets ignored whereas another mouse event input interface should be instantiated and connected to it.

I also think so. I opened this bug on mailing list years ago and, at some point, I made it working. I do so much tests and experiment that I didn't exactly know what make it working, but I only touch the hog part.

I lose my changes now :/

guilhem avatar Dec 16 '22 22:12 guilhem

@guilhem Thanks, that's already a very helpful hint! Then I stop looking at the other parts now... Too bad you lost your source tree... but we'll figure it out eventually... it is already 98% working, just this one tiny missing link somewhere... Can you remember any other details that might help us now to retrace your steps?

nica-f avatar Dec 16 '22 22:12 nica-f

@nica-f I end up ordering one, Im starting to suspect the is some bug enumerating the second instance mouse report, perhaps because it would be considered a duplicate of the first report so it would be a exact match for the Input device ID and name fields, that said why did HP need 2 different mouse reports I don't really get it, or they are 2 different sensors that be used simultaneously?

Did you get yours? Already tinkered with it and probably have some insights to share?

nica-f avatar Jan 29 '23 16:01 nica-f

I can happily report that the problem is solved! And it's not a BlueZ userspace problem, it's a Linux kernel HID problem. The successfully tested patch can be found here:

https://lore.kernel.org/linux-input/[email protected]/

After applying, recompliing kernel (applied it to 6.3.8) and installing, mouse function of the Elite Presenter works out of the box, very happy!

The kernel patch was submitted end of May so I guess it will end up in new kernels some time soon.

nica-f avatar Jun 17 '23 13:06 nica-f