diff options
author | Jerry Huang <Chang-Ming.Huang@freescale.com> | 2010-01-22 16:58:41 +0800 |
---|---|---|
committer | Scott Sweeny <scott.sweeny@timesys.com> | 2010-09-29 17:32:29 -0400 |
commit | 1d6c0e83838a2bfb93aa15326dfe79d11e511abe (patch) | |
tree | bd6a5788a789d21e232b27ac421150ef0972ed69 | |
parent | 78a135ffb982e9ba2278634c3e8d2d5291d2566b (diff) |
p1022ds: get the env variable address
Get the environment variable address
Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
-rw-r--r-- | board/freescale/p1022ds/p1022ds.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/board/freescale/p1022ds/p1022ds.c b/board/freescale/p1022ds/p1022ds.c index e6cfe421a7..6ea221dbd8 100644 --- a/board/freescale/p1022ds/p1022ds.c +++ b/board/freescale/p1022ds/p1022ds.c @@ -37,6 +37,8 @@ #include <asm/fsl_law.h> #include <asm/mp.h> #include <netdev.h> +#include <mmc.h> +#include <malloc.h> #include "../../../drivers/block/fsl_sata.h" @@ -509,3 +511,46 @@ void board_lmb_reserve(struct lmb *lmb) cpu_mp_lmb_reserve(lmb); } #endif +#if defined(CONFIG_MMC) +/* + * The environment variables are written to just after the u-boot image + * on SDCard, so we must read the MBR to get the start address and code + * length of the u-boot image, then calculate the address of the env. + */ +#define ESDHC_BOOT_IMAGE_SIZE 0x48 +#define ESDHC_BOOT_IMAGE_ADDR 0x50 + +int mmc_get_env_addr(int dev, u32 *env_addr) +{ + int ret; + u8 *tmp_buf; + u32 blklen, code_offset, code_len; + struct mmc *mmc = find_mmc_device(dev); + + mmc_init(mmc); + + blklen = mmc->read_bl_len; + tmp_buf = malloc(blklen); + if (!tmp_buf) + return 1; + + /* read out the first block, get the config data information */ + ret = mmc_read(mmc, 0, tmp_buf, blklen); + if (ret) { + free(tmp_buf); + return 1; + } + + /* Get the Source Address, from offset 0x50 */ + code_offset = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_ADDR); + + /* Get the code size from offset 0x48 */ + code_len = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_SIZE); + + *env_addr = code_offset + code_len; + + free(tmp_buf); + + return 0; +} +#endif |