WiFi与蓝牙源码包发布规范


1. 概述

本文档主要介绍蓝牙、Wi-Fi的源码包release操作步骤和注意事项以及常见问题处理方法。

文档中的{vendor}和{product}对应厂商以及平台。

1.1. 读者对象

本文档主要适用于以下工程师:

  • 技术支持工程师

  • 软件开发工程师

2. WiFi与蓝牙源码包发布规范

在发布版本时,平台会删除driver源码包,并且也跟driver厂家沟通过了,sigmastar通知客户对应的WiFi与蓝牙版本号,客户再跟driver厂家要对应版本号的源码包到对应路径下 修改编译即可。

WiFi、Bluetooth支持的器件及对应的driver版本如下表所示:

模组 客户需要跟driver厂家拿的版本号
RTL8723DU Wifi driver版本:RTL8723DU_WiFi_linux_v5.13.4.1-0-g3240d362a_COEX20200103-3535.20211130.tar(57895).gz需要Realtek提供
Bluetooth版本:20210702_BT_ANDROID_11.0_RTL8723D_COEX_v3b3b.tar.gz需要Realtek提供
SSW101B Wifi driver版本:sigmastar_wifi.tar.gz 由Sigmastar提供
不支持Bluetooth
RTL8723DS Wifi driver版本 rtl8723ds v5.13.5-43-g163a63d1e.20221027_COEX20211112-4141.tar.gz 需要Realtek提供
Bluetooth版本 20210702_BT_ANDROID_11.0 需要Realtek提供

2.1. RTL8723DU Wi-Fi 源码移植(USB接口)

kernel路径指的是 vendor/sigmastar/Alkaid/kernel/common

在kernel路径下:

1、在android/abi_gki_aarch64_sstar文件中添加以下代码:

 proc_get_parent_data
 yield

2、在arch/arm64/configs/{product}_android_gki.fragment文件中添加以下代码:

CONFIG_WLAN_VENDOR_REALTEK=y
CONFIG_CFG80211=m
CONFIG_RTL8723DU=m

3、在drivers/net/wireless/realtek/Kconfig文件(没有就创建一个)中添加以下代码:

source "drivers/net/wireless/realtek/rtl8723du/Kconfig"

4、在drivers/net/wireless/realtek/Makefile文件(没有就创建一个)中添加以下代码:

obj-$(CONFIG_RTL8723DU)    += rtl8723du/

5、使用tar zxvf + 压缩包名称 ,对wifi驱动的代码包进行解压rtl8723DU_WiFi_linux_v5.13.4.1-0-g3240d362a.20211129_COEX20200103-3535.tar.gz将解压出来的文件夹进行重命名修改为rtl8723du,并放入到以下路径下vendor/sigmastar/Alkaid/kernel/common/drivers/net/wireless/realtek/

6、在rtl8723du/Makefile文件中进行修改

将EXTRA_CFLAGS += -I$(src)/include修改为

EXTRA_CFLAGS += -I$(srctree)/drivers/net/wireless/realtek/rtl8723du/include



将EXTRA_CFLAGS += -I$(src)/platform修改为

EXTRA_CFLAGS += -I$(srctree)/drivers/net/wireless/realtek/rtl8723du/platform



将EXTRA_CFLAGS += -I$(src)/hal/btc修改为

EXTRA_CFLAGS += -I$(srctree)/drivers/net/wireless/realtek/rtl8723du/hal/btc



将EXTRA_CFLAGS += -I$(src)/core/crypto修改为

EXTRA_CFLAGS += -I$(srctree)/drivers/net/wireless/realtek/rtl8723du/core/crypto

修改CONFIG_LOAD_PHY_PARA_FROM_FILE = n
修改CONFIG_RTW_ANDROID = 12

7、在HAL_RTL8723D下的EXTRA_CFLAGS += -DCONFIG_RTL8723D下添加以下内容:

EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211

EXTRA_CFLAGS += -DRTW_USE_CFG80211_STA_EVENT

EXTRA_CFLAGS += -DCONFIG_RADIO_WORK

EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE

EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC

