首页 > 解决方案 > 在 u-boot shell 中打印任意十六进制字符

问题描述

我想为我的 u-boot bootcmd 着色,以便打印出令人惊叹的错误消息。通常我只会使用 ANSI 转义序列,如下所示。

#!/bin/bash
printf '\x1b[31mERROR\33[0m'
#!/usr/bin/env python
print("\x1b[31mERROR\33[0m")

如何在 u-boot 中获得等效行为?似乎 u-boot 只会删除反斜杠,如下所示

# u-boot shell
echo \33[31m  # prints "33[31m"
echo \x1b[31m # prints "x1b[31m"

标签: u-boot

解决方案


在 bash 控制台上,您可以使用 CTRL-V 逐字输入控制字符。U-Boot 尚不支持此功能。但是我已经提交了一个补丁来启用它,cf。https://patchwork.ozlabs.org/project/uboot/list/?series=152686

U-Boot 的 echo 命令不知道 '\x' 转义序列,而是将转义字符逐字复制到控制台。

所以这是你可以做的:

使用包含转义序列的 echo 命令创建脚本 test.txt。

echo -e 'echo \e[33mError\e[37m\necho \e[32mWarning\e[37m' > test.txt

我在下面以十六进制格式显示它,因此文件中的内容变得显而易见:

00000000   65 63 68 6F  20 1B 5B 33  33 6D 45 72  echo .[33mEr
0000000C   72 6F 72 1B  5B 33 37 6D  0A 65 63 68  ror.[37m.ech
00000018   6F 20 1B 5B  33 32 6D 57  61 72 6E 69  o .[32mWarni
00000024   6E 67 1B 5B  33 37 6D 0A               ng.[37m.

将此转换为 U-Boot 映像

mkimage -T script -n 'test' -d test.txt test.scr

在 U-Boot 中加载脚本。我使用 tFTP 做到了这一点:

dhcp $script_addr_r test.scr

现在您可以执行脚本

source $script_addr_r

当使用 CONFIG_DISTRO_DEFAULTS=y 构建 U-Boot 时,它将在您的引导设备上查找脚本 boot.scr.uimg 和 boot.scr。所以这可能是您想要集成转义序列的地方。


推荐阅读