求助!!2016.09.01版u-boot环境变量设置问题

十拿&九稳 2018-07-16 12:48:56
我用的是韦东山的JZ2440开发板,在移植u-boot时我想把环境变量放到nand flash里面,可在include/configs/xxx.h里,添加
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x00080000
#define CONFIG_ENV_SIZE 0x20000
#define CONFIG_ENV_RANGE CONFIG_ENV_SIZE
#define CONFIG_ENV_OVERWRITE


结果就卡死在这里

U-Boot 2016.09.01 (Jul 14 2018 - 07:07:45 -0700)

CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
NAND: 256 MiB



如果把CONFIG_ENV_IS_IN_NAND换成
#define CONFIG_ENV_IS_IN_FLASH会报错
common/built-in.o:(.data.env_ptr+0x0): undefined reference to `environment'

只有加上
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
才能编译通过
并且不会卡住各项功能都能实现,只是不能save环境变量
U-Boot 2016.09.01 (Jul 15 2018 - 21:08:43 -0700)

CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
NAND: 256 MiB
*** Warning - bad CRC, using default environment

In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
JZ2440 #
JZ2440 #
JZ2440 #
JZ2440 # help
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootelf - Boot from an ELF image in memory
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootvx - Boot vxWorks from an ELF image
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
.....................
.....................
.....................

JZ2440 # print
baudrate=115200
bootargs=console=ttySAC0 root=/dev/mtdblock3
bootcmd=nand read 30000000 kernel 0x200000;bootm 30000000
bootdelay=5
ethact=dm9000
ethaddr=00:0c:29:4b:e4:f4
ipaddr=192.168.2.5
netmask=255.255.255.0
serverip=192.168.2.1
stderr=serial
stdin=serial
stdout=serial

Environment size: 299/131068 bytes
JZ2440 #


那位大佬帮我看看是哪里的问题,不胜感激。
...全文
914 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38378662 2018-12-19
  • 打赏
  • 举报
回复
NAND读写要加ECC校验的,完了你还得知道你的NAND是支不支持大页读写。注意这两个问题,不然就可能出现写入成功,但重启丢失的情况。
十拿&九稳 2018-07-20
  • 打赏
  • 举报
回复
函数原型第一行是自己加的打印
int saveenv(void)
{
printf("saveenv()\n");
int ret = 0;
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
int env_idx = 0;
static const struct env_location location[] = {
{
.name = "NAND",
.erase_opts = {
.length = CONFIG_ENV_RANGE,
.offset = CONFIG_ENV_OFFSET,
},
},
#ifdef CONFIG_ENV_OFFSET_REDUND
{
.name = "redundant NAND",
.erase_opts = {
.length = CONFIG_ENV_RANGE,
.offset = CONFIG_ENV_OFFSET_REDUND,
},
},
#endif
};


if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
return 1;

ret = env_export(env_new);
if (ret)
return ret;

#ifdef CONFIG_ENV_OFFSET_REDUND
env_new->flags = ++env_flags; /* increase the serial */
env_idx = (gd->env_valid == 1);
#endif

ret = erase_and_write_env(&location[env_idx], (u_char *)env_new);
#ifdef CONFIG_ENV_OFFSET_REDUND
if (!ret) {
/* preset other copy for next write */
gd->env_valid = gd->env_valid == 2 ? 1 : 2;
return ret;
}

env_idx = (env_idx + 1) & 1;
ret = erase_and_write_env(&location[env_idx], (u_char *)env_new);
if (!ret)
printf("Warning: primary env write failed,"
" redundancy is lost!\n");
#endif

return ret;
}
十拿&九稳 2018-07-20
  • 打赏
  • 举报
回复
反汇编文件是
33f07268 <do_env_save>:
33f07268: e59f3028 ldr r3, [pc, #40] ; 33f07298 <do_env_save+0x30>
33f0726c: e92d4010 push {r4, lr}
33f07270: e5931000 ldr r1, [r3]
33f07274: e59f0020 ldr r0, [pc, #32] ; 33f0729c <do_env_save+0x34>
33f07278: eb009010 bl 33f2b2c0 <printf>
33f0727c: e59f001c ldr r0, [pc, #28] ; 33f072a0 <do_env_save+0x38>
33f07280: e5991024 ldr r1, [r9, #36] ; 0x24
33f07284: eb00900d bl 33f2b2c0 <printf>
33f07288: eb0011cd bl 33f0b9c4 <saveenv>
33f0728c: e2500000 subs r0, r0, #0
33f07290: 13a00001 movne r0, #1
33f07294: e8bd8010 pop {r4, pc}
33f07298: 33f39f78 mvnscc r9, #480 ; 0x1e0
33f0729c: 33f3533d mvnscc r5, #-201326592 ; 0xf4000000
33f072a0: 33f3535a mvnscc r5, #1744830465 ; 0x68000001

saveenv()函数地址在
33f0b9c4 <saveenv>:
33f0b9c4: e92d41f0 push {r4, r5, r6, r7, r8, lr}
33f0b9c8: e24dd802 sub sp, sp, #131072 ; 0x20000
33f0b9cc: e24dd020 sub sp, sp, #32
33f0b9d0: e28d4020 add r4, sp, #32
。。。。。。。。。。。。

不知道是不是这个原因,求大佬解惑
十拿&九稳 2018-07-20
  • 打赏
  • 举报
回复
nand falsh 读/写/擦除都可以,我一直用这个u-boot烧写程序,现在又出现新的问题
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
JZ2440 # save
Saving Environment to NAND...
env_valid = 1



加的打印,执行到
static int do_env_save(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[])
{
printf("Saving Environment to %s...\n", env_name_spec);
printf("env_valid = %ld",gd->env_valid);
return saveenv() ? 1 : 0;
}
saveenv()函数没有执行到,查了很久,都没有找到原因,宏也是开着的
zhxianbin 2018-07-18
  • 打赏
  • 举报
回复
这要加打印一步步调试才能知道
低吟浅唱~ 2018-07-16
  • 打赏
  • 举报
回复
你在说什么00
leochen_career 2018-07-16
  • 打赏
  • 举报
回复
正常启动boot的情况下,能访问nand flash吗?

1,025

社区成员

发帖
与我相关
我的任务
社区描述
Linux /Unix kernel支持不同的硬件体系,X86, ARM, MIPS, 等等
社区管理员
  • CPU和硬件区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