Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Mar 2015 07:26:30 -0700
From:      Waitman Gobble <gobble.wa@gmail.com>
To:        Iain Hibbert <plunky@ogmig.net>
Cc:        "freebsd-bluetooth@freebsd.org" <freebsd-bluetooth@freebsd.org>
Subject:   Re: register HID with SDP error
Message-ID:  <CAFuo_fx47uRC-eKD_KtsSsrMCQZauyHyCOgRxGbtp_WEZ49o_Q@mail.gmail.com>
In-Reply-To: <alpine.NEB.2.11.1503170658130.4414@galant.ogmig.net>
References:  <CAFuo_fy9xRU2T3GUPY8116yZCUd8sL9pBQ9ixXnMwO56niJFog@mail.gmail.com> <CAFuo_fzdmB79qdoH8P5EcO_ZZoa=_id6h=eqFBXvP_a%2B3WMkLw@mail.gmail.com> <CAFuo_fzB3A5L3vivH7Z80OEoBtVEHftEYE4LUkhnrkguzL5GDA@mail.gmail.com> <CAFuo_fzrk%2BWLXivZrnTsGQD%2BS7mq%2BUSXB7Mn6%2BJT=y64JakGSw@mail.gmail.com> <CAFPOs6q3iVcNthF=S--UgTm=5wA0HM6coqB7AcmCKb=55OWdTQ@mail.gmail.com> <CAFuo_fxgBVKxmzbJs%2B-XDz%2Bu4tb2_i3eYXSa-oiOoU%2BQD6ApwQ@mail.gmail.com> <CAFPOs6r_D7bcGCMP_bP%2BQtZgKt7Oj5jRJ2v872RODekn%2B6xv1Q@mail.gmail.com> <CAFuo_fwPuaD4bYwfZou0RBswZsTmdtVZA1B2GqUdo3ZJJiWRQg@mail.gmail.com> <0AD7A2F7-37BE-4F6A-9FD6-F6C81B2CAF36@gmail.com> <CAFuo_fye5RWNtjsutHa%2BbXL0AYHYRpJxW-b=48o0iMwX227wdA@mail.gmail.com> <alpine.NEB.2.11.1503170658130.4414@galant.ogmig.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Mar 17, 2015 at 12:26 AM, Iain Hibbert <plunky@ogmig.net> wrote:
> On Mon, 16 Mar 2015, Waitman Gobble wrote:
>
>> I reviewed the HID_SPEC_V11 PDF and think i'm getting closer.
>> not yet sure about 11 & 12
>>
>> 11) HIDDescriptorList 0x0206
>
> this is effectively the HID Descriptor, as per a USB keyboard, should be
> something like
>
>   seq
>     seq
>       uint8    0x22
>       str8     "the descriptor itself"
>
> where 0x22 means a Report
>
>> 12) HIDLANGIDBaseList 0x0207
>
> This should be something like
>
>   seq
>     seq
>       uint16    0x0409
>       uint16    0x0100
>
> where 0x0409 translates as "English (US)" and 0x0100 is the offset of the
> default language attributes, from LanguageBaseAttributeIDList
>
> both of these allow multiple versions, which is why they are wrapped in a
> sequence
>
>> I can't seem to find examples of people using several of the
>> 'mandatory' attributes.
>
> using the NetBSD sdpquery(1) program, from my Apple wireless keyboard (the
> old white one), I get:
>
> ServiceRecordHandle: 0x00010000
> ServiceClassIDList:
>     Human Interface Device
> ProtocolDescriptorList:
>     L2CAP (PSM 0x0011)
>     HIDP
> BrowseGroupList:
>     Public Browse Root
> LanguageBaseAttributeIDList:
>     en.UTF-8 base 0x0100
> BluetoothProfileDescriptorList:
>     Human Interface Device, v1.0
> AdditionalProtocolDescriptorLists:
>     L2CAP (PSM 0x0013)
>     HIDP
> ServiceName: "Apple Wireless Keyboard"
> ServiceDescription: "Apple Wireless Keyboard"
> ProviderName: "Apple Computer, Inc."
> HIDDeviceReleaseNumber: v1.1.0
> HIDParserVersion: v1.1.1
> HIDDeviceSubClass: Peripheral <Keyboard>
> HIDCountryCode: 0x0d
> HIDVirtualCable: true
> HIDReconnectInitiate: true
> HIDDescriptorList:
>     Type 0x22: Report
>     Data 0x05 0x01 0x09 0x06 0xa1 0x01 0x85 0x01
>          0x05 0x07 0x19 0xe0 0x29 0xe7 0x15 0x00
>          0x25 0x01 0x75 0x01 0x95 0x08 0x81 0x02
>          0x75 0x08 0x95 0x01 0x81 0x01 0x75 0x01
>          0x95 0x05 0x05 0x08 0x19 0x01 0x29 0x05
>          0x91 0x02 0x75 0x03 0x95 0x01 0x91 0x01
>          0x75 0x08 0x95 0x06 0x15 0x00 0x26 0xff
>          0x00 0x05 0x07 0x19 0x00 0x2a 0xff 0x00
>          0x81 0x00 0x75 0x01 0x95 0x01 0x15 0x00
>          0x25 0x01 0x05 0x0c 0x09 0xb8 0x81 0x06
>          0x09 0xe2 0x81 0x06 0x09 0xe9 0x81 0x02
>          0x09 0xea 0x81 0x02 0x75 0x01 0x95 0x04
>          0x81 0x01 0xc0
> HIDLANGIDBaseList:
>     English (US) base 0x0100
> HIDSDPDisable: false
> HIDRemoteWake: true
> HIDProfileVersion: v1.0
> HIDSupervisionTimeout: 8000
> HIDNormallyConnectable: true
> HIDBootDevice: true
>
> which, in 'raw' form is:
>
> AttributeID 0x0000:
>     uint32        0x00010000
> AttributeID 0x0001:
>     seq8(3)
>      uuid16       0x1124
> AttributeID 0x0004:
>     seq8(13)
>      seq8(6)
>       uuid16      0x0100
>       uint16      0x0011
>      seq8(3)
>       uuid16      0x0011
> AttributeID 0x0005:
>     seq8(3)
>      uuid16       0x1002
> AttributeID 0x0006:
>     seq8(9)
>      uint16       0x656e
>      uint16       0x006a
>      uint16       0x0100
> AttributeID 0x0009:
>     seq8(8)
>      seq8(6)
>       uuid16      0x1124
>       uint16      0x0100
> AttributeID 0x000d:
>     seq8(15)
>      seq8(13)
>       seq8(6)
>        uuid16     0x0100
>        uint16     0x0013
>       seq8(3)
>        uuid16     0x0011
> AttributeID 0x0100:
>     str8(23)      "Apple Wireless Keyboard"
> AttributeID 0x0101:
>     str8(23)      "Apple Wireless Keyboard"
> AttributeID 0x0102:
>     str8(20)      "Apple Computer, Inc."
> AttributeID 0x0200:
>     uint16        0x0110
> AttributeID 0x0201:
>     uint16        0x0111
> AttributeID 0x0202:
>     uint8         0x40
> AttributeID 0x0203:
>     uint8         0x0d
> AttributeID 0x0204:
>     bool          true
> AttributeID 0x0205:
>     bool          true
> AttributeID 0x0206:
>     seq8(105)
>      seq8(103)
>       uint8       0x22
>       str8(99)    "\^E\^A       \^F\M-!\^A\M^E\^A\^E\a\^Y\M-`)\M-g\^U\0 ...
> AttributeID 0x0207:
>     seq8(8)
>      seq8(6)
>       uint16      0x0409
>       uint16      0x0100
> AttributeID 0x0208:
>     bool          false
> AttributeID 0x020a:
>     bool          true
> AttributeID 0x020b:
>     uint16        0x0100
> AttributeID 0x020c:
>     uint16        0x1f40
> AttributeID 0x020d:
>     bool          true
> AttributeID 0x020e:
>     bool          true
>
> and the plain hex values:
>
> AttributeID 0x0000:
>       0x0a 0x00 0x01 0x00 0x00
> AttributeID 0x0001:
>       0x35 0x03 0x19 0x11 0x24
> AttributeID 0x0004:
>       0x35 0x0d 0x35 0x06 0x19 0x01 0x00 0x09
>       0x00 0x11 0x35 0x03 0x19 0x00 0x11
> AttributeID 0x0005:
>       0x35 0x03 0x19 0x10 0x02
> AttributeID 0x0006:
>       0x35 0x09 0x09 0x65 0x6e 0x09 0x00 0x6a
>       0x09 0x01 0x00
> AttributeID 0x0009:
>       0x35 0x08 0x35 0x06 0x19 0x11 0x24 0x09
>       0x01 0x00
> AttributeID 0x000d:
>       0x35 0x0f 0x35 0x0d 0x35 0x06 0x19 0x01
>       0x00 0x09 0x00 0x13 0x35 0x03 0x19 0x00
>       0x11
> AttributeID 0x0100:
>       0x25 0x17 0x41 0x70 0x70 0x6c 0x65 0x20
>       0x57 0x69 0x72 0x65 0x6c 0x65 0x73 0x73
>       0x20 0x4b 0x65 0x79 0x62 0x6f 0x61 0x72
>       0x64
> AttributeID 0x0101:
>       0x25 0x17 0x41 0x70 0x70 0x6c 0x65 0x20
>       0x57 0x69 0x72 0x65 0x6c 0x65 0x73 0x73
>       0x20 0x4b 0x65 0x79 0x62 0x6f 0x61 0x72
>       0x64
> AttributeID 0x0102:
>       0x25 0x14 0x41 0x70 0x70 0x6c 0x65 0x20
>       0x43 0x6f 0x6d 0x70 0x75 0x74 0x65 0x72
>       0x2c 0x20 0x49 0x6e 0x63 0x2e
> AttributeID 0x0200:
>       0x09 0x01 0x10
> AttributeID 0x0201:
>       0x09 0x01 0x11
> AttributeID 0x0202:
>       0x08 0x40
> AttributeID 0x0203:
>       0x08 0x0d
> AttributeID 0x0204:
>       0x28 0x01
> AttributeID 0x0205:
>       0x28 0x01
> AttributeID 0x0206:
>       0x35 0x69 0x35 0x67 0x08 0x22 0x25 0x63
>       0x05 0x01 0x09 0x06 0xa1 0x01 0x85 0x01
>       0x05 0x07 0x19 0xe0 0x29 0xe7 0x15 0x00
>       0x25 0x01 0x75 0x01 0x95 0x08 0x81 0x02
>       0x75 0x08 0x95 0x01 0x81 0x01 0x75 0x01
>       0x95 0x05 0x05 0x08 0x19 0x01 0x29 0x05
>       0x91 0x02 0x75 0x03 0x95 0x01 0x91 0x01
>       0x75 0x08 0x95 0x06 0x15 0x00 0x26 0xff
>       0x00 0x05 0x07 0x19 0x00 0x2a 0xff 0x00
>       0x81 0x00 0x75 0x01 0x95 0x01 0x15 0x00
>       0x25 0x01 0x05 0x0c 0x09 0xb8 0x81 0x06
>       0x09 0xe2 0x81 0x06 0x09 0xe9 0x81 0x02
>       0x09 0xea 0x81 0x02 0x75 0x01 0x95 0x04
>       0x81 0x01 0xc0
> AttributeID 0x0207:
>       0x35 0x08 0x35 0x06 0x09 0x04 0x09 0x09
>       0x01 0x00
> AttributeID 0x0208:
>       0x28 0x00
> AttributeID 0x020a:
>       0x28 0x01
> AttributeID 0x020b:
>       0x09 0x01 0x00
> AttributeID 0x020c:
>       0x09 0x1f 0x40
> AttributeID 0x020d:
>       0x28 0x01
> AttributeID 0x020e:
>       0x28 0x01
>
> the HID descriptor decodes as follows: (in the style of bthidcontrol)
>
> Collection page=Generic_Desktop usage=Keyboard
>   Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_LeftControl Variable, logical range 0..1
>   Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_LeftShift Variable, logical range 0..1
>   Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_LeftAlt Variable, logical range 0..1
>   Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_Left_GUI Variable, logical range 0..1
>   Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_RightControl Variable, logical range 0..1
>   Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_RightShift Variable, logical range 0..1
>   Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_RightAlt Variable, logical range 0..1
>   Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_Right_GUI Variable, logical range 0..1
>   Input id=1 size=8 count=1 page=0x0000 usage=0x0000 Const, logical range 0..1
>  Output id=1 size=1 count=1 page=LEDs usage=Num_Lock Variable, logical range 0..1
>  Output id=1 size=1 count=1 page=LEDs usage=Caps_Lock Variable, logical range 0..1
>  Output id=1 size=1 count=1 page=LEDs usage=Scroll_Lock Variable, logical range 0..1
>  Output id=1 size=1 count=1 page=LEDs usage=Compose Variable, logical range 0..1
>  Output id=1 size=1 count=1 page=LEDs usage=Kana Variable, logical range 0..1
>  Output id=1 size=3 count=1 page=0x0000 usage=0x0000 Const, logical range 0..1
>   Input id=1 size=8 count=6 page=Keyboard usage=No_Event, logical range 0..255
>   Input id=1 size=1 count=1 page=Consumer usage=Eject Variable Relative, logical range 0..1
>   Input id=1 size=1 count=1 page=Consumer usage=Mute Variable Relative, logical range 0..1
>   Input id=1 size=1 count=1 page=Consumer usage=Volume_Up Variable, logical range 0..1
>   Input id=1 size=1 count=1 page=Consumer usage=Volume_Down Variable, logical range 0..1
>   Input id=1 size=1 count=4 page=0x0000 usage=0x0000 Const, logical range 0..1
> End collection
>
> or, in a more raw format:
>
>  05 01         Global:Usage Page (1)
>  09 06         Local:Usage (6)
>  a1 01         Main:Collection(Application)
>  85 01            Global:Report ID (1)
>  05 07            Global:Usage Page (7)
>  19 e0            Local:Usage Minimum (-32)
>  29 e7            Local:Usage Maximum (-25)
>  15 00            Global:Logical Minimum (0)
>  25 01            Global:Logical Maximum (1)
>  75 01            Global:Report Size (1)
>  95 08            Global:Report Count (8)
>  81 02            Main:Input(Variable)
>  75 08            Global:Report Size (8)
>  95 01            Global:Report Count (1)
>  81 01            Main:Input(Constant)
>  75 01            Global:Report Size (1)
>  95 05            Global:Report Count (5)
>  05 08            Global:Usage Page (8)
>  19 01            Local:Usage Minimum (1)
>  29 05            Local:Usage Maximum (5)
>  91 02            Main:Output(Variable)
>  75 03            Global:Report Size (3)
>  95 01            Global:Report Count (1)
>  91 01            Main:Output(Constant)
>  75 08            Global:Report Size (8)
>  95 06            Global:Report Count (6)
>  15 00            Global:Logical Minimum (0)
>  26 ff 00         Global:Logical Maximum (255)
>  05 07            Global:Usage Page (7)
>  19 00            Local:Usage Minimum (0)
>  2a ff 00         Local:Usage Maximum (255)
>  81 00            Main:Input()
>  75 01            Global:Report Size (1)
>  95 01            Global:Report Count (1)
>  15 00            Global:Logical Minimum (0)
>  25 01            Global:Logical Maximum (1)
>  05 0c            Global:Usage Page (12)
>  09 b8            Local:Usage (-72)
>  81 06            Main:Input(Variable, Relative)
>  09 e2            Local:Usage (-30)
>  81 06            Main:Input(Variable, Relative)
>  09 e9            Local:Usage (-23)
>  81 02            Main:Input(Variable)
>  09 ea            Local:Usage (-22)
>  81 02            Main:Input(Variable)
>  75 01            Global:Report Size (1)
>  95 04            Global:Report Count (4)
>  81 01            Main:Input(Constant)
>  c0            Main:End Collection
>
>
> regards,
> iain

