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 HCI
command 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.
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