当前位置:网站首页>[I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A
[I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A
2022-06-24 22:47:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部MAC+外部 PHY 芯片的方案。
I.MX6UL/ULL 有两个网络接口 ENET1 和 ENET2,I.MX6U-ALPHA 开发板提供了这两个网络接口,其中 ENET1 和 ENET2 都使用 LAN8720A 作为 PHY 芯片。
NXP 官方的I.MX6ULL EVK 开发板使用 KSZ8081 这颗 PHY 芯片,LAN8720A 相比 KSZ8081 具有体积小、外围器件少、价格便宜等优点。 直接使用 KSZ8081 固然可以,但是我们在实际的产品中不一定会使用 KSZ8081,有时候为了降低成本会选择其他的 PHY 芯片。 这个时候就有个问题:换了PHY 芯片以后网络驱动怎么办?为此,I.MX6U-ALPHA 开发板将 ENET1 和 ENET2的 PHY 换成了LAN8720A,这样就可以给大家讲解更换 PHY 芯片以后如何调整网络驱动,使网络工作正常。
I.MX6U-ALPHA 开发板的 ENET1 引脚与 NXP 官方的 I.MX6ULL EVK 开发板基本一样,唯独复位引脚不同。从图可以看出,I.MX6U-ALPHA 开发板的 ENET1 复位引脚ENET1_RST 接到了 I.M6ULL 的SNVS_TAMPER7 这个引脚上。
LAN8720A 内部是有寄存器的,I.MX6ULL 会读取 LAN8720 内部寄存器来判断当前的物理链接状态、 连接速度(10M 还是 100M)和双工状态(半双工还是全双工)。 I.MX6ULL 通过 MDIO接口来读取 PHY 芯片的内部寄存器,MDIO 接口有两个引脚,ENET_MDC 和 ENET_MDIO, ENET_MDC 提供时钟,ENET_MDIO 进行数据传输。一个 MIDO 接口可以管理 32 个 PHY 芯片,同一个 MDIO 接口下的这些 PHY 使用不同的器件地址来做区分,MIDO 接口通过不同的器件地址即可访问到相应的 PHY 芯片。I.MX6U-ALPHA 开发板 ENET1 上连接的 LAN8720A器件地址为 0X0, 所以我们要修改 ENET1 网络驱动的话重点就三点:
①、ENET1 复位引脚初始化。 ENET1_RST –>SNVS_TAMPER7 ②、LAN8720A 的器件 ID。0x0 ③、LAN8720 驱动
修改 ENET2网络驱动的话重点就三点:
①、ENET1 复位引脚初始化。 ENET1_RST –>SNVS_TAMPER8 ②、LAN8720A 的器件 ID。0x1 ③、LAN8720 驱动
下面开始修改文件。
- 终端输入:gedit include/configs/mx6ull_mybsp_emmc.h
下图为修改后:
- 删除 uboot 中 74LV595 的驱动代码,因为 NXP 官方I.MX6ULL EVK 开发板使用 74LV595 来扩展 IO,两个网络的复位引脚就是由 74LV595 来控制的。I.MX6U-ALPHA 开发板并没有使用 74LV595,因此我们将代码删除掉。
终端输入:gedit board/freescale/mx6ull_mybsp_emmc/mx6ull_mybsp_emmc.c
修改前:
#define IOX_SDI IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE IMX_GPIO_NR(5, 8)修改后:
#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)- ENET1 的复位引脚连接到 SNVS_TAMPER7 上,对应 GPIO5_IO07,ENET2 的复位引脚连 接到 SNVS_TAMPER8 上,对应 GPIO5_IO08。 继续在 mx6ull_mybsp_emmc.c 中找到如下代码,将这个结构体全部删除:
static iomux_v3_cfg_t const iox_pads[] = {
/* IOX_SDI */
MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_SHCP */
MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_STCP */
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_nOE */
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
}; - 继续在mx6ull_mybsp_emmc.c 中找到函数 iox74lv_init和iox74lv_set,将这两个函数全部删除掉!
- 在 mx6ull_mybsp_emmc.c 中找到 board_init 函数,此函数是板子初始化函数,会被board_init_r 调用。
board_init 会调用 imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化 74lv595 的 GPIO,将这两行删除掉。至此,mx6ull_mybsp_emmc.c 中关于 74LV595 芯片的驱 动代码都删除掉了。
添加 I.MX6U-ALPHA 开发板网络复位引脚驱动
在 mx6ull_mybsp_emmc.c 中找到关键词: ①static iomux_v3_cfg_t const fec1_pads[] ②static iomux_v3_cfg_t const fec2_pads[]
需要追加下面内容:
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),/* 初始化ETH1 RESET引脚 */MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),/* 初始化ETH2 RESET引脚 */继续在文件 mx6ull_mybsp_emmc.c 中找到函数 setup_iomux_fec。将这两个 IO 设置为输出并且硬件复位一下 LAN8720A,这个硬件复位很重要!否则可能导致 uboot 无法识别 LAN8720A。 追加内容如下:
static void setup_iomux_fec(int fec_id)
{
if (fec_id == 0)
{
imx_iomux_v3_setup_multiple_pads(fec1_pads,
ARRAY_SIZE(fec1_pads));
gpio_direction_output(ENET1_RESET, 1);
gpio_set_value(ENET1_RESET, 0);
mdelay(100);
gpio_set_value(ENET1_RESET, 1);
}
else
{
imx_iomux_v3_setup_multiple_pads(fec2_pads,
ARRAY_SIZE(fec2_pads));
gpio_direction_output(ENET2_RESET, 1);
gpio_set_value(ENET2_RESET, 0);
mdelay(100);
gpio_set_value(ENET2_RESET, 1);
}
}修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link
uboot 中的 LAN8720A 驱动有点问题,打开文件drivers/net/phy/phy.c,找到函数 genphy_update_link,这是个通用 PHY 驱动函数,此函数用于更新 PHY 的连接状态和速度。
终端输入:gedit drivers/net/phy/phy.c 搜索关键字:genphy_update_link 修改如下:
/* LAN8720 must software*/
#ifdef CONFIG_PHY_SMSC
static int lan8720_flag = 0;
int bmcr_reg = 0;
if (lan8720_flag == 0) {
bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); /* 读取寄存器BMCR默认值 */
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); /* 软件复位,自动清零 */
while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & BMCR_RESET) {
udelay(100);
}
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg); /* BMCR写入原来的值 */
lan8720_flag = 1;
}
#endif重新编译uboot
./mx6ull_mybsp_emmc.sh 或 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_mybsp_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
下载烧录验证:
chmod 777 imxdownload
//给予 imxdownload 可执行权限
./imxdownload u-boot.bin /dev/sdg
//烧写 u-boot.bin 到 SD 卡中烧写完成以后将 SD 卡插入 I.MX6U-ALPHA 开发板的 TF 卡槽中,最后设置开发板从 SD卡启动。打开 SecureCRT,设置好开发板所使用的串口并打开,复位开发板。
在 uboot 中使用网络之前要先设置几个环境变量,命令如下:
setenv ipaddr 192.168.1.55
//开发板 IP 地址
setenv ethaddr 00:04:9f:04:d2:35
//开发板网卡 MAC 地址
setenv gatewayip 192.168.1.1
//开发板默认网关
setenv netmask 255.255.255.0
//开发板子网掩码
setenv serverip 192.168.1.250
//服务器地址,也就是 Ubuntu 地址
saveenv
//保存环境变量 SecureCRT的uboot中使用ping命令。
ping 192.168.1.250 有“host 192.168.1.250 is alive”这句,说明 ping 主机成功。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151761.html原文链接:https://javaforall.cn
边栏推荐
- Chrysanthemum chain (winter vacation daily question 39)
- MPLS notes Part 1
- 进入阿里做测试员遥不可及?这里或许有你想要的答案
- Pit entry machine learning: I. Introduction
- 放养但没有完全放养(春季每日一题 2)
- Sumati GameFi生态纵览,神奇世界中的元素设计
- 指南针靠谱吗?开证券账户安全吗?
- Please run IDA with elevated permissons for local debugging.
- How can Huatai Securities open an account to achieve one in ten thousand? Are securities accounts safe and reliable
- LogMiner 数据库日志挖掘
猜你喜欢

