取消绑定/绑定新的蓝牙设备驱动程序 - Ubuntu 14.04 Trust Tahr

取消绑定/绑定新的蓝牙设备驱动程序 - Ubuntu 14.04 Trust Tahr

前言

我吞下了前三章Linux 设备驱动程序,第 3 版 - PDF,所以我对它的了解比本周初多了一些,但仍然不多。

系统

  • 发行版:Ubuntu 14.04.4 LTS、Trusty Tahr
  • 内核:4.4.0-47-通用

问题

我正在尝试btusb用 Bluetopia USB BT 驱动程序替换内核驱动程序SS1BTUSB(驱动程序源和构建文件来自极光代码),因为我正在尝试了解有关 Bluetopia 蓝牙堆栈实现的更多信息,这是实现这一目标的第一步。

我可以成功构建SS1BTUSB内核模块并安装它。

$ sudo insmod SS1BTUSBM.ko

$ lsmod | grep SS1BTUSB
SS1BTUSBM              32768  0

并且,按照来自lwn.net 文章,我可以解除绑定到驱动程序的设备btusb

$ ls /sys/bus/usb/drivers/btusb
1-1.5:1.0  1-1.5:1.1  bind  module  new_id  remove_id  uevent  unbind
$ sudo -i
# echo "1-1.5:1.0" > /sys/bus/usb/drivers/btusb/unbind
# echo "1-1.5:1.1" > /sys/bus/usb/drivers/btusb/unbind
-bash: echo: write error: No such device
# ls /sys/bus/usb/drivers/btusb
bind  module  new_id  remove_id  uevent  unbind

我不确定为什么取消绑定第二个设备会导致错误,但结果是设备与btusb驱动程序取消绑定。

但是,当我尝试将这些设备绑定到SS1BTUSB1驱动程序时,我收到相同的错误。

# echo "1-1.5:1.1" > /sys/bus/usb/drivers/SS1BTUSB/bind
-bash: echo: write error: No such device
# echo "1-1.5:1.0" > /sys/bus/usb/drivers/SS1BTUSB/bind
-bash: echo: write error: No such device

看来“没有这样的设备”错误相当普遍,可能意味着很多事情,关于如何调试/诊断此问题的建议将不胜感激。

散记

(可能有助于也可能没有帮助诊断问题)。

btusb驱动程序被其他驱动程序使用 - 可能相关。

$ lsmod | grep btusb
btusb                  45056  0
btrtl                  16384  1 btusb
btbcm                  16384  1 btusb
btintel                16384  1 btusb
bluetooth             516096  25 bnep,btbcm,btrtl,btusb,rfcomm,btintel

蓝牙 USB 适配器上的 USB 信息...

$ lsusb
.
Bus 001 Device 003: ID 0a12:1243 Cambridge Silicon Radio, Ltd
.

它实际上是一个配置为 BT 加密狗的 CSR8675 耳机开发板(这一点我知道),所以它的细节看起来有点奇怪......

$ usb-devices
.
T:  Bus=01 Lev=02 Prnt=02 Port=04 Cnt=01 Dev#=  3 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0a12 ProdID=1243 Rev=20.32
S:  Product=CSR8675 USB Headset
S:  SerialNumber=ABCDEF0123456789
C:  #Ifs= 3 Cfg#= 1 Atr=80 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
I:  If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
I:  If#= 2 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
.

但它是一个功能齐全的蓝牙 HCI 设备。

答案1

因此,事实证明 Bluetopia 设备驱动程序SS1BTUSB对其支持的蓝牙设备非常具体。比内核驱动程序更具体btusb

来自 SS1BTUSB.c BluetoothDeviceIDTable[]...

   /* CSR Module.                                             */
   { USB_DEVICE(0x0A12, 0x0001) },
   { USB_DEVICE(0x0A12, 0x0043) },
   { USB_DEVICE(0x0A12, 0x1000) },

我检查了我的开发板...其 idProduct(USB 产品 ID 代码)是 0x1234。

$ lsusb -d 0a12:
Bus 001 Device 006: ID 0a12:1234 Cambridge Silicon Radio, Ltd

0x1234 不在表中,甚至没有在任何“剑桥硅无线电”设备中列出www.linux-usb.org

幸运的是,我可以更改 DevBoards USB 产品 ID,因此我将其更改为 0x0001 - 表示“HCI 设备”。

结果,设备被识别为蓝牙适配器(HCI 模式)

$ lsusb -d 0a12:
Bus 001 Device 007: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

现在我可以将设备“1-1.5:1-0”和“1-1.5:1-1”绑定/取消绑定到驱动SS1BTUSB程序,不会出现错误。

得到教训

  1. 默认内核btusb驱动程序对其识别的 USB 蓝牙设备更加宽松,也许只是知道所有 CSR 设备都是蓝牙适配器。
  2. 设备驱动程序错误消息非常迟钝。即使启用 SS1BTUSB 设备驱动程序 DEBUGprintk输出也没有帮助。
  3. 一如既往,唯一真正的文档是源代码。

相关内容