本文主要记录如何在 LuckFox Pico Max RV1106 开发板上驱动 Wiznet-W5500 SPI以太网模块。

前文 给开发板适配 Alpine Linux 介绍了一个 RV1106 的开发板,尺寸小巧,功能十足,只有一个 100M 以太网口对于有些应用不大够用,USB 也是跟 Type-C 共享不容易引出扩展,GPIO 针脚上引出有 SPI 总线,可以利用 Wiznet-W5500 模组扩展一个低速网口使用。

板载 GPIO 扩展引脚如下图所示:

Luckfox pico max gpio pins

W5500 模块除了连接 SOC SPI 总线外,还需要额外两个 GPIO 引脚用于连接 INT (中断处理) 和 RST (重置),如上图所示,SPI 片选使用 RV1106 的 CS0 ,中断(INT)使用 GPIO2_A6(29 引脚),重置(RST) 使用 GPIO2_A0 (24 引脚),需要注意硬件上电平转换。

硬件连接完成后,还需要配置 RV1106 BSP 以驱动该模块。Wiznet-W5500 在内核中使用 wiznet/w5100-spi 驱动模块,我们只需要配置内核 CONFIG 以及 DTS 即可。

Kernel Config 修改如下,激活 Wiznet/w5100-spi:

1
2
3
4
5
6
#FILE: source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig

-# CONFIG_NET_VENDOR_WIZNET is not set
+CONFIG_NET_VENDOR_WIZNET=y
+CONFIG_WIZNET_W5100=m
+CONFIG_WIZNET_W5100_SPI=m

DTS 修改如下,配置 SPI,以及 w5500 INTRST 引脚:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#FILE: source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pro-max.dts

 // /**********SPI**********/
 &spi0 {
 	status = "okay";
 	pinctrl-names = "default";
 	pinctrl-0 = <&spi0m0_pins>;
-	cs-gpios = <&gpio1 RK_PC0 1>;
-	// cs-gpios = <&gpio1 26 1>;
+	//cs-gpios = <&gpio1 RK_PC0 1>;
+	cs-gpios = <&gpio1 16 1>;
 	#address-cells = <1>;
 	#size-cells = <0>;
 	spidev@0 {
+		status = "disabled";
 		compatible = "rockchip,spidev";
 		spi-max-frequency = <50000000>;
 		reg = <0>;
 	};
+	w5500@0 {
+		status = "okay";
+		compatible = "wiznet,w5500";
+		spi-max-frequency = <50000000>;
+		reg = <0>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart1m1_ctsn>;
+		interrupt-parent = <&gpio2>;
+		interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
+	};
 };

以上修改完成后,编译 BSP 生成镜像刷机即可,启动后会额外生成 eth1 设备,可以安装 iperf3 工具用来测试网口性能:

iper3f with w5500 on rv1106

基本可以达到 W5500 的 15 Mbps 的速率上限,此时 CPU 占用约在 50% 左右(多数在内核 sys 数据处理上,si 并不高),主要原因还是 rv1106 只有单核,性能有限。

这样扩展的网口,速率只有 10 Mbps 水平,对于一些收发数据率不高的应用场景,也足够了。