我用的是韦东山的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 environmentIn: 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=serialEnvironment size: 299/131068 bytes
JZ2440 #
那位大佬帮我看看是哪里的问题,不胜感激。
#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 environmentIn: 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=serialEnvironment size: 299/131068 bytes
JZ2440 #
那位大佬帮我看看是哪里的问题,不胜感激。
解决方案 »
- Requires: libpython2.4.so.1.0()(64bit)
- nohup运行shell脚本kill命令后代码不执行
- linuxc问题
- 鸟哥linux学习视频
- centos使用yum groupinstall "Development Tools" 安装时出错,请帮忙看看
- ubuntu 18.04 desktop 如何安装 xrdp?
- linux 下udp可以实现本机数据收发,但是不能收到外部数据。另一现象,板子能够ping通电脑但是电脑ping不通板子
- 各大阅读平台自动阅读刷金币脚本
- 求助:外网不能访问LAMP架设的网站(局域网可以访问)
- Ubuntu有时候会在开机的时候卡住,按了一下方向键,就出现了这个
- 华硕主板BIOS 从独立显卡改成集成显卡显示
- 重启后默认网关需要重新设置
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()函数没有执行到,查了很久,都没有找到原因,宏也是开着的
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 ; 0x68000001saveenv()函数地址在
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
不知道是不是这个原因,求大佬解惑
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;
}