• NXP官方uboot针对ALPHA开发板网络驱动更改说明三


    一. 简介

    前几篇文章学习了 在 NXP官方uboot上做网络驱动的一部分更改。地址如下:

    ALPHA开发板网络方案说明-CSDN博客

    NXP官方uboot针对ALPHA开发板网络驱动更改说明一-CSDN博客

    NXP官方uboot针对ALPHA开发板网络驱动更改说明二-CSDN博客

    本文继续来学习在 NXP官方uboot上做网络驱动方面的更改,适用正点原子ALPHA开发板的uboot。

    二.  NXP官方uboot针对ALPHA开发板网络驱动更改

    前面几篇文章学习了 在 NXP官方uboot上做网络驱动方面的更改,适用正点原子ALPHA开发板的uboot。

    本文继续学习:更改 网络 PHY芯片 LAN8720A驱动的更改。

    4.  修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link

    uboot 中的 LAN8720A 驱动有点问题,打开文件 drivers/net/phy/phy.c,找到 genphy_update_link函数 ,这是个通用 PHY 驱动函数,此函数用于更 PHY 的连接状态和速度。
    使用 LAN8720A 的时需要在此函数中添加一些代码。
    更改后  genphy_update_link 函数如下所示:
    1. int genphy_update_link(struct phy_device *phydev)
    2. {
    3. unsigned int mii_reg;
    4. #ifdef CONFIG_PHY_SMSC
    5. static int lan8720_flag = 0;
    6. int bmcr_reg = 0;
    7. if (lan8720_flag == 0)
    8. {
    9. bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
    10. phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
    11. while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000){
    12. udelay(100);
    13. }
    14. phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);
    15. lan8720_flag = 1;
    16. }
    17. #endif
    18. /*
    19. * Wait if the link is up, and autonegotiation is in progress
    20. * (ie - we're capable and it's not done)
    21. */
    22. mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
    23. ...................
    24. return 0;
    25. }

    注意:这里需要参考 网络PHY芯片 LAN8720A 的数据手册:LAN_8720A-CP_datasheet.pdf文档。

    LAN8720A 数据手册所在目录:

    【正点原子】阿尔法Linux开发板(A盘)-基础资料-2022 /【正点原子】阿尔法Linux开发板(A盘)-基础资料 / 硬件资料 / 芯片资料

    代码分析:

    上面的 genphy_update_link 函数中,新添加的代码 为条件编译代码段,只有使用 SMSC 公司的 PHY 这段 代码才会执行

    10 行,读取 LAN8720A BMCR 寄存器 ( 寄存器地址为 0) ,此寄存器为 LAN8720A 的配置寄存器,这里先 读取此寄存器的默认值并保存起来。
    参考 LAN8720A 数据手册中 BMCR 寄存器 就是:

    第 11 行,向寄存器 BMCR 寄存器写入 BMCR_RESET( 值为 0X8000) ,因为 BMCR bit15 是软件复位控制位,因此 软件复位 LAN8720A。复位 完成以后此位会自动清零。
    BMCR 寄存器如下:

    12~14 行,等待 LAN8720A 软件复位完成,也就是判断 BMCR 寄存器 bit15 位是否为 1 ,为 1 的话表示还没有复位完成。
    16 行,重新向 BMCR 寄存器写入以前 的值,也就是 229 行读出的那个值。
    这段代码其实是实现了软件复位功能。

    三.  编译测试

    1.   编译 uboot源码,进入 Uboot根目录,使用脚本编译:

    wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux/uboot/nxp_uboot/uboot-imx-rel_imx_4.1.15_2.1.0_ga$ ./imx6ull_alientek_nand.sh

    2.  烧写到 SD卡

    将 SD卡插入 读卡器,将读卡器插入电脑。连接进 ubuntu系统下。

    进入Uboot根目录 使用 imxdownload软件,将 u-boot.bin 烧写到 SD卡,操作如下:

    1. wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux/uboot/nxp_uboot/uboot-imx-rel_imx_4.1.15_2.1.0_ga$ ./imxdownload u-boot.bin /dev/sdb -256m
    2. I.MX6ULL bin download software
    3. Edit by:zuozhongkai
    4. Date:2019/6/10
    5. Version:V1.1
    6. log:V1.0 initial version,just support 512MB DDR3
    7. V1.1 and support 256MB DDR3
    8. file u-boot.bin size = 470120Bytes
    9. Board DDR SIZE: 256MB
    10. Delete Old load.imx
    11. Create New load.imx
    12. Download load.imx to /dev/sdb ......
    13. [sudo] wangtian 的密码:
    14. 记录了924+1 的读入
    15. 记录了924+1 的写出
    16. 473192字节(473 kB,462 KiB)已复制,0.54755 s,864 kB/s

    3.   开发板运行。

    将 SD卡插入开发板,开发板的拨码开关拨到 SD卡启动,开发板上电启动。

    4.  ping ubuntu系统的 ip地址。

    uboot 中使用网络之前要先设置几个环境变量。
    开发板上电后按下 "Enter"回车键进入 uboot命令模式下,设置 以上几个 网络相关的地址,操作如下:
    1. U-Boot 2016.03 (Oct 21 2023 - 21:42:25 +0800)
    2. CPU: Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
    3. CPU: Industrial temperature grade (-40C to 105C) at 44C
    4. Reset cause: POR
    5. Board: MX6ULL ALIENTEK NAND
    6. I2C: ready
    7. DRAM: 256 MiB
    8. NAND: 512 MiB
    9. MMC: FSL_SDHC: 0, FSL_SDHC: 1
    10. Display: TFT43AB (480x272)
    11. Video: 480x272x24
    12. In: serial
    13. Out: serial
    14. Err: serial
    15. Net: FEC1
    16. Normal Boot
    17. Hit any key to stop autoboot: 0
    18. =>
    19. => setenv ipaddr 192.168.1.50
    20. => setenv ethaddr b8:ae:1d:01:00:00
    21. => setenv gatewayip 192.168.1.1
    22. => setenv netmask 255.255.255.0
    23. => setenv serverip 192.168.1.66
    24. => saveenv
    25. Saving Environment to NAND...
    26. Erasing NAND...
    27. Erasing at 0x3c00000 -- 100% complete.
    28. Writing to NAND... OK
    29. =>

    试着 ping Ubuntu的 ip。操作如下:

    1. =>ping 192.168.1.66
    2. FEC1 Waiting for PHY auto negotiation to complete.... done
    3. Using FEC1 device
    4. host 192.168.1.66 is alive
    5. =>

    可以看出,所使用的网络是 FEC1,也就是对应网络 2。 ping Ubuntu 的 ip 时也可以 ping通,至此针对 ALPHA开发板的网络驱动已经更改好。

  • 相关阅读:
    Java 遍历指定路径下的所有文件和子文件夹
    工业交换机的单模多模是什么意思?
    docker进程隔离
    第三章:SQL聚合与排序
    21天学习挑战赛之java集合
    基于J2EE的大型视频影音系统的设计与实现
    TuyaLink 快速入门教程
    HarmonyOS脚手架:快捷实现ArkTs中json转对象
    UE源码分析:Slate 鼠标/触摸输入处理
    springboot整合shiro问题
  • 原文地址:https://blog.csdn.net/wojiaxiaohuang2014/article/details/133946443