野火 RT1052 移植网卡功能(LAN8720A)

2023-11-13

野火 RT1052 移植网卡功能(LAN8720A)

开发环境

RT-Thread: v4.0.2(master)
SOC: i.MX RT1050
Board: 野火 RT1052

目的

在 RT-Thread 系统上进行网络通讯

背景描述

1.首先调研,找板子,在这过程中发现了野火和正点原子有基于 NXP 的 i.MX RT1050 的开发板。为什么要选择 i.MX RT1050 呢?主要是因为他的主频能达到500MHz。这也是我需要的。
2.搜了很多帖子,都说野火的资料比正点原子的要多,而且较系统。所以就选择了野火的开发。当天就下单了一块“野火 i.MX RT1052开发板 Pro版本”。
3.之前有对 RT-Thread 展开过调研,发现这款国产系统做的很不错,开发方式,代码风格有借鉴 Linux,对于我这个从 Linux过来的人很是熟悉。因为对 RT-Thread 也还是初涉,而野火对于"野火 RT1052"这款开发板有详细的 RT-Thread 资料和示例,所以选择"野火 RT1052"也是基于这个原因。
4.最后要说下野火的问题,其"野火 RT1052"开发板没有PCB,BOM表,需要玩家自己设计底板。野火几乎可以说没有客服渠道,都是要去淘宝上找客服转接技术才能咨询,然后就是野火自家的论坛可以咨询问题。
5.期间我有遇到了很多问题,只在问题一栏简单说明,以及解决办法。移植过程中的坑太多,难言啊!言归正传,开始搞板子

移植过程

1.首先去 Git 下载 RT-Thread 最新的源代码
为什么最新的源代码呢,因为 RT-Thread 团队会更新 bsp, 开发板各功能,开发板各驱动。可能你前段时间下载查询没有的功能,可能再次下载就有你想要的功能,而且只是 menuconfig 简单配置后就可以使用了。
RT-Thread
2.去 RT-Thread 官网下载 Env工具
Env 工具使用来配置编译 RT-Thread 的
按照官方给的安装文档,进行安装配置 Env 用户手册
3.下载好后,进入 “rt-thread\bsp\imxrt\imxrt1052-fire-pro” 这个目录,各种开发板相关的代码都在 bsp 目录下,去找对应的就行。
如果你要用 RT-Thread, 而又不知到选什么板子好,你可以先在源码 bsp 目录下看有没有对应的 bsp ,并且功能是否有你需要的。然后再抉择是否选用这块开发板、SOC
4.按照 网络协议栈驱动移植笔记 文档进行移植。然而进行 “menuconfig” 时,在配置项中并没有 “Enable Ethernet”这个选项。经过阅读
“rt-thread\bsp\imxrt\imxrt1052-fire-pro\board\Kconfig” 文件,发现并没有BSP_USING_ETH配置,绝望了!我在 RT-Thread 论坛上发布了一个问题,第二天就收到了回复, 在这里要感谢这位朋友的回复.
回复中提到: i.MX RT 系列外设驱动添加指南
这里不得不说 RT-Thread 团队很给力,提供的文档很是详细。还有 RT-Thread 官方论坛, 上面有 RT-Thread 团队的维护, 以及希望国产操作系统越来越强大的猿友们.
5.参考"i.MX RT 系列外设驱动添加指南"文档,进行了外设驱动添加。该文档步骤详细,只要按照步骤一步步做就可以了。这里我说下需要注意的问题
5.1 用 MCUXpresso 生成 pin_mux.h pin_mux.c 复用代码时,要根据自己开发板原理图,我们这里是移植的网卡,所以要注意从SOC到PHY芯片之间用到的引脚。然后结合 LAN8720A 芯片手册来进行配置。这里我使用的野火提供的FreeRTOS中lwip例程,这个例程有LAN8720A 芯片的驱动代码 fsl_phy.c,fsl_phy.h。所以直接拿过来使用进行。将 pin_mux.c 中的 “BOARD_InitPins” 函数下有关网卡配置的代码,复制到你的工程中。(NXP官网上没有找到关于LAN8720A的驱动,而且NXP的官方开发板“MIMXRT1050-EVK”使用的是“ksz8081”phy芯片)
5.2 编写 phy 复位函数 imxrt_enet_phy_reset_by_gpio,代码见 board.h board.c
board.h

