Skip to main content

BT

BT Porting and Usage Guide.

Overview​

The K1 platform implements wireless communication through an external BT (Bluetooth) module (with UART/USB interfaces).

Functional Description​

The Bluetooth architecture comprises the following layers:

Source Code Structure​

The BT-related source code can be divided into the following parts:

  1. Bluetooth Protocol Stack: Taking the BlueZ protocol stack as an example, the code is divided into two parts: kernel space and user space.
  2. BT HCI Driver: Primarily handles the HCI (Host Controller Interface) protocol layer implementation.
  3. Platform Support: Mainly implements module power supply and enable/disable control interfaces, which are called by the RFKILL driver.
  4. Interface Driver: Mainly implements the BT data transfer interface functions, such as UART, USB, etc.

BlueZ Protocol Stack Source Code is located in the following directories:

drivers/net/bluetooth
|-- af_bluetooth.c
|-- af_bluetooth.o
|-- bnep # Bluetooth network encapsulation protocol
│ |-- bnep.h
│ |-- core.c
│ |-- Kconfig
│ |-- Makefile
│ |-- netdev.c
│ |-- sock.c
|-- hci_codec.c
|-- hci_codec.h
|-- hci_conn.c
|-- hci_core.c # Hci core implementation
|-- hci_debugfs.c
|-- hci_debugfs.h
|-- hci_event.c
|-- hci_request.c
|-- hci_request.h
|-- hci_sock.c
|-- hci_sync.c
|-- hci_sysfs.c
|-- hidp # Bluetooth hid implementation
│ |-- core.c
│ |-- hidp.h
│ |-- Kconfig
│ |-- Makefile
│ |-- sock.c
|-- iso.c
|-- Kconfig
|-- l2cap_core.c # l2cap core implementation
|-- l2cap_sock.c
|-- lib.c
|-- Makefile
|-- mgmt.c # mgmt Bluetooth management implementation
|-- mgmt_config.c
|-- mgmt_config.h
|-- mgmt_util.c
|-- mgmt_util.h
|-- rfcomm # rfcomm protocol
│ |-- core.c
│ |-- Kconfig
│ |-- Makefile
│ |-- sock.c
│ |-- tty.c
|-- sco.c
|-- selftest.c
|-- selftest.h
|-- smp.c
|-- smp.h

HCI driver source code is located in the following directory:

drivers/bluetooth
|-- btbcm.c # Broadcom vendor implementation
|-- btrtl.c # Realtek vendor implementation
|-- btusb.c # hci UART implementation
|-- hci_h4.c # hci h4 implementation
|-- hci_h5.c # hci h5 implementation
|-- hci_ldisc.c # Bluetooth hci line discipline

Platform-specific source code:

drivers/soc/spacemit/spacemit-rf
|-- spacemit-pwrseq.c # Implementation for common parts of WIFI and Bluetooth
|-- spacemit-wlan.c # WIFI power supply, GPIO, and clock-related interface implementation
|-- spacemit-bt.c # BT power supply, GPIO, and clock-related interface implementation

Interface-related source code: Refer to the documentation for each interface driver.

Key Features​

Platform UART Interface Features​

FeatureDescription
4-wire flow control supportSupports up to 3.6Mbps
DMA supportSupports DMA transfer mode

Module Performance Specifications​

Module ModeSpecifications
rtl8852bsSupports Bluetooth 5.2
Supports Bluetooth 2.0 UART HCI H4/H5
aic8800d80Supports Bluetooth 5.3
Supports Bluetooth 2.0 UART HCI H4

Configuration​

It mainly includes driver enablement configuration and DTS configuration.

CONFIG Configuration​

Protocol Stack Configuration

Networking support (NET [=y])
Bluetooth subsystem support (BT [=y])
Bluetooth Classic (BR/EDR) features (BT_BREDR [=y])
RFCOMM protocol support (BT_RFCOMM [=y])
RFCOMM TTY support (BT_RFCOMM_TTY [=y])
BNEP protocol support (BT_BNEP [=y])
HIDP protocol support (BT_HIDP [=y])
Bluetooth Low Energy (LE) features (BT_LE [=y])
Export Bluetooth internals in debugfs (BT_DEBUGFS [=y])