EXTRA_CFLAGS += -DCONFIG_RTW_WIFI_HAL

EXTRA_CFLAGS += -DCONFIG_RTW_ANDROID

EXTRA_CFLAGS += -DCONFIG_PLATFORM_ANDROID

8、在rtl8723du/Makefile文件中注释掉

 #ifeq ($(shell test $(CONFIG_RTW_ANDROID) -gt 0; echo $$?), 0)

 #EXTRA_CFLAGS += -DCONFIG_RTW_ANDROID=$(CONFIG_RTW_ANDROID)

 #endif

在vendor/realtek/hardware/wlan/路径下:

1、使用tar zxvf + 压缩包名称,来解压realtek_wifi_SDK_for_android_12_x_20211130.tar.gz

2、将里面的hardware/realtek/wlan文件夹放入vendor/realtek/hardware/路径下

3、新建init.realtek.wifi.rc文件和rtkwifi.mk文件,在init.realtek.wifi.rc文件中添加以下内容:

on zygote-start

 # Create the directories used by the Wireless subsystem

 # Copy wpa_supplicant config files to related dir

  mkdir /data/misc/wifi 0770 wifi wifi

  mkdir /data/misc/wifi/wpa_supplicant 0770 wifi wifi

  mkdir /data/vendor/wifi 0771 wifi wifi

  mkdir /data/vendor/wifi/wpa 0770 wifi wifi

  mkdir /data/vendor/wifi/wpa/sockets 0770 wifi wifi

  mkdir /data/misc/dhcp 0770 dhcp dhcp

  chown dhcp dhcp /data/misc/dhcp

  chown wifi wifi /data/vendor/wifi/wpa/wpa_supplicant.conf

在/external/wpa_supplicant_8/路径下:

1、将原有的wpa_supplicant_8替换为提供的wpa_supplicant_8

2、在device/sigmastar/{product}/wifi_config/路径下添加文件:

p2p_supplicant_overlay.conf

p2p_no_group_iface=1

wpa_supplicant_overlay.conf

p2p_disabled=1

p2p_supplicant.conf

ctrl_interface=p2p0
update_config=1
device_name=AOSP_TV_on_infinity7
manufacturer=sstar
device_type=10-0050F204-5
config_methods=virtual_display virtual_push_button
# Listen channel
p2p_listen_reg_class=81
p2p_listen_channel=1
# Operation channel
p2p_oper_reg_class=81
p2p_oper_channel=1
# persisten reconnect
persistent_reconnect=1
wifi_config/wpa_supplicant.conf
update_config=1
eapol_version=1
ap_scan=1
fast_reauth=1
disable_scan_offload=1

3、在init.sstar.rc文件里面添加

import /vendor/etc/init/hw/init.realtek.wifi.rc

4、在{product}/sstar_{product}.mk文件里面添加

BOARD_WIFI_VENDOR := realtek
$(call inherit-product-if-exists, vendor/realtek/hardware/wlan/rtkwifi.mk)

5、在{product}/device.mk文件里面添加

# Wi-Fi Config

PRODUCT_COPY_FILES += \
device/sigmastar/infinity7/wifi_config/wpa_supplicant.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant.conf \
device/sigmastar/infinity7/wifi_config/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf \
device/sigmastar/infinity7/wifi_config/p2p_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/p2p_supplicant_overlay.conf \
device/sigmastar/infinity7/wifi_config/p2p_supplicant.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/p2p_supplicant.conf

6、在{product}/overlay/frameworks/base/core/res/res/values/config.xml文件里面添加

<?xml version="1.0" encoding="utf-8"?>

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

  <string-array translatable="false" name="config_tether_wifi_regexs">

     <item>"wlan0"</item>

  </string-array>

  <integer-array translatable="false" name="config_tether_upstream_types">

     <item>1</item>

     <item>9</item>

     <item>7</item>

     <item>0</item>

  </integer-array>

  <bool name="config_enableWifiDisplay">true</bool>

</resources>

2.1.1. 常见问题分析

Wi-Fi打开失败(STA模式):

(1)检查驱动是否成功加载

(2)检查wlan0是否创建

