首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蓝牙在uart上使用hciattach?

蓝牙在uart上使用hciattach?
EN

Stack Overflow用户
提问于 2017-01-30 20:27:23
回答 2查看 12.8K关注 0票数 10

我使用的是QN9021 SoC in controller mode (BLE蓝牙核心规范v4.0)。它支持一些标准的HCI命令以及一些特定于供应商的命令。我正试图把它附在我的ubuntu笔记本电脑上。

我使用的命令是hciattach

代码语言:javascript
复制
hciattach -s 9600 /dev/ttyUSBx any 9600 noflow nosleep 

hcidump在执行sudo hciconfig hci1 up时显示。

代码语言:javascript
复制
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命令显示:

代码语言:javascript
复制
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或为其编写固件以支持所有必要的命令对于此项目是不可能的。

编辑:

我知道我的HCI支持的SoC命令列表。我正在考虑创建一个module,告诉运行中的内核和守护进程只向SoC发送受支持的命令。我看了一下Linux内核源代码(特别是这个core.c)。我认为修改它可以解决通过这个链接之后的问题。在这个链接中,一些开发人员提供了一个支持bluetooth dongle的修补程序。该修补程序阻止core.c文件向特定制造商的dongle发送特定的HCI命令。

我只想提出解决这个问题的建议。我需要修改linux内核还是为我的SoC编写一个模块?

注意:-应用程序将在openwrt linux上运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-06 03:14:53

我几年前就解决了这个问题。我使用的是Linux版本的4.4.14和Bluez堆栈5.38。看来QN9021有一些bug。问题不在于Read Class of Device,而在于QN9021对命令Read Local Supported Features的响应。由于它是BLE控制器芯片,所以不应该将Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00作为对上述命令的响应。

问题是内核将其检测为经典蓝牙控制器芯片,然后将不受支持的HCI命令发送到芯片。该芯片应该将Features中第4字节的第5位和第6位( LEFeatures位)设置为命令Read Local Supported Features,然后内核将其检测为BLE控制器模式芯片,并且不会将任何不支持的命令发送到布尔控制器模式芯片。

因为,我不能改变芯片的固件,我不得不修补内核。

以下是我的补丁:

代码语言:javascript
复制
*** 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 ----

我也厌倦了以下命令,但这并没有帮助我:

代码语言:javascript
复制
hciattach -r /dev/ttyS0 bcsp 115200
票数 1
EN

Stack Overflow用户

发布于 2017-02-10 12:51:50

好吧,今天我们找到了解决办法:

代码语言:javascript
复制
# hciattach -r /dev/ttyS0 bcsp 115200

也许这对某人有帮助

帮助小贴士:愿这个链接对你有帮助。

我将提供两个链接来获取更多细节,以及蓝牙单击此处和内核配置单击此处

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41944822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档