0

在我的系统中,我得到了一个奇怪的行为。从 uboot printenv 和 saveenv 正常工作。从用户空间 fw_printenv 工作, fw_setenv 不保存任何东西,它不给出任何错误或反馈。

这是我的 fw_env.config,看起来是正确的

# cat /etc/fw_env.config 
# Configuration file for fw_(printenv/saveenv) utility.
# Up to two entries are valid, in this case the redundant
# environment sector is assumed present.
# Notice, that the "Number of sectors" is ignored on NOR.

# MTD device name   Device offset   Env. size   Flash sector size   Number of sectors
/dev/mtd0       0x80000     0x40000     0x40000 1
#/dev/mtd2      0x0000      0x4000      0x4000

# NAND example
#/dev/mtd0      0x4000      0x4000      0x20000         2
# 

有任何想法吗?

这是 fw_setenv 的 strace

execve("/usr/sbin/fw_setenv", ["fw_setenv", "pippo", "pippo"], [/* 11 vars */]) = 0
brk(0)                                  = 0x2012000
uname({sys="Linux", node="buildroot", ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab91000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib/tls/v7l/vfp/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l/vfp", 0x7ee54508)  = -1 ENOENT (No such file or directory)
open("/lib/tls/v7l/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l", 0x7ee54508)      = -1 ENOENT (No such file or directory)
open("/lib/tls/vfp/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/vfp", 0x7ee54508)      = -1 ENOENT (No such file or directory)
open("/lib/tls/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls", 0x7ee54508)          = -1 ENOENT (No such file or directory)
open("/lib/v7l/vfp/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l/vfp", 0x7ee54508)      = -1 ENOENT (No such file or directory)
open("/lib/v7l/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l", 0x7ee54508)          = -1 ENOENT (No such file or directory)
open("/lib/vfp/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/vfp", 0x7ee54508)          = -1 ENOENT (No such file or directory)
open("/lib/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\214\317\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=129092, ...}) = 0
mmap2(NULL, 160612, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2abff000
mprotect(0x2ac1f000, 28672, PROT_NONE)  = 0
mmap2(0x2ac26000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1f) = 0x2ac26000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\214\177\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1238696, ...}) = 0
mmap2(NULL, 1275280, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2ac27000
mprotect(0x2ad51000, 32768, PROT_NONE)  = 0
mmap2(0x2ad59000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12a) = 0x2ad59000
mmap2(0x2ad5c000, 9616, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ad5c000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab5c000
set_tls(0x2ab5c4c0, 0x2ab5cb98, 0x2ab9a058, 0x2ab5c4c0, 0x2ab9a058) = 0
mprotect(0x2ad59000, 8192, PROT_READ)   = 0
mprotect(0x2ab99000, 4096, PROT_READ)   = 0
brk(0)                                  = 0x2012000
brk(0x2033000)                          = 0x2033000
open("/etc/fw_env.config", O_RDONLY)    = 3
fstat64(3, {st_mode=S_IFREG|0755, st_size=422, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ad5f000
read(3, "# Configuration file for fw_(pri"..., 4096) = 422
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x2ad5f000, 4096)                = 0
stat64("/dev/mtd0", {st_mode=S_IFCHR|0660, st_rdev=makedev(90, 0), ...}) = 0
mmap2(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aab0000
open("/dev/mtd0", O_RDONLY)             = 3
ioctl(3, MCE_GET_RECORD_LEN or MEMGETINFO or MFB_SET_CHROMA_KEY or MTRRIOC_SET_ENTRY, {type=MTD_NORFLASH, flags=MTD_WRITEABLE|MTD_BIT_WRITEABLE, size=0x100000, erasesize=0x10000, writesize=0x1, oobsize=0, padding=0xffffffff}) = 0
lseek(3, 524288, SEEK_SET)              = 524288
read(3, "\33\326PMbootdelay=3\0baudrate=115200\0"..., 262144) = 262144
close(3)                                = 0
open("/dev/mtd0", O_RDWR)               = 3
ioctl(3, MCE_GET_LOG_LEN or MEMERASE or MTRRIOC_DEL_ENTRY, {start=0x80000, length=0x40000}) = 0
lseek(3, 524288, SEEK_SET)              = 524288
write(3, "\307L\362Xbootdelay=3\0baudrate=115200\0"..., 262144) = 262144
close(3)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

所以这似乎是一个库问题。我正在使用 buildroot 来生成我的 ramfs,似乎有些库没有编译。为了修复 libgcc_s.so.1,我在我的 postbuild 脚本中直接从工具链的文件夹中添加了一个副本。对于 ldconfig 我现在不知道该怎么做。

G

4

2 回答 2

0

由于 fw_printenv 有效,因此您的 fw_env.config 是正确的,是的。

问题可能在于您的目标内核对存储环境的闪存芯片的支持。我已经看到闪存芯片在哪里有 U-Boot 支持的 UNLOCK 和 LOCK 命令,但内核 MTD 闪存芯片驱动程序不支持。请参阅擦除闪存或 ioctlmemunlock-return-status

请注意,上述文章的问题有很好的在目标上使用 mtd-utils 的示例。在您的情况下,您可以执行用户空间“mtd_debug info /dev/mtd0 | grep flags”来查看目标的 mtd0 分区是否可写。还可以检查例如“strace flash_erase 0xC0000 1”输出以查看驱动程序是否正在执行 ioctl(UNLOCK)。

于 2016-05-16T18:50:03.660 回答
0

我有照明!!!在我尝试在 uboot 中设置一个变量然后在用户空间中读回之后,我说“让我试试它现在是否有效......”并且它有效!我做了一些测试,问题是我的系统需要“sf probe 0x0; sf unlock;” 解锁包含环境变量的 SPI 内存!我会将它们添加到 bootcmd 中!谢谢!

于 2016-05-19T12:38:35.923 回答