rtthread系统用 RT1062 移植网卡功能(LAN8720A)

RT-Thread: v4.0.2(master)
SOC: i.MX RT1062
Board: 自研控制板

背景描述
1.有个控制板网口一直没人调试。
2.NXP RT1xxx系列ENET_MAC调试心得。

3.Ethernet MAC控制器调试《终极指南》。

 

开整

RT1062 移植网卡功能(LAN8720A)

1、i.MX RT 系列外设驱动添加指南

2、LAN8720A 芯片的驱动代码:fsl_phy.c,fsl_phy.h

3、编写 phy 复位函数 imxrt_enet_phy_reset_by_gpio

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芯片)

编写 phy 复位函数 imxrt_enet_phy_reset_by_gpio,代码见 board.h board.c

void imxrt_enet_phy_reset_by_gpio(void)
{
    gpio_pin_config_t gpio_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};

    GPIO_PinInit(GPIO2, 30, &gpio_config);
    GPIO_WritePinOutput(GPIO2, 30, 0);
    GPIO_PinInit(GPIO3, 2, &gpio_config);
    GPIO_PinInit(GPIO3, 3, &gpio_config);
    /* pull up the ENET_INT before RESET. */
    GPIO_WritePinOutput(GPIO3, 2, 1);
    GPIO_WritePinOutput(GPIO3, 3, 0);
    rt_thread_delay(100);
    GPIO_WritePinOutput(GPIO3, 3, 1);
}

void imxrt_enet_phy_reset_by_gpio(void);
#define PHY_ADDRESS (0x00U)

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

1、去 RT-Thread 官网下载 Env工具,打开对应的配置项。

2、移植L8720的驱动程序,lwip 的方法来移植 rt-thread中的网卡。

3、enet_ethernetif.c 该文件中也有包含 #include "fsl_enet.h"。

4、移植网卡驱动, 主要是针对 fsl_enet.c,fsl_enet.h 这两个文件。

4、电路上关于8720的一些配置。

MODE[2:0]: Mode配置

用于选择 LAN8720A 网络通信速率和工作模式

MODE[0]与 RXD0 引脚共用

nINTSEL: nINT/REFCLKO配置 当 nINTSEL引脚为低电平时 可以直接连

通过nINTSEL来配置两个模式:REF_CLK输入模式(nINT)和REF_CLK输出模式。通过该引脚的高低电平决定了nINT / REFCLKO引脚的功能。

当 nINTSEL引脚为低电平时,它也可以被设置成 50MHz 时钟输出,这样可以直接与 主机MAC接口 的 REF_CLK引脚连接为其提供 50MHz时钟源,这种模式要求为 XTAL1 与 XTAL2 之间或为 XTAL1/CLKIN提供 25MHz时钟,由 LAN8720A内部 PLL电路陪频得到 50MHz 时钟,此时nIN/REFCLKO 引脚的中断功能不可用,用于 50MHz时钟输出。

 

5. REGOFF: 配置内部+1.2V电压源

REGOFF引脚用于配置内部+1.2V电压源,LAN8720A 内部需要+1.2V电压,可以通过VDDCR引脚输入+1.2V 电压提供,也可以直接利用 LAN8720A 内部+1.2V 稳压器提供。当REGOFF引脚为低电平时选择内部+1.2V稳压器。REGOFF与 LED1 引脚共用。

由于REGOFF的配置与LED1引脚共享功能,因此还必须适当考虑LED的极性。下面是REGOFF引脚为低电平时的实例如下:

MDIO接口

MDIO是双向的,只支持一个MAC连接最多32个PHY的连接方式,且MAC作为master,PHY作为slave。在写PHY寄存器的时候,由MAC驱动MDIO向PHY写入数据;在读PHY寄存器时,前半段由MAC驱动发送寄存器地址,后半段由PHY驱动回复寄存器的值。

MDC要求由MAC输出,是非周期性的,即不要求提供固定频率的时钟,对于PHY芯片则作为输入,以在上升沿触发MDIO的读写。MDC的时钟频率可以是DC-2.5MHz,即最小的时钟周期为400ns。

硬件管脚分配

pin_mux.c中的BOARD_InitPins函数。

针对RMII模式,PHY和MAC之间需要做时钟同步。 REF_CLK

OMUX_SW_MUX_CTL_PAD[SION] = 1:该bit的作用是强制开启该管脚的输入功能,这样相当于ENET_PLL时钟通过该管脚输出后又接回到ENET_REF_CLK,该bit可以通过IOMUXC_SetPinMux函数最后一个入参来设置。

5 软件调试注意的问题

g_txBuffDescrip: TXBD作为发送描述符一般由length, control, buffer三个域所组成,其中length表示要发送的数据长度,control表示发送的控制bit,buffer是发送地址指针,发送函数会将g_txDataBuff的地址填入该指针。需要注意的是,该变量必须放在noncache的数据区,并且按照一定的对齐方式进行对齐,默认是64字节。

查看的资料:

NXP RT1xxx系列ENET_MAC调试心得

https://mp.weixin.qq.com/s/jMmipY2GDMq12hu4SJH-Eg

Ethernet MAC控制器调试《终极指南》

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

6、太晚了

文章记录的有点乱,有啥问题可以找我技术交流吧。

 

posted @ 2024-02-01 17:56  狗尾巴草word  阅读(101)  评论(0编辑  收藏  举报