查看: 1610|回复: 0

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

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 590 天

    [LV.9]以坛为家II

    31

    主题

    1345

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3581
    最后登录
    2024-4-25
    发表于 2021-5-21 16:19:38 | 显示全部楼层 |阅读模式
    100ASK-IMX6ULL开发板移值NXP官方UBOOT
    1. 开发环境
    2. 在UBOOT中添加自己的开发板
    2.1 添加开发板配置文件
    2.2 添加开发板对应的头文件
    2.3 添加开发板对应的板级文件夹
    2.4 修改UBOOT图形界面配置文件
    2.5 编译下载测试新添加的开发板
    3. LCD驱动修改
    3.1 LCD背光和RESET引脚修改
    3.2 LCD参数配置
    3.3 编译测试修改后的UBOOT
    3.4 其它修改
    4. 网络驱动移值
    4.1 网络PHY地址修改
    4.2 删除uboot 中 74LV595 的驱动代码,修改RESET引脚
    4.3 添加100ask开发板网络复位引脚驱动
    4.4 修改 drivers/net/phy/phy.c 文件中的函数genphy_update_link
    4.5 下载测试网络驱动
    5. 设置环境变量自动下载uboot到SD卡(无需插拔SD卡)
    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,并修改内容为:

    CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_100ask_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
    CONFIG_ARM=y
    CONFIG_ARCH_MX6=y
    CONFIG_TARGET_MX6ULL_100ASK_EMMC=y
    CONFIG_CMD_GPIO=y
    1
    2
    3
    4
    5
    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,将:

    #ifndef __MX6ULLEVK_CONFIG_H
    #define __MX6ULLEVK_CONFIG_H
    1
    2
    修改为:

    #ifndef __MX6ULL_100ASK_EMMC_CONFIG_H
    #define __MX6ULL_100ASK_EMMC_CONFIG_H
    1
    2
    2.3 添加开发板对应的板级文件夹
    uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等,nxp的imx系列芯片的板级文件夹都存放在board/freescale中,因为飞思卡尔被nxp收购了,所以文件夹名字是freescale。

    复制board/freescale/mx6ullevk文件夹并重命名为mx6ull_100ask_emmc。
    将board/freescale/mx6ull_100ask_emmc下的mx6ullevk.c重命为mx6ull_100ask_emmc.c。
    修改board/freescale/mx6ull_100ask_emmc下的Makefile文件,将
    obj-y  := mx6ullevk.o
    1
    修改为:

    obj-y  := mx6ul_100ask_emmc.o
    1
    这样才会编译mx6ull_100ask_emmc.c。
       4. 修改board/freescale/mx6ull_100ask_emmc下的imximage.cfg 文件,将34行的

    PLUGIN        board/freescale/mx6ullevk/plugin.bin 0x00907000
    1
    修改为:

    PLUGIN        board/freescale/mx6ull_100ask_emmc/plugin.bin 0x00907000
    1
    修改board/freescale/mx6ull_100ask_emmc目录下的 Kconfig 文件,修改后内容如下:
    if TARGET_MX6ULL_100ASK_EMMC

    config SYS_BOARD
            default "mx6ull_100ask_emmc"

    config SYS_VENDOR
            default "freescale"

    config SYS_CONFIG_NAME
            default "mx6ull_100ask_emmc"

    endif
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    修改board/freescale/mx6ull_100ask_emmc目录下的 MAINTAINERS 文件,修改后内容如下:
    MX6ULL_100ASK_EMMC BOARD
    M:        Peng Fan <peng.fan@nxp.com>
    S:        Maintained
    F:        board/freescale/mx6ull_100ask_emmc/
    F:        include/configs/mx6ull_100ask_emmc.h
    F:        configs/mx6ull_100ask_emmc_defconfig
    1
    2
    3
    4
    5
    6
    2.4 修改UBOOT图形界面配置文件
    修改文件修改文件arch/arm/cpu/armv7/mx6/Kconfig,在207行加入以下内容:

    config TARGET_MX6ULL_100ASK_EMMC
            bool "Support mx6ull_100ask_emmc"
            select MX6ULL
            select DM
            select DM_THERMAL
    1
    2
    3
    4
    5
    在endif前加入:

    source "board/freescale/mx6ull_100ask_emmc/Kconfig"
    1
    2.5 编译下载测试新添加的开发板
    编译新添加的开发板:

    make distclean
    make mx6ull_100ask_emmc_defconfig
    make -j4
    1
    2
    3
    查看串口输出如下:

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

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

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

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

    这里的电路应该是上电自动复位,上电后通过电容c18复位一下LCD,所以不需要设置RESET引脚,但是nxp官方使用了LCD的reset引脚,代码如下:

    771 /* Reset the LCD */
    772 gpio_direction_output(IMX_GPIO_NR(5, 9) , 0);
    773 udelay(500);
    774 gpio_direction_output(IMX_GPIO_NR(5, 9) , 1);
    1
    2
    3
    4
    直接注释掉该代码即可。

    3.2 LCD参数配置
    由于nxp官方的开发板是不支持100ask的1024x600的屏的,所以需要修改,在mx6ull_100ask_emmc.c中的第780的display_info_t结构体中定义了LCD相关参数:

    struct display_info_t const displays[] = {{
            .bus = MX6UL_LCDIF1_BASE_ADDR,
            .addr = 0,
            .pixfmt = 24,
            .detect = NULL,
            .enable        = do_enable_parallel_lcd,
            .mode        = {
                    .name                        = "TFT43AB",
                    .xres           = 480,
                    .yres           = 272,
                    .pixclock       = 108695,
                    .left_margin    = 8,
                    .right_margin   = 4,
                    .upper_margin   = 2,
                    .lower_margin   = 4,
                    .hsync_len      = 41,
                    .vsync_len      = 10,
                    .sync           = 0,
                    .vmode          = FB_VMODE_NONINTERLACED
    } } };
    size_t display_count = ARRAY_SIZE(displays);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    其中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,查看数据手册得到参数:
    修改后的结构体如下:

    struct display_info_t const displays[] = {{
            .bus = MX6UL_LCDIF1_BASE_ADDR,
            .addr = 0,
            .pixfmt = 24,
            .detect = NULL,
            .enable        = do_enable_parallel_lcd,
            .mode        = {
                    .name                        = "TFT7016",
                    .xres           = 1024,
                    .yres           = 600,
                    .pixclock       = 19531,
                    .left_margin    = 140,
                    .right_margin   = 160,
                    .upper_margin   = 20,
                    .lower_margin   = 12,
                    .hsync_len      = 20,
                    .vsync_len      = 3,
                    .sync           = 0,
                    .vmode          = FB_VMODE_NONINTERLACED
    } } };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    其中pixclock是像素时钟,计算方法为:
    1 ( T H + T V ) ∗ 60 ∗ 1 0 12 \frac {1}{(TH+TV)*60}*10^{12}
    (TH+TV)∗60
    1
    ​       
    ∗10
    12


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

    3.3 编译测试修改后的UBOOT
    编译下载并插上LCD后,uboot串口输出:

    LCD显示NXP的logo:

    如果LCD没有显示,查看uboot环境变量panel是否是TFT7016,不是的话修改为TFT7016重启测试,还是没有显示的话,可能是之前SD/eMMC中有环境变量,所以uboot没有使用代码中的环境变量,需要将eMMC/SD完全格式化之后就可以了。格式化可以在uboot中使用mmc erase命令来擦除环境变量:

    /*SD卡启动*/
    mmc dev 0
    mmc erase 600 10
    /*eMMC启动*/
    mmc dev 1
    mmc erase 600 10
    1
    2
    3
    4
    5
    6
    重启开发板即可。

    3.4 其它修改
    在mx6ull_100ask_emmc.c中找到checkboard函数,修改如下:

    int checkboard(void)
    {
            puts("Board: MX6ULL 100ASK EMMC\n");
            return 0;
    }

    1
    2
    3
    4
    5
    6
    4. 网络驱动移值
    IMX6ULL有两个网络外设,分别为ENET1和ENET2,100ask开发板使用LAN8720A作为PHY芯片,接在了ENET2上,LAN8720A芯片有一个地址引脚,RXER/PHYAD0,在开发板上接到了高电平,所以LAN8720A的网络PHY地址为1,RESET引脚接在了SNVS_TAMPER6上,由于PHY网络芯片有规定,所有PHY芯片前16个寄存器都是一样的功能,并且使用这16个寄存器就可以让网络正常工作,所以需要修改三个地方:

    LAN8720A的PHY网络地址为1
    RESET引脚
    LAN8720A驱动
    4.1 网络PHY地址修改
    打开mx6ull_100ask_emmc.h,找到如下代码:

    #define CONFIG_FEC_ENET_DEV                1
    1
    该代码定义了默认使用的ENET,说明使用ENET2,0使用ENET1,紧接着是ENET配置代码:

    #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
    #define CONFIG_FEC_XCV_TYPE                RMII
    #endif
    #define CONFIG_ETHPRIME                        "FEC"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    我们使用ENET2,所以设置地址的代码为:

    #elif (CONFIG_FEC_ENET_DEV == 1)
    #define IMX_FEC_BASE                        ENET2_BASE_ADDR
    #define CONFIG_FEC_MXC_PHYADDR                0x1
    #define CONFIG_FEC_XCV_TYPE                RMII
    #endif
    #define CONFIG_ETHPRIME                        "FEC"
    1
    2
    3
    4
    5
    6
    nxp默认使用的也是ENET2,所以不用修改。
    第345行定义了一个宏:

    #define CONFIG_PHY_MICREL
    1
    此宏用于使能 uboot 中 Micrel 公司的 PHY驱动,NXP使用的KSZ8081 这颗 PHY 芯片就是 Micrel 公司生产的,如果要使用 LAN8720A,那么就得将 CONFIG_PHY_MICREL 改为 CONFIG_PHY_SMSC,也就是使能 uboot 中的 SMSC 公司中的 PHY 驱动,因为 LAN8720A 就是 SMSC 公司生产的,将该宏修改为:

    #define CONFIG_PHY_SMSC
    1
    4.2 删除uboot 中 74LV595 的驱动代码,修改RESET引脚
    打开mx6ull_100ask_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)
    1
    2
    3
    4
    删除并替换为:

    #define ENET2_RESET IMX_GPIO_NR(5, 6)
    1
    因为SNVS_TAMPER6复用为IO时是GPIO5_IO6,继续在 mx6ull_alientek_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),
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    该代码是74lv595的驱动代码,将其删除,同理,将iox74lv_init,iox74lv_set函数删除,将board_init中调用74lv595的代码删掉:

            imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));

            iox74lv_init();
    1
    2
    3
    4.3 添加100ask开发板网络复位引脚驱动
    在mx6ull_100ask_emmc.c中找到如下代码:

    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_TX_DATA0__ENET2_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
            MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
            MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),
            MX6_PAD_ENET2_TX_EN__ENET2_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),

            MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
            MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 | 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),
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    该数组是网络接口引脚初始化数组,添加复位引脚后:

    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_TX_DATA0__ENET2_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
            MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
            MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),
            MX6_PAD_ENET2_TX_EN__ENET2_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),

            MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
            MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 | 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),
            MX6_PAD_SNVS_TAMPER6__GPIO5_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    继续在mx6ull_100ask_emmc.c中找到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));
            else
                    imx_iomux_v3_setup_multiple_pads(fec2_pads,
                                                     ARRAY_SIZE(fec2_pads));
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    该函数就是通过fec1_pads和fec2_pads数组来初始化ENET引脚,修改后如下:

    static void setup_iomux_fec(int fec_id)
    {
            if (fec_id == 0)
                    imx_iomux_v3_setup_multiple_pads(fec1_pads,
                                                     ARRAY_SIZE(fec1_pads));
            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);  /*复位LAN8720A*/
                    mdelay(20);
                    gpio_set_value(ENET2_RESET, 1);
            }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    如果不复位LAN8720A,uboot可能识别不了LAN8720A。

    4.4 修改 drivers/net/phy/phy.c 文件中的函数genphy_update_link
    该函数的部分代码如下:

    int genphy_update_link(struct phy_device *phydev)
    {
            unsigned int mii_reg;

            /*
             * 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);

            /*
             * If we already saw the link up, and it hasn't gone down, then
             * we don't need to wait for autoneg again
             */
            if (phydev->link && mii_reg & BMSR_LSTATUS)
                    return 0;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    修改后:

    int genphy_update_link(struct phy_device *phydev)
    {
            unsigned int mii_reg;

            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;
            }

            /*
             * 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);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    添加的代码用于将LAN8720A软件复位一下。
    至此uboot的网络驱动修改完成,可以编译下载测试了。

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

    可以看到Net: FEC1,说明uboot可以识别出LAN8720A了,只是没有设置IP地址,设置环境变量:

    setenv ipaddr 192.168.101.6 //开发板 IP 地址
    setenv ethaddr 00:04:9f:04:d2:35 //开发板网卡 MAC 地址
    setenv gatewayip 192.168.101.1 //开发板默认网关
    setenv netmask 255.255.255.0 //开发板子网掩码
    setenv serverip 192.168.101.5 //服务器地址,也就是 Ubuntu 地址
    saveenv //保存环境变量
    1
    2
    3
    4
    5
    6
    使用ping命令测试:

    ping 192.168.101.5
    1
    192.168.101.5是ubuntu的ip地址,也可以是pc的ip地址,输出如下:


    说明网络驱动修改成功。可以通过tftp来下载zImage内核试验一下:

    tftp 80800000 zImage
    1
    uboot输出:

    此时就可以通过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服务,可以设置一个环境变量:

    setenv tosd 'tftp 80000000 u-boot.imx; mmc dev 0; mmc write 80000000 2 900'
    saveenv
    1
    2
    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后,执行:

    cp u-boot.imx ~/tftpboot
    1
    然后在uboot中运行:

    run tosd
    1
    等待完成即可从sd卡启动。裸机程序也可使用此方法,但是裸机直接在内存中使用go命令运行应该更方便。
    ————————————————
    版权声明:本文为CSDN博主「chendilincd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u014783685/article/details/104951681

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-25 10:19 , Processed in 0.094431 second(s), 18 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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