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、太晚了
文章记录的有点乱,有啥问题可以找我技术交流吧。