Thanks, that's very helpful. I added the 0x0206 and 0x0207 but NOW i
see i didn't do it correctly based on your information.

btw i tried running 'bluetoothctl' on a machine running mainline Linux
kernel with 'hcidump' running on the FreeBSD machine, kinda looks like
a good way to find issues/debug. I don't yet see how to query from
FreeBSD so that it's 'parsing' the sdp records.

# bluetoothctl
[bluetooth]# list
Controller 00:10:60:AF:5B:AF eshe [default]
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:10:60:AF:5B:AF Discovering: yes
[NEW] Device 00:1B:DC:06:94:D3 00-1B-DC-06-94-D3
[CHG] Device 00:1B:DC:06:94:D3 RSSI: -61
[CHG] Device 00:1B:DC:06:94:D3 LegacyPairing: no
[CHG] Device 00:1B:DC:06:94:D3 Name: afia.waitman.net (ubt0)
[CHG] Device 00:1B:DC:06:94:D3 Alias: afia.waitman.net (ubt0)
[CHG] Device 00:1B:DC:06:94:D3 LegacyPairing: yes
[CHG] Device 00:1B:DC:06:94:D3 RSSI: -52
[bluetooth]# connect 00:1B:DC:06:94:D3
Attempting to connect to 00:1B:DC:06:94:D3
[CHG] Device 00:1B:DC:06:94:D3 Connected: yes
[CHG] Device 00:1B:DC:06:94:D3 UUIDs:
        00001000-0000-1000-8000-00805f9b34fb
        00001001-0000-1000-8000-00805f9b34fb
        00001124-0000-1000-8000-00805f9b34fb
Failed to connect: org.bluez.Error.Failed
[CHG] Device 00:1B:DC:06:94:D3 RSSI: -51
[bluetooth]# pairable on
Changing pairable on succeeded
[bluetooth]# pair 00:1B:DC:06:94:D3
Attempting to pair with 00:1B:DC:06:94:D3
Failed to pair: org.bluez.Error.AuthenticationFailed

hcidump log https://gist.github.com/waitman/c3f8a3bc9b046e36dbb5

it's showing me the 0x0206 is incorrect, but now i think realize how
it should be structured based on your information. Thank you.


-- 
Waitman Gobble
Los Altos California USA
510-830-7975



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFuo_fx47uRC-eKD_KtsSsrMCQZauyHyCOgRxGbtp_WEZ49o_Q>