请选择 进入手机版 | 继续访问电脑版
查看: 6554|回复: 0

[分享] IMX6ULL开发板移值NXP官方UBOOT

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31998
    最后登录
    2024-4-9
    发表于 2020-6-3 12:49:08 | 显示全部楼层 |阅读模式
    IMX6ULL开发板移值NXP官方UBOOT


    1. 开发环境

    gcc: 100ask_imx6ull-sdk\ToolChain\gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf
    uboot: uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
    gcc可以在百问网提供的bsp包找到,uboot使用的是nxp官方的uboot, 点击下载uboot。本文参考了正点原子的imx6ull左神的uboot移值教程(非常感谢左神的教程)。
    2. 在UBOOT中添加自己的开发板
    2.1 添加开发板配置文件
    在configs目录下创建开发板配置文件,复制configs/mx6ull_14x14_evk_emmc_defconfig并重命名为mx6ull_100ask_emmc_defconfig,并修改内容为:
    1. CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_100ask_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
    2. CONFIG_ARM=y
    3. CONFIG_ARCH_MX6=y
    4. CONFIG_TARGET_MX6ULL_100ASK_EMMC=y
    5. CONFIG_CMD_GPIO=y
    复制代码
    PS:将MX6ULL_EVK_EMMC_REWORK修改为MX6ULL_100ASK_EMMC_REWORK后,uboot的MMC驱动不能用了,识别不了sd卡和eMMC,不知道为什么。
    2.2 添加开发板对应的头文件
    在目录include/configs下添加100ask开发板对应的头文件,复制include/configs/mx6ullevk.h,并重命名为mx6ull_100ask_emmc.h,将:
    1. #ifndef __MX6ULLEVK_CONFIG_H
    2. #define __MX6ULLEVK_CONFIG_H
    复制代码
    修改为:
    1. #ifndef __MX6ULL_100ASK_EMMC_CONFIG_H
    2. #define __MX6ULL_100ASK_EMMC_CONFIG_H
    复制代码
    2.3 添加开发板对应的板级文件夹
    uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等,nxp的imx系列芯片的板级文件夹都存放在board/freescale中,因为飞思卡尔被nxp收购了,所以文件夹名字是freescale。

    1.复制board/freescale/mx6ullevk文件夹并重命名为mx6ull_100ask_emmc。
    2.将board/freescale/mx6ull_100ask_emmc下的mx6ullevk.c重命为mx6ull_100ask_emmc.c。
    3.修改board/freescale/mx6ull_100ask_emmc下的Makefile文件,将

    1. obj-y  := mx6ullevk.o
    复制代码
    修改为:
    1. obj-y  := mx6ul_100ask_emmc.o
    复制代码
    这样才会编译mx6ull_100ask_emmc.c。
    4. 修改board/freescale/mx6ull_100ask_emmc下的imximage.cfg 文件,将34行的
    1. PLUGIN        board/freescale/mx6ullevk/plugin.bin 0x00907000
    复制代码
    修改为:
    1. PLUGIN        board/freescale/mx6ull_100ask_emmc/plugin.bin 0x00907000
    复制代码
    5.修改board/freescale/mx6ull_100ask_emmc目录下的 Kconfig 文件,修改后内容如下:
    1. if TARGET_MX6ULL_100ASK_EMMC
    2. config SYS_BOARD
    3.         default "mx6ull_100ask_emmc"
    4. config SYS_VENDOR
    5.         default "freescale"
    6. config SYS_CONFIG_NAME
    7.         default "mx6ull_100ask_emmc"
    8. endif
    复制代码
    6.修改board/freescale/mx6ull_100ask_emmc目录下的 MAINTAINERS 文件,修改后内容如下:
    1. MX6ULL_100ASK_EMMC BOARD
    2. M:        Peng Fan <peng.fan@nxp.com>
    3. S:        Maintained
    4. F:        board/freescale/mx6ull_100ask_emmc/
    5. F:        include/configs/mx6ull_100ask_emmc.h
    6. F:        configs/mx6ull_100ask_emmc_defconfig
    复制代码
    2.4 修改UBOOT图形界面配置文件
    修改文件修改文件arch/arm/cpu/armv7/mx6/Kconfig,在207行加入以下内容:
    1. config TARGET_MX6ULL_100ASK_EMMC
    2.         bool "Support mx6ull_100ask_emmc"
    3.         select MX6ULL
    4.         select DM
    5.         select DM_THERMAL
    复制代码
    在endif前加入:
    1. source "board/freescale/mx6ull_100ask_emmc/Kconfig"
    复制代码
    2.5 编译下载测试新添加的开发板
    编译新添加的开发板:
    1. make distclean
    2. make mx6ull_100ask_emmc_defconfig
    3. make -j4
    复制代码
    查看串口输出如下:
    1.png

    从上图可看出uboot的LCD和网络是不能用的,接下来需要修改LCD和网络驱动。

    3. LCD驱动修改
    一般uboot的驱动都是在xxx.c和xxx.h中修改,xxx为板子名称,比如mx6ull_100ask_emmc.c和mx6ull_100ask_emmc.h两个文件,修改LCD驱动时应注意一下几点:

    1.LCD所使用的GPIO。
    2.LCD背光控制和RESET引脚。
    3.LCD参数配置。
    imx6ull的LCD有固定的引脚,所以只需要修改背光引脚和参数。

    3.1 LCD背光和RESET引脚修改
    从mx6ull_100ask_emmc.c中的第777行可以看出,nxp官方使用的也是GPIO1_IO8来控制LCD背光的,所以不用修改,而RESET引脚在100ask开发板中是接了电阻上拉的,如下图所示:
    2.png

    这里的电路应该是上电自动复位,上电后通过电容c18复位一下LCD,所以不需要设置RESET引脚,但是nxp官方使用了LCD的reset引脚,代码如下:
    1. 771 /* Reset the LCD */
    2. 772 gpio_direction_output(IMX_GPIO_NR(5, 9) , 0);
    3. 773 udelay(500);
    4. 774 gpio_direction_output(IMX_GPIO_NR(5, 9) , 1);
    复制代码
    直接注释掉该代码即可。

    3.2 LCD参数配置
    由于nxp官方的开发板是不支持100ask的1024x600的屏的,所以需要修改,在mx6ull_100ask_emmc.c中的第780的display_info_t结构体中定义了LCD相关参数:
    1. struct display_info_t const displays[] = {{
    2.         .bus = MX6UL_LCDIF1_BASE_ADDR,
    3.         .addr = 0,
    4.         .pixfmt = 24,
    5.         .detect = NULL,
    6.         .enable        = do_enable_parallel_lcd,
    7.         .mode        = {
    8.                 .name                        = "TFT43AB",
    9.                 .xres           = 480,
    10.                 .yres           = 272,
    11.                 .pixclock       = 108695,
    12.                 .left_margin    = 8,
    13.                 .right_margin   = 4,
    14.                 .upper_margin   = 2,
    15.                 .lower_margin   = 4,
    16.                 .hsync_len      = 41,
    17.                 .vsync_len      = 10,
    18.                 .sync           = 0,
    19.                 .vmode          = FB_VMODE_NONINTERLACED
    20. } } };
    21. size_t display_count = ARRAY_SIZE(displays);
    复制代码
    其中do_enable_parallel_lcd函数就是lcd的引脚初始化函数,打开LCD背光就是在此函数中完成的。
    100ask开发板所使用的LCD为1024x600,数据手册路径:100ask_imx6ull_2020.02.29_v2.0/06_Da
    tasheet/Extend_modules/7寸LCD模块/7.0-13SPEC(7寸1024600TN-RGB).pdf,查看数据手册得到参数:

    修改后的结构体如下:
    1. struct display_info_t const displays[] = {{
    2.         .bus = MX6UL_LCDIF1_BASE_ADDR,
    3.         .addr = 0,
    4.         .pixfmt = 24,
    5.         .detect = NULL,
    6.         .enable        = do_enable_parallel_lcd,
    7.         .mode        = {
    8.                 .name                        = "TFT7016",
    9.                 .xres           = 1024,
    10.                 .yres           = 600,
    11.                 .pixclock       = 19531,
    12.                 .left_margin    = 140,
    13.                 .right_margin   = 160,
    14.                 .upper_margin   = 20,
    15.                 .lower_margin   = 12,
    16.                 .hsync_len      = 20,
    17.                 .vsync_len      = 3,
    18.                 .sync           = 0,
    19.                 .vmode          = FB_VMODE_NONINTERLACED
    20. } } };
    复制代码
    其中pixclock是像素时钟,计算方法为:
    5.png

    通过上图的参数计算出为19531(单位应该是ps,皮秒(1ns=1000ps)),name修改为TFT7016,表示7寸,1024x600。最后将mx6ull_100ask_emmc.h中的TFT43AB替换为TFT7016。

    3.3 编译测试修改后的UBOOT

    编译下载并插上LCD后,uboot串口输出:
    6.png

    LCD显示NXP的logo:
    7.png

    如果LCD没有显示,查看uboot环境变量panel是否是TFT7016,不是的话修改为TFT7016重启测试,还是没有显示的话,可能是之前SD/eMMC中有环境变量,所以uboot没有使用代码中的环境变量,需要将eMMC/SD完全格式化之后就可以了。格式化可以在uboot中使用mmc erase命令来擦除环境变量:
    1. /*SD卡启动*/
    2. mmc dev 0
    3. mmc erase 600 10
    4. /*eMMC启动*/
    5. mmc dev 1
    6. mmc erase 600 10
    复制代码
    重启开发板即可。

    3.4 其它修改
    在mx6ull_100ask_emmc.c中找到checkboard函数,修改如下:
    1. int checkboard(void)
    2. {
    3.         puts("Board: MX6ULL 100ASK EMMC\n");
    4.         return 0;
    5. }
    复制代码
    4. 网络驱动移值
    IMX6ULL有两个网络外设,分别为ENET1和ENET2,100ask开发板使用LAN8720A作为PHY芯片,接在了ENET2上,LAN8720A芯片有一个地址引脚,RXER/PHYAD0,在开发板上接到了高电平,所以LAN8720A的网络PHY地址为1,RESET引脚接在了SNVS_TAMPER6上,由于PHY网络芯片有规定,所有PHY芯片前16个寄存器都是一样的功能,并且使用这16个寄存器就可以让网络正常工作,所以需要修改三个地方:

    1.LAN8720A的PHY网络地址为1
    2.RESET引脚
    3.LAN8720A驱动
    4.1 网络PHY地址修改
    打开mx6ull_100ask_emmc.h,找到如下代码:
    1. #define CONFIG_FEC_ENET_DEV                1
    复制代码
    该代码定义了默认使用的ENET,说明使用ENET2,0使用ENET1,紧接着是ENET配置代码:
    1. #if (CONFIG_FEC_ENET_DEV == 0)
    2. #define IMX_FEC_BASE                        ENET_BASE_ADDR
    3. #define CONFIG_FEC_MXC_PHYADDR          0x2
    4. #define CONFIG_FEC_XCV_TYPE             RMII
    5. #elif (CONFIG_FEC_ENET_DEV == 1)
    6. #define IMX_FEC_BASE                        ENET2_BASE_ADDR
    7. #define CONFIG_FEC_MXC_PHYADDR                0x1
    8. #define CONFIG_FEC_XCV_TYPE                RMII
    9. #endif
    10. #define CONFIG_ETHPRIME                        "FEC"
    复制代码
    我们使用ENET2,所以设置地址的代码为:
    1. #elif (CONFIG_FEC_ENET_DEV == 1)
    2. #define IMX_FEC_BASE                        ENET2_BASE_ADDR
    3. #define CONFIG_FEC_MXC_PHYADDR                0x1
    4. #define CONFIG_FEC_XCV_TYPE                RMII
    5. #endif
    6. #define CONFIG_ETHPRIME                        "FEC"
    复制代码
    nxp默认使用的也是ENET2,所以不用修改。
    第345行定义了一个宏:
    1. #define CONFIG_PHY_MICREL
    复制代码
    此宏用于使能 uboot 中 Micrel 公司的 PHY驱动,NXP使用的KSZ8081 这颗 PHY 芯片就是 Micrel 公司生产的,如果要使用 LAN8720A,那么就得将 CONFIG_PHY_MICREL 改为 CONFIG_PHY_SMSC,也就是使能 uboot 中的 SMSC 公司中的 PHY 驱动,因为 LAN8720A 就是 SMSC 公司生产的,将该宏修改为:
    1. #define CONFIG_PHY_SMSC
    复制代码
    4.2 删除uboot 中 74LV595 的驱动代码,修改RESET引脚
    打开mx6ull_100ask_emmc.c,找到如下代码:
    1. <p>#define IOX_SDI IMX_GPIO_NR(5, 10)</p><p>#define IOX_STCP IMX_GPIO_NR(5, 7)</p><p>#define IOX_SHCP IMX_GPIO_NR(5, 11)</p><p>#define IOX_OE IMX_GPIO_NR(5, 8)</p>
    复制代码
    删除并替换为:
    1. #define ENET2_RESET IMX_GPIO_NR(5, 6)
    复制代码
    因为SNVS_TAMPER6复用为IO时是GPIO5_IO6,继续在 mx6ull_alientek_emmc.c 中找到如下代码:
    1. <p>static iomux_v3_cfg_t const iox_pads[] = {</p><p><span style="white-space:pre">        </span>/* IOX_SDI */</p><p><span style="white-space:pre">        </span>MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),</p><p><span style="white-space:pre">        </span>/* IOX_SHCP */</p><p><span style="white-space:pre">        </span>MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),</p><p><span style="white-space:pre">        </span>/* IOX_STCP */</p><p><span style="white-space:pre">        </span>MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),</p><p><span style="white-space:pre">        </span>/* IOX_nOE */</p><p><span style="white-space:pre">        </span>MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),</p><p>};</p>
    复制代码
    该代码是74lv595的驱动代码,将其删除,同理,将iox74lv_init,iox74lv_set函数删除,将board_init中调用74lv595的代码删掉:
    1. <p>imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));</p><p>iox74lv_init();</p>
    复制代码
    4.3 添加100ask开发板网络复位引脚驱动
    在mx6ull_100ask_emmc.c中找到如下代码:
    1. <p>static iomux_v3_cfg_t const fec2_pads[] = {</p><p><span style="white-space:pre">        </span>MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p>
    2. </p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_TX_DATA0__ENET2_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_TX_EN__ENET2_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p>
    3. </p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p>};</p>
    复制代码
    该数组是网络接口引脚初始化数组,添加复位引脚后:
    1. <p>static iomux_v3_cfg_t const fec2_pads[] = {</p><p><span style="white-space:pre">        </span>MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p>
    2. </p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_TX_DATA0__ENET2_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_TX_EN__ENET2_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p>
    3. </p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),</p><p><span style="white-space:pre">        </span>MX6_PAD_SNVS_TAMPER6__GPIO5_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),</p><p>};</p>
    复制代码
    继续在mx6ull_100ask_emmc.c中找到setup_iomux_fec函数:
    1. <p>
    2. </p><p>static void setup_iomux_fec(int fec_id)</p><p>{</p><p><span style="white-space:pre">        </span>if (fec_id == 0)</p><p><span style="white-space:pre">                </span>imx_iomux_v3_setup_multiple_pads(fec1_pads,</p><p><span style="white-space:pre">                                                </span> ARRAY_SIZE(fec1_pads));</p><p><span style="white-space:pre">        </span>else</p><p><span style="white-space:pre">                </span>imx_iomux_v3_setup_multiple_pads(fec2_pads,</p><p><span style="white-space:pre">                                                </span> ARRAY_SIZE(fec2_pads));</p><p>}</p>
    复制代码
    该函数就是通过fec1_pads和fec2_pads数组来初始化ENET引脚,修改后如下:
    1. <p>static void setup_iomux_fec(int fec_id)</p><p>{</p><p><span style="white-space:pre">        </span>if (fec_id == 0)</p><p><span style="white-space:pre">                </span>imx_iomux_v3_setup_multiple_pads(fec1_pads,</p><p><span style="white-space:pre">                                                </span> ARRAY_SIZE(fec1_pads));</p><p><span style="white-space:pre">        </span>else</p><p><span style="white-space:pre">        </span>{</p><p><span style="white-space:pre">                </span>imx_iomux_v3_setup_multiple_pads(fec2_pads,</p><p><span style="white-space:pre">                                                </span> ARRAY_SIZE(fec2_pads));</p><p><span style="white-space:pre">                </span>gpio_direction_output(ENET2_RESET, 1); </p><p><span style="white-space:pre">                </span>gpio_set_value(ENET2_RESET, 0);  /*复位LAN8720A*/</p><p><span style="white-space:pre">                </span>mdelay(20);</p><p><span style="white-space:pre">                </span>gpio_set_value(ENET2_RESET, 1);</p><p><span style="white-space:pre">        </span>}</p><p>}</p>
    复制代码
    如果不复位LAN8720A,uboot可能识别不了LAN8720A。

    4.4 修改 drivers/net/phy/phy.c 文件中的函数genphy_update_link
    该函数的部分代码如下:
    1. <p>int genphy_update_link(struct phy_device *phydev)</p><p>{</p><p><span style="white-space:pre">        </span>unsigned int mii_reg;</p><p>
    2. </p><p><span style="white-space:pre">        </span>/*</p><p><span style="white-space:pre">        </span> * Wait if the link is up, and autonegotiation is in progress</p><p><span style="white-space:pre">        </span> * (ie - we're capable and it's not done)</p><p><span style="white-space:pre">        </span> */</p><p><span style="white-space:pre">        </span>mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);</p><p>
    3. </p><p><span style="white-space:pre">        </span>/*</p><p><span style="white-space:pre">        </span> * If we already saw the link up, and it hasn't gone down, then</p><p><span style="white-space:pre">        </span> * we don't need to wait for autoneg again</p><p><span style="white-space:pre">        </span> */</p><p><span style="white-space:pre">        </span>if (phydev->link && mii_reg & BMSR_LSTATUS)</p><p><span style="white-space:pre">                </span>return 0;</p>
    复制代码
    修改后:
    1. <p>int genphy_update_link(struct phy_device *phydev)</p><p>{</p><p><span style="white-space:pre">        </span>unsigned int mii_reg;</p><p>
    2. </p><p><span style="white-space:pre">        </span>static int lan8720_flag = 0;</p><p><span style="white-space:pre">        </span>int bmcr_reg = 0;</p><p><span style="white-space:pre">        </span>if (lan8720_flag == 0) {</p><p><span style="white-space:pre">                </span>bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);</p><p><span style="white-space:pre">                </span>phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);</p><p><span style="white-space:pre">                </span>while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000) {</p><p><span style="white-space:pre">                        </span>udelay(100);</p><p><span style="white-space:pre">                </span>}</p><p><span style="white-space:pre">                </span>phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);</p><p><span style="white-space:pre">                </span>lan8720_flag = 1;</p><p><span style="white-space:pre">        </span>}</p><p>
    3. </p><p><span style="white-space:pre">        </span>/*</p><p><span style="white-space:pre">        </span> * Wait if the link is up, and autonegotiation is in progress</p><p><span style="white-space:pre">        </span> * (ie - we're capable and it's not done)</p><p><span style="white-space:pre">        </span> */</p><p><span style="white-space:pre">        </span>mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);</p>
    复制代码
    添加的代码用于将LAN8720A软件复位一下。
    至此uboot的网络驱动修改完成,可以编译下载测试了。


    4.5 下载测试网络驱动
    下载后uboot输出:
    8.png

    可以看到Net: FEC1,说明uboot可以识别出LAN8720A了,只是没有设置IP地址,设置环境变量:
    1. <p>setenv ipaddr 192.168.101.6 //开发板 IP 地址</p><p>setenv ethaddr 00:04:9f:04:d2:35 //开发板网卡 MAC 地址</p><p>setenv gatewayip 192.168.101.1 //开发板默认网关</p><p>setenv netmask 255.255.255.0 //开发板子网掩码</p><p>setenv serverip 192.168.101.5 //服务器地址,也就是 Ubuntu 地址</p><p>saveenv //保存环境变量</p>
    复制代码
    使用ping命令测试:
    1. ping 192.168.101.5
    复制代码
    192.168.101.5是ubuntu的ip地址,也可以是pc的ip地址,输出如下:
    9.png

    说明网络驱动修改成功。可以通过tftp来下载zImage内核试验一下:
    1. tftp 80800000 zImage
    复制代码
    uboot输出:
    10.png

    此时就可以通过tftp来加载内核镜像和设备树来启动Linux了。如果使用nfs下载时末尾出现卡顿现象,在主机/etc/hosts文件加入192.168.101.6 /home/book/nfs_rootfs,192.168.101.6是开发板uboot的ip地址, /home/book/nfs_rootfs是主机的nfs目录。如果u-boot NFS下载文件报错:Loading: *** ERROR: File lookup fail,导致此错误得原因是:uboot中使用得NFS版本为V2版本,而ubuntu中的NFS版本为V3,V4及以上版本,从而导致uboot不能再NFS服务器中找到文件,解决方法。

    5. 设置环境变量自动下载uboot到SD卡(无需插拔SD卡)
    在调试uboot时,如果从sd卡启动,就会频繁的插拔读卡器,频繁重启开发板,很麻烦,解决方法:uboot网络调试完成后,可以将调试好的uboot先下载到eMMC中,如果想将uboot下载进sd卡,可以先使用eMMC中的uboot启动开发板,然后用tftp从ubuntu中将uboot.imx下载到DRAM中,然后利用uboot的mmc write命令将DRAM中的uboot.imx写入到SD卡,然后从SD卡启动,这样就不需要频繁插拔SD卡和读卡器了。前提是ubuntu中要安装好tftp服务,可以设置一个环境变量:

    1. <p>setenv tosd 'tftp 80000000 u-boot.imx; mmc dev 0; mmc write 80000000 2 900'</p><p>saveenv</p>
    复制代码
    mmc write 80000000 2 900表示将DRAM中0x80000000开始的900个blk(1blk=512byte)写入sd卡第2个blk开始的地方,因为uboot.imx是存放在sd卡第1kbyte后的,然后使用run tosd来将uboot下载到sd卡中(使用eMMC中的uboot下载到内存中,然后使用go命令理论上可以,但是我测试的时候初始化mmc后就卡住了,不知道为什么,有大神可以解答一下吗,嘿嘿,不胜感激)。
    完整的测试:
    编译完uboot后,执行:
    1. cp u-boot.imx ~/tftpboot
    复制代码
    然后在uboot中运行:
    1. run tosd
    复制代码
    等待完成即可从sd卡启动。裸机程序也可使用此方法,但是裸机直接在内存中使用go命令运行应该更方便。



    文章出处:CSDN
    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-16 19:34 , Processed in 0.104286 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表