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 函数如下所示:
int genphy_update_link(struct phy_device *phydev)
{
	unsigned int mii_reg;

#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); 
        phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); 
        while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000){
        udelay(100); 
        }
        
    phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg); 
    lan8720_flag = 1;
    }
 #endif
	/*
	 * Wait if the link is up, and autonegotiation is in progress
	 * (ie - we're capable and it's not done)
	 */
	mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
...................
    return 0;
}

注意:这里需要参考 网络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 寄存器如下:

NXP官方uboot针对ALPHA开发板网络驱动更改说明三_第1张图片

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卡,操作如下:

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
I.MX6ULL bin download software
Edit by:zuozhongkai
Date:2019/6/10
Version:V1.1
log:V1.0 initial version,just support 512MB DDR3
    V1.1 and support 256MB DDR3
file u-boot.bin size = 470120Bytes
Board DDR SIZE: 256MB
Delete Old load.imx
Create New load.imx
Download load.imx to /dev/sdb  ......
[sudo] wangtian 的密码:
记录了924+1 的读入
记录了924+1 的写出
473192字节(473 kB,462 KiB)已复制,0.54755 s,864 kB/s

3.   开发板运行。

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

4.  ping ubuntu系统的 ip地址。

uboot 中使用网络之前要先设置几个环境变量。
开发板上电后按下 "Enter"回车键进入 uboot命令模式下,设置 以上几个 网络相关的地址,操作如下:
U-Boot 2016.03 (Oct 21 2023 - 21:42:25 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 44C
Reset cause: POR
Board: MX6ULL ALIENTEK NAND
I2C:   ready
DRAM:  256 MiB
NAND:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Display: TFT43AB (480x272)
Video: 480x272x24
In:    serial
Out:   serial
Err:   serial
Net:   FEC1
Normal Boot
Hit any key to stop autoboot:  0 
=>
=> setenv ipaddr 192.168.1.50
=> setenv ethaddr b8:ae:1d:01:00:00
=> setenv gatewayip 192.168.1.1
=> setenv netmask 255.255.255.0
=> setenv serverip 192.168.1.66
=> saveenv 
Saving Environment to NAND...
Erasing NAND...
Erasing at 0x3c00000 -- 100% complete.
Writing to NAND... OK
=> 

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

=>ping 192.168.1.66
FEC1 Waiting for PHY auto negotiation to complete.... done
Using FEC1 device
host 192.168.1.66 is alive
=> 

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

你可能感兴趣的:(uboot,系统移植篇,linux,arm开发)