UART HCI Configuration

Networking support (NET [=y])
Bluetooth subsystem support (BT [=y])
Bluetooth device drivers
HCI UART driver (BT_HCIUART [=y])
UART (H4) protocol support (BT_HCIUART_H4 [=y])
Three-wire UART (H5) protocol support (BT_HCIUART_3WIRE [=y])
Realtek protocol support (BT_HCIUART_RTL [=y])

By default, H4 and H5 are supported, where the Realtek BT serial port uses the H5 protocol.

USB HCI Configuration

Networking support (NET [=y])
Bluetooth subsystem support (BT [=y])
Bluetooth device drivers
HCI USB driver (BT_HCIBTUSB [=m])
Broadcom protocol support (BT_HCIBTUSB_BCM [=y])
Realtek protocol support (BT_HCIBTUSB_RTL [=y])

BT_HCIBTUSB_BCM and BT_HCIBTUSB_RTL correspond to support for Broadcom and Realtek, respectively.

AVRCP Configuration

Device Drivers
Input device support
Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])
Miscellaneous devices (INPUT_MISC [=y])
User level driver support (INPUT_UINPUT [=y])

To deliver AVRCP key values and related information to user-space applications via the input device, the INPUT_UINPUT option must be enabled.

HOGP Configuration

Device Drivers
HID bus support (HID_SUPPORT [=y])
HID bus core support (HID[=y])
User-space I/O driver support for HID subsystem (UHID [=y])

To deliver HoGP key values (e.g., KEY_1, KEY_2, KEY_ESC) to user-space applications via the input device, the UHID option must be enabled.

Platform RFKILL Configuration

Device Drivers
SOC (System On Chip) specific Drivers
Spacemit rfkill driver (SPACEMIT_RFKILL [=y])

CONFIG_SPACEMIT_RFKILL provides platform-specific support for the BT module. By default, this option is set to Y.

DTS Configuration​

UART Configuration​

Typically, uart2 is used to connect to the Bluetooth module, with the device node being /dev/ttyS1:

&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart2>;
status = "okay";
};

UART2 pinctrl Configuration​

The Bluetooth pin control configuration should be based on the actual hardware, and flow control is enabled by default.

pinctrl_uart2: uart2_grp {
pinctrl-single,pins =<
K1X_PADCONF(GPIO_21, MUX_MODE1, (EDGE_NONE | PULL_UP | PAD_1V8_DS2)) /* uart2_txd */
K1X_PADCONF(GPIO_22, MUX_MODE1, (EDGE_NONE | PULL_UP | PAD_1V8_DS2)) /* uart2_rxd */
K1X_PADCONF(GPIO_23, MUX_MODE1, (EDGE_NONE | PULL_UP | PAD_1V8_DS2)) /* uart2_cts_n */
K1X_PADCONF(GPIO_24, MUX_MODE1, (EDGE_NONE | PULL_UP | PAD_1V8_DS2)) /* uart2_rts_n */
>;
};

Platform DTS Configuration​

The complete platform solution configuration is as follows:

rf_pwrseq: rf-pwrseq {
compatible = "spacemit,rf-pwrseq";
//vdd-supply = <&ldo_7>;
//vdd_voltage = <3300000>;
io-supply = <&dcdc_3>;
io_voltage = <1800000>;
pwr-gpios = <&gpio 67 0>;
status = "okay";

wlan_pwrseq: wlan-pwrseq {
compatible = "spacemit,wlan-pwrseq";
regon-gpios = <&gpio 116 0>;
interrupt-parent = <&pinctrl>;
interrupts = <268>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_wlan_wakeup>;
};

bt_pwrseq: bt-pwrseq {
compatible = "spacemit,bt-pwrseq";
reset-gpios = <&gpio 63 0>;
};
};
  • rf_pwrseq:

    • vdd-supply is the power supply configuration for the module, which should be set according to the actual hardware.
    • vdd_voltage is used to set the voltage for the module's power supply.
    • io-supply is the power supply configuration for the module's IO, which should be set according to the actual hardware.
    • io_voltage is used to set the voltage for the module's IO power supply.
    • pwr-gpioss is the enable pin for the module. After configuration, it will be pulled high by default and supports the configuration of multiple GPIOs.
    • clock is the clock configuration shared by the module.
    • power-on-delay-ms is the delay after the module is powered on, with a default value of 100ms.
  • bt_pwrseq:

    • reset-gpios is the enable pin for Bluetooth. When enabling the corresponding RFKILL for Bluetooth, this GPIO will be pulled high.
    • clockis the clock configuration for Bluetooth.
    • power-on-delay-ms is the delay after Bluetooth is powered on, with a default value of 10ms.

