1

I have this uboot

VERSION = 2017
PATCHLEVEL = 03

I am trying to silent the console using the silent variable.I defined this #define CONFIG_SILENT_CONSOLE So at boot time I am interrupting the console, and entering

setenv silent 1
save
reset

Now after reset, or power on reset I try again get console logs.After seeing env variables

printenv

I see my saved variable correctly in env varibles

silent=1

but still u-boot is not silent. I suspect this function is failing at checking for this env variable,

    char *getenv(const char *name)
{
    if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */
        ENTRY e, *ep;

        WATCHDOG_RESET();

        e.key   = name;
        e.data  = NULL;
        hsearch_r(e, FIND, &ep, &env_htab, 0); /*this function is maybe returning*/

        return ep ? ep->data : NULL;
    }

    /* restricted capabilities before import */
    if (getenv_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
        return (char *)(gd->env_buf);

    return NULL;
}

But what exactly is happening? Is there something like before relocation time env variables and after relocation env variables because the function,

static void console_update_silent(void)
{
#ifdef CONFIG_SILENT_CONSOLE
    if (getenv("silent") != NULL){
        puts("silent");
        gd->flags |= GD_FLG_SILENT;
    }
    else{
        puts("Non silent");
        gd->flags &= ~GD_FLG_SILENT;
    }
#endif
}

/* Called before relocation - use serial functions */
int console_init_f(void)
{
    gd->have_console = 1;

    console_update_silent();

    print_pre_console_buffer(PRE_CONSOLE_FLUSHPOINT1_SERIAL);

    return 0;
}

console_init_f says its before relocation. I have put some prints to see and always gets non silent, even if I have saved the silent variable,

I am using a sd card to boot(mmc), I don't have any debugger, so I I tried printing default environment, as

env print default
## Error: "default" not defined

So there is not default environment too.

Any tips or help will make me understand.

P.S.

I explicitly defined silent in #define CONFIG_EXTRA_ENV_SETTINGS Now u-boot is silent.

Doing a setenv silent should remove this from env variable, and I can see that its gone, but still on reboot my uboot is silent. So something about environment variable is clearly mystery to me.

P.P.S I come to see this code,

int getenv_f(const char *name, char *buf, unsigned len)
{
    int i, nxt;

    for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
        int val, n;

        for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) {
            if (nxt >= CONFIG_ENV_SIZE)
                return -1;
        }

        val = envmatch((uchar *)name, i);
        if (val < 0)
            continue;

        /* found; copy out */
        for (n = 0; n < len; ++n, ++buf) {
            *buf = env_get_char(val++);
            if (*buf == '\0')
                return n;
        }

        if (n)
            *--buf = '\0';

        printf("env_buf [%d bytes] too small for value of \"%s\"\n",
            len, name);

        return n;
    }

    return -1;
}

Which is called by this

char *getenv(const char *name)
{
    if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */
        ENTRY e, *ep;

        WATCHDOG_RESET();

        e.key   = name;
        e.data  = NULL;
        hsearch_r(e, FIND, &ep, &env_htab, 0);

        return ep ? ep->data : NULL;
    }

    /* restricted capabilities before import */
    if (getenv_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
        return (char *)(gd->env_buf);

    return NULL;
}

From early board_init_f this function

int env_init(void)
{
    /* use default */
    gd->env_addr    = (ulong)&default_environment[0];
    gd->env_valid   = 1;

    return 0;
}

makes env_addr to point always to read only memory of the code, and does not point to anything else such as where mmc environment are saved. So this function always point to default_environment variable.

__weak uchar env_get_char_spec(int index)
{
    return *((uchar *)(gd->env_addr + index));
}

static uchar env_get_char_init(int index)
{
    /* if crc was bad, use the default environment */
    if (gd->env_valid)
        return env_get_char_spec(index);
    else
        return default_environment[index];
}

uchar env_get_char_memory(int index)
{
    return *env_get_addr(index);
}

uchar env_get_char(int index)
{
    /* if relocated to RAM */
    if (gd->flags & GD_FLG_RELOC)
        return env_get_char_memory(index);
    else
        return env_get_char_init(index);
}

So I conclude that inherently, u-boot code there is no possibility to point the mmc area where environments are stored.

Can anyone confirm this?

0 Answers0