(3)检查wpa_supplicant是否正常运行

(4)检查是否存在可执行的wpa_supplicant

(5)检查wpa_supplicant.conf和p2p_supplicant.conf是否存在并且正确

2.2. RTL8723DU 蓝牙源码移植(USB接口)

kernel路径指的是 vendor/sigmastar/Alkaid/kernel/common

1、在kernel/android/abi_gki_aarch64_sstar文件里面添加

 usb_disable_autosuspend

 usb_interrupt_msg

2、在kernel/arch/arm64/configs/infinity7_android_gki.fragment文件里面添加

CONFIG_BT_RTKBTUSB=m

3、在kernel/drivers/base/firmware_loader/main.c文件里面的fw_path[]里添加

    "xxxxxxxx",
    "xxxxxxxx",
    "/vendor/firmware"
};

4、在kernel/drivers/bluetooth/Kconfig文件里面添加

config BT_RTKBTUSB

     tristate "RTK HCI USB driver"

     depends on USB

     help

      RTK Bluetooth HCI USB driver

5、在kernel/drivers/bluetooth/Makefile文件里面添加

obj-$(CONFIG_BT_RTKBTUSB)  += rtk_btusb.o

6、将解压出来的rtk_btusb.h和rtk_btusb.c两个文件放入/driver/bluetooth/路径下

7、在device/{vendor}/{product}/BoardConfig-common.mk文件里面添加

ifeq ($(BOARD_HAVE_BLUETOOTH_RTK), true)

BOARD_VENDOR_SEPOLICY_DIRS += vendor/realtek/hardware/bt/sepolicy

endif

8、在device/{vendor}/{product}/init.sstar.rc文件里面添加

import /vendor/etc/init/hw/init.realtek.bt.rc

9、在device/{vendor}/{product}/{product_class}/sstar_{product_class}.mk文件里面添加

BOARD_HAVE_BLUETOOTH_RTK := true

BOARD_HAVE_BLUETOOTH_RTK_TV := true

$(call inherit-product-if-exists, vendor/realtek/hardware/bt/rtkbt.mk)

10、在device/{vendor}/{product}/ueventd.sstar.rc文件里面添加

/dev/rtkbt_dev     0660  bluetooth net_bt_admin

在vendor/realtek/hardware/bt/路径下:

1、将Release包中rtkbt下的文件拷贝到vendor/realtek/hardware/bt/路径下,然后在vendor/realtek/hardware/bt/路径下新创建文件夹sepolicy,新创建文件dummy_addr。

2、在vendor/realtek/hardware/bt/sepolicy/dummy_addr文件里面添加

22:22:67:c6:69:55

3、在vendor/realtek/hardware/bt/sepolicy/路径下添加以下文件(所有.te文件末尾要留空一行)

bluetooth.te

allow bluetooth tmpfs:dir { write };

allow bluetooth rtk_bt_device:chr_file rw_file_perms;

device.te (定义type)

type rtk_bt_device, dev_type;

file.te (定义type)

type bluetooth_vendor_data_file, file_type, data_file_type;

sepolicy/file_contexts

#realtek bluetooth device
/dev/rtkbt_dev                      u:object_r:rtk_bt_device:s0

#data/vendor
/data/vendor/bluetooth(/.*)?        u:object_r:bluetooth_vendor_data_file:s0

/hal_bluetooth_default.te

# Socket creation under /data/misc/bluedroid.
type_transition hal_bluetooth_default bluetooth_data_file:sock_file bluetooth_socket;

# Allow access to net_admin ioctls
allowxperm hal_bluetooth_default self:udp_socket ioctl priv_sock_ioctls;
allow hal_bluetooth_default bluetooth_vendor_data_file:dir create_dir_perms;
allow hal_bluetooth_default bluetooth_vendor_data_file:file create_file_perms;
allow hal_bluetooth_default rtk_bt_device:chr_file rw_file_perms;

# Socket creation under /data/misc/bluedroid.
#allow hal_bluetooth_default bluetooth_socket:sock_file create_file_perms;
allow hal_bluetooth_default self:capability net_admin;

set_prop(hal_bluetooth_default, vendor_rtk_prop);