Many modules on the market are dual-purpose Wi-Fi and Bluetooth modules, and the power supply for Wi-Fi and Bluetooth is often shared. For this situation, it is recommended to configure the DTS as follows:

  • Shared parts (affecting both Wi-Fi and Bluetooth) should be configured in rf_pwrseq.
  • Parts that only affect Bluetooth should be configured in bt_pwrseq.

For Bluetooth-only modules, only bt_pwrseq needs to be configured, and rf_pwrseq does not need to be configured. However, the rf_pwrseq node must still be enabled.

Power Control Logic Explanation

  • When turning on Bluetooth power:
    • The system will first enable the shared power supply (i.e., rf_pwrseq) and related GPIO states.
    • The platform will maintain a reference count internally.
  • When turning off Bluetooth power: The shared power supply and GPIO states will only be truly turned off when both Wi-Fi and Bluetooth are turned off.

Interface​

UART hciattach​

hciattach is an initialization tool provided by BlueZ for UART interface Bluetooth controllers. For Bluetooth devices with a USB interface, this part can be ignored.

  • Realtek Bluetooth UART Enter the rtk_hciattach/ directory, generate the executable file rtk_hciattach, and then run:

    rtk_hciattach -n -s 115200 ttyS1 rtk_h5 &
  • AIC8800 Bluetooth UART Initialize using hciattach as follows:

    hciattach -s 1500000 /dev/ttyS1 any 1500000 flow nosleep

API​

The platform encapsulates Bluetooth power on/off within the RFKILL subsystem, allowing direct control of Bluetooth power through RFKILL.

# rfkill list
0: spacemit-bt: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
2: hci0: Bluetooth
Soft blocked: no
Hard blocked: no

# rfkill block blutooth
# rfkill list
0: spacemit-bt: Bluetooth
Soft blocked: yes
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
2: hci0: Bluetooth
Soft blocked: yes
Hard blocked: no

Among them:

  • spacemit-bt is the RFKILL Bluetooth device registered by the platform.
  • hci0 is the RFKILL device registered by the Bluetooth Protocol Stack.

During platform initialization, you only need to actively turn on the Bluetooth device corresponding to spacemit-bt:

cat /sys/class/rfkill/rfkill0/type
bluetooth
cat /sys/class/rfkill/rfkill0/name
spacemit-bt
echo 1 > /sys/class/rfkill/rfkill0/state

When operating RFKILL, you need to confirm that the type and name correspond to the Bluetooth device of spacemit-bt.

Debugging​

sysfs​

You can query the status information of rfkill under sysfs:

cat /sys/class/rfkill/rfkill0/state
1

sysfs can also be used to query information about the corresponding UART.

/sys/devices/platform/soc/d4017100.uart

debugfs​

You can query information related to Bluetooth stack components under debugfs:

/sys/kernel/debug/bluetooth# ls
hci0 l2cap rfcomm rfcomm_dlc sco

Testing​

Interact with the bluetoothctl service using bluetoothd.

First, ensure that the bluetoothd service is running properly, and then enter the following command to access the command line:

