1、驱动
驱动来源:
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 =
<3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>,/* LU45 P3B0 复位 */
};
};
};
w5500-eth{
gpio_reset = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&w5500_reset_gpio>;
status = "okay";
};
&spi0 {
pinctrl-names = "default", "high_speed";
pinctrl-0 = <&spi0m1_cs0 &spi0m1_pins>;
pinctrl-1 = <&spi0m1_cs0 &spi0m1_pins_hs>;
status = "okay";
w5500-wiz0@0x00{
compatible = "w5500-wiz0";
reg = <0>;
spi-max-frequency = <40000000>; /* SPI支持80M速率,实际使用高于50M时寄存器读出错误*/
interrupt-parent = <&gpio3>;
interrupts = <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 = <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
该文件重启会清除,可以在启动文件中加入以下
echo "nameserver 1.1.1.1" >> /etc/resolv.conf
echo "nameserver 8.8.8.8" >> /etc/resolv.conf