1 WiFi 基礎(chǔ)知識 WiFi 是當(dāng)今使用最廣泛的一種無線網(wǎng)絡(luò)技術(shù)之一,廣泛應(yīng)用與廣告機,投影儀,智能家居,智能門禁,智能音箱,智能手機等智能聯(lián)網(wǎng)設(shè)備之中,為了加速產(chǎn)品設(shè)計,大部分都是以 wifi 模塊來應(yīng)用的。市場上WiFi 模塊的型號很多,不同的應(yīng)用場景對 wifi 模塊的功能要求不同,有的只需要點對點數(shù)據(jù)傳輸,有的需要在線播放視頻,音樂,在線互動,所以通常會從功能上將 wifi 模塊分為倆大類:通用型 WIFI 模塊,透傳型 WIFI 模塊。如下圖所示: ![]() 通用型 wifi 模塊:比如手機,筆記本上的 USB 或者 SDIO 接口模塊,WiFi 協(xié)議棧和驅(qū)動是在Android,windows 等系統(tǒng)里面跑的,是需要 CPU 來配合完成應(yīng)用。 透傳型 WiFi 模塊通常應(yīng)用與點對點數(shù)據(jù)傳輸場景,模塊中內(nèi)置 wifi 驅(qū)動和協(xié)議,用戶不需要關(guān)心 WiFi協(xié)議是如何實現(xiàn)的,只需要做的是 A 通過串口發(fā)數(shù)據(jù),B 通過串口接收數(shù)據(jù),WiFi 模塊對于開發(fā)者來說變成了透明的,這種類型的模塊接口一般是 MCU 接口的,如 UART 等。像樂鑫,安信可的 WiFi 模塊都是透傳型 WiFi 模塊。 本文檔移植的 wifi 模塊是 RTL8822cs 模塊,是 SDIO 接口的模塊。本次 wifi 移植是在光盤資料【20210702】日期的 Linux 源碼的基礎(chǔ)上進行移植的。 移植的環(huán)境: 1.iTOP-3399 開發(fā)板+ RTL8822CS 模塊 2.Android 8.1 3.搭建好編譯環(huán)境的 ubuntu16.04 64Bit 開發(fā)環(huán)境 本文檔配套資料在網(wǎng)盤資料“iTOP-3399 開發(fā)板\02_iTOP-3399 開發(fā)資料匯總(不含光盤內(nèi)容)\13_嵌入式 Linux 開發(fā)指南(RK3399)手冊配套資料\6.Android 底層驅(qū)動\Android8wifi 移植\”目錄下。如果您移植出現(xiàn)問題,可以對比下修改好的文件。光盤資料【20210927】日期的 Android8 源碼是支持 rtl8822cs 模塊 wifi 功能的。 2 移植步驟 2.1 設(shè)備樹配置 輸入以下命令修改 Android8 的設(shè)備樹文件。 vim kernel/arch/arm64/boot/dts/rockchip/itop-3399.dtsi 將下面的 wifi_chip_type 后面的內(nèi)容修改為 rtl8822cs ![]() 查找 sdio,注釋掉下面的語句,注釋掉這句是因為注冊 sdio 設(shè)備時,會注冊不上。 ![]() 2.2 修改內(nèi)核驅(qū)動 將廠商提供的源碼文件夾放入內(nèi)核目錄 drivers/net/wireless/rockchip_wlan/下,廠商提供的源碼文件夾在網(wǎng)盤資料“iTOP-3399 開發(fā)板\02_iTOP-3399 開發(fā)資料匯總(不含光盤內(nèi)容)\13_嵌入式 Linux 開發(fā)指南(RK3399) 手 冊 配 套 資 料 \6.Android 底 層 驅(qū) 動 \Android8wifi 移 植 \ 廠 商 提 供 的 驅(qū) 動 文 件 ” 路 徑 下 的rtl88x2CS_WiFi_linux_v5.12.1.1-0-gf673ce3.20210125_COEX20200922-1e1e.tar.gz。解壓并修改文件夾名稱為rtl8822cs。 接著修改以下文件: (6)rtl8822cs 文件夾下的 Makefile,添加以下代碼,如下圖所示: obj-$(CONFIG_RTL8822CS) += rtl8822cs/ ![]() (7)rtl8822cs 文件夾下的 Kconfig,添加以下代碼,如下圖所示: source "drivers/net/wireless/rockchip_wlan/rtl8822cs/Kconfig" ![]() (8)rtl8822cs 下的 Makefile 將文件中的 CONFIG_PLATFORM_I386_PC 的值修改為 n 將文件中的 CONFIG_PLATFORM_ARM_RK3188 的值修改為 y 如下圖所示: ![]() 然后將以下圖一的“wlan”改為“8822cs”,如下圖所示: ![]() ![]() (4)rtl8822cs 下的 Kconfig 將第一行的 RTL8822BS 修改為 RTL8822CS,這里是廠家的源碼寫錯了,不改正的話不會編譯到這個源碼目錄。 ![]() (5)然后在 Android8 內(nèi)核目錄(itop-3399_8.1/kernel)下輸入以下命令配置加載驅(qū)動。 make ARCH=arm64 menuconfig Device Drivers ---> 修改后保存到.config 文件 (6)輸入以下命令,將保存好的.config 文件復(fù)制替換 defconfig 文件 cp .config arch/arm64/configs/rockchip_defconfig (7)然后修改 itop-3399_8.1/kernel/net/rfkill/rfkill-wlan.c 文件,添加如下所示內(nèi)容。 } else if (strcmp(wifi_chip_type_string, "rtl8822cs") == 0) { type = WIFI_RTL8822CS; ![]() (8)然后修改 include/linux/rfkill-wlan.h 文件,添加如下內(nèi)容,如下圖所示: WIFI_RTL_8822CS, ![]() 3 修改 HAL 層 (1)我們修改 frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp 文件,添加如下所示代碼,如下圖所示: {"RTL8822CS", "024c:c822"}, ![]() (2)將 strcpy(recoginze_wifi_chip, "APXXX");注釋掉,修改為 strcpy(recoginze_wifi_chip, "RTL8822CS"); strcpy(recoginze_wifi_chip, "RTL8822CS"); ![]() (3)修改 frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp 文件,添加代碼 #define RTL8822CS_DRIVER_MODULE_PATH "/vendor/lib/modules/wifi/8822cs.ko" ![]() (4)添加代碼,如下圖所示。 #define RTL8822CS_DRIVER_MODULE_NAME "8822cs" ![]() 添加代碼,如下圖所示: {"RTL8822CS", RTL8822CS_DRIVER_MODULE_NAME, RTL8822CS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODUL ![]() 更多內(nèi)容請關(guān)注迅為電子 |