property.te

vendor_public_prop(vendor_rtk_prop)

property_contexts

vendor.realtek.bluetooth.            u:object_r:vendor_rtk_prop:s0

4、在vendor/init/hw/init.realtek.bt.rc中添加(没有就创建该文件)

on post-fs-data

  mkdir /data/vendor/bluetooth 0770 bluetooth bluetooth



on boot

# bluetooth
# change back to bluetooth from system
# chown bluetooth net_bt_admin /data/misc/bluetooth
# mkdir /data/misc/bluedroid 0770 bluetooth net_bt_admin
# bluetooth LPM

  chown bluetooth net_bt_admin /proc/bluetooth/sleep/lpm
  chown bluetooth net_bt_admin /proc/bluetooth/sleep/btwrite


# USB device
# insmod /system/lib/modules/rtk_btusb.ko
# chmod 0660 /dev/rtkbt_dev
# chown bluetooth net_bt_admin /dev/rtkbt_dev

# rfkill
  chmod 0660 /sys/class/rfkill/rfkill0/state
  chmod 0660 /sys/class/rfkill/rfkill0/type
  chown bluetooth net_bt_admin /sys/class/rfkill/rfkill0/state
  chown bluetooth net_bt_admin /sys/class/rfkill/rfkill0/type

# bluetooth MAC address programming
# chown bluetooth net_bt_admin ro.bt.bdaddr_path
# chown bluetooth net_bt_admin /system/etc/bluetooth
# chown bluetooth net_bt_admin /data/misc/bluetooth
# setprop ro.bt.bdaddr_path "/data/misc/bluetooth/bdaddr"

service dhcpcd_bnep0 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bnep1 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bnep2 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bnep3 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bnep4 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bt-pan /system/bin/dhcpcd -ABKL
  class main
  disabled
  oneshot
service iprenew_bt-pan /system/bin/dhcpcd -n
  class main
  disabled
  oneshot

5、在vendor/realtek/hardware/bt/rtkbt.mk中添加

.
.
.
.
.
# Realtek Bluetooth MAC addr config
PRODUCT_VENDOR_PROPERTIES += \
    ro.bt.bdaddr_path=/vendor/etc/bluetooth/dummy_addr \
    persist.vendor.rtkbt.bdroid_path=default

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/dummy_addr:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth/dummy_addr
.
.
.
.
.
.
PRODUCT_COPY_FILES += \
       $(LOCAL_PATH)/vendor/etc/bluetooth/rtkbt.conf:vendor/etc/bluetooth/rtkbt.conf \
       frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
       frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml \
       $(LOCAL_PATH)/vendor/init/hw/init.realtek.bt.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.realtek.bt.rc
.
.
.
.
.
.

6、在vendor/realtek/hardware/bt/rtkbt.mk中注释掉

#ifeq ($(BOARD_HAVE_BLUETOOTH_RTK_TV), true)
#PRODUCT_COPY_FILES += \
#$(LOCAL_PATH)/vendor/usr/keylayout/Vendor_005d_Product_0001.kl:vendor/usr/keylayout/Vendor_005d_Product_0001.kl \
#$(LOCAL_PATH)/vendor/usr/keylayout/Vendor_005d_Product_0002.kl:vendor/usr/keylayout/Vendor_005d_Product_0002.kl
#endif

7、在vendor/realtek/hardware/bt/code/libbt-vendor/src/ android.hardware.bluetooth@1.0.realtek.xml中添加

<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>android.hardware.bluetooth</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IBluetoothHci</name>
            <instance>default</instance>
        </interface>
    </hal>
</manifest>

2.2.1. 常见问题分析

  1. 蓝牙打开失败

    使用adb shell lsmod检查rtk_btusb.ko驱动是否加载成功

  2. BLE设备回连失败

    让设备增加Link Layer Privacy功能或在bt_target.h关闭BLE_PRIVACY_SPT,第二种方法目前不被android允许,需要自行评估风险。

2.3. SSW101B Wi-Fi源码移植(USB接口)

kernel路径指的是 vendor/sigmastar/Alkaid/kernel/common

