uboot设置环境变量之后,不能保存在EMMC中,出现错误。

MX6SDL SABRESD U-Boot > saveenv
Saving Environment to SPI Flash...
Environment SPI flash not initialized

板子上没有flash,使用EMMC。

查找出错地方,发现uboot调用的是uboot/common/env_sf.c中的saveenv函数。

查看uboot/common/Makefile

COBJS-$(CONFIG_ENV_IS_IN_ONENAND) += env_onenand.o
COBJS-$(CONFIG_ENV_IS_IN_SATA) += env_sata.o
COBJS-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o
COBJS-$(CONFIG_ENV_IS_IN_MMC) += env_mmc.o

查找对应的宏,位于uboot/include/configs/mx6dl_sabresd.h

更改保存在MMC中。

/* Monitor at beginning of flash */
//#define CONFIG_FSL_ENV_IN_SF
// Tony 2016-12-18
#define CONFIG_FSL_ENV_IN_MMC
//#define CONFIG_FSL_ENV_IN_NAND

这样一来就调用env_mmc.c中的saveenv函数。

重新编译,保存环境变量,出现错误。

MX6SDL SABRESD U-Boot > saveenv
Saving Environment to MMC...
MMC Device 3 not found
No MMC card found

uboot中查看EMMC

MX6SDL SABRESD U-Boot > mmc list
FSL_USDHC: 0
FSL_USDHC: 1
FSL_USDHC: 2

应该从MMC2启动,而不是MMC3。查找报错的地方,进行更改。

uboot/common/env_mmc.c

int saveenv(void)
{
struct mmc *mmc = find_mmc_device(mmc_env_devno); if (init_mmc_for_env(mmc))
return 1; printf("Writing to MMC(%d)... ", mmc_env_devno);
if (write_env(mmc, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, env_ptr)) {
puts("failed\n");
return 1;
} puts("done\n");
return 0;
}

mmc_env_devno变量赋值的地方。

uboot/common/env_mmc.c

int env_init(void)
{
/* use default */
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 1; #ifdef CONFIG_DYNAMIC_MMC_DEVNO
extern int get_mmc_env_devno(void);
mmc_env_devno = get_mmc_env_devno();
#else
mmc_env_devno = CONFIG_SYS_MMC_ENV_DEV;
#endif return 0;
}

CONFIG_DYNAMIC_MMC_DEVNO和CONFIG_SYS_MMC_ENV_DEV的定义在uboot/include/configs/mx6dl_sabresd.h

注释掉CONFIG_DYNAMIC_MMC_DEVNO,采用静态的CONFIG_SYS_MMC_ENV_DEV。

uboot/include/configs/mx6dl_sabresd.h

#ifdef CONFIG_CMD_MMC
#define CONFIG_MMC
#define CONFIG_GENERIC_MMC
#define CONFIG_IMX_MMC
#define CONFIG_SYS_FSL_USDHC_NUM 3
#define CONFIG_SYS_FSL_ESDHC_ADDR 0
#define CONFIG_SYS_MMC_ENV_DEV 2
#define CONFIG_DOS_PARTITION 1
#define CONFIG_CMD_FAT 1
#define CONFIG_CMD_EXT2 1 /* detect whether SD1, 2, 3, or 4 is boot device */
// Tony 2016-12-18
// #define CONFIG_DYNAMIC_MMC_DEVNO /* SD3 and SD4 are 8 bit */
#define CONFIG_MMC_8BIT_PORTS 0xC
/* Setup target delay in DDR mode for each SD port */
#define CONFIG_GET_DDR_TARGET_DELAY
#endif

编译之后,再次保存,OK。

MX6SDL SABRESD U-Boot > saveenv
Saving Environment to MMC...
Writing to MMC(2)... done

Tony Liu

2016-12-18, Shenzhen