[bluetooth]# power on
[bluetooth]# Changing power on succeeded
[bluetooth]# scan on
[bluetooth]# SetDiscoveryFilter success
[bluetooth]# Discovery started
[bluetooth]# [CHG] Controller 5C:8A:AE:67:62:04 Discovering: yes
[bluetooth]# [NEW] Device 45:DC:1E:BC:2C:77 45-DC-1E-BC-2C-77
[bluetooth]# [NEW] Device 4C:30:B8:02:7F:7A 4C-30-B8-02-7F-7A
[bluetooth]# [NEW] Device DC:28:67:9A:70:8E DC-28-67-9A-70-8E
[bluetooth]# [NEW] Device 58:FB:F1:17:D4:19 58-FB-F1-17-D4-19
[bluetooth]# [NEW] Device 84:7B:57:FB:20:8D 84-7B-57-FB-20-8D
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D TxPower: 0x000c (12)
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D Name: LT-ZHENGHONG
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D Alias: LT-ZHENGHONG
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D UUIDs: 0000110a-0000-1000-8000-00805f9b34fb
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D UUIDs: 0000111f-0000-1000-8000-00805f9b34fb
[bluetooth]# [CHG] Device 84:7B:57:FB:20:8D UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[bluetooth]#
[bluetooth]# pair 84:7B:57:FB:20:8D
Attempting to pair with 84:7B:57:FB:20:8D
[CHG] Device 84:7B:57:FB:20:8D Connected: yes
[LT-ZHENGHONG]# Request confirmation
[LT-ZHENGHONG]# 1;39m[agent] Confirm passkey 947781 (yes/no): yes
[DEL] Device 58:FB:F1:17:D4:19 58-FB-F1-17-D4-19
[bluetooth]# info 84:7B:57:FB:20:8D
Device 84:7B:57:FB:20:8D (public)
Name: LT-ZHENGHONG
Alias: LT-ZHENGHONG
Class: 0x002a010c (2752780)
Icon: computer
Paired: no
Bonded: no
Trusted: no
Blocked: no
Connected: yes
LegacyPairing: no
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
UUID: Audio Sink (0000110b-0000-1000-8000-00805f9b34fb)
UUID: Handsfree Audio Gateway (0000111f-0000-1000-8000-00805f9b34fb)
UUID: Handsfree (0000111e-0000-1000-8000-00805f9b34fb)
RSSI: 0xffffffae (-82)
TxPower: 0x000c (12)
[LT-ZHENGHONG]# [DEL] Device DC:28:67:9A:70:8E DC-28-67-9A-70-8E
[LT-ZHENGHONG]# [DEL] Device 45:DC:1E:BC:2C:77 45-DC-1E-BC-2C-77
[LT-ZHENGHONG]# [DEL] Device 53:84:3E:02:79:84 53-84-3E-02-79-84
[LT-ZHENGHONG]# [CHG] Device 84:7B:57:FB:20:8D Bonded: yes
[LT-ZHENGHONG]# info 84:7B:57:FB:20:8D
Device 84:7B:57:FB:20:8D (public)
Name: LT-ZHENGHONG
Alias: LT-ZHENGHONG
Class: 0x002a010c (2752780)
Icon: computer
Paired: no
Bonded: yes
Trusted: no
Blocked: no
Connected: yes
LegacyPairing: no
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
UUID: Audio Sink (0000110b-0000-1000-8000-00805f9b34fb)
UUID: Handsfree Audio Gateway (0000111f-0000-1000-8000-00805f9b34fb)
UUID: Handsfree (0000111e-0000-1000-8000-00805f9b34fb)
RSSI: 0xffffffae (-82)
TxPower: 0x000c (12)

FAQ​

Question 1: Bluetooth Initialization Failure

Symptom: hciattach initialization fails.

Log Output::

Realtek Bluetooth :Realtek Bluetooth init UART with init speed:115200, type:HCI UART H5
Realtek Bluetooth :Realtek hciattach version 3.1.4796cb2.20230921-183414
Realtek Bluetooth :Use epoll
Realtek Bluetooth WARN: Writev partially, ret 0
Realtek Bluetooth WARN: OP_H5_SYNC Transmission timeout
Realtek Bluetooth WARN: Writev partial, 0
Realtek Bluetooth WARN: OP_H5_SYNC Transmission timeout
Realtek Bluetooth WARN: Writev partial, 0
Realtek Bluetooth WARN: OP_H5_SYNC Transmission timeout
Realtek Bluetooth WARN: Writev partial, 0

Solution:

  • Verify that the power supply for the Bluetooth module is functioning correctly.