1、在kernel/android/abi_gki_aarch64_sstar文件中添加以下代码:

# required by ssw101b_wifi_usb.ko
 __dev_get_by_name
 __dev_kfree_skb_irq
 usb_anchor_empty
 usb_block_urb
 usb_for_each_dev
 usb_lock_device_for_reset
 usb_reset_device
 usb_unlink_urb
 usb_wait_anchor_empty_timeout
 netdev_master_upper_dev_get_rcu

2、在 arch/arm64/configs/{product}_android_gki.fragment文件中添加以下代码:

CONFIG_SSTAR_APOLLO=m

3、在drivers/net/wireless/Kconfig文件中添加以下代码:

source "drivers/net/wireless/sstar/Kconfig"

4、在drivers/net/wireless/Makefile文件中添加以下代码:

obj-$(CONFIG_WLAN_VENDOR_SSTAR) += sstar/

5、使用tar zxvf + 压缩包名称对wifi驱动的代码包sigmastar_wifi.tar.gz进行解压,将解压出来的文件夹进行重命名修改为 ssw101b,并放入到以下路径下vendor/sigmastar/Alkaid/kernel/common/drivers/net/wireless/sstar/

在drivers/net/wireless/sstar/Kconfig文件中添加以下代码:(没有就创建一个)

source "drivers/net/wireless/sstar/ssw101b/Kconfig"

在drivers/net/wireless/sstar/Makefile文件中添加以下代码:(没有就创建一个)

obj-$(CONFIG_SSW101B)      += ssw101b/

6、在/external/wpa_supplicant_8/路径下:

将原有的wpa_supplicant_8替换为提供的wpa_supplicant_8

在/frameworks/opt/net/wifi/libwifi_hal/Android.mk文件中以下位置新增libwifi-hal-sstar

...
# Pick a vendor provided HAL implementation library.
# ============================================================
ifeq ($(WIFI_MULTIPLE_VENDOR_HALS), true)
  # vendor HALs are loaded dynamically and not linked here
  LIB_WIFI_HAL :=
else
  LIB_WIFI_HAL ?= libwifi-hal-fallback
  VENDOR_LOCAL_SHARED_LIBRARIES :=
  ifeq ($(BOARD_WLAN_DEVICE), bcmdhd)
    LIB_WIFI_HAL := libwifi-hal-bcm
    VENDOR_LOCAL_SHARED_LIBRARIES := libcrypto
ifneq ($(wildcard vendor/google/libraries/GoogleWifiConfigLib),)
    VENDOR_LOCAL_SHARED_LIBRARIES += \
        google_wifi_firmware_config_version_c_wrapper
endif
  else ifeq ($(BOARD_WLAN_DEVICE), qcwcn)
    LIB_WIFI_HAL := libwifi-hal-qcom
    VENDOR_LOCAL_SHARED_LIBRARIES := libcld80211
...
  else ifeq ($(BOARD_WLAN_DEVICE), sstar)
    # support Sigmastar WIFI HAL
    LIB_WIFI_HAL := libwifi-hal-sstar
...

2.3.1. 常见问题分析

Wi-Fi打开失败(STA模式):

(1)检查驱动是否成功加载

(2)检查wlan0是否创建

(3)检查wpa_supplicant是否正常运行

(4)检查是否存在可执行的wpa_supplicant

(5)检查wpa_supplicant.conf和p2p_supplicant.conf是否存在并且正确

2.4. RTL8723DS Wi-Fi源码移植(SDIO接口)

1、使用tar zxvf + 压缩包名称 ,对wifi驱动的代码包WiFi.tar.gz进行解压,将解压出来的文件夹进行重命名修改为rtl8723ds,并放入到以下路径下vendor/sigmastar/Alkaid/kernel/common/drivers/net/wireless

2、在arch/arm64/configs/{product}_android_gki.fragment文件中添加以下代码:

CONFIG_CFG80211=m
CONFIG_RTL8723DS=m

3、在drivers/net/wireless/Kconfig文件中添加以下代码:

source "drivers/net/wireless/rtl8723ds/Kconfig"

