Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Jun 2011 22:46:35 -0500
From:      Brandon Gooch <jamesbrandongooch@gmail.com>
To:        Maksim Yevmenkin <maksim.yevmenkin@gmail.com>
Cc:        "freebsd-bluetooth@freebsd.org" <freebsd-bluetooth@freebsd.org>, freebsd-usb@freebsd.org
Subject:   Re: Broadcom BCM2046B1 in HCI mode?
Message-ID:  <BANLkTi=SqvgOHRpvQSAc%2BQ60wUHJFi7nDg@mail.gmail.com>
In-Reply-To: <BANLkTikbiJtr6E7-G86tEX-PpTZn2R8u7A@mail.gmail.com>
References:  <BANLkTikUpA-1NxFrrgXACzPoeocjjZXT=A@mail.gmail.com> <BANLkTikbiJtr6E7-G86tEX-PpTZn2R8u7A@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Jun 22, 2011 at 11:17 AM, Maksim Yevmenkin
<maksim.yevmenkin@gmail.com> wrote:
> On Tuesday, June 21, 2011, Brandon Gooch <jamesbrandongooch@gmail.com> wr=
ote:
>> I have one of these in my notebook:
>>
>> uhub4: <Broadcom BCM2046B1, class 9/0, rev 2.00/1.00, addr 5> on usbus0
>>
>> This is a bluetooth device in HID mode, but I'd like to switch it to
>> HCI mode. I found the following in rc.conf(5):
>>
>> =A0=A0 =A0 ubthidhci_enable
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (bool) If set to ``YES'', change the =
USB Bluetooth controller
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 from HID mode to HCI mode. =A0You als=
o need to specify the
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 location of USB Bluetooth controller =
with the
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ubthidhci_busnum and ubthidhci_addr v=
ariables.
>>
>> =A0=A0 =A0 ubthidhci_busnum
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Bus number where the USB Bluetooth co=
ntroller is located.
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Check the output of usbconfig(8) on y=
our system to find this
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 information.
>>
>> =A0=A0 =A0 ubthidhci_addr
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Bus address of the USB Bluetooth cont=
roller. =A0Check the out-
>> =A0=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 put of usbconfig(8) on your system to=
 find this information.
>>
>> So I added the appropriate directives to /etc/rc.conf, to no avail:
>>
>> ubthidhci_enable=3D"YES"
>> ubthidhci_busnum=3D"0"
>> ubthidhci_addr=3D"5"
>>
>> This basically calls usbconfig(8) at system start-up in the following wa=
y:
>>
>> /usr/sbin/usbconfig -u 0 -a 5 do_request 0x40 0 0 0 0 > /dev/null 2>&1
>>
>> Running this command manually, I see this output:
>>
>> REQUEST =3D <ERROR>
>>
>> ...which I've read as potentially being OK, as the operation still may
>> have successfully completed -- it hasn't :(
>>
>> So, has anyone had any luck using this rc.conf(5) directive, or does
>> anyone on this list have a modified usbconfig(8) command that may help
>> me coax HCI from this device?
>
>
> Switching device between hid and hci modes is s something that is
> device / manufacturer specific. It could be that this particular
> device need different request or something like that. I would suggest
> to look at linux tool called hid2hci. It has support for different
> devices from different manufacturers.
>
> Thanks,
> Max
>

That was an excellent suggestion, so I went and checked it out. In
fact, I verified that it indeed does the trick in a couple of recent
Linux distros.

So can someone help me decipher the byte sequence I need to provide to
usbconfig(8)?

The hid2hci utility has this function defined for dealing with the
device in question:

http://git.kernel.org/?p=3Dbluetooth/bluez.git;a=3Dblob;f=3Dtools/hid2hci.c=
;h=3D45a3a3db8b29411ee193e480f5ce8a82a40103d1;hb=3D7822123d08b176ef8b3e8aae=
cbc3c8ff25a33483#l122

static int usb_switch_dell(struct usb_dev_handle *dev, enum mode mode)
...
        char report[] =3D { 0x7f, 0x00, 0x00, 0x00 };
...
        report[1] =3D 0x13;
....
        err =3D usb_control_msg(dev,
            USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
            USB_REQ_SET_CONFIGURATION, 0x7f | (0x03 << 8), 0,
            report, sizeof(report), 5000);
...

And according to:

http://lxr.linux.no/#linux+v2.6.39/include/linux/usb.h#L1400

usb_control_msg() is prototyped:

extern int usb_control_msg(struct usb_device *dev, unsigned int pipe,
         __u8 request, __u8 requesttype, __u16 value, __u16 index,
         void *data, __u16 size, int timeout);

...and I'd like to know what this means in terms of the following
(from src/usr.sbin/usbconfig/usbconfig.c):

libusb20_dev_request_sync(pdev, &opt->setup,
    opt->buffer, &actlen, 5000 /* 5 seconds */ , 0))

which is prototyped as:

libusb20_dev_request_sync(struct libusb20_device *pdev,
         struct LIBUSB20_CONTROL_SETUP_DECODED *setup, void *data,
         uint16_t *pactlen, uint32_t timeout, uint8_t flags);

I'm looking for something like the following:

# usbconfig -u 0 -a 5 do_request 0x37f 0x13 0 0 0

However, this isn't correct I know, but I could use some help sorting
it out -- any takers?

-Brandon

(Bad form: I'm cross-posting)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BANLkTi=SqvgOHRpvQSAc%2BQ60wUHJFi7nDg>