0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC_ether_qos的以太网驱动开发-无OS环境移植LWIP

嵌入式USB开发 来源:嵌入式Lee 作者:嵌入式Lee 2023-09-06 08:40 次阅读

本文转自公众号欢迎关注

基于DWC_ether_qos的以太网驱动开发-无OS环境移植LWIP (qq.com)

https://mp.weixin.qq.com/s/u1Bv6s_oh7jZ3sjS3nxbEA

一.前言

前面我们实现了数据的收发,现在我们就可以移植协议栈了。LWIP是一个适合嵌入式平台的著名的轻量级协议栈,我们这一篇就来无OS环境移植LWIP,下一篇再基于RTOS移植LWIP。

二.源码

LWIP官网如下

https://savannah.nongnu.org/projects/lwip/

下载源码git clone https://git.savannah.nongnu.org/git/lwip.git

LWIP的代码可移植性非常好src下的源码完全可移植不需要任何修改,移植参考contribports下的模板即可,已经有了unix,freertos,win32的移植可参考。

三.NONEOS移植

3.1添加文件

将src复制到自己的工程路径

然后添加一个port文件夹和src并列,无OS移植就添加一个noneos子目录。

.

其中port如下,相关的文件可以从其他port下复制过来修改。

ports/

添加源文件

将src文件夹复制到自己的工程,添加源码

src/api下所有c

src/core下所有c

src/core/ipv4下所有c

src/core/ipv6下所有c

src/netif/ethernet.c,netif下还有其他很多接口实现,用到可以使用对应的,我们这里只需要使用ethernet.c

头文件路径

将目录src/include,ports/noneos/include添加到头文件包含路径。

3.2 移植文件

修改修改的文件

Ports下文件是需要修改的

ports/

lwipopts.h

配置文件,使用宏对LWIP进行配置。

Cc.h

必须位于arch目录下

Perf.h/perf.c

portethif.h/portethif.c

sys_arch.c

错误码

lwipopts.h中定义#define LWIP_PROVIDE_ERRNO 1则

src/include/lwip/errno.h中定义错误编码和变量errno。

(我们这里使用该方式)

否则cc.h中需要include 或者自己实现错误码宏定义和errno变量。

src/include/lwip/errno.h中可知,如果已经有了对应的头文件则

可以定义LWIP_ERRNO_STDINCLUDE则自动#include

否则错误头文件由LWIP_ERRNO_INCLUDE定义。

随机数产生接口

如果有stdint.h则直接使用库函数,否则自行实现

Cc.h中

#include

extern unsigned int lwip_port_rand(void);

#define LWIP_RAND() (lwip_port_rand())

portethif.c中实现

#include

uint32_t lwip_port_rand(void)

{

return (uint32_t)rand();

}

断言

不使用断言,Cc.h中定义

#define LWIP_NOASSERT 1

如果定义了LWIP_NOASSERT则LWIP_ASSERT为空

如果使用断言,没有定义LWIP_NOASSERT

则src/lib/lwip/lwip/src/include/lwip/debug.h中

#define LWIP_ASSERT(message, assertion) do { if (!(assertion)) {

LWIP_PLATFORM_ASSERT(message); }} while(0)

此时需要实现LWIP_PLATFORM_ASSERT宏,

如果没有定义LWIP_PLATFORM_ASSERT宏则默认使用printf

则src/lib/lwip/lwip/src/include/lwip/arch.h中

#define LWIP_PLATFORM_ASSERT(x) do {printf("Assertion "%s" failed at line %d in %sn",

x, __LINE__, __FILE__); fflush(NULL); abort();} while(0)

atoi

Stdlib.h中有实现,如果没有该库可以如下源码实现

/*----------------------------------------------*/

时钟

lwip/ports/noneos/sys_arch.c下实现

u32_t sys_now(void)返回mS的全局时间。

存储管理

lwip/ports/noneos/include/lwipopts.h中配置

堆管理

LWIP_RAM_HEAP_POINTER定义堆地址,必须要空间足够大。

未定义则mem.c中定义大数组ram_heap

MEM_ALIGNMENT设置堆对齐

MEM_SIZE设置堆字节大小

lwip_init->mem_init时初始化,代码位于mem.c

内存池

pbuf.c调用memp.的接口

lwip_init->memp_init时初始化,代码位于memp.c

lwip/priv/memp_priv.h中定义各个组件需要的内存池

lwip/ports/noneos/include/lwipopts.h中MEMP_NUM_xxx定义大小。

性能测试接口

lwipopts.h中如果配置LWIP_PERF宏则

arch/perf.h需要实现两个宏

PERF_START

PERF_STOP

在perf.c/perf.h中具体实现

否则这两个宏自动置空。

一个参考实现如下

Perf.h

#ifndef LWIP_ARCH_PERF_H

perf.c

#include 

可以看到指定接口执行时间打印如下

wKgaomT31GyAV2MOAAAICZ45IBE418.png

系统层接口

无OS时不需要实现相关接口

src/lib/lwip/ports/noneos/include/lwipopts.h中

#define NO_SYS 1

NO_SYS=1时不能使用socket相关接口

#define LWIP_NETCONN 0

#define LWIP_SOCKET 0

以太网收发接口相关

实现以下几个函数即可

实现初始化函数lwip_port_eth_init

在netif_add(&netif, (const ip_addr_t *)&ipaddr, (const ip_addr_t *)&netmask, (const ip_addr_t *)&gw, NULL, &lwip_port_eth_init, ðernet_input);时调用执行lwip_port_eth_init

实现low_level_output,在执行lwip_port_eth_init时绑定到回调函数

netif->linkoutput = low_level_output;

收到一包数据时调用

lwip_port_eth_input

Portethif.h

#ifndef LWIP_TAPIF_H