4、在drivers/net/wireless/Makefile文件中添加以下代码:

obj-$(CONFIG_RTL8723DS)    += rtl8723ds/

5、在rtl8723ds/Makefile文件中进行修改

将CONFIG_PLATFORM_MSTAR = n修改成 CONFIG_PLATFORM_MSTAR = y
将CONFIG_PLATFORM_I386_PC = y修改成 CONFIG_PLATFORM_I386_PC = n

6、修改kernel dts支持SDIO模式,在arch/arm64/boot/dts/sstar/pioneer5.dtsi

将sdmmc节点中slot-sdio-use = <0>,<0>,<0>改成slot-sdio-use = <1>,<1>,<1>  //修改对应slot为SDIO模式
将sdmmc节点中slot-intcdzs = <1>,<1>,<1>改成slot-sdio-use = <0>,<0>,<0>   //修改对应slot为关闭CDZ检测

HAL层和wpa_supplicant层可以参考RTL8723DU Wi-Fi 源码移植

2.4.1. 常见问题分析

Wi-Fi打开失败(STA模式):

(1)检查驱动是否成功加载(检查模块是否上电GPIO、有没有复用成SDIO模式,dts是否配置成SDIO模式)

(2)检查wlan0是否创建

(3)检查wpa_supplicant是否正常运行

(4)检查是否存在可执行的wpa_supplicant

(5)检查wpa_supplicant.conf和p2p_supplicant.conf是否存在并且正确

2.5. RTL8723DS 蓝牙源码移植(UART接口)

1、在device/{vendor}/{product}/BoardConfig-common.mk文件里面添加

ifeq ($(BOARD_HAVE_BLUETOOTH_RTK), true)

BOARD_VENDOR_SEPOLICY_DIRS += vendor/realtek/hardware/bt/sepolicy

endif

2、在device/{vendor}/{product}/init.sstar.rc文件里面添加

import /vendor/etc/init/hw/init.realtek.bt.rc

3、在device/{vendor}/{product}/{product_class}/sstar_{product_class}.mk文件里面添加

BOARD_HAVE_BLUETOOTH_RTK := true

BOARD_HAVE_BLUETOOTH_RTK_TV := true

$(call inherit-product-if-exists, vendor/realtek/hardware/bt/rtkbt.mk)

在vendor/realtek/hardware/bt/路径下:

1、将Release包中rtkbt下的文件拷贝到vendor/realtek/hardware/bt/路径下,然后在vendor/realtek/hardware/bt/路径下新创建文件夹sepolicy,新创建文件dummy_addr。

2、在vendor/realtek/hardware/bt/sepolicy/dummy_addr文件里面添加

22:22:67:c6:69:55

3、在vendor/realtek/hardware/bt/sepolicy/路径下添加以下文件(所有.te文件末尾要留空一行)

bluetooth.te

allow bluetooth tmpfs:dir { write };

allow bluetooth rtk_bt_device:chr_file rw_file_perms;

device.te (定义type)

type rtk_bt_device, dev_type;

file.te (定义type)

type bluetooth_vendor_data_file, file_type, data_file_type;

sepolicy/file_contexts

#realtek bluetooth device
/dev/ttyS5                          u:object_r:rtk_bt_device:s0

#data/vendor
/data/vendor/bluetooth(/.*)?        u:object_r:bluetooth_vendor_data_file:s0

/hal_bluetooth_default.te

# Socket creation under /data/misc/bluedroid.
type_transition hal_bluetooth_default bluetooth_data_file:sock_file bluetooth_socket;

# Allow access to net_admin ioctls
allowxperm hal_bluetooth_default self:udp_socket ioctl priv_sock_ioctls;
allow hal_bluetooth_default bluetooth_vendor_data_file:dir create_dir_perms;
allow hal_bluetooth_default bluetooth_vendor_data_file:file create_file_perms;
allow hal_bluetooth_default rtk_bt_device:chr_file rw_file_perms;

# Socket creation under /data/misc/bluedroid.
#allow hal_bluetooth_default bluetooth_socket:sock_file create_file_perms;
allow hal_bluetooth_default self:capability net_admin;