imx6 uboot saveenv fail的更多相关文章

  1. imx6 uboot lcd

    本文记录imx6 uboot中关于lcd初始化的过程. uboot中相关的文件: cpu/arm_cortexa8/start.S lib_arm/board.c board/freescale/mx ...

  2. imx6 uboot lvds clock

    在uboot中添加logo,lvds接口的lcd显示不正常,出现波动.网上说是lvds时钟频率的问题. 使用示波器测量之后,发现频率是60M,而lcd最大频率才46.8M. 因此就需要更改uboot中 ...

  3. imx6 uboot splash image

    跟踪uboot代码,了解imx6 splash image的生成过程. 涉及文件: ./cpu/arm_cortexa8/start.S ./board/freescale/mx6q_sabresd/ ...

  4. imx6 uboot启动流程分析

    参考http://blog.csdn.net/skyflying2012/article/details/25804209 这里以imx6平台为例,分析uboot启动流程对于任何程序,入口函数是在链接 ...

  5. imx6 u-boot.bin 和 u-boot.imx

    有些MFG TOOL烧录工具使用了u-boot.imx,而不是原来的u-boot.bin文件进行烧录. 这两个镜像的区别是,u-boot.bin文件编译后,会在u-boot.bin的开头添加一个大小为 ...

  6. imx6 uboot logo 更改

    最近需要更改im6 uboot的开机logo,使用10.1inch, 1024x600,18bit的LCD,期间遇到了很多的问题,记录于此. 参考链接 https://community.nxp.co ...

  7. uboot的readme

    ## (C) Copyright 2000 - 2008# Wolfgang Denk, DENX Software Engineering, wd@denx.de.## See file CREDI ...

  8. 转载 uboot 命令

    1.bootm bootm [addr [arg ...]] - boot application image stored in memory passing arguments 'arg ...' ...

  9. UBoot常用命令手册

    UBoot常用命令手册 U-Boot还提供了更加详细的命令帮助,可以通过”?”显示支持的命令列表,通过help [CommandName]命令还可以查看每个命令的参数说明. 1.bootm bootm ...

随机推荐

  1. python基础之文件操作

    对于文件操作中最简单的操作就是使用print函数将文件输出到屏幕中,但是这种操作并不能是文件保存到磁盘中去,如果下调用该数据还的重新输入等. 而在python中提供了必要的函数和方法进行默认情况下的文 ...

  2. PHP面试题4

    在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中:而链接到当前页面的URL记录在预定义变量(2)中. 答:echo $_SERVER['PHP_SELF']; echo $ ...

  3. Jquery Mobile开发以及Js对象动态绑定

    动态创建对象并绑定属性: var instantiate = function (Type, args) { var Constructor = function () { }; Constructo ...

  4. winform对话框控件、打印控件

    对话框控件: ColorDialog:颜色选择对话框,让用户自行选择一种颜色,使用方法类似FontDialog FontDialog:字体选择对话框,让用户自行选择一种字体(也可以选择字体颜色,需要在 ...

  5. Js-知识小总结

    1.给标签价 class属性的时候,记住是 ClassName, 例如:var oImg = document.getElementById('img1'); 要给这个对象价class属性 oimg. ...

  6. Delphi 操作Flash D7~XE10都有 导入Activex控件 shockwave

    http://www.cnblogs.com/devcjq/articles/2906224.html Flash是Macromedia公司出品的,用在互联网上动态的.可互动的shockwave.它的 ...

  7. 【Unity3d游戏开发】unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(转载)

    此文为转载,因为最近在做U3D,有一些概念弄得不是很清楚,看到这篇博客讲的不错,就转载过来了,方便自己随时查看. ------------------------------------------- ...

  8. 使用tungsten将mysql的数据同步到hadoop

    背景 线上有很多的数据库在运行,后台需要一个分析用户行为的数据仓库.目前比较流行的是mysql和hadoop平台. 现在的问题是,如何将线上的mysql数据实时的同步到hadoop中,以供分析.这篇文 ...

  9. MySQL中INFORMATION_SCHEMA是什么?(1)

    在获取自增ID时,我用到了以下语句: select auto_increment from information_schema.tables where table_name = "表名& ...

  10. include、require、include_once和require_once理解

    都是在当前文件中包含引入并运行指定文件,include和require的不通之处仅仅在于发生错误时include产生一个警告脚本继续执行,而require产生一个致命的错误,脚本停止运行.有了once ...