diff options
author | Dipen Dudhat <dipen.dudhat@freescale.com> | 2009-10-29 22:34:03 +0530 |
---|---|---|
committer | Scott Sweeny <scott.sweeny@timesys.com> | 2010-11-10 14:52:24 -0500 |
commit | 9a780f26955495de39f1bff510ca5d19101e5e73 (patch) | |
tree | ef760e5f9bc5bc5386ffd870f2f0bb733a4d4376 | |
parent | a9bb9897a88b1ac1611b6b0415fd36ac1bfb1978 (diff) |
Get the Address for env on SD Card for SD Boot on P1 and P2 RDB Platforms
Both the save env and load env operation will call this function
to get the address of env on the SDCard, so the user can control
where to put the env freely.
Signed-off-by: Dipen Dudhat <dipen.dudhat@freescale.com>
Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
-rw-r--r-- | board/freescale/p1_p2_rdb/p1_p2_rdb.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/board/freescale/p1_p2_rdb/p1_p2_rdb.c b/board/freescale/p1_p2_rdb/p1_p2_rdb.c index d34a6e71b2..2fa30c34de 100644 --- a/board/freescale/p1_p2_rdb/p1_p2_rdb.c +++ b/board/freescale/p1_p2_rdb/p1_p2_rdb.c @@ -33,6 +33,8 @@ #include <tsec.h> #include <vsc7385.h> #include <netdev.h> +#include <mmc.h> +#include <malloc.h> DECLARE_GLOBAL_DATA_PTR; @@ -245,3 +247,47 @@ 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 |