使用 hciattach 通过 uart 蓝牙?
Bluetooth over uart using hciattach?
我正在使用 QN9021
在 controller mode
(BLE 蓝牙核心规范 v4.0)中工作的 SoC。它支持一些标准 HCI
命令以及一些特定于供应商的命令。我正在尝试将它附加到我的 ubuntu
笔记本电脑中。
我用过的指令是hciattach
.
hciattach -s 9600 /dev/ttyUSBx any 9600 noflow nosleep
执行sudo hciconfig hci1 up
时显示hcidump
。
HCI sniffer - Bluetooth packet analyzer ver 5.37
device: hci1 snap_len: 1500 filter: 0xffffffffffffffff
> HCI Event: Command Complete (0x0e) plen 12
Read Local Supported Features (0x04|0x0003) ncmd 11
status 0x00
Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
> HCI Event: Command Complete (0x0e) plen 12
Read Local Version Information (0x04|0x0001) ncmd 11
status 0x00
HCI Version: 4.0 (0x6) HCI Revision: 0x400
LMP Version: 4.0 (0x6) LMP Subversion: 0x400
Manufacturer: Quintic Corp. (142)
> HCI Event: Command Complete (0x0e) plen 10
Read BD ADDR (0x04|0x0009) ncmd 11
status 0x00 bdaddr 08:7C:BE:3E:34:BB
> HCI Event: Command Complete (0x0e) plen 11
Read Buffer Size (0x04|0x0005) ncmd 11
status 0x00
ACL MTU 0:0 SCO MTU 0:0
> HCI Event: Command Complete (0x0e) plen 4
Read Class of Device (0x03|0x0023) ncmd 11
status 0x01 class 0x000000
Error: Unknown HCI Command
hciconfig
命令显示:
hci1: Type: BR/EDR Bus: UART
BD Address: 08:7C:BE:3E:34:BB ACL MTU: 0:0 SCO MTU: 0:0
DOWN
RX bytes:192 acl:0 sco:0 events:15 errors:0
TX bytes:60 acl:0 sco:0 commands:15 errors:0
hci0: Type: BR/EDR Bus: USB
BD Address: C4:8E:8F:66:3B:0E ACL MTU: 820:8 SCO MTU: 255:16
UP RUNNING PSCAN
RX bytes:2457 acl:0 sco:0 events:196 errors:0
TX bytes:24646 acl:0 sco:0 commands:196 errors:0
我想知道如何防止内核或某些蓝牙内核模块发送不支持的 HCI 命令。我是否需要修补 linux 内核源代码或为我的 SoC 编写模块。
注意:- 此项目无法更改 SoC 或为其编写固件以支持所有必要的命令。
编辑:
我知道我的 SoC 支持的HCI
命令列表。我正在考虑创建一个 module
来告诉内核和守护进程 运行 只向 SoC 发送支持的命令。我查看了 linux 内核源代码(特别是在这个 hci_core.c). I think modifying it may solve the problem after going through this link. In this link, some developer has provided a patch to support a bluetooth dongle
. The patch prevents the hci_core.c 文件中,用于将特定的 HCI 命令发送到特定制造商的加密狗。
我想要的只是解决这个问题的建议。我是否需要修改 linux 内核或为我的 SoC 编写模块?
注意:- 应用程序将在 openwrt
linux 上 运行。
好的,今天我们找到了解决方案:
# hciattach -r /dev/ttyS0 bcsp 115200
也许对某人有帮助
有帮助Tips:May这篇link会对你有所帮助。
I will give two links for more details
and for bluetooth click here
and for kernel configuration click here
几年前我已经解决了这个问题。我使用的是 Linux 版本 4.4.14
和 Bluez 堆栈 5.38
。看起来 QN9021
有一些错误。问题不在于 Read Class of Device
,而在于 QN9021
对命令的响应:Read Local Supported Features
。因为,它是 BLE 控制器芯片,它不应该发送 Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
作为对上述命令的响应。
问题是内核将其检测为经典蓝牙控制器芯片,然后将不支持的 HCI 命令发送到芯片。芯片应该将 Features
中第 4 个字节的第 5 位和第 6 位(LMP_NO_BREDR and LMP_LE 位)设置为命令 Read Local Supported Features
然后内核将其检测为 BLE
控制器模式芯片,不会向蓝牙控制器模式芯片发送任何不受支持的命令。
既然不能改芯片的固件,只好给内核打补丁了。
这是我的补丁:
*** hci_event.c 2017-02-10 00:05:13.149974000 +0530
--- bluetooth/hci_event.c 2016-06-24 22:48:38.000000000 +0530
***************
*** 588,597 ****
if (rp->status)
return;
-
memcpy(hdev->features, rp->features, 8);
- hdev->features[0][4] |= LMP_NO_BREDR;
- hdev->features[0][4] |= LMP_LE;
/* Adjust default settings according to features
* supported by device. */
--- 588,594 ----
我也厌倦了以下命令,但没有帮助:
hciattach -r /dev/ttyS0 bcsp 115200
我正在使用 QN9021
在 controller mode
(BLE 蓝牙核心规范 v4.0)中工作的 SoC。它支持一些标准 HCI
命令以及一些特定于供应商的命令。我正在尝试将它附加到我的 ubuntu
笔记本电脑中。
我用过的指令是hciattach
.
hciattach -s 9600 /dev/ttyUSBx any 9600 noflow nosleep
执行sudo hciconfig hci1 up
时显示hcidump
。
HCI sniffer - Bluetooth packet analyzer ver 5.37
device: hci1 snap_len: 1500 filter: 0xffffffffffffffff
> HCI Event: Command Complete (0x0e) plen 12
Read Local Supported Features (0x04|0x0003) ncmd 11
status 0x00
Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
> HCI Event: Command Complete (0x0e) plen 12
Read Local Version Information (0x04|0x0001) ncmd 11
status 0x00
HCI Version: 4.0 (0x6) HCI Revision: 0x400
LMP Version: 4.0 (0x6) LMP Subversion: 0x400
Manufacturer: Quintic Corp. (142)
> HCI Event: Command Complete (0x0e) plen 10
Read BD ADDR (0x04|0x0009) ncmd 11
status 0x00 bdaddr 08:7C:BE:3E:34:BB
> HCI Event: Command Complete (0x0e) plen 11
Read Buffer Size (0x04|0x0005) ncmd 11
status 0x00
ACL MTU 0:0 SCO MTU 0:0
> HCI Event: Command Complete (0x0e) plen 4
Read Class of Device (0x03|0x0023) ncmd 11
status 0x01 class 0x000000
Error: Unknown HCI Command
hciconfig
命令显示:
hci1: Type: BR/EDR Bus: UART
BD Address: 08:7C:BE:3E:34:BB ACL MTU: 0:0 SCO MTU: 0:0
DOWN
RX bytes:192 acl:0 sco:0 events:15 errors:0
TX bytes:60 acl:0 sco:0 commands:15 errors:0
hci0: Type: BR/EDR Bus: USB
BD Address: C4:8E:8F:66:3B:0E ACL MTU: 820:8 SCO MTU: 255:16
UP RUNNING PSCAN
RX bytes:2457 acl:0 sco:0 events:196 errors:0
TX bytes:24646 acl:0 sco:0 commands:196 errors:0
我想知道如何防止内核或某些蓝牙内核模块发送不支持的 HCI 命令。我是否需要修补 linux 内核源代码或为我的 SoC 编写模块。
注意:- 此项目无法更改 SoC 或为其编写固件以支持所有必要的命令。
编辑:
我知道我的 SoC 支持的HCI
命令列表。我正在考虑创建一个 module
来告诉内核和守护进程 运行 只向 SoC 发送支持的命令。我查看了 linux 内核源代码(特别是在这个 hci_core.c). I think modifying it may solve the problem after going through this link. In this link, some developer has provided a patch to support a bluetooth dongle
. The patch prevents the hci_core.c 文件中,用于将特定的 HCI 命令发送到特定制造商的加密狗。
我想要的只是解决这个问题的建议。我是否需要修改 linux 内核或为我的 SoC 编写模块?
注意:- 应用程序将在 openwrt
linux 上 运行。
好的,今天我们找到了解决方案:
# hciattach -r /dev/ttyS0 bcsp 115200
也许对某人有帮助
有帮助Tips:May这篇link会对你有所帮助。
I will give two links for more details and for bluetooth click here and for kernel configuration click here
几年前我已经解决了这个问题。我使用的是 Linux 版本 4.4.14
和 Bluez 堆栈 5.38
。看起来 QN9021
有一些错误。问题不在于 Read Class of Device
,而在于 QN9021
对命令的响应:Read Local Supported Features
。因为,它是 BLE 控制器芯片,它不应该发送 Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
作为对上述命令的响应。
问题是内核将其检测为经典蓝牙控制器芯片,然后将不支持的 HCI 命令发送到芯片。芯片应该将 Features
中第 4 个字节的第 5 位和第 6 位(LMP_NO_BREDR and LMP_LE 位)设置为命令 Read Local Supported Features
然后内核将其检测为 BLE
控制器模式芯片,不会向蓝牙控制器模式芯片发送任何不受支持的命令。
既然不能改芯片的固件,只好给内核打补丁了。
这是我的补丁:
*** hci_event.c 2017-02-10 00:05:13.149974000 +0530
--- bluetooth/hci_event.c 2016-06-24 22:48:38.000000000 +0530
***************
*** 588,597 ****
if (rp->status)
return;
-
memcpy(hdev->features, rp->features, 8);
- hdev->features[0][4] |= LMP_NO_BREDR;
- hdev->features[0][4] |= LMP_LE;
/* Adjust default settings according to features
* supported by device. */
--- 588,594 ----
我也厌倦了以下命令,但没有帮助:
hciattach -r /dev/ttyS0 bcsp 115200