我用的是韦东山的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 #
那位大佬帮我看看是哪里的问题,不胜感激。

解决方案 »

  1.   

    正常启动boot的情况下,能访问nand flash吗?
      

  2.   

    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()函数没有执行到,查了很久,都没有找到原因,宏也是开着的
      

  3.   

    反汇编文件是
    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
    不知道是不是这个原因,求大佬解惑
      

  4.   

    函数原型第一行是自己加的打印
    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;
    }
      

  5.   

    NAND读写要加ECC校验的,完了你还得知道你的NAND是支不支持大页读写。注意这两个问题,不然就可能出现写入成功,但重启丢失的情况。