U引导不会使输出静音

时间:2018-10-07 08:49:02

标签: linux console u-boot relocation

我有这个uboot

VERSION = 2017
PATCHLEVEL = 03

我正在尝试使用无声变量使控制台无声。我定义了此#define CONFIG_SILENT_CONSOLE 因此,在启动时,我中断了控制台,然后输入

setenv silent 1
save
reset

现在重置或重新启动后,我再次尝试获取控制台日志。看到env变量后

printenv

我在环境变量中正确看到了保存的变量

silent=1

但仍然u-boot并不静音。我怀疑此函数无法检查此环境变量,

    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;
}

但是到底发生了什么? 是否存在诸如在重定位时间env变量之前和在重定位env变量之后的事情,因为该函数

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说它在重定位之前。 我已经打印了一些照片,即使我保存了无声变量,也总是变得无声,

我正在使用SD卡启动(MMC),我没有任何调试器,所以我 我尝试打印默认环境,

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

因此也没有默认环境。

任何提示或帮助都会使我理解。

P.S。

我在#define CONFIG_EXTRA_ENV_SETTINGS中明确定义了无声 现在,u-boot处于静默状态。

执行setenv silent应该将其从env变量中删除,我可以看到它已经消失了,但是在重启时,我的uboot却保持沉默。 因此,关于环境变量的某些事情对我来说显然是个谜。

P.P.S 我来看这段代码,

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;
}

这个叫哪个

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;
}

从早期board_init_f开始 此功能

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

    return 0;
}

使env_addr始终指向只读代码的内存,而不指向其他任何位置,例如保存mmc环境的位置。 因此,此函数始终指向default_environment变量。

__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);
}

所以我得出结论,从本质上讲,u-boot代码不可能指向存储环境的mmc区域。

任何人都可以确认吗?

0 个答案:

没有答案