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; 

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值