底层驱动移植篇-瑞芯微RK3399开发板Android7蓝牙移植

近期需要把蓝牙(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路  

########################BT FM ########################## Download the image using command: 1 # Flash Image Put the board in Flashing mode. Refer below Appendix - 1 cd <your path>/Nvidia_Demo/android_gb_cardhu_os_image sudo ./nvflash --bct flash.bct --setbct --odmdata 0x40080105 --configfile flash.cfg --create --bl bootloader.bin --go #################################################################################################################################################################################################### Appendix - 1 Nvidia Board in Flashing Mode #################################################################################################################################################################################################### 1. Connect the Debug board to Cardhu board. 2. Connect the power supply and Micro USB to Cardhu 3. On the Debug Board Press S12 (FRC RCV), Keeping this pressed Press and release S7 (RESET), Now Release S12. 4. Now Device is in Flashing mode, We can start nvflash command now. #################################################################################################################################################################################################### Appendix - 2 Nvidia Board Keys (On Debug Board) #################################################################################################################################################################################################### 1. S7 (RESET) --> is the RESET button. 2. S5 (ROW1) --> is the BACK button. 2. S10 (ROW2) --> is the Home button. 4. S6 (ON KEY) --> is Wake up button. #################################################################################################################################################################################################### Appendix - 3 Nvidia Board unavailable Keys workaround #################################################################################################################################################################################################### 1.To execute teh specific keys, provide the key inputs from adb shell. Provide the keyevent for the desired key.Refer teh key list below. Eg: for MENU key run adb shell #input keyevent 82 { "STAR", 17 }, { "POUND", 18 }, { "DPAD_UP", 19 }, { "DPAD_DOWN", 20 }, { "DPAD_LEFT", 21 }, { "DPAD_RIGHT", 22 }, { "DPAD_CENTER", 23 }, { "VOLUME_UP", 24 }, { "VOLUME_DOWN", 25 }, { "POWER", 26 }, { "CAMERA", 27 }, { "CLEAR", 28 }, { "HEADSETHOOK", 79 }, { "FOCUS", 80 }, { "PLUS", 81 }, { "MENU", 82 }, { "NOTIFICATION", 83 }, { "SEARCH", 84 }, { "MEDIA_PLAY_PAUSE", 85 }, { "MEDIA_STOP", 86 }, { "MEDIA_NEXT", 87 },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值