set_prop(hal_bluetooth_default, vendor_rtk_prop);

property.te

vendor_public_prop(vendor_rtk_prop)

property_contexts

vendor.realtek.bluetooth.            u:object_r:vendor_rtk_prop:s0

4、在vendor/init/hw/init.realtek.bt.rc中添加(没有就创建该文件)

on post-fs-data

  mkdir /data/vendor/bluetooth 0770 bluetooth bluetooth



on boot

# bluetooth
# change back to bluetooth from system
# chown bluetooth net_bt_admin /data/misc/bluetooth
# mkdir /data/misc/bluedroid 0770 bluetooth net_bt_admin
# bluetooth LPM

  chown bluetooth net_bt_admin /proc/bluetooth/sleep/lpm
  chown bluetooth net_bt_admin /proc/bluetooth/sleep/btwrite


# USB device
# insmod /system/lib/modules/rtk_btusb.ko
# chmod 0660 /dev/rtkbt_dev
# chown bluetooth net_bt_admin /dev/rtkbt_dev

#UART device
  chmod 0660 /dev/ttyS5
  chown bluetooth net_bt_admin /dev/ttyS5

# rfkill0
  chmod 0660 /sys/class/rfkill/rfkill0/state
  chmod 0660 /sys/class/rfkill/rfkill0/type
  chown bluetooth net_bt_admin /sys/class/rfkill/rfkill0/state
  chown bluetooth net_bt_admin /sys/class/rfkill/rfkill0/type
# rfkill1
  chmod 0660 /sys/class/rfkill/rfkill1/state
  chmod 0660 /sys/class/rfkill/rfkill1/type
  chown bluetooth net_bt_admin /sys/class/rfkill/rfkill1/state
  chown bluetooth net_bt_admin /sys/class/rfkill/rfkill1/type

# bluetooth MAC address programming
# chown bluetooth net_bt_admin ro.bt.bdaddr_path
# chown bluetooth net_bt_admin /system/etc/bluetooth
# chown bluetooth net_bt_admin /data/misc/bluetooth
# setprop ro.bt.bdaddr_path "/data/misc/bluetooth/bdaddr"

service dhcpcd_bnep0 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bnep1 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bnep2 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bnep3 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bnep4 /system/bin/dhcpcd -BKLG
  disabled
  oneshot
service dhcpcd_bt-pan /system/bin/dhcpcd -ABKL
  class main
  disabled
  oneshot
service iprenew_bt-pan /system/bin/dhcpcd -n
  class main
  disabled
  oneshot

5、在vendor/realtek/hardware/bt/rtkbt.mk中添加

# Realtek Bluetooth MAC addr config
PRODUCT_VENDOR_PROPERTIES += \
    ro.bt.bdaddr_path=/vendor/etc/bluetooth/dummy_addr \
    persist.vendor.rtkbt.bdroid_path=default

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/dummy_addr:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth/dummy_addr
PRODUCT_COPY_FILES += \
       $(LOCAL_PATH)/vendor/etc/bluetooth/rtkbt.conf:vendor/etc/bluetooth/rtkbt.conf \
       frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
       frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml \
       $(LOCAL_PATH)/vendor/init/hw/init.realtek.bt.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.realtek.bt.rc

6、在vendor/realtek/hardware/bt/rtkbt.mk中注释掉

#ifeq ($(BOARD_HAVE_BLUETOOTH_RTK_TV), true)
#PRODUCT_COPY_FILES += \
#$(LOCAL_PATH)/vendor/usr/keylayout/Vendor_005d_Product_0001.kl:vendor/usr/keylayout/Vendor_005d_Product_0001.kl \
#$(LOCAL_PATH)/vendor/usr/keylayout/Vendor_005d_Product_0002.kl:vendor/usr/keylayout/Vendor_005d_Product_0002.kl
#endif

7、在vendor/realtek/hardware/bt/code/libbt-vendor/src/android.hardware.bluetooth@1.0.realtek.xml中添加

<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>android.hardware.bluetooth</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IBluetoothHci</name>
            <instance>default</instance>
        </interface>
    </hal>
