zoukankan      html  css  js  c++  java
  • 底层驱动移植篇瑞芯微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路  

  • 相关阅读:
    Linux 系统使用WordPress开启“固定链接设置”之后部分页面打不开(404)的解决办法
    WordPress安全配置
    去掉Windows2003的自动锁定
    用IP访问wordpress的css和js为何不能加载
    元素伸缩
    Cookie之获设删
    输入0开头的数字,自动纠正
    PHP入门(一)
    node.js(一)
    vue-demo-tab切换
  • 原文地址:https://www.cnblogs.com/liyue3/p/15628282.html
Copyright © 2011-2022 走看看