linux - U-boot 不会使其输出静音
问题描述
我有这个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;
}
但究竟发生了什么?是否有类似重定位时间环境变量之前和重定位环境变量之后的东西,因为函数,
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
所以也没有默认环境。
任何提示或帮助都会让我理解。
附言
#define CONFIG_EXTRA_ENV_SETTINGS
我在Now 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);
}
所以我得出结论,从本质上讲,u-boot 代码不可能指向存储环境的 mmc 区域。
谁能证实这一点?
解决方案
推荐阅读
- javascript - 如何使用 Chart.js 版本 3.2.1 在圆环图中添加文本
- authentication - MS Teams Bot oAuthPrompt,如何更改弹出窗口大小
- python-3.x - 在方法“Solver_AddConstraint”中,类型为“operations_research::Constraint *const”的参数 2
- laravel - Laravel API - 如果订购了产品,试图禁止管理员删除产品
- material-ui - React material-ui AvatarGroup 圆形,用于额外的孩子
- c# - WS_SYSMENU 防止窗口调整大小
- jmeter - 如何在 JMeter 中将请求分散到特定时间
- javascript - 如何从多个类别中获取所有产品(Woocommerce/Wordpress/React)
- python-3.x - AWS Lambda 容器映像中的 OpenCV
- c++ - 为什么字符串'text2'的输出为空白?