QN9021 SoC를 사용하며 컨트롤러 모드(BLE Bluetooth Core Spec v4.0)에서 작동합니다. 일부 표준 HCI 명령과 일부 공급업체별 명령을 지원합니다. 우분투 노트북에 연결하려고 합니다.
내가 사용하는 명령은 입니다 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 명령 목록을 알고 있습니다. 실행 중인 커널과 데몬에게 지원되는 명령만 SoC로 보내도록 지시하는 모듈을 만들려고 합니다. 나는 리눅스 커널 소스 코드(특히 hci_core.c)를 살펴보았습니다. 이 링크를 수정하면 문제가 해결될 수 있을 것 같습니다. 이 링크에서 일부 개발자는 Bluetooth 어댑터를 지원하는 패치를 제공했습니다. 이 패치는 hci_core.c 파일이 특정 HCI 명령을 특정 제조업체의 동글로 보내는 것을 방지합니다.
내가 원하는 것은 이 문제를 해결하는 방법에 대한 조언뿐입니다. Linux 커널을 수정하거나 SoC용 모듈을 작성해야 합니까?
참고:- 이 응용 프로그램은 openwrt Linux에서 실행됩니다.