移植NXP官方uboot到ALPHA开发板过程3

阅读: 评论:0

移植NXP官方uboot到ALPHA开发板过程3

移植NXP官方uboot到ALPHA开发板过程3

接着LCD移植后的uboot文件,正点原子开发板用的PHY芯片是LAN8720A,跟着视频教程和PDF移植并不难,就是要注意uboot IP地址设置和虚拟机的网络链接模式设置,导致我整了很久,在朋友的指导下,才ping通虚拟机上的Ubuntu。
条件1. uboot和电脑必须在同一个局域网里面,或者连接到同一个路由器,我通过网络ping 虚拟机好像没有成功;然后电脑、虚拟机Ubuntu、板子uboot这三个IP地址的前三个字段,要相同,就是IP必须处于同一个字段;
条件2. 虚拟机的网络模式需要设置(自动)成桥接模式,具体设置就不提了,自己去搜索吧,其他模式不清楚。
网络环境达到这两个条件才有ping通的可能性,还有其他设备ping Uboot可能ping不通,而Uboot ping其他设备却能ping通,反正很奇怪。。。
主要就3大移植步骤:

针对NXP imx6ull-14x14-emmc的uboot 网络驱动移植过程

    • 1.删除NXP uboot原有的74LV595相关代码
    • 2.配置LAN8720A相关代码
    • 3.修改 drivers/net/phy/phy.c 文件
    • 4.设置uboot网络环境变量

1.删除NXP uboot原有的74LV595相关代码

正点原子的板子并没有使用74LV595,主要是74LV595相关代码占用了LAN8720A复位引脚,当然我们自己设计板子时也要注意引脚的使用情况;

  1. 找到自己的板级文件,74LV595的代码在mx6ull_xxx_emmc.c中,找到91行 74LV595 引脚定义,删除掉74的引脚定义;
#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)
  1. 为了方便,就此添加网络芯片的复位IO定义(这里正点原子的复位IO定义);
#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)
  1. 找到96行,删除掉static iomux_v3_cfg_t const iox_pads[] 结构体;
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),};
  1. 还是在mx6ull_xxx_emmc.c文件中在找到136行 iox74lv_init()iox74lv_se() 函数,删除或注释掉;
static void iox74lv_init(void)
{
int i;
gpio_direction_output(IOX_OE, 0);
for (i = 7; i >= 0; i--) {
gpio_direction_output(IOX_SHCP, 0);
gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
udelay(500);
gpio_direction_output(IOX_SHCP, 1);
udelay(500);
}
......
/*
* shift register will be output to pins
*/
gpio_direction_output(IOX_STCP, 1);
};
void iox74lv_set(int index)
{
int i;
for (i = 7; i >= 0; i--) {
gpio_direction_output(IOX_SHCP, 0);
if (i == index)
gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
else
gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
udelay(500);
gpio_direction_output(IOX_SHCP, 1);
udelay(500);
}
......
/*
* shift register will be output to pins
*/
gpio_direction_output(IOX_STCP, 1);
};
  1. 找到737行board_init() 函数,删除下面两句:
int board_init(void)
{
......
imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
iox74lv_init();
......
return 0;
}

2.配置LAN8720A相关代码

芯片复位引脚已定义,这里就不重复了;
5. 打开 include/configs/mx6ull_xxx_emmc.h,找到333行 网络芯片地址定义的语句:

 #define CONFIG_FEC_ENET_DEV 1#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x2
#define CONFIG_FEC_XCV_TYPE RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x1#endif

把网络接口芯片1的地址(CONFIG_FEC_MXC_PHYADDR )改为: 0x0

 #if (CONFIG_FEC_ENET_DEV == 0)#define IMX_FEC_BASE ENET_BASE_ADDR#define CONFIG_FEC_MXC_PHYADDR 0x0#define CONFIG_FEC_XCV_TYPE RMII#elif (CONFIG_FEC_ENET_DEV == 1)#define IMX_FEC_BASE ENET2_BASE_ADDR#define CONFIG_FEC_MXC_PHYADDR 0x1
  1. 回到mx6ull_alientek_emmc.c 文件,找到553行 网络IO结构体fec1_padsfec2_pads,添加复位IO;
    网络1结构体
static iomux_v3_cfg_t const fec1_pads[] = {
MX6_PAD_GPIO1_IO06__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
MX6_PAD_GPIO1_IO07__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
......
MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

添加复位IO GPIO5_IO07

MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),

网络2结构体

static iomux_v3_cfg_t const fec2_pads[] = {
MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
......
MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

添加复位IO GPIO5_IO08

MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
  1. 继续在文件 mx6ull_alientek_emmc.c 中找到583函数 setup_iomux_fec,
static void setup_iomux_fec(int fec_id)
{if (fec_id == 0)imx_iomux_v3_setup_multiple_pads(fec1_pads,ARRAY_SIZE(fec1_pads));elseimx_iomux_v3_setup_multiple_pads(fec2_pads,ARRAY_SIZE(fec2_pads));
}

添加硬件复位语句,改为:

tatic 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(20);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(20);gpio_set_value(ENET2_RESET, 1);}
}

注意引脚编号;

3.修改 drivers/net/phy/phy.c 文件

  1. 打开phy.c,找到函数 genphy_update_link,这是个通用 PHY 驱动函数,此函数用于更新 PHY 的连接状态和速度,改为添加代码如下:
int genphy_update_link(struct phy_device *phydev)
{unsigned int mii_reg;//#ifdef CONFIG_PHY_SMSCstatic 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)
*/
243 mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
......return 0;
}

条件编译(#ifdef CONFIG_PHY_SMSC)我试了,好像不行。

最后烧录到SD卡,串口打印信息这如果看到Net: FEC1,那说明网络驱动配置成功了。

4.设置uboot网络环境变量

uboot参考命令

setenv ipaddr 192.168.1.55 //开发板 IP 地址,注意前三个字段与电脑要相同
setenv ethaddr 00:a4:1f:04:d2:35 //开发板网卡 MAC 地址,不和其他网络设备冲突就行
setenv gatewayip 192.168.1.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.1.67 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量

然后可以尝试ping一下虚拟机的Ubuntu,应该能成功。

本文发布于:2024-02-02 20:59:58,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170687879846410.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:过程   开发板   官方   NXP   ALPHA
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23