linux w5500 驱动及使用

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 = 
             <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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值