底层驱动移植篇-瑞芯微RK3399开发板Android7蓝牙移植
发布时间:2021-12-1 10:25
发布者:就是塔塔
近期需要把蓝牙(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 分别代表旧目录和新目录。这里则为 目录与补丁目录 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 中的文件直接复制到 注意:因为修改替换过程十分漫长和复杂,因此我们建议直接使用我们修改好的代码。 三. 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路 |
网友评论