register HID with SDP error
Waitman Gobble
gobble.wa at gmail.com
Thu Mar 19 01:46:43 UTC 2015
On Wed, Mar 18, 2015 at 11:48 AM, Maksim Yevmenkin
<maksim.yevmenkin at gmail.com> wrote:
> [...]
>
>> I'm working on the hid code. It opens the l2cap control and interrupt
>> sockets then waits for client connect. When the client connects it
>> sends the key codes.
>>
>> very simply,
>>
>> struct sockaddr_l2cap l2addr, cli_addr;
>>
>> controlsock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BLUETOOTH_PROTO_L2CAP);
>> bind(controlsock, (struct sockaddr *) &l2addr, sizeof(l2addr));
>>
>> intrsock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BLUETOOTH_PROTO_L2CAP);
>> bind(intrsock, (struct sockaddr *) &l2addr, sizeof(l2addr));
>>
>>
>> clilen = sizeof(cli_addr);
>> newsockfd = accept(controlsock, (struct sockaddr *) &cli_addr,
>> &clilen); //blocks until client connect
>
> ok... are you also accepting connection on interrupt channel? please
> recall, i've mentioned that buetooth hid is modeled after usb hid.
> there are two channels: control and interrupt.
>
>> then loop while reading chars from FIFO:
>>
>> evkeyb->btcode = 0xA1;
>> evkeyb->rep_id = REPORTID_KEYBD;
>> evkeyb->key[0] = retkey(sfifo[i]); //translate to key code
>> send ( newsockfd, evkeyb,sizeof(struct hidrep_keyb_t),MSG_NOSIGNAL );
>
> hmm.... i don't think its quite correct. all the hid reports should be
> sent on the interrupt channel (just like usb hid device uses interrupt
> transfer endpoint to send its reports back to host). if i'm reading
> your code correctly, newsockfd is an accepted connection on the
> control socket. i presume you have constructed correct hid report
> sequence to send too (as per hid descriptor you have given out to
> remote host via sdp).
>
> [...]
>
>> # ./hid_sppd
>> control socket created
>> interrupt socket created
>> waiting for connect
>> waiting for fifo.. press Control-C to exit.
>> sent data 38 "key 0"
>> sent data 29 "key 1"
>> sent data 30 "key 2"
>> sent data 31 "key 3"
>> sent data 32 "key 4"
>> ...
>>
>> ...and it's reading the fifo buffer and sending the keys through the
>> clientfd, but nothing useful is happening on client.. So I think I'm
>> either doing this wrong, or my SDP record is still incorrect.
>
> well, if remote host has connected then, presumably, it has found
> everything that it needed from sdp. so, i would guess that your sdp
> records are probably correct. i suspect that you need to sort out your
> hid reports format and send them via interrupt channel, not control.
> you also might want to take a look at USBHID(3), specifically
> hid_set_data().
>
> you can use bthidd(8) code as an example of what host *might* be doing
> and how host *might* expect data. in fact, you can probably use
> bthidd(8) to test your virtual hid device.
>
> one thing to keep in mind is the initial "handshake" setup. when hid
> device is "unknown" to host, host must initiate connection to the
> device first. later, host must respect value of reconnect_initiate
> attribute, and, if its set, host must wait for hid device to
> re-connect. this way, say, keyboard may put itself to sleep, and, wake
> up and reconnect when user presses a button.
>
> thanks,
> max
Thanks Max, that is super great help. Hopefully I can get it
straightened out tonight.
--
Waitman Gobble
Los Altos California USA
510-830-7975
More information about the freebsd-bluetooth
mailing list