目录
概要
上一篇文章解决了根文件系统只读,但是最近在移植mqtt客户端的时候,突然发现板子还无法联网,移植了mqtt也没法用。于是打算用MQ-F133A自带的rtl8189wifi模块联网。对于MQ-f133-A有两种获取SDK的方式:
一:全志官网SDK,但是从官网下载太慢了,这里建议直接大家下载韦东山提供的SDK全志Tian 2.0
二:芒果派官网Mango Pi official website | Tiny and Elegant SBC | mangopi_mq
但是无论你获取哪种SDK,如果直接编译烧写的话,无法启动wifi模块,下面给出两种SDK移植WIFI驱动的方法
Mango Pi
Mango Pi 官网的SDK有直接提供对应的开发板并且提供了移植好的wifi驱动,如图所示,选择5即可
如果不做任何配置,编译出来的根文件系统是只读的,无法将.ko文件发送到开发板,解决方法可参考笔者的上一篇文章。在设置根文件系统可读可写之后,编译wifi驱动,将.ko通过adb push到开发板。在加载wifi驱动之后,立刻连接网络,此时会产生如下报错:connect wpa_supplicant failed,please check wifi driver!
解决方法:手动打开wpa_supplicant,wpa_supplicant路径:/etc/init.d
连接wifi,wifi_connect_ap_test <wifi名> <密码>,连接成功
但如此便存在一个缺点,将.ko发送到开发板,然后加载模块,在打开wpa_supplicant,在连接wifi,这些操作是在烧写镜像之后完成的。这就意味着,如果每次更新镜像,那么这些操作需要再来一遍。这就非常麻烦了,为了省去这些不必要的麻烦,可以将wifi编译进内核,并且在编译阶段将.ko文件复制到开发板,加载模块,打开wpa_supplicant,连接wifi。因此可以将这些步骤放在rcS文件中,使以上配置操作开机自动完成。
全志官方Tina系统
修改设备树
rfkill: rfkill@0 {
compatible = "allwinner,sunxi-rfkill";
chip_en;
power_en;
pinctrl-0 = <&wlan_pins_a>;
pinctrl-names = "default";
status = "okay";
wlan: wlan@0 {
compatible = "allwinner,sunxi-wlan";
clock-names = "32k-fanout1";
clocks = <&ccu CLK_FANOUT1_OUT>;
wlan_busnum = <0x1>;
wlan_regon = <&pio PG 12 GPIO_ACTIVE_HIGH>;
wlan_hostwake = <&pio PG 10 GPIO_ACTIVE_HIGH>;
/*wlan_power = "VCC-3V3";*/
/*wlan_power_vol = <3300000>;*/
/*interrupt-parent = <&pio>;
interrupts = < PG 10 IRQ_TYPE_LEVEL_HIGH>;*/
wakeup-source;
};
bt: bt@0 {
compatible = "allwinner,sunxi-bt";
clock-names = "32k-fanout1";
clocks = <&ccu CLK_FANOUT1_OUT>;
/*bt_power_num = <0x01>;*/
/*bt_power = "axp803-dldo1";*/
/*bt_io_regulator = "axp803-dldo1";*/
/*bt_io_vol = <3300000>;*/
/*bt_power_vol = <330000>;*/
bt_rst_n = <&pio PG 15 GPIO_ACTIVE_LOW>;
status = "okay";
};
};
btlpm: btlpm@0 {
compatible = "allwinner,sunxi-btlpm";
uart_index = <0x1>;
bt_wake = <&pio PG 13 GPIO_ACTIVE_HIGH>;
bt_hostwake = <&pio PG 14 GPIO_ACTIVE_HIGH>;
status = "okay";
};
addr_mgt: addr_mgt@0 {
compatible = "allwinner,sunxi-addr_mgt";
type_addr_wifi = <0x0>;
type_addr_bt = <0x0>;
type_addr_eth = <0x0>;
status = "okay";
};
};
修改rtl8189驱动
全志官方的Tina 2.0 SDK中并没有提供rtl8189驱动,需要自己获取,wifi驱动参考Wifi - linux-sunxi.org
git clone https://github.com/jwrdegoede/rtl8189ES_linux.git
cd rtl8189ES_linux
git checkout -B rtl8189fs origin/rtl8189fs
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnu- KSRC=../linux
这里记得修改cpu架构、交叉编译器、以及Linux内核路径。
make -j4 ARCH=riscv CROSS_COMPILE=/home/awei/liunx/risc-v/MQ-f133/Tina-Linux/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu- KSRC=/home/awei/liunx/risc-v/MQ-f133/Tina-Linux/lichee/linux-5.4
这里提一下,笔者一开始并没有获取最新的rtl8189驱动,而是使用比较老的版本,编译的时候会出现以下报错:
这是因为在linux5.1以上版本已经不在使用set_fs(get_ds())这种写法,改为set_fs(KERNEL_DS); 从最新的rtl8189驱动源码也可看出这一修改:
因此,这里建议大家下载最新版的rtl8189驱动。当然最新版也需要修改
Makefile
获取驱动后,修改Makefile
kernel_read
编译wifi驱动,将.ko文件发送到开发板,加载驱动报错(kernel_read)如下:
在使用kernel_read()函数之前,需要加上MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
替换扫卡函数,上电函数
在完成上述修改后,成功加载wifi驱动,本以为到这便移植成功了,但现实是残酷的,终端打印信息如下,加载驱动之后只有寥寥几行,根本看不出来wifi启动成功了。
这个问题卡了很久,最终在全志官方文档D1-H Tina Linux Wi-Fi 开发指南找到了解决方法,
需要使用Tina平台提供的上下电和扫卡函数,函数位于rtl8189ES_linux/platform/platform_ARM_SUNxI_sdio.c中,将里面的函数替换掉,进入
Tina-Linux/lichee/linux-5.4/drivers/net/wireless中找一个rtl系列的wifi驱动,例如rtl8723ds,将platform_ARM_SUNxI_sdio.c复制到rtl8189ES_linux/platform
cp platform_ARM_SUNxI_sdio.c /home/awei/liunx/wifi/rtl8189ES_linux/platform/
重新编译,发送.ko文件到开发板,加载模块,会打印一大堆信息,说明成功了,如果不想看这些信息,可以在Makefile把debug关了,扫面附近wifi:wifi_scan_results_test
OK,至此针对两种sdk,移植wifi驱动成功
小结
1.获取最新的rtl8189wifi驱动
2.在rtl8189ES_linux/os_dep/linux/os_intfs.c中增加声明
MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
3.替换扫卡,上电函数