全志A33开发板蓝牙功能扩展实战:RTL8723BU从驱动移植到系统集成的完整指南
老旧硬件焕发新生总是令人兴奋的——特别是当你手头那块积灰的全志A33开发板突然获得蓝牙连接能力时。本文将带你深入Android 6.0系统底层,从内核驱动编译到HAL层适配,逐步实现RTL8723BU USB蓝牙模块的完整支持。不同于简单的步骤罗列,我们会剖析每个修改背后的设计逻辑,确保你不仅知道怎么做,更明白为什么这样做。
1. 开发环境准备与驱动源码处理
在开始前,请确认已搭建好全志A33的标准编译环境,包括:
- 官方推荐的Ubuntu 14.04 LTS系统
- 已同步完整的Android 6.0源码树
- 安装必要的交叉编译工具链
关键步骤解析:
获取Realtek官方提供的驱动包
20150528_RTL8723BU_BT_android5.0_V3.0_P11_FW_svn14422-BTCOEX20150119-5844.zip,解压后重点关注两个核心文件:rtk_btusb.h # 驱动头文件 rtk_btusb.c # 主驱动实现将驱动文件放置到内核源码的正确位置:
cp rtk_btusb.[ch] kernel/drivers/bluetooth/修改Kconfig和Makefile以启用驱动编译选项:
# drivers/bluetooth/Kconfig 新增 config BT_RTKBTUSB tristate "RTK HCI USB driver" depends on USB help RTK Bluetooth HCI USB driver # drivers/bluetooth/Makefile 新增 obj-$(CONFIG_BT_RTKBTUSB) += rtk_btusb.o
提示:全志A33默认使用Linux 3.4内核,需特别注意驱动兼容性。若遇到编译错误,可能需要根据内核版本调整驱动代码中的API调用。
2. 内核配置与模块编译
正确的内核配置是驱动正常工作的基础。除了启用RTL8723BU驱动外,还需确保相关子系统支持:
# .config 关键配置项 CONFIG_BT_RTKBTUSB=m # 模块方式编译 CONFIG_UHID=y # HID协议支持 CONFIG_TUN=y # PAN网络支持 CONFIG_INPUT_UINPUT=y # 用户输入设备模拟编译内核模块的典型命令序列:
./build.sh kernel # 全志专用编译脚本 make -C linux-3.4 M=drivers/bluetooth modules # 单独编译蓝牙驱动验证生成的驱动模块:
ls -l out/sun8iw5p1/android/common/lib/modules/3.4.39/rtk_btusb.ko常见问题排查:
- 若模块加载失败,使用
dmesg | grep bluetooth查看内核日志 - 确保USB控制器驱动已正确加载(
lsmod | grep dwc2)
3. Android系统层适配
3.1 设备树配置
修改device/softwinner/astar-d7/BoardConfig.mk启用蓝牙支持:
BOARD_HAVE_BLUETOOTH := true BOARD_HAVE_BLUETOOTH_RTK := true BLUETOOTH_HCI_USE_RTK_H5 := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/softwinner/astar-d7/bluetooth3.2 初始化脚本调整
在init.sun8i.rc中添加驱动加载和权限设置:
on early-fs insmod /system/vendor/modules/rtk_btusb.ko on boot chmod 0660 /dev/rtk_btusb chown bluetooth net_bt_stack /dev/rtk_btusb3.3 SELinux策略配置
确保设备节点访问权限正确:
# ueventd.sun8i.rc /dev/rtk_btusb 0660 bluetooth net_bt_stack # file_contexts /dev/rtk_btusb u:object_r:hci_attach_dev:s04. HAL层实现与固件集成
4.1 蓝牙协议栈配置
创建bt_vendor.conf配置文件:
# device/softwinner/astar-d7/bluetooth/bt_vendor.conf UartPort = /dev/rtk_btusb FwPatchFilePath = /system/vendor/modules/ FwPatchFileName = rtlbt_fw4.2 自定义HAL实现
关键步骤:
- 在
hardware/realtek/bluetooth/libbt-vendor/下新建usb目录结构 - 实现专用的USB版libbt-vendor:
# usb/Android.mk LOCAL_SRC_FILES := \ src/bt_vendor_rtk.c \ src/upio.c LOCAL_MODULE := libbt-vendor_usb关键代码修改点:
// usb/include/vnd_buildcfg.h #define BLUETOOTH_UART_DEVICE_PORT "/dev/rtk_btusb"4.3 固件集成
在astar_d7.mk中添加蓝牙固件支持:
$(call inherit-product, hardware/realtek/bt/firmware/rtl8723b/device-rtl.mk) PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.bluetooth.xml:system/etc/permissions/android.hardware.bluetooth.xml5. 系统集成与功能验证
完整编译流程:
mmm hardware/realtek/bluetooth/libbt-vendor/ make -j8验证步骤清单:
驱动加载检查:
lsmod | grep rtk_btusb ls /dev/rtk_btusbHAL库生成验证:
ls /system/lib/libbt-vendor_usb.so蓝牙服务状态:
logcat | grep Bluetooth getprop | grep bluetooth实际功能测试:
- 扫描周围设备
- 文件传输测试
- 音频设备连接
当你在开发者选项里看到"蓝牙HCI snoop日志"选项,在设置菜单中能正常开启蓝牙并搜索到周边设备时,这场硬件升级之旅就圆满成功了。记得最后用hciconfig -a命令检查设备信息,确认固件版本和连接状态符合预期。