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