
SPI to Ethernet Communication on Forlinx OK-MX9352-C Board: W5500 Driver Setup & Debug Guide
This article takes Forlinx Embedded’s OK-MX9352-C development board as an example to elaborate on how to adapt the network port module through the SPI interface to achieve Ethernet communication. The W5500 module, a high-performance SPI to 100Mbps Ethernet chip with up to 80Mbps data rate, suits embedded network needs.
Modules used:
Hardware Connection
Wiring between W5500 and OK-MX9352-C is in the table below.
Develop board pins |
W5500 pins |
---|---|
LPSPI3_PCS0 | SCS |
LPSPI3_SIN | MISO |
LPSPI3_SOUT | MOSI |
LPSPI3_SCK | SCLK |
GPIO_IO04 | INT |
GPIO_IO05 | RST |
Among them, SCS is the chip-select signal, MISO is the master-in slave-out data line, MOSI is the master-out slave-in data line, SCLK is the clock signal, INT is the interrupt signal, and RST is the reset signal.
Software Configuration and Driver Debugging
1. Compilation Drive
First, add the relevant options to the kernel configuration
> Device Drivers > Network device support > Ethernet driver support ...... [*] WIZnet devicesWIZnet W5100 Ethernet support < > WIZnet W5300 Ethernet support WIZnet interface mode (Select interface mode in runtime) --->WIZnet W5100/W5200/W5500 Ethernet support for SPI mode ......
2. Devie Tree Modification
Add the relevant configuration of W5500 under SPI3 node.
&lpspi3 { fsl,spi-num-chipselects =; pinctrl-names = "default", "sleep"; pinctrl-0 = <&pinctrl_lpspi3>; pinctrl-1 = <&pinctrl_lpspi3>; cs-gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; status = "okay"; ethernet: w5500@0 { compatible = "wiznet,w5500"; reg =; status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_w5500>; interrupt-parent = <&gpio2>; interrupts =; spi-max-frequency =; }; };
Multiplexed SPI
pinctrl_lpspi3: lpspi3grp { fsl,pins = < MX93_PAD_GPIO_IO08__GPIO2_IO08 0x3fe MX93_PAD_GPIO_IO09__LPSPI3_SIN 0x3fe MX93_PAD_GPIO_IO10__LPSPI3_SOUT 0x3fe MX93_PAD_GPIO_IO11__LPSPI3_SCK 0x3fe >; }; pinctrl_w5500: w5500grp { fsl,pins = < MX93_PAD_GPIO_IO04__GPIO2_IO04 0x31e //int MX93_PAD_GPIO_IO05__GPIO2_IO05 0x31e //rst >; };
Since the W5500 driver uses software reset by default, it’s only necessary to ensure that the reset pin is in a pull-up state.
3. Compilation&Porting
Compile the device tree and drivers, including w5100.ko and w5100-SPI. Ko for W5500.
$ root@DESKTOP-GJ47EH8:/home/OKMX93-linux-sdk# ./build.sh kernel
After compiling, replace the device tree on the development board and place the driver in the directory where the system can find it.
$ root@ok-mx93:~# cp /run/media/boot-mmcblk1p1/OK-MX93-C.dtb /run/media/Boot-mmcblk0p1/ $ root@ok-mx93:~# cp /run/media/boot-mmcblk1p1/w5100.ko ./ $ root@ok-mx93:~# cp /run/media/boot-mmcblk1p1/w5100-spi.ko ./
4. Driver Loading
Execute the load driver command on the development board
root@ok-mx93:~# insmod w5100.ko root@ok-mx93:~# insmod w5100-spi.ko
The new eth2 network card can be seen through the ifconfig -a command, and the network card can be up normally.
root@ok-mx93:~# ifconfig -a ... eth2: flags=-28605mtu 1500 inet 169.254.218.84 netmask 255.255.0.0 broadcast 169.254.255.255 inet6 fe80::c4c5:86ff:fe12:9f9d prefixlen 64 scopeid 0x20ether c6:c5:86:12:9f:9d txqueuelen 1000 (Ethernet) RX packets 2115 bytes 340022 (332.0 KiB) RX errors 0 dropped 133 overruns 0 frame 0 TX packets 56 bytes 13927 (13.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ... root@ok-mx93:~# ifconfig eth2 up root@ok-mx93:~# ifconfig ... eth2: flags=-28605 mtu 1500 inet 169.254.218.84 netmask 255.255.0.0 broadcast 169.254.255.255 inet6 fe80::c4c5:86ff:fe12:9f9d prefixlen 64 scopeid 0x20ether c6:c5:86:12:9f:9d txqueuelen 1000 (Ethernet) RX packets 2430 bytes 398823 (389.4 KiB) RX errors 0 dropped 158 overruns 0 frame 0 TX packets 56 bytes 13927 (13.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ...
5. Network Test
After the driver is loaded, IP can be set normally and the external network can be pinged.
root@ok-mx93:~# ifconfig eth2 172.20.2.167 root@ok-mx93:~# ifconfig ... eth2: flags=-28605mtu 1500 inet 172.20.2.167 netmask 255.255.0.0 broadcast 172.20.255.255 inet6 fe80::c4c5:86ff:fe12:9f9d prefixlen 64 scopeid 0x20ether c6:c5:86:12:9f:9d txqueuelen 1000 (Ethernet) RX packets 8082 bytes 1529102 (1.4 MiB) RX errors 0 dropped 491 overruns 0 frame 0 TX packets 94 bytes 31366 (30.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ... root@ok-mx93:~# ping -I eth2 172.20.2.166 PING 172.20.2.166 (172.20.2.166) from 172.20.2.166 eth2: 56(84) bytes of data. 64 bytes from 172.20.2.166: icmp_seq=1 ttl=64 time=0.127 ms 64 bytes from 172.20.2.166: icmp_seq=2 ttl=64 time=0.077 ms 64 bytes from 172.20.2.166: icmp_seq=3 ttl=64 time=0.077 ms 64 bytes from 172.20.2.166: icmp_seq=4 ttl=64 time=0.076 ms ^C --- 172.20.2.166 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3076ms rtt min/avg/max/mdev = 0.076/0.089/0.127/0.021 ms