Portethif.c

#include 

四.测试

以下忽略了平台相关的操作,比如以太网驱动初始化等,仅保留lwip相关内容。

#include "lwip/netif.h"

收到包时调用

lwip_port_eth_input(&netif, p_data, len);

初始化与主循环

 /* 在PHY初始化后,尤其是RXC输出之后才调用,因为GMAC复位需要RXC */ 

使用网口调试工具,发送数据收到后原样返回。

wKgZomT31GyAO6PAAAEaypu-RkI193.png

五.总结

LWIP代码移植性非常好,无OS支持也非常好,移植只需要实现平台相关的配置和宏,实现网口收发接口即可。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 以太网
    +关注

    关注

    40

    文章

    5419

    浏览量

    171599
  • LwIP
    +关注

    关注

    2

    文章

    86

    浏览量

    27149
  • 驱动开发
    +关注

    关注

    0

    文章

    130

    浏览量

    12072
收藏 人收藏

    评论

    相关推荐

    基于DWC_ether_qos以太网驱动开发-MAC帧格式介绍

    本文转自公众号,欢迎关注 基于DWC_ether_qos以太网驱动开发-MAC帧格式介绍 (qq.com) 一.前言   在以太网
    的头像 发表于 08-30 09:23 2361次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-MAC帧格式介绍

    基于DWC_ether_qos以太网驱动开发-MDIO驱动编写与测试

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-MDIO驱动编写与测试 一.前言
    的头像 发表于 08-30 09:37 3737次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-MDIO<b class='flag-5'>驱动</b>编写与测试

    基于DWC_ether_qos以太网驱动开发-描述符链表介绍

    本文转自公众号欢迎关注 一.描述符概述 1.0 前言 对于DWC Ethernet QoS驱动的编写来说,初始化完成之后,核心操作就是DMA的描述符链表配置(linked list
    的头像 发表于 08-30 09:39 4502次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-描述符链表介绍

    基于DWC_ether_qos以太网驱动开发-数据流验证过程

    转自公众号欢迎关注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太网驱动开发-数据流验证过程
    的头像 发表于 08-31 08:41 2010次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-数据流验证过程

    基于DWC_ether_qos以太网驱动开发-收发驱动编写与调试

    本文转自公众号,欢迎关注 基于DWC_ether_qos以太网驱动开发-收发驱动编写与调试 (qq.com) https://mp.wei
    的头像 发表于 09-05 08:47 2320次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-收发<b class='flag-5'>驱动</b>编写与调试

    基于DWC_ether_qos以太网驱动开发-LWIP的内存池介绍

    本文转自公众号,欢迎关注 https://mp.weixin.qq.com/s/mBoGSf_u9edFF01U_OZT9g 一.前言 lwIP为基础结构提供了专用的内存池管理,比如netconn
    的头像 发表于 09-07 08:45 1718次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>LWIP</b>的内存池介绍

    基于DWC_ether_qos以太网驱动开发-LWIP的堆管理介绍

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-LWIP的堆管理介绍 (qq.com) https://mp.wei
    的头像 发表于 09-08 08:40 1297次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>LWIP</b>的堆管理介绍

    基于DWC_ether_qos以太网驱动开发-LWIP的堆(内存池)未对齐导致问题的案例分享

    本文转自公众号欢迎关注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog 一. 前言 内存未对齐访问问题这个已经是老生常谈的问题了, 由于LWIP
    的头像 发表于 09-09 08:44 1722次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>LWIP</b>的堆(内存池)未对齐导致问题的案例分享

    基于DWC_ether_qos以太网驱动开发-RTOS环境移植LWIP与性能测试

    本文转自公众号,欢迎关注 基于DWC_ether_qos以太网驱动开发-RTOS环境移植
    的头像 发表于 09-11 11:20 2090次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-RTOS<b class='flag-5'>环境</b><b class='flag-5'>移植</b><b class='flag-5'>LWIP</b>与性能测试

    基于DWC_ether_qos以太网驱动开发-LWIP在PC上进行开发调试

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-LWIP在PC上进行开发
    的头像 发表于 09-11 08:40 1998次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>LWIP</b>在PC上进行<b class='flag-5'>开发</b>调试

    基于DWC_ether_qos以太网驱动开发-LWIP的定时器模块详解

    一. 前言 LWIP的定时器模块,实现了通用的软件定时器,用于内部的周期事件处理,比如arp,tcp的超时等,用户也可以使用。这一篇来分析该模块的实现。 二.代码分析 2.1源码 源码
    的头像 发表于 09-18 09:33 1660次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>LWIP</b>的定时器模块详解

    基于DWC_ether_qos以太网驱动开发-LWIP的ARP模块介绍

    TCP/IP通讯第一步需要先调通ARP,否则TCP/IP包都不知道MAC地址要发给谁。这一篇来基于LWIP的ARP实现进行相关的分析。
    的头像 发表于 09-18 09:34 1888次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>LWIP</b>的ARP模块介绍

    为什么要做OSLWIP

    首先,为什么要做OSLWIP呢?原因很简单,因为stm32f103c8t6只有20K的RAM,很难支持OS+LWIP
    发表于 08-05 07:38

    设计软件核心以太网服务质量数据手册免费下载

    本文描述Synopsys设计软件核心以太网服务质量DWC以太网QoS核心5.10A。DWC以太网
    发表于 10-23 08:00 16次下载
    设计软件核心<b class='flag-5'>以太网</b>服务质量数据手册免费下载

    基于DWC_ether_qos以太网驱动开发-包过滤

    以太网上数据非常多,如果所有数据都接收交给软件去处理软件负载会非常重,所以一般只需要接收发给自己的数据即可
    的头像 发表于 09-02 09:19 1747次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-包过滤