</manifest>

8、在vendor/realtek/hardware/bt/vendor/etc/bluetooth/rtkbt.conf中修改

修改BtDeviceNode=?/dev/ttyS1:H5 为BtDeviceNode=?/dev/ttyS5:H5   //FUART对应的串口节点

9、配置vendor/sigmastar/alkaid/kernel/common/dtbo(2381为例pioneer5-ssz028c-s01a-s.dts) FUART GPIO节点配置

 //FUART
        <PAD_SAR_ADC_16          PINMUX_FOR_FUART_MODE_2      MDRV_PUSE_FUART_RX>,
        <PAD_SAR_ADC_17          PINMUX_FOR_FUART_MODE_2      MDRV_PUSE_FUART_TX>,
        <PAD_SAR_ADC_18          PINMUX_FOR_FUART_MODE_2      MDRV_PUSE_FUART_RTS>,
        <PAD_SAR_ADC_19          PINMUX_FOR_FUART_MODE_2      MDRV_PUSE_FUART_CTS>,

10、修改vendor/sigmastar/alkaid/kernel/common/arch/arm64/boot/dts/sstar/pioneer5.dtsi fuart 节点打开 流控 配置

       fuart: fuart@1F220400 {
            compatible = "sstar,uart";
            reg = <0x1F220400 0x100>, <0x1F220600 0x100>;
            interrupts= <GIC_SPI INT_IRQ_FUART IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI INT_IRQ_URDMA IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI INT_IRQ_FUART_EMPTY IRQ_TYPE_LEVEL_HIGH>;
            dma = <0>;
            sctp_enable = <1>;
            rx_fifo_level = <0>;
            tx_fifo_level = <0>;
            digmux = <0xFF>;
            status = "okay";
            clocks = <&CLK_fuart>;
        };

2.5.1. 常见问题分析

  1. 蓝牙打开失败

    • 检查ttyS5 FUART节点是否能打开
    • 检查是否有权限操作节点
    • 检查是否有电(需要rfkill驱动参考 rfkill驱动设置)
  2. BLE设备回连失败

    让设备增加Link Layer Privacy功能或在bt_target.h关闭BLE_PRIVACY_SPT,第二种方法目前不被android允许,需要自行评估风险。

3. rfkill驱动设置

3.1. rfkill说明

rfkill-sstar用来控制WiFi/BT power和reset gpio的驱动,通过配置dts来控制gpio

3.2. rfkill配置

1、在vendor/sigmastar/alkaid/kernel/common/net/rfkill文件中确认有没有下面文件,没有需要更新

 rfkill-bt.c  rfkill-wlan.c

2、在vendor/sigmastar/alkaid/kernel/common/arch/arm64/boot/dts/sstar/pioneer5.dtsi文件添加蓝牙节点

  bluetooth: bluetooth {
                compatible = "bluetooth-platdata";
                bt_name = "rfkill_bt";
                BT,reset_gpio = <&gpio PAD_SAR_ADC_13 0>;
                BT,wake_gpio = <&gpio PAD_SAR_ADC_13 0>;
                status = "okay";
        };

3、在vendor/sigmastar/alkaid/kernel/common/arch/arm64/boot/dts/sstar/pioneer5.dtsi文件添加wifi节点

  wifi: wifi {
                compatible = "wlan-platdata";
                wlan_name = "wlan-platdata";
                keep_wifi_power_on = "true";
                WIFI,poweren_gpio = <&gpio PAD_SAR_ADC_12 1>;
                WIFI,reset_gpio = <&gpio PAD_SAR_ADC_10 1>;
                status = "okay";
        };

3.2.1. 常见问题分析

  1. 识别不到WiFi,加载WiFi驱动不成功

    • 编译生成的rfkill_sstar.ko需要在kdrv_sdmmc.ko加载之前加载

    • dts配置的WiFi GPIO是否跟硬件原理图一致

  2. 反复开关蓝牙失败

    检查板子是否有生成rfkill type 节点为bluetooth

    命令如下:

    cat /sys/class/rfkill/rfkill0/type
    cat /sys/class/rfkill/rfkill1/type