linux w5500 驱动及使用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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







阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux