2016-05-16 248 views
0

我得到一個奇怪的行爲。 從uboot printenv和saveenv能正常工作。 從用戶空間fw_printenv起作用,fw_setenv不保存任何內容,並且不會給出任何錯誤或反饋。fw_setenv不起作用,fw_printev在我的系統中做

這是我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 +++ 

的strace的看起來是這樣的一個lib問題。 我正在使用buildroot來生成我的ramfs,而且似乎有些庫沒有編譯。要修復libgcc_s.so.1,我在postbuild腳本中添加了一個直接來自工具鏈文件夾的副本。對於ldconfig我不知道該怎麼做。

+0

是基於主線源的你的U-Boot和Kernel;如果是這樣,你能告訴我們這些版本嗎?什麼閃存芯片可以在你的目標上保存U-Boot環境? –

+0

而你正面fw_printenv正在工作?即你在U-Boot中設置一個變量並將其打印在Linux中?默認情況下,如果將工具和U-Boot二進制文件一起構建,然後使用您獲得的工具,那麼它們將包含默認環境。除非你做'fw_printenv>/dev/null'(這樣你仍然可以看到stderr出現問題),否則很容易錯過最初的錯誤。 –

+0

不,uboot和內核都來自芯片供應商的SDK。 – JosephITA

回答

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)。

+0

我不太確定fw_printenv是否真的有效。如果U-Boot本身被配置爲使用冗餘環境,則fw_printenv仍將打印某些內容,但它可能是環境的舊副本。 – Arnout

0

我有照明!在我嘗試在uboot中設置一個變量然後回讀用戶空間後,我說「讓我試一下,如果它現在可以工作......」,它就起作用了!我做了一些測試,問題是我的系統需要「sf probe 0x0; sf unlock;」解鎖包含環境變量的SPI內存!我將把它們添加到bootcmd中!謝謝!

相關問題