linux w5500 驱动及使用

news2024/12/23 14:23:06

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django 入门学习

记录Django入门学习过程 1 基本环境 安装virtualenv pip3.9 install virtualenv 使用命令行创建 创建一个项目 virtualenv dj 进入虚拟环境 cd dj/bin source ./activate 进入成功后bash前面显示括号 安装 Django pip install django3.0.6 安装成功后之星django-…

创建者模式

1.单例模式 单例模式能够保证一个类只有一个实例&#xff0c;并且提供一个可以访问该实例的全局节点 实现步骤 类中添加一个私有静态成员变量用于保存单例实例声明一个公有静态构建方法用于获取单例实例在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一…

【云原生kubernetes】k8s中pod使用详解

一、前言 在之前k8s组件一篇中&#xff0c;我们谈到了pod这个组件&#xff0c;了解到pod是k8s中资源管理的最小单位&#xff0c;可以说Pod是整个k8s对外提供服务的最基础的个体&#xff0c;有必要对Pod做深入的学习和探究。 二、再看k8s架构图 为了加深对k8s中pod的理解&#x…

ARM PWM 定时器与实战

一、什么是定时器&#xff08;timer&#xff09; 1、定时器是 SoC 中常见外设 (1) 定时器与计数器。计数器是用来计数的&#xff08;每隔一个固定时间会计一个数&#xff09;&#xff1b;因为计数器的计数时间周期是固定的&#xff0c;因此到了一定时间只要用计数值计数时间周…

contex-m基于IAR工程从boot阶段引导app

目录 1.修改工程 2.修改代码 Boot代码 App代码 3.修改FM33LG04x.icf 4.修改IAR工程icf配置路径 5.修改FM33LG04X.icf链接文件 6.编译工程 7.查看map文件 8.调试程序 1.修改工程 本次调试的demo为《UART0 DMA发送_串口中断示例》&#xff0c;以下修改都是基于该工程&…

初始C语言 - 函数

C语言中函数的分类&#xff1a; 1.库函数:C语言自带的函数&#xff0c;包含大量频繁使用的功能 2.自定义函数:有些库函数没有的&#xff0c;需要程序员自己设计一、库函数通过MSDN、cplusplus.com、cppreference.com这些网站&#xff0c;查看学习函数的作用和用法在使用库函数时…

portswigger靶场中目录遍历

portswigger靶场中目录遍历1.Bp靶场介绍1.1.访问靶场1.2.注意事项2.目录变量漏洞2.1.文件路径遍历2.1.1.开启靶场2.1.2.点击详情2.1.3.抓包2.1.4.修改参数2.1.5.过关2.2.用绝对路径旁路阻止遍历序列2.2.1.开启靶场2.2.2.修改参数2.2.3.过关2.3.非递归地剥离遍历序列2.3.1.开启靶…

Windows下让Qt5 QCamera响应UVC摄像头硬件按钮拍图

QCamera相机类提供了一些基本的功能&#xff0c;包括拍照和录制功能&#xff08;Windows不支持录制视频&#xff09;&#xff0c;但也有很多接口是没有封装的&#xff0c;比如有些UVC摄像头有物理按键&#xff0c;可以进行拍图等操作&#xff0c;但是QCamera没法响应硬件按钮的…

通信原理与MATLAB(十五):码间干扰和无码间干扰条件

目录1.码间干扰2.无码间干扰条件2.1 时域条件2.2 频域条件3.满足无码间干扰条件的滤波器3.1 理想低通滤波器3.2 余弦滚降滤波器4.不同滚降系数的余弦滚降滤波器时频域图4.1 代码4.2 结果图5.理想低通滤波器和升余弦滚降滤波器(α1)对比1.码间干扰 如下图所示&#xff0c;码间干…

Vue 基础之侦听器

Vue 基础之侦听器描述侦听器侦听器的创建侦听器的应用选项immediate 选项deep 选项未使用 deep 选项使用 deep 选项侦听目标对象中的单个属性描述 项目描述IDEVScode操作系统Windows 10 专业版Vue.js2.6.12 侦听器 侦听器允许开发者对数据进行监视&#xff0c;并指定数据发生…

