在我的系统中,我得到了一个奇怪的行为。 从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
的结果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 +++
所以这似乎是一个lib问题。 我正在使用buildroot生成我的ramfs,似乎有些库没有编译。为了修复libgcc_s.so.1,我在postbuild脚本中直接从工具链的文件夹中添加了一个副本。对于ldconfig,我现在不知道该怎么做。
答案 0 :(得分:0)
由于fw_printenv有效,你的fw_env.config是正确的,是的。
问题可能在于您的目标内核支持存储环境的闪存芯片。我已经看到闪存芯片在U-Boot支持UNLOCK和LOCK命令的地方,而不是内核MTD闪存芯片驱动程序。请参阅erasing-flash-nor-ioctlmemunlock-return-status。
注意上面的文章提到了在目标上使用mtd-utils的好例子。在您的情况下,您可以执行用户空间“mtd_debug info / dev / mtd0 | grep flags”以查看目标的mtd0分区是否可写。例如,可以检查“strace flash_erase 0xC0000 1”输出以查看驱动程序是否正在执行ioctl(UNLOCK)。
答案 1 :(得分:0)
我有照明!!!在我尝试在uboot中设置一个变量然后在用户空间中回读之后,我说“让我尝试一下,如果它现在可以工作......”并且它有效!我做了一些测试,问题是我的系统需要“sf probe 0x0; sf unlock;”解锁包含环境变量的SPI内存!我将它们添加到bootcmd中!谢谢!