300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > i.MX6ULL裸机篇(二)NXP官方SDK移植之踩坑 网口驱动

i.MX6ULL裸机篇(二)NXP官方SDK移植之踩坑 网口驱动

时间:2024-01-26 06:38:55

相关推荐

i.MX6ULL裸机篇(二)NXP官方SDK移植之踩坑 网口驱动

MX6ULL官方SDK移植之踩坑 网口驱动

一、引言

NXP MX6ULL 网口移植其实主要修改底层驱动程序,LWIP协议通用,一般不用修改,这里主要和大家分享在Linux环境下移植修改网口驱动程序。网口程序移植主要修改可分为三步进行:

(1)第一步:确认网口引脚连接

确认复位电路(复位引脚置1,高电平);

确认接口模式(RMII/MII接口模式);

确认PHY芯片地址是否正确。

(2)第二步:PHY芯片的初始化

phy芯片初始化过程就是对其读写过程,根据网口芯片手册,确保读写值正确。

(3)第三步:lwip 协议

一般情况下,lwip协议基本上不用修改,lwip协议都是通用的。其应用程序可以根据自己的需求进行修改。

二、背景

开发环境: Linux

硬件环境:正点原子MX6ULL开发板

三、移植

3.1 环境搭建

mx6ull 基于 Linux 裸机开发环境搭建这里不做介绍,不知道的朋友可以到正点原子论坛、野火论坛或NXP官网中去查找资料,这几个网站上的相关学习资料丰富得很。

需要注意的一点:Linux环境下的MX6ULL裸机下载工具推荐使用野火家的,正点原子家的MX6ULL裸机下载工具目前还不支持官网MX6ULL SDK源码下载,也可以直接使用官网的下载工具。

3.2 网口硬件连接

NXP官网I.MX6ULL开发板使用KSZ8081 PHY芯片;正点原子I.MX6ULL开发板使用的是LAN8720 PHY芯片。它们的网口引脚连接情况基本都一样,唯独复位引脚连接不同。复位引脚连接电路需要根据开发板原理图进行修改,如下图所示:

正点原子 ENET1官网 ENET1 根据上图所示,正点原子开发板 I.MX6ULL 与 phy 网口芯片复位引脚连接网络标识为:SNVS_TAMPER7——>ENET1_RST

IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER7_GPIO5_IO07, 0U);IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER7_GPIO5_IO07, IOMUXC_SNVS_SW_PAD_CTL_PAD_DSE(4U) |IOMUXC_SNVS_SW_PAD_CTL_PAD_SPEED(2U) |IOMUXC_SNVS_SW_PAD_CTL_PAD_PKE_MASK |IOMUXC_SNVS_SW_PAD_CTL_PAD_PUS(2U) |IOMUXC_SNVS_SW_PAD_CTL_PAD_HYS_MASK );

3.3 PHY芯片地址

确认phy芯片地址是否正确,一般不同phy芯片地址可能也会不一样,LAN8720 芯片的地址为:

//#define BOARD_ENET0_PHY_ADDRESS (0x02U) /* Phy address of enet port 0. *///#define BOARD_ENET1_PHY_ADDRESS (0x01U) /* Phy address of enet port 1. */#define BOARD_ENET0_PHY_ADDRESS (0x01U) /* Phy address of enet port 0. */#define BOARD_ENET1_PHY_ADDRESS (0x00U) /* Phy address of enet port 1. */

3.4 确认接口模式(RMII/MII接口模式)

正点原子 IMX6ULL开发板网口使用LAN8720网口芯片,使用的是RMII接口模式,如下面代码所示,官网 IMX6ULL开发板网口同样也是使用RMII接口模式,这里不用修改。

void ENET_GetDefaultConfig(enet_config_t *config){/* Checks input parameter. */assert(config);/* Initializes the MAC configure structure to zero. */memset(config, 0, sizeof(enet_config_t));/* Sets MII mode, full duplex, 100Mbps for MAC and PHY data interface. */config->miiMode = kENET_RmiiMode;config->miiSpeed = kENET_MiiSpeed100M;config->miiDuplex = kENET_MiiFullDuplex;/* Sets the maximum receive frame length. */config->rxMaxFrameLen = ENET_FRAME_MAX_FRAMELEN;}

3.5 PHY芯片的初始化

phy芯片的初始化过程的是就是对phy读写数据,不同的phy芯片,对它读写的数据也不同。只需要修改其对应的宏定义值就可以了,即修改phy.h头文件。

/*!@brief Defines the mask flag of operation mode in control two register*/#define PHY_CTL2_REMOTELOOP_MASK 0x0004U /*!< The PHY remote loopback mask. */#define PHY_CTL2_REFCLK_SELECT_MASK 0x0080U /*!< The PHY RMII reference clock select. */ // #define PHY_CTL1_10HALFDUPLEX_MASK 0x0001U /*!< The PHY 10M half duplex mask. */// #define PHY_CTL1_100HALFDUPLEX_MASK 0x0002U /*!< The PHY 100M half duplex mask. */// #define PHY_CTL1_10FULLDUPLEX_MASK 0x0005U /*!< The PHY 10M full duplex mask. */// #define PHY_CTL1_100FULLDUPLEX_MASK 0x0006U /*!< The PHY 100M full duplex mask. */// #define PHY_CTL1_SPEEDUPLX_MASK 0x0007U/*!< The PHY speed and duplex mask. */#define PHY_CTL1_10HALFDUPLEX_MASK 0x0004U /*!< The PHY 10M half duplex mask. */#define PHY_CTL1_100HALFDUPLEX_MASK 0x0008U /*!< The PHY 100M half duplex mask. */#define PHY_CTL1_10FULLDUPLEX_MASK 0x0014U /*!< The PHY 10M full duplex mask. */#define PHY_CTL1_100FULLDUPLEX_MASK 0x0018U /*!< The PHY 100M full duplex mask. */#define PHY_CTL1_SPEEDUPLX_MASK 0x001cU/*!< The PHY speed and duplex mask. */#define PHY_CTL1_ENERGYDETECT_MASK 0x10U /*!< The PHY signal present on rx differential pair. */#define PHY_CTL1_LINKUP_MASK 0x100U /*!< The PHY link up. */ #define PHY_LINK_READY_MASK (PHY_CTL1_ENERGYDETECT_MASK | PHY_CTL1_LINKUP_MASK)

3.6 lwip 协议

移植官网SDK代码LWIP协议部分基本上不用修改,直接可以使用,也可以根据自己的需求来修改APP应用程序。

四、坑区

官网SDK包虽然没有提供网口enet2的程序,但是也可以在enet1基础上修改扩展,如初始化网口gpio引脚、复位引脚,再确认接口模式(模式为:rmii)和phy地址就差不多就可以了?

还不可以,这里还需要注意的一个地方就是使能启用网口2模式,根据mx6ull参考手册,启用enet2模式需要对IOMUXC_GPR1通用寄存器18位置1,我之前调试时没有注意到这个地方折腾了一下午,网口2的状态灯显示异常,还以为开发板硬件出了啥问题。

IOMUXC_GPR->GPR1 |= 0x40000;

浪里白瞟刚入坑,有不对的地方还望大佬在下面评论区评论指点…

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。