数据分析-深度学习 Pytorch Day4

一&#xff1a;概述当你想训练好一个神经网络时&#xff0c;你需要做好三件事情&#xff1a;一个合适的网络结构&#xff0c;一个合适的训练算法&#xff0c;一个合适的训练技巧&#xff1a;合适的网络结构&#xff1a;包括网络结构和激活函数&#xff0c;你可以选择更深的卷积…

打工人必学的法律知识(四)——《中华人民共和国劳动法》

中华人民共和国劳动法http://www.npc.gov.cn/npc/c30834/201901/ffad2d4ae4da4585a041abf66e74753c.shtml 目录 第一章 总  则 第二章 促进就业 第三章 劳动合同和集体合同 第四章 工作时间和休息休假 第五章 工  资 第六章 劳动安全卫生 第七章 女职工和未…

大数据技术之Hadoop(HDFS)——超详细

第1章 HDFS概述 1.1 HDFS产出背景及定义 1&#xff09;HDFS产生背景 随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文…

误删照片音视频文件不要担心 几种方法解救慌乱的你 别再病急乱投医啦 [附软件]

误删照片音视频文件不要担心 几种方法解救慌乱的你 方法1&#xff1a;从手机相册中恢复手机删除的照片 这里以vivo手机为例,其他手机也是差不多的 相册->右上角三个点->设置->云空间 进入云存储空间 点击云盘->我的备份->就能看到你自动上传的照片 相册-&…

【Linux】共享内存

目录 一、共享内存 1.1 申请共享内存块 1.2 释放共享内存块 1.3 挂接共享内存 二、共享内存的使用 2.1 Server端与Client端 2.2 挂接与运行 三、共享内存总结 3.1 共享内存的特点 3.2 共享内存实现访问控制 一、共享内存 共享内存是最快的IPC形式。一旦这样的内存映…

xxl-job原理(版本2.3.1)

一、xxl-job架构图 1、调度中心 ​ 负责管理调度信息&#xff0c;按照调度配置发出调度请求&#xff0c;自身不承担业务代码。调度系统与任务解耦&#xff0c;提高了系统可用性和稳定性&#xff0c;同时调度系统性能不再受限于任务模块。 2、执行器 负责接收调度请求并执行任…

CSS注入 2.0

看过CSS注入1.0的朋友&#xff0c;不相信对CSS注入有了一个概念性的理解&#xff0c;在上一篇文章中我只是简单复现了一下波兰老哥的CSS注入过程&#xff0c;阐述了其大致原理。对于其中很大一部分技术细节&#xff0c;代码细节并未做深入的理解(当时我也看不懂&#xff0c;哈哈…

什么是分布式事务

上一篇文章已经讲完分布式了&#xff0c;那暖男说要讲分布式事务那就一定会讲&#xff0c;只是我估计大家没料到暖男这么快就肝好了吧&#xff1f; 事务想必大家并不陌生&#xff0c;至于什么是 ACID&#xff0c;也是老生常谈了。不过暖男为了保证文章的完整性确保所有人都听得…

uniapp-微信小程序分包操作步骤详解

1、在原来的pages的同级下新建一个目录&#xff1a;package1 &#xff08;名字自己随便起。想分几个包就建几个新目录。比如package2、package3……&#xff09; 结构是并列的&#xff1a; 2、把想要放进分包里去的模块都剪切在新目录里面去。 &#xff08;就是以前全都放在…

移动端 - 搜索组件(suggest篇)

这一篇博客是和 search-input篇 衔接的, 需要的可以看上文 移动端 - 搜索组件(search-list篇) 这里我们需要去封装这么一个组件 先说一下大致的方向: 1. 根据父组件传入的关键字数据发送请求获取后端数据, 进行模板渲染 2. 处理一些边界情况(后端返回数据为空, 初次加载数据…