近期需要把蓝牙(RTL8822CS 模块)移植到迅为瑞芯微iTOP-3399 开发板,经过一段时间研究,调试,终于成功的将 wifi 功能移植到开发板上面。
迅为iTOP-3399 开发板的蓝牙模块与板卡之间的连接采用串口通信,蓝牙模块使用的是 RTL8822CS 模块,Realtek 提供了 Android 各种版本的 driver ,porting Guid ,有了这些就为我们的移植工作做了总体性的指导。但是仅仅由 Realtek 提供的文档是远远不够的,毕竟硬件接口定义不同,内核版本也不一样,Android 层与 Realtek 提供的代码也有差异,这就需要我们在 Realtek 文档的指导下,一步步完成移植工作。
移植的环境:
1.迅为iTOP-3399 开发板+ RTL8822CS 模块
2.Android 7.0
3.搭建好编译环境的 ubuntu16.04 64Bit 开发环境
本文档配套资料在网盘资料“iTOP-3399 开发板\02_iTOP-3399 开发资料汇总(不含光盘内容)\13_嵌入式 Linux 开发指南(RK3399)手册配套资料\6.Android 底层驱动\Android7 蓝牙移植”目录下。如果您移植出现问题,可以对比下修改好的文件。光盘资料【20210927】日期的 Android7 源码是修改好支持 rtl8822cs模块蓝牙功能的。
#移植步骤
一.修改 Android 部分
1. 修改 build\core\product.mk,添加如下内容:
BOARD_HAVE_BLUETOOTH_RTK \
2.将厂商提供的 rtkbt 目录(在网盘资料“iTOP-3399 开发板\02_iTOP-3399 开发资料汇总(不含光盘内容)\13_嵌入式 Linux 开发指南(RK3399)手册配套资料\6.Android 底层驱动\Android7 蓝牙移植\原厂资料\20200422_BT_ANDROID_7.0_RTL8822C_COEX_v1717\rtkbt”)拷贝到
/home/topeet/rk3399_7.1_industry/device/rockchip/rk3399/rtkbt,该目录主要用于设定不同硬件平台 board配置信息。不同的子目录对应不同的硬件平台,需要根据具体硬件平台进行修改。
3.因为是 UART 接口蓝牙芯片,我们需要修改/home/topeet/rk3399_7.1_industry/device/rockchip/rk3399/rtkbt/system/etc/bluetooth/rtkbt.conf 文件将BtDeviceNode 设置为正确蓝牙串口设备.例如 BtDeviceNode=/dev/ttyS0
4.添加设备权限,在
/home/topeet/rk3399_7.1_industry/device/rockchip/rk3399/init.rk3399.rc 文件中添加如下内容,一定要在 on boot 下添加。
# bluetooth
# change back to bluetooth from system
chown bluetooth net_bt_stack /data/misc/bluetooth
mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stack
# bluetooth LPM
chown bluetooth net_bt_stack /proc/bluetooth/sleep/lpm
chown bluetooth net_bt_stack /proc/bluetooth/sleep/btwrite
#UART device
chmod 0660 /dev/ttyS0
chown bluetooth net_bt_stack /dev/ttyS0
# rfkill
chmod 0660 /sys/class/rfkill/rfkill0/state
chmod 0660 /sys/class/rfkill/rfkill0/type
chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state
chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type
write /sys/class/rfkill/rfkill0/state 0
# bluetooth MAC address programming
chown bluetooth net_bt_stack ro.bt.bdaddr_path
chown bluetooth net_bt_stack /system/etc/bluetooth
chown bluetooth net_bt_stack /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
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
service rtw_fwloader /system/bin/rtw_fwloader
class main
disabled
oneshot
service p2p_supplicant /system/bin/wpa_supplicant \
-ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \
-e/data/misc/wifi/entropy.bin -N \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-O/data/misc/wifi/sockets \
-g@android:wpa_wlan0
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
service wpa_supplicant /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-O/data/misc/wifi/sockets \
-e/data/misc/wifi/entropy.bin \
-g@android:wpa_wlan0
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
service dhcpcd_wlan0 /system/bin/dhcpcd -aABDKL
class main
disabled
oneshot
service dhcpcd_p2p /system/bin/dhcpcd -aABKL
class main
disabled
oneshot
service iprenew_wlan0 /system/bin/dhcpcd -n
class main
disabled
oneshot
service iprenew_p2p /system/bin/dhcpcd -n
class main
disabled
oneshot
二.打补丁
我们打补丁是修改的 rtkbt 文件夹下的文件,因为 android7 默认不支持此款蓝牙芯片,因此我们还需要对照补丁文件,修改 c 源码。
补丁文件:patch/diff/system_bt.diff,修改后的参考代码目录:patch/code
注意:因为系统源码可能经过修改或者定制,与制作补丁文件时有所不同。因此切勿直接覆盖code 下面的文件。请参考 system_bt.diff 文件逐一修改。
因为修改内容众多,限于篇幅,这里仅列举几个具有代表性的例子。
修改文件示例:
首先打开 system_bt.diff 文件:
首先看第 1 行:
diff --git a/Android.mk b/Android.mk
表示对比的文件是 Android.mk。a 和 b 分别代表旧目录和新目录。这里则为/system/bt(下同)
目录与补丁目录 patch/code/system/bt 目录对比。
第 2~3 行
表示旧的文件权限为 0644,新的文件权限问 755。不过权限部分我们其实可以忽略。
第 5~7 行
其中---和+++分别代表了新旧文件,我们可以不去管他。重点是第 7 行,补丁中的块是用来说明文件的改动情况。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。表示旧文件的 1~5 行被替换为了新文件的 1~9 行。
第 8~16 行
这部分内容为具体的修改内容。对应了新文件中的 1~9 行。其中,以+行起始的行(10~13 行)表示被新增的行。如果以-号起始,则表示删除的行。
第一小部分的修改总结而言就是,修改旧文件(Android.mk)的 1~5 行,替换为新文件的(code 目录下 Android.mk)1~9 行。如下图所示,红色部分为修改替换的部分,而绿色框起来的 3~6 行是新旧文件对比后的差异部分。
新增文件示例:
如 1657~1662 行所示,基本格式同前面讲的大致相同,区别是第 1160~1162 行。第 1160 行的旧文件不是具体文件了,而是/dev/null。这里的意思就是旧的目录不存在这个文件。自然,第 1162 行的-0,0 +1,12976就表示原来的内容全部替换为新的文件。
这个修改是最为简单的,我们只需要把 patch/code/system/bt/hci/src/hci_h5.c 中的文件直接复制到/code/system/bt/hci/src/目录中即可。
注意:因为修改替换过程十分漫长和复杂,因此我们建议直接使用我们修改好的代码。
三. rtk_rfkill driver 驱动
在需要用到 BT_DIS pin 来控制蓝牙芯片的场合, 则需要一个 rfkill 驱动. rfkill 驱动的具体实现与平台严重相关,所以如果有需要,请根据实际情况进行开发.RTK 可以提供 reference code. 注意:大多数情况下,客户平台之前搭配过其他家的蓝牙,所以一般都已有 rfkill 驱动,只是需要将 GPIOpin 脚接到之前蓝牙使用过的 pin 就可以,如果不一样,修改一下 rfkill 驱动中 GPIO 脚即可.确认当前是否有支持蓝牙的 rfkill 驱动方法如下:
cat /sys/class/rfkill/rfkill*/type
检查是否有 bluetooth 字样输出,如果有,则已有 rfkill 驱动,不需要重新开发。
然后将/home/topeet/rk3399_7.1_industry/system/bt/conf 下的 Android.mk.disbale 重命名为 Android.mk。
然后将/home/topeet/rk3399_7.1_industry/hardware/libhardware/include/hardware/bluetooth.h 文件修改
为如下图所示:
四.BT 功能配置
1.支持的 Profile 配置
修改/home/topeet/rk3399_7.1_industry/packages/apps/Bluetooth/res/values/config.xml 文件,可以按照下面的配置来关闭这几个 Profile,如果用户需要支持,只需把对应值设置为 true 即可
2.配置本地设备名称
修改/home/topeet/rk3399_7.1_industry/device/rockchip/rk3399/bluetooth/bdroid_buildcfg.hBTM_DEF_LOCAL_NAME 配置项用于配置设备的名字.如果没有这个配置项,将采用 ro.product.modelproperty 设置的名字作为设备名.
五. Porting 结束后的基本测试
修改完成后在 Android7 的 Setting APP 里面打开 Bluetooth,就可以扫描到其他蓝牙设备,然后进行配对,配对完成后就可以进行文件的传输操作了,笔者仅测试了蓝牙的文件发送与接收功能,其他的蓝牙功能比如蓝牙耳机,蓝牙鼠标的使用均未进行测试,不过有了文件发送接收的测试基本说明了蓝牙的 Porting
是 OK 的,如果您有兴趣或者需求,可以移植蓝牙其他更丰富的功能与应用。
迅为瑞芯微RK3399开发板:
核心板参数
尺寸:6.5*5.5cm
高度:连同连接器在内0.26cm
CPU:Rockchip RK3399 28纳米HKMG制程 双核Cortex-A72 1.8/2.0GHz;四核Cortex-A53 1.4GHz
内存:2GB 双通道DDR3(4GB可选)
存储:16GB EMMC
电源管理:官方推荐RK808芯片
工作电压:3.3V供电
系统支持:Android8.1系统;Ubuntu16.04系统;Debian9系统
接口:支持双USB3.0 Type-C接口;支持PCIe 2.1 (4 full-duplex lanes );内置低功耗MCU;8路数字麦克风阵列输入
引角扩展:引出脚多达320个,满足用户各类扩展需求
多媒体 支持4K VP9 and 4K 10bits H265/H264 视频解码,高达60fps;1080P 多格式视频解码 (VC-1, MPEG-1/2/4, VP8)
运行温度:0度至+80度区间,设备工作正常,运行良好!
应用范围:可广泛用于人脸识别设备、无人机、机器人、游戏终端、广告机/一体机、金融POS类、车载控制业、云端服务、VOIP视频会议系统、医疗类、安防/监控/警务、工控类、IoT物联网领域、VR等近百行业应用产品。
底板参数
尺寸:19cm*12cm PCB板:4层
POWER:电直流电源输入接口,12V/2A电源输入 GPS模块:支持(选配)
SWITCH:电源开关 WIFI/BT:双频2.4G/5G WIFI、Bluetooth4.1二合一模块
HDMI接口:1路 HDMI2.0输出接口 EDP LCD:1路
Type-C:1路 Type-C USB3.0接口,兼容OTG功能 MIPI_TX:1路
TF卡槽:1个 MIPI_TX/RX:1路
USB HOST:4路 USB2.0接口;1路 USB3.0接口; SPDIF:光纤输出接口
串口:2路RS232串口 BUZZER:个蜂鸣器
网口:1路千兆以太网(10/100/1000Mbps) RTC:实时时钟
IRDA:1个 GPIO接口:20PIN,包括2路 ADC、2路I2C、 5v、3.3v电源和地
SIM卡槽:1个 LED:3个
PHONE:支持耳机输出 PCIE:PCIE M.2接口
MIC:支持MIC输入 陀螺仪:支持
按键:6个 电子罗盘:支持
4G模块:全网通(选配) GPIO:20路
CAMERA接口:CAMERA 1路、MIPI CAMERA 1路