tech_log: U-Boot environment vars

Friday, May 22, 2009

U-Boot environment vars

- In u-boot/include/configs/versatile.h :

/*-----------------------------------------------------------------------
 * FLASH and environment organization
 */

#define VERSATILE_SYS_BASE                    0x10000000
#define VERSATILE_SYS_FLASH_OFFSET            0x4C
#define VERSATILE_FLASHCTRL              (VERSATILE_SYS_BASE + VERSATILE_SYS_FLASH_OFFSET)
#define VERSATILE_FLASHPROG_FLVPPEN          (1 << 0)    /* Enable writing to flash */

#define CFG_MAX_FLASH_BANKS    1        /* max number of memory banks */
#define PHYS_FLASH_SIZE         0x34000000    /* 64MB */
/* timeout values are in ticks */
#define CFG_FLASH_ERASE_TOUT    (20*CFG_HZ)    /* Timeout for Flash Erase */
#define CFG_FLASH_WRITE_TOUT    (20*CFG_HZ)    /* Timeout for Flash Write */
#define CFG_MAX_FLASH_SECT    (256)

#define PHYS_FLASH_1        (CFG_FLASH_BASE)

#define CFG_ENV_IS_IN_FLASH     1               /* env in flash instead of CFG_ENV_IS_NOWHERE */
#define CFG_ENV_SECT_SIZE       0x00020000      /* 256 KB sectors (x2) */
#define CFG_ENV_SIZE            0x10000         /* Total Size of Environment Sector */
#define CFG_ENV_OFFSET          0x01f00000      /* environment starts here  */
#define CFG_ENV_ADDR            (CFG_FLASH_BASE + CFG_ENV_OFFSET)


This is important - CFG_ENV_ADDR. It tells where will be env variables held in memory (in this case flash).


- In u-boot/common/env_flash.c :

char * env_name_spec = "Flash";

#ifdef ENV_IS_EMBEDDED

extern uchar environment[];
env_t *env_ptr = (env_t *)(&environment[0]);

#ifdef CMD_SAVEENV
/* static env_t *flash_addr = (env_t *)(&environment[0]);-broken on ARM-wd-*/
static env_t *flash_addr = (env_t *)CFG_ENV_ADDR;
#endif

#else /* ! ENV_IS_EMBEDDED */

env_t *env_ptr = (env_t *)CFG_ENV_ADDR;
#ifdef CMD_SAVEENV
static env_t *flash_addr = (env_t *)CFG_ENV_ADDR;
#endif

#endif /* ENV_IS_EMBEDDED */

#ifdef CFG_ENV_ADDR_REDUND
static env_t *flash_addr_new = (env_t *)CFG_ENV_ADDR_REDUND;

/* CFG_ENV_ADDR is supposed to be on sector boundary */
static ulong end_addr = CFG_ENV_ADDR + CFG_ENV_SECT_SIZE - 1;
static ulong end_addr_new = CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - 1;

#define ACTIVE_FLAG   1
#define OBSOLETE_FLAG 0
#endif /* CFG_ENV_ADDR_REDUND */

extern uchar default_environment[];
extern int default_environment_size;

Also there basic intialization of gd general data structure (and to check if Flash is OK, stuff like this...) :

int  env_init(void)
{
#ifdef CONFIG_OMAP2420H4
    int flash_probe(void);

    if(flash_probe() == 0)
        goto bad_flash;
#endif
    if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
        gd->env_addr  = (ulong)&(env_ptr->data);
        gd->env_valid = 1;
        return(0);
    }
#ifdef CONFIG_OMAP2420H4
bad_flash:
#endif
    gd->env_addr  = (ulong)&default_environment[0];
    gd->env_valid = 0;
    return (0);
}

- In u-boot/arm_lib/board.c :

gd pointer to env is initialized:

typedef int (init_fnc_t) (void);

int print_cpuinfo (void); /* test-only */

init_fnc_t *init_sequence[] = {
    cpu_init,        /* basic cpu dependent setup */
    board_init,        /* basic board dependent setup */
    interrupt_init,        /* set up exceptions */
    env_init,        /* initialize environment */
    init_baudrate,        /* initialze baudrate settings */
    serial_init,        /* serial communications setup */
    console_init_f,        /* stage 1 init of console */
    display_banner,        /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
    print_cpuinfo,        /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
    checkboard,        /* display board info */
#endif
    dram_init,        /* configure available RAM banks */
    display_dram_config,
    NULL,
};

void start_armboot (void)
{
    init_fnc_t **init_fnc_ptr;
    char *s;
#ifndef CFG_NO_FLASH
    ulong size;
#endif
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
    unsigned long addr;
#endif

    /* Pointer is writable since we allocated a register for it */
    gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
    /* compiler optimization barrier needed for GCC >= 3.4 */
    __asm__ __volatile__("": : :"memory");

    memset ((void*)gd, 0, sizeof (gd_t));
    gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
    memset (gd->bd, 0, sizeof (bd_t));

    monitor_flash_len = _bss_start - _armboot_start;

    for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
        if ((*init_fnc_ptr)() != 0) {
            hang ();
        }
    }

which is a call to function in u-boot/common/env_flash.c.


Chunk of memory in Flash that hoslds env variables is later relocated from Flash to RAM :

/* initialize environment */
    env_relocate ();



0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home