Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bluetooth over uart using hciattach?

I am using QN9021 SoC working in controller mode (BLE Bluetooth core specification v4.0). It supports some standard HCI commands as well as some vendor specific commands. I am trying to attach it in my ubuntu laptop.

The command that i have used is hciattach.

hciattach -s 9600 /dev/ttyUSBx any 9600 noflow nosleep 

The hcidump shows while executing sudo hciconfig hci1 up.

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

The hciconfig command shows:

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

I would like to know how to prevent the kernel or some bluetooth kernel module to send non-supported HCI commands. Do i need to patch linux kernel source code or write a module for my SoC.

Note:- Changing the SoC or writing firmware for it to support all necessary commands is not possible for this project.


EDIT:

I know the list of HCIcommand supported by my SoC. I am thinking of creating a module to tell the kernel and daemons running to send only supported commands to the SoC. I have a look at linux kernel source (specifically at this 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 file to send a specific HCI command to a dongle of a particular manufacturer.

All i want is suggestion to resolve this problem. Do i need to modify the linux kernel or write a module for my SoC?

NOTE:- The application will run on openwrt linux.

like image 201
abhiarora Avatar asked Jan 30 '17 20:01

abhiarora


People also ask

What is Hciattach?

Description. Hciattach is used to attach a serial UART to the Bluetooth stack as HCI transport interface.

What is Hciconfig?

hciconfig is used to configure Bluetooth devices. hciX is the name of a Bluetooth device installed in the system. If hciX is not given, hciconfig prints name and basic information about all the Bluetooth devices installed in the system.


2 Answers

Okay, today we found out the solution:

# hciattach -r /dev/ttyS0 bcsp 115200

Maybe it helps somebody

Helpful Tips:May this link will be helps to you.

I will give two links for more details and for bluetooth click here and for kernel configuration click here

like image 91
bob marti Avatar answered Sep 20 '22 21:09

bob marti


I have solved this problem few years back. I was using Linux version 4.4.14 and Bluez stack 5.38. Looks like QN9021 had some bugs. The problem wasn't with Read Class of Device but with the response given by QN9021 for the command: Read Local Supported Features. Since, it's the BLE controller chip, it shouldn't be sending Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 as the response to the above command.

The issue is kernel detects it as Classic Bluetooth controller chip and then sends non-supported HCI commands to the chip. The chip should have set the 5th and 6th bits (LMP_NO_BREDR and LMP_LE bits) of the 4th byte in the Features to the command Read Local Supported Features and then kernel detects it as a BLE controller mode chip and won't send any unsupported commands to a ble controller mode chip.

Since, I can't change the firmware of the chip, I had to patch the kernel.

Here are my patches:

*** 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 ----

I have also tired the following command but it didn't helped:

hciattach -r /dev/ttyS0 bcsp 115200
like image 28
abhiarora Avatar answered Sep 20 '22 21:09

abhiarora