2016-05-16 18 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 +++ 

так кажется Lib проблему. Я использую buildroot для генерации своих ramfs, и кажется, что некоторые библиотеки не скомпилированы. Чтобы исправить libgcc_s.so.1, я добавил в свой сценарий postbuild копию непосредственно из папки инструментальной цепочки. Для ldconfig я не знаю, что делать в данный момент.

G

+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 правильно, да.

Проблема может заключаться в поддержке целевого ядра флэш-чипа, где хранится среда. Я видел, где флеш-чип имел команды UNLOCK и LOCK, поддерживаемые U-Boot, но не с помощью драйвера чипа ядра MTD. См. erasing-flash-nor-ioctlmemunlock-return-status.

Обратите внимание, что в приведенном выше вопросе статьи есть хорошие примеры использования mtd-utils для цели. В вашем случае вы можете сделать userpace «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! Благодаря!