#ifdef BSP_USING_ETH
void imxrt_enet_phy_reset_by_gpio(void);
#define PHY_ADDRESS     (0x00U)
#endif

board.c

#ifdef BSP_USING_ETH
void imxrt_enet_phy_reset_by_gpio(void)
{
	rt_kprintf("imxrt_enet_phy_reset_by_gpio");

	gpio_pin_config_t gpio_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};

    GPIO_PinInit(GPIO1, 9, &gpio_config);
    GPIO_PinInit(GPIO1, 10, &gpio_config);
    // pull up the ENET_INT before RESET.
    GPIO_WritePinOutput(GPIO1, 10, 1);
    GPIO_WritePinOutput(GPIO1, 9, 0);
    rt_thread_delay(100);
    GPIO_WritePinOutput(GPIO1, 9, 1);
}
#endif /* BSP_USING_ETH */

5.3 drv_eth.c 文件中 _enet_config 函数下 注释 “ENET_Deinit(imxrt_eth_device.enet_base);”,代码如下

static void _enet_config(void)
{
	...
    /* Set SMI to get PHY link status. */
    sysClock = CLOCK_GetFreq(kCLOCK_AhbClk);

    dbg_log(DBG_LOG, "deinit\n");
    //ENET_Deinit(imxrt_eth_device.enet_base);
    dbg_log(DBG_LOG, "init\n");
    ENET_Init(imxrt_eth_device.enet_base, &imxrt_eth_device.enet_handle, &config, &buffConfig, &imxrt_eth_device.dev_addr[0], sysClock);
    dbg_log(DBG_LOG, "set call back\n");
    ENET_SetCallback(&imxrt_eth_device.enet_handle, _enet_callback, &imxrt_eth_device);
    dbg_log(DBG_LOG, "active read\n");
    ...
}

5.4 menuconfig 配置
在 RT-Thread Components → Network → light weight TCP/IP stack 下
关闭 “Enable alloc ip address through DHCP”
进入 “Static IPv4 Address” 并设置IP,网关,掩码
scons --target=mdk5 -s
5.6 编译并下载,程序正常运行,ping 检测, 网络正常

问题

1."ENET_Deinit(imxrt_eth_device.enet_base);"必须注释。不是注释改行,程序就会死在改行。该问题是通过代码打印调试,才锁定到该行,具体原因还待探索。
2.“cannot open source input file “ulog.h”: No such file or directory”
解: menuconfig 开启 ulog 功能后, 要先关闭该工程, 然后再"scons --target=mdk5 -s"生成工程.
3.“Undefined symbol ulog_flush (referred from drv_eth.o)”, “Undefined symbol ulog_console_backend_output (referred from ulog.o).”
解: 同2,
解: 关闭 ulog 功能后并生成工程, 再开启功能并生成工程

移植过程中思路/日志

RT-Thread RT1052网卡移植思路
1.借助 Freertos 中移植 lwip 的方法来移植 rt-thread中的网卡
2.enet_ethernetif_kinetis.c
    D:\BaiduNetdiskDownload\书籍配套程序\基于i.MXRT1052_开发板\lwip_tcpecho_socket\user\bsp\arch\enet_ethernetif_kinetis.c
    该文件中包含大部分对网卡的操作.
    可以搜索 ENET_ 为前缀的 nxp 提供的 fsl_enet.c 文件中的函数.
    按照对应的方式, 来操作网卡.
    
3.enet_ethernetif.c
    该文件中也有包含 
        #include "fsl_enet.h"
    要注意是否有操作.
    
4.移植网卡驱动, 主要是针对 fsl_enet.c,fsl_enet.h 这两个文件
    E:\firepro\rt-thread-v(master)\rt-thread\bsp\imxrt\libraries\MIMXRT1050\MIMXRT1052\drivers

这是在定位ENET_Deinit卡死过程中, lwip 代码阅读

struct netifapi_msg {
  struct tcpip_api_call_data call;
  struct netif *netif;
  union {
    struct {
#if LWIP_IPV4
      NETIFAPI_IPADDR_DEF(ip4_addr_t, ipaddr);
      NETIFAPI_IPADDR_DEF(ip4_addr_t, netmask);
      NETIFAPI_IPADDR_DEF(ip4_addr_t, gw);
#endif /* LWIP_IPV4 */
      void *state;
      netif_init_fn init;
      netif_input_fn input;
    } add;
    struct {
      netifapi_void_fn voidfunc;
      netifapi_errt_fn errtfunc;
    } common;
  } msg;
};
NETIFAPI_VAR_DECLARE(msg);      //定义了 struct netifapi_msg 结构体
  NETIFAPI_VAR_ALLOC(msg);
NETIFAPI_VAR_REF(msg).netif = netif;
#if LWIP_IPV4
  NETIFAPI_VAR_REF(msg).msg.add.ipaddr  = NETIFAPI_VAR_REF(ipaddr);
  NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);
  NETIFAPI_VAR_REF(msg).msg.add.gw      = NETIFAPI_VAR_REF(gw);
#endif /* LWIP_IPV4 */
  NETIFAPI_VAR_REF(msg).msg.add.state   = state;        //state 就是 struct eth_device *dev
  NETIFAPI_VAR_REF(msg).msg.add.init    = init;
  NETIFAPI_VAR_REF(msg).msg.add.input   = input;

err = tcpip_api_call(netifapi_do_netif_add, &API_VAR_REF(msg).call);
    err = fn(call);
struct netifapi_msg *msg = (struct netifapi_msg*)(void*)&call;


if (init(netif) != ERR_OK) {        //init 就是 msg->msg.add.init


static err_t eth_netif_device_init(struct netif *netif)     //传进来是struct netifapi_msg*


struct eth_device *ethif;
ethif = (struct eth_device*)netif->state;
rt_device_t device = (rt_device_t) ethif;

(device->init)(device)          //device->init 就是 rt_imxrt_eth_init


netifapi_netif_add(netif, &ipaddr, &netmask, &gw, dev, eth_netif_device_init, tcpip_input);
    //调用了很多层最终调用到,以下代码
        if (init(netif) != ERR_OK) {
            static err_t eth_netif_device_init(struct netif *netif)
                device = (rt_device_t) ethif;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

野火 RT1052 移植网卡功能(LAN8720A) 的相关文章

  • RTTHREAD软件包目录

    RTTHREAD软件包目录 这边统计下RTTHREAD软件包的各项内容 IOT 包名技术标签依赖平台备注abup fotaOTATCP UDP本软件包是用于 Abup FOTA 升级的固件下载器agile jsmnjsonC库jsmn是一个
  • rtthread中使用sqlite

    一 简介 SQLite是一款嵌入式 轻量级的关系型数据库系统 xff0c 它的设计目标是嵌入式的 xff0c 而且目前已经在很多嵌入式产品中使用了它 它占用资源非常的低 xff0c 在嵌入式设备中 xff0c 可能只需要几百K的内存就够了
  • 【Ethernet】以太网卡LAN8720A分析和使用

    文章目录 1 LAN8720A简介 2 PHYAD 0 PHY地址配置 3 MODE 2 0 Mode配置 4 nINTSEL nINT REFCLKO配置 5 REGOFF 配置内部 1 2V电压源 6 SMI MDC MDIO 总线接口
  • RT-Thread记录(十四、I/O 设备模型之ADC设备)

    RT Thread ADC 设备学习使用 目录 前言 一 ADC 采样基础 1 1 ADC 通道 1 2 ADC 分辨率 1 3 ADC 采样计算 二 ADC 设备操作函数 2 1 查找 ADC 设备 2 2 使能 关闭 ADC 通道 2
  • rt-thead-studio 中实现 MPU6050基于DMP中断读取数据

    rt thead studio 中实现 MPU6050基于DMP中断读取数据 目录 文章目录 rt thead studio 中实现 MPU6050基于DMP中断读取数据 目录 toc 前言 mpl高级特性库问题 一 基于开发板创建闪灯工程
  • RT-Thread记录(十六、SFUD组件 — SPI Flash的读写)

    从本文开始 测试学习一些 RT Thread 常用的组件与软件包 先从刚学完的 SPI 设备开始 目录 前言 一 SFUD 组件简介 1 1 基本简介 1 2 SFUD 对 Flash 的管理 二 SFUD 组件操作函数 2 1 初始化相关
  • rt-thread系列文章目录

    rt thread系列文章目录 本文是rt thread系列文章目录 后续关于rt thread的更新都会添加到此文内 实战篇 rt thread 生成工程模板 rt thread fal移植 内核篇 rt thread 内存管理 内存堆
  • RT-Thread中AT组件连接ESP8266 模块

    应用 AT 组件连接 ESP8266 模块 本文介绍 智龙开发板 应用AT组件 连接 esp8266 模块 从而连接无线网络 参考官网 应用 AT 组件连接 ESP8266 模块 1 首先去除 lwip 2 连接硬件模块 连接到智龙开发板的
  • STM32F4 RTC-Alarm 的使用(RT-Thread操作系统)

    文章目录 1 工程的创建和配置 1 1 CubeMX 的配置 1 1 1 时钟源的选择 1 1 2 Debug 引脚配置 1 1 3 控制台串口的配置 1 1 4 RTC的配置 1 1 5 时钟树配置 1 1 6 代码生成 1 2 RT T
  • 内核7-线程间同步

    目录 1 信号量 1 1 信号量机制 1 2 信号量的使用场合 1 2 1 线程同步 1 2 2 锁 1 2 3 中断与线程的同步 1 2 4 资源计数 1 3 信号量控制块 1 4 函数 1 4 1 rt sem init 函数 1 4
  • 【RTT驱动框架分析07】- adc驱动框架分析+adc中断唤醒adc驱动

    ADC adc应用开发 访问 ADC 设备 应用程序通过 RT Thread 提供的 ADC 设备管理接口来访问 ADC 硬件 相关接口如下所示 函数 描述 rt device find 根据 ADC 设备名称查找设备获取设备句柄 rt a
  • RTT-信号量

    RTT 信号量 概念 信号量就是一个标记位 释放信号量就是标记位加一 获取信号量后自动减一 减到0后不能再获取了 信号量 Semaphore 是一种实现线程间通信的机制 实现线程之间同步或临界资源的互斥访问 常用于协助一组相互竞争的线程来访
  • RT-Thread内核启动流程

    一般了解一份代码大多从启动部分开始 同样这里也采用这种方式 先寻找启动的源头 RT Thread 支持多种平台和多种编译器 而 rtthread startup 函数是 RT Thread 规定的统一启动入口 一般执行顺序是 系统先从启动文
  • RT-Thread微秒延时?

    今天继续做之前的东西 使用了RT thread操作系统 程序中有AT24C02的相关操作AT24C02的操作的接口是IIC接口 所以又涉及到IIC 程序用的模拟的IIC IIC的时序挺严格的 有微秒的延时操作 由于模拟IIC程序中的延时操作
  • 配置 RT-Thread 的工程目录

    1 前言 RT Thread 基于 Scons 的包管理非常方便让我们使用 RT Thread 进行开发 但在实际工程中将应用代码写到 RT Thread 官方提供的 bsp 目录下面会非常不便于使用 无法使用自己 git 工具进行代码管理
  • RTThread学习有关的Keil的两个符号 $Sub$ $main 与 $Super$ $main

    Keil的两个符号 Sub 与 Super 是其做的打 补丁 功能 具体调用方法就是程序中包含有main函数 和 Sub main Super main 两个符号 源码先放出来 re define main function int Sub
  • 操作系统内部机制学习

    切换线程时需要保存什么 函数需要保存吗 函数在Flash上 不会被破坏 无需保存 函数执行到了哪里 需要保存吗 需要保存 全局变量需要保存吗 全局变量在内存上 无需保存 局部变量需要保存吗 局部变量在栈里 也是在内存里 只要避免栈不会被破坏
  • BSP制作

    STM32系列驱动介绍 在RT Thread实时操作系统中 各种各样的设备驱动是通过一套I O设备管理框架来实现的 设备管理框架给上层应用提供了一套标准的设备操作API 开发者通过调用这些标准设备操作API 可以高效地完成和底层硬件外设的交
  • 中断管理学习

    中断管理 什么是中断 简单的解释就是系统正在处理某一个正常事件 忽然被另一个需要马上处理的紧急事件打断 系统转而处理这个紧急事件 待处理完毕 再恢复运行刚才被打断的事件 生活中 我们经常会遇到这样的场景 当你正在专心看书的时候 忽然来了一个
  • RT-Thread 内核基础(四)

    自动初始化机制 自动初始化机制是指初始化函数不需要被显示调用 只需要在函数定义处通过宏定义的方式进行申明 就会在系统启动过程中被执行 例如在串口驱动中调用一个宏定义告知系统初始化需要调用的函数 代码如下 int rt hw usart in

随机推荐

  • Eclipse添加注释的快捷键alt+shift+j

    http www cnblogs com xuedexin articles 5658346 html
  • [464]Outlook如何备份邮件

    如何在outlook中添加新账户 点击outlook菜单栏上的 文件 选项 可以看到主界面右侧有一个 添加账户 的选项 点击 添加账户 进入其设置界面 这里有三大选项 请选择 手动设置服务器设置或其他服务器类型 点击下一步 进入 选择服务
  • vue3+vite快速配置eslint的踩坑

    前言 本文强调快速配置eslint 所以不使用下载依赖包和配置的方式进行eslint配置 而是使用现有的eslint自动化构建的包进行快速配置 无论是新项目要集成eslint还是已经开发了一段时间的项目中途要加入eslint都可以按文章中的
  • Linux笔记&Linux常用指令合集

    1 Linux文件结构 linux的目录中有且只有一个根目录 linux的各个目录存放的内容是规划好 不能乱放文件 linux是以文件的形式管理我们的设备 因此linux系统 一切皆为文件 bin Binary的缩写 用来存放常用命令的 比
  • Python GUI 设计(一)———Tkinter窗口创建、组件布局

    本篇开始介绍用Python的Tkinter模块来设计图形化界面 尽量用简洁的语言和实例让读者能看明白 轻松入门 1 1 创建窗口 tkinter模块是Pyhton自带的标准GUI库 可以直接导入 导入tkinter模块后 可以使用下面的方法
  • TCP/IP协议栈与数据包封装

    TCP IP网络协议栈分为应用层 Application 传输层 Transport 网络层 Network 和链路层 Link 四层 如下图所示 该图出自 TCPIP 图 36 1 TCP IP协议栈 两台计算机通过TCP IP协议通讯的
  • 2022年的就业前景

    硕士毕业的话 可以有很多选择 1 如果自己德才兼备 不要凭自我感觉 那么可以继续研究 攻读博士学位 2 对技术痴迷 可以废寝忘食 建议去企业 不要去那些所谓的阿猫阿狗 3 喜欢跟人打交道的 可选择国企 事业单位 或者考公 4 金鳞乃非池中物
  • 抖音seo源码开发搭建(开源)

    抖音seo源码开发搭建 开源 本篇文章将介绍如何开发搭建一款抖音SEO源码 并提供开源资源 我们采用Node js作为主要开发工具 使用Thinkphp自研框架搭建后台服务 同时利用Python对数据进行爬取和处理 最终通过Elastics
  • 阿里巴巴Java开发规约p3c插件扩展-自定义开发规范

    1 前言 工作中难免会遇到维护别人代码的情况 那么首先就得看懂别人写的代码 如果对方写的代码混乱臃肿 维护成本必然很高 如果对方写的代码优雅清晰 那维护的人看起来必然心情愉悦 正所谓 前人栽树 后人乘凉 前人埋坑 后人骂娘 代码首先是给人看
  • 猿人学第一题尝试分析【混淆,改写】

    猿人学JS逆向大赛第一题 分析 地址 https match yuanrenxue com match 1 第一步 解决Debug问题 添加一个条件断点 这样添加条件断点后 就不会一直触发Debug调试了 第二步 找到接口Api 随机翻页一
  • 计算机网络实验:RIP路由协议配置

    目录 前言 实验目的 实验内容 相关知识点 实验设备 实验过程 总结 前言 计算机网络是指由多台计算机通过通信设备和通信线路互联起来 实现信息交换的系统 计算机网络中的路由器是一种专用的网络设备 它负责根据目的地址选择最佳的传输路径 将数据
  • linux 弱网环境模拟

    linux 环境 1 tc qdisc add dev eth0 root netem delay 100ms 10ms 将 eth0 网卡的传输设置为延迟 100ms 10ms 90 110 ms 之间的任意值 发送 所有的包 2 tc
  • python函数闭包

    闭包 函数的闭包与函数的嵌套类似 它返回的不是一个值 而是一个函数 也就是说在函数内定义函数 如加法函数 def sum a def add b return a b 内部函数add 引用了外部函数sum 的变量a return add 外
  • echarts自定义X轴、Y轴间距

    echarts自定义X轴 Y轴间距 1 自定义间距 1 自定义间距 最近做一个项目 要求x y 轴间距自定义 因为项目数据X轴为时间轴 Y轴为对数数据轴 由于x轴的时间轴各段时间点返回密度不均匀 所以一开始用interval 官网上spli
  • 面试——软件测试

    自我介绍 Web与app测试的区别 App与小程序测试的区别 小程序的兼容性测试怎么测 小程序测试需要分别测试Android和iOS吗 还是怎么测试 Android小程序和iOS小程序的测试区别 测试流程 介绍一下项目 公司有几个测试 秒杀
  • maven 同时配置远程仓库和中央仓库的方法 mirroOf 标签意义

    问题描述 在公司内做maven项目开发时使用的都是公司内部搭建的私有远程仓库做项目开发 所以导致setting文件的设置如下
  • 华为OD机试 - 用连续自然数之和来表达整数(Java)

    题目描述 一个整数可以由连续的自然数之和来表示 给定一个整数 计算该整数有几种连续自然数之和的表达式 且打印出每种表达式 输入描述 一个目标整数T 1 lt T lt 1000 输出描述 该整数的所有表达式和表达式的个数 如果有多种表达式
  • 【vue3+elementplus】el-table的操作列使用子组件渲染按钮,按钮权限改变,父给子传值,子组件的dom不更新的解决方案

    起初是因为我使用了这个回答里面的组件去渲染表格操作列 需求 点击某个按钮 表格数据改变 按钮的权限也随着该数据变化而变化 问题 表格行数据变了 给子组件传的值也变了 在watch中也监听了 但是子组件的dom就是不更新 原因 重新获取表格数
  • 单键控制单片机电源开关电路

    原文地址 http www jichudianlu com archives 168 相关文章 1 问答 单片机控制电源开关 https bbs elecfans com jishu 1698980 1 1 html 2 由MCU控制的开关
  • 野火 RT1052 移植网卡功能(LAN8720A)

    野火 RT1052 移植网卡功能 LAN8720A 开发环境 RT Thread v4 0 2 master SOC i MX RT1050 Board 野火 RT1052 目的 在 RT Thread 系统上进行网络通讯 背景描述 1 首