代码之家  ›  专栏  ›  技术社区  ›  user2427839

从U引导shell模式写入NVRAM

  •  2
  • user2427839  · 技术社区  · 10 年前

    带有嵌入式系统的硬件设备。NVRAM已损坏,我想更换NVRAM。是否可以在U-boot shell模式下更新NVRAM? U-boot提供升级固件、U-boot、uimage和其他组件的选项:U-boot代码的两个示例:

    update_uboot=tftpboot 0x80000100 u-boot.bin && protect off 0x48000000 +${filesize} && erase 0x48000000 +${filesize} && sleep ${sdelay} && cp.b ${fileaddr} 0x48000000 ${filesize} && protect on 0x48000000 +${filesize}
    
    update_uimage=tftpboot 0x80000100 uImage && protect off ${UBFIADDR1} +${filesize} && erase ${UBFIADDR1} +${filesize} && sleep ${sdelay} && cp.b ${fileaddr} ${UBFIADDR1} ${filesize} && protect on ${UBFIADDR1} +${filesize}
    

    U引导代码中没有任何NVRAM升级的指导或提示。nvram.bin偏移地址在u-boot设置中指定,是否可以从u-boot shell模式替换nvram?如何从u-boot shell中解锁NVRAM以进行写入?我尝试写入NVRAM,但它不允许。

    这是U型靴 dump 所有命令都在里面。 Spansion串行闪存S25FL064A

    1 回复  |  直到 10 年前
        1
  •  2
  •   sawdust    10 年前

    您提供了以下U-Boot命令输出:

    => md nvram
    00000000: 7b1b1185 77ef4e0f 20082c8c 561a45d0    {...w.N. .,.V.E.
    00000010: 699012a1 c36840a9 8f825272 9fd95faf    i....h@...Rr.._.
    ... 
    

    这是“nvram”的虚假数据。
    打印环境 输出,没有环境变量名“nvram”。
    符号“nvram”似乎未定义,似乎默认值为0。

    基于内核命令行和MTD分区映射 “NVRAM” 可能不是存储设备,而是Spansion串行闪存芯片中的一个分区,即。

    partitions[4] = {.name = nvram, .offset = 0x007b0000,.size = 0x00050000 (320K) }
    

    如果是这样,该分区显然会映射到U-Boot中的0x487b0000到0x487fffff。

    您应该能够使用命令检查该分区的数据

    md 0x487b0000  
    

    如果您想复制它,应该引导到Linux并使用 命令

    dd if=/dev/mtdblock4 of=save_nvram.img
    

    将此图像文件与要写入的文件进行比较,以查看其是否已损坏。

    是否可以在U-boot shell模式下更新NVRAM?

    假设“NVRAM”实际上是串行闪存末尾的分区,那么是的。
    根据两个更新变量的命令语法,以下U-Boot命令应完成任务:

    tftpboot 0x80001000 new_nvram.img
    protect off 0x487b0000 +0x50000
    erase 0x487b0000 +0x50000
    cp.b 0x80001000 0x487b0000 0x50000
    protect on 0x487b0000 +0x50000
    

    注:
    你提供的信息不一致。
    从U-Boot 打印环境 命令 引导参数 定义为:

    root=/dev/mtdblock5 mtdparts=physmap-flash.0:512k(U-Boot)ro,256K(env1),256K(env2),0x40000(script),0x140000(Kernel),0x140000(RootFileSystem),5M@1M(UBFI1),5M(UBFI2) console=ttyS0,115200n8 ethaddr0=${ethaddr}
    

    但是内核日志表明实际传递的命令行是

    root=/dev/mtdblock3 mtdparts=spansion:0x20000(U-Boot)ro,0x10000(env1),0x10000(env2),0x2d0000@0x4a0000(fWare-FS),0x50000@0x7B0000(nvram),0x3B0000@0x40000(UBFI1),0x3B0000@0x3F0000(UBFI2) console=ttyS0,115200n8