Chinese address and English address

当他们在私域里,掌握了分寸感

Exploring the mystery of C language program -- C language program compilation and preprocessing

Redis 那些事

做软件安全测试的作用,如何寻找软件安全测试公司出具报告?

JS array object to object

Fake wireless speakers in stores? Sony responded: the product has reserved a wired connection interface, which can be used in complex scenarios

Day 04 - file IO

谈谈飞书对开发工作的优势 | 社区征文

The ecosystem of the yuan universe
随机推荐
Day 04 - file IO
Viewing MySQL password on Linux_ MySQL forgets password "suggestions collection" under Linux
Basic layout -qhboxlayout class, qvboxlayout class, qgridlayout class
MPLS notes Part 1
你知道你的ABC吗(春季每日一题 1)
Software testing salary in first tier cities - are you dragging your feet
The ecosystem of the yuan universe
入职一家新公司,如何快速熟悉代码?
Smartctl 打开设备遇到 Permission denied 问题排查过程记录
Cusdis - lightweight, privacy first open source comment system | chain of the city
背了八股文,六月赢麻了……
When an interface has an exception, how do you analyze the exception?
Do you know your ABC
当他们在私域里,掌握了分寸感
TSDB在民机行业中的应用
探索C语言程序奥秘——C语言程序编译与预处理
Half of the year has passed. How many flags have been achieved at the end of the year?
Pit entry machine learning: I. Introduction
After integrating the aurora push plug-in in the uni app, the real machine debugging prompts "the currently running base does not contain the native plug-in [jg-jpush]..." Solutions to problems
jwt