---
title: "Linux w5500 driver and use"
url: "https://maker.wiznet.io/chen/projects/linux-w5500-driver-and-use/"
markdown_url: "https://maker.wiznet.io/chen/projects/linux-w5500-driver-and-use/md"
type: "UCC: User Created Content"
author: "lnwechag"
author_url: "https://blog.csdn.net/lnwechag/article/details/128675509?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167686454416782427420808%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167686454416782427420808&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~times_rank-1-128675509-null-null.142%5ev73%5econtrol,201%5ev4%5eadd_ask,239%5ev2%5einsert_chatgpt&utm_term=W5500&spm=1018.2226.3001.4187"
editor: "WIZnet"
editor_url: "https://maker.wiznet.io/"
original_author: "lnwechag"
original_url: "https://blog.csdn.net/lnwechag/article/details/128675509?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167686454416782427420808%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167686454416782427420808&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~times_rank-1-128675509-null-null.142%5ev73%5econtrol,201%5ev4%5eadd_ask,239%5ev2%5einsert_chatgpt&utm_term=W5500&spm=1018.2226.3001.4187"
published: "2023-05-02"
language: "en"
likes: 0
views: 1010
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# Linux w5500 driver and use

> Linux w5500 driver and use

Original author: lnwechag (source: https://blog.csdn.net/lnwechag/article/details/128675509?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167686454416782427420808%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167686454416782427420808&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~times_rank-1-128675509-null-null.142%5ev73%5econtrol,201%5ev4%5eadd_ask,239%5ev2%5einsert_chatgpt&utm_term=W5500&spm=1018.2226.3001.4187)

## Article

1、驱动

驱动来源: a: 内核驱动； b：官方驱动

a. 内核：linux内核w5500驱动，包含两个源文件w5100.c和w5100-spi.c

/kernel/drivers/net/ethernet/wiznet/w5100.c

kernel/drivers/net/ethernet/wiznet/w5100-spi.c

kernel/drivers/net/ethernet/wiznet/w5100.h

可通过make menuconfig将其配置进内核，重新烧写内核即可。

或者将这两个文件单独拷贝出来，将其编译成模块，手动insmod

单独编译：写两个makefile编译出w5500.ko和w5500-spi.ko

obj-m := w5500.o
w5500-objs := w5100.o

KDIR := /home/kernel
PWD := $(shell pwd)

default :
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
obj-m := w5500-spi.o
w5500-spi-objs := w5100-spi.o

KDIR := /home/kernel
PWD := $(shell pwd)

default :
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
依次加载驱动，insmod w5500.ko && insmod w5500-spi.ko （注意挂载顺序）

而后执行 ifconfig -a 即可查看到ethx新增的网络设备

内核驱动中的问题点：

1、内核驱动中没有rst硬件复位，只有软复位。 自己的板子上rst引脚有引出，需要处理

static int w5100_hw_reset(struct w5100_priv *priv) 函数中增加对硬件复位的控制

b. wiz官网驱动：

www.w5500.com

下载linux驱动文件，文件内有app和driver两个文件，使用driver文件内的驱动代码

驱动代码里的针对的内核版本有点低，使用4.19，需要针对版本修改一些函数使用方法。

针对自己的环境修改makefile。

obj-m := w5500-wiz.o
w5500-wiz1-objs := module.o netdrv.o dev.o queue.o

KDIR := /home/kernel
PWD := $(shell pwd)

default :
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
insmod w5500-wiz.ko 加载驱动，ifconfig -a 后生成新网卡wiz0

加载驱动前需要先修改好设备树文件

2、w5500设备树

增加复位控制引脚

增加spi0设备树描述：SPI速率，中断脚等

&pinctrl {
......

w5500{
w5500_reset_gpio: w5500_reset_gpio{
rockchip,pins =
&lt;3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>,/* LU45 P3B0 复位 */
};
};

};

w5500-eth{
gpio_reset = &lt;&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = &lt;&w5500_reset_gpio>;
status = "okay";
};

&spi0 {
pinctrl-names = "default", "high_speed";
pinctrl-0 = &lt;&spi0m1_cs0 &spi0m1_pins>;
pinctrl-1 = &lt;&spi0m1_cs0 &spi0m1_pins_hs>;
status = "okay";

w5500-wiz0@0x00{
compatible = "w5500-wiz0";
reg = &lt;0>;
spi-max-frequency = &lt;40000000>; /* SPI支持80M速率，实际使用高于50M时寄存器读出错误*/
interrupt-parent = &lt;&gpio3>;
interrupts = &lt;RK_PA7 IRQ_TYPE_LEVEL_LOW>;
};

};

过程中的问题：

配置完成设备树后，加载驱动后，可以进入probe；使用ifconfig -a 可以查看到网口设备有新增eth2。

驱动初始化，或其他操作进行复位操作后，将对一个默认参数读取来指示当前spi接口及复位情况。

if ((read_data = w5100_read16(priv, rtr)) != RTR_DEFAULT){

printk("read data16: %d,\n", read_data);

return -ENODEV;

}
实际独处的数据与RTR_DEFAULT不一致；驱动会一直重启。

将驱动换成wiznet官网提供的。

修改驱动，适配4.1的内核。配置硬件复位和中断引脚。

修改复位引脚使用设备树of函数操作。

进入probe后，在网口中生成设备wiz0

问题1：申请引脚和驱动的api返回值判断逻辑错误。

问题2：驱动加载时，读取版本号验证。读出的版本号与实际的不一致。

最终问题点：设备树配置spi速率，以上操作都将spi 速率配置成80MHz

spi-max-frequency = &lt;40000000>;

SPI速率问题：W5500的spi理论上可以支持到80Mhz，开始之初设置到80M后，spi通信数据异常，寄存器读出错误，然后驱动重启。后将速率设置讲到40Mhz才正常。

由于硬件设计时对spi的数据线，时钟线走线没有处理，导致速率升上去后数据异常

3、连接网络

设置IP:

1、使用固定IP

ifconfig wiz0 192.168.1.121 up
ifconfig wiz0 netmask 255.255.255.0 broadcast 192.168.1.255
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1 dev wiz0
route add default gw 192.168.1.1 dev wiz0
2、使用dhcp自动获取IP

udhcpc -i wiz0
设置完成 IP后，使用ifconfig 查看网卡

指定网卡PING：

ping -I wiz0 192.168.1.102
PING 外网：

ping -I wiz0 www.baidu.com
需要DNS服务：

/etc resolv.conf 文件添加DNS

————————————————
版权声明：本文为CSDN博主「lnwechag」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/lnwechag/article/details/128675509

---

Source: https://maker.wiznet.io/chen/projects/linux-w5500-driver-and-use/
