前言
我吞下了前三章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
程序,不会出现错误。
得到教训
- 默认内核
btusb
驱动程序对其识别的 USB 蓝牙设备更加宽松,也许只是知道所有 CSR 设备都是蓝牙适配器。 - 设备驱动程序错误消息非常迟钝。即使启用 SS1BTUSB 设备驱动程序 DEBUG
printk
输出也没有帮助。 - 一如既往,唯一真正的文档是源代码。