У меня есть этот uboot
VERSION = 2017
PATCHLEVEL = 03
Я пытаюсь отключить консоль с помощью переменной silent. Я определил это #define CONFIG_SILENT_CONSOLE
Поэтому во время загрузки я прерываю консоль и ввожу
setenv silent 1
save
reset
Теперь после сброса или сброса при включении питания я снова пытаюсь получить консольные журналы. После просмотра переменных env
printenv
Я правильно вижу свою сохраненную переменную в переменных env
silent=1
но все равно u-boot не молчит.Я подозреваю, что эта функция не может проверить эту переменную env,
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
Так что и среды по умолчанию тоже нет.
Любые советы или помощь помогут мне понять.
PS
Я явно определил молчание в #define CONFIG_EXTRA_ENV_SETTINGS
Теперь u-boot молчит.
Выполнение setenv silent
должно удалить это из переменной env, и я вижу, что его нет, но при перезагрузке мой uboot молчит,Так что что-то в переменной окружения для меня явно загадка.
PPS Я пришел, чтобы увидеть этот код,
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);
}
Поэтому я заключаю, что по сути, при загрузочном коде нет возможности указать область mmc, где хранятся среды.
Кто-нибудь может это подтвердить?