register HID with SDP error

Waitman Gobble gobble.wa at gmail.com
Sun Mar 22 15:19:29 UTC 2015


On Sat, Mar 21, 2015 at 8:41 PM, Waitman Gobble <gobble.wa at gmail.com> wrote:
> On Thu, Mar 19, 2015 at 1:24 PM, Maksim Yevmenkin
> <maksim.yevmenkin at gmail.com> wrote:
>>> Hi,
>>>
>>> It's not for production use, but if someone comes across this post in
>>> the future maybe save a few minutes when tinkering and
>>> troubleshooting.
>>>
>>> I changed the Makefile so it will 'more easily' build as a standalone
>>> outside /usr/src
>>> I added the syslog line around ln 324 in server.c - just wanted to see
>>> that data was coming in.
>>>
>>> do {
>>> len = read(fd, &data, to_read);
>>> syslog(LOG_ERR,"%s",data.b);
>>> } while (len < 0 && errno == EINTR);
>>
>> ok, thanks.
>>
>> so, yes, please check your hid report format.
>>
>> this it the input report you should be using (this is taken from your
>> hid descriptor)
>>
>> Input   id=1 size=8 count=6 page=Keyboard
>> usage=Reserved_(no_event_indicated), logical range 0..255
>>
>> so, it means that on-the-wire packet should be 10 bytes
>>
>> byte 0: 0xA1 -- bluetooth header
>> byte 1: 0x01 -- hid report id
>> byte 2: 0xXX -- bitmask for modifier key pressed, i.e. ctrl, shift, alt, etc.
>> byte 3: 0x00 -- padding
>> byte 4: 0xXX -- key code pressed #1
>> byte 5: 0xXX -- key code pressed #2
>> byte 6: 0xXX -- key code pressed #3
>> byte 7: 0xXX -- key code pressed #4
>> byte 8: 0xXX -- key code pressed #5
>> byte 9: 0xXX -- key code pressed #6
>>
>> hid repot should tell which keys (scan codes 1..6) are pressed
>> currently, and, which modifier keys are pressed currently (byte 2). if
>> no keys are pressed currently, then, 0x00 should be used. host should
>> keep track of which keys were pressed previously, and, effectively
>> build a press/release logic itself. meaning if hid report N had key
>> code K, and, hid report N+1 did not have key code K, then it means
>> that key code K was pressed and subsequently released.
>>
>> here is another example that my be easier to understand. suppose we
>> start with no keys pressed. hid report will look like
>>
>> byte 0: 0xA1
>> byte 1: 0x01
>> byte 2: 0x00
>> byte 3: 0x00
>> byte 4: 0x00
>> byte 5: 0x00
>> byte 6: 0x00
>> byte 7: 0x00
>> byte 8: 0x00
>> byte 9: 0x00
>>
>> now, suppose key 'a' was pressed and then released. two hid reports
>> will go out, i.e.
>>
>> byte 0: 0xA1
>> byte 1: 0x01
>> byte 2: 0x00
>> byte 3: 0x00
>> byte 4: key code for 'a' key
>> byte 5: 0x00
>> byte 6: 0x00
>> byte 7: 0x00
>> byte 8: 0x00
>> byte 9: 0x00
>>
>> followed by
>>
>> byte 0: 0xA1
>> byte 1: 0x01
>> byte 2: 0x00
>> byte 3: 0x00
>> byte 4: 0x00
>> byte 5: 0x00
>> byte 6: 0x00
>> byte 7: 0x00
>> byte 8: 0x00
>> byte 9: 0x00
>>
>> meaning key 'a' was released and no other keys were pressed.
>>
>> i hope it makes sense to you.
>>
>> thanks,
>> max
>
> I finally have it working, except for some reason it's repeating last
> character. ('1' in the following example)
>
> Sending 'ABEF010231' to FIFO buffer, the client "types" the following:
>
> ABEF010231111111111111111111111111111111111111111111111111111111111111
>
> 1 forever, until i send another string of data to FIFO buffer, then it
> again repeats the last key as if it were stuck.
>
> i have 'release' key defined as
>
> /* empty struct for key release */
> struct hidrep_keyb_t * releasekey = (void *)hidrep;
> releasekey->btcode = 0xA1;
> releasekey->rep_id = REPORTID_KEYBD;
> releasekey->modify = 0x00;
> releasekey->pad = 0x00;
> releasekey->key[0] = 0x00;
> releasekey->key[1] = 0x00;
> releasekey->key[2] = 0x00;
> releasekey->key[3] = 0x00;
> releasekey->key[4] = 0x00;
> releasekey->key[5] = 0x00;
>
>
> here's the loop, for each character in FIFO buffer
>
> vkeyb->btcode = 0xA1;
> vkeyb->rep_id = REPORTID_KEYBD;
> vkeyb->modify = shiftkey(sfifo[i]);
> vkeyb->pad = 0x00;
> vkeyb->key[0] = retkey(sfifo[i]); /* key press */
> vkeyb->key[1] = 0x00;
> vkeyb->key[2] = 0x00;
> vkeyb->key[3] = 0x00;
> vkeyb->key[4] = 0x00;
> vkeyb->key[5] = 0x00;
> send ( intrsockfd, vkeyb,sizeof(struct hidrep_keyb_t), MSG_NOSIGNAL );
> printf("sent data %d %lu\n",vkeyb->key[0],sizeof(struct hidrep_keyb_t));
> send ( intrsockfd, releasekey,sizeof(struct hidrep_keyb_t), MSG_NOSIGNAL );
> printf("sent release\n");
> fflush(stdout);
>
> it does 'shift' 0x2 modifier on A-Z
>
>
> I think I'm missing something with the release key.
>
> Thank you,
>
> --
> Waitman Gobble
> Los Altos California USA
> 510-830-7975

Max,

I solved the problem, I got rid of the 'release key' structure and
change vkeyb->key[0] to  0, then send that as a key release. Its
working now.

I believe I just need to handle client disconnects, and re-connects,
and I think it will be all good.

Thanks for your help.

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


More information about the freebsd-bluetooth mailing list