Linux 从U-boot外壳模式写入NVRAM

Linux 从U-boot外壳模式写入NVRAM,linux,memory,memory-management,embedded,u-boot,Linux,Memory,Memory Management,Embedded,U Boot,具有嵌入式系统的硬件设备。NVRAM已损坏,我想更换NVRAM。是否可以从U-boot外壳模式内更新NVRAM? U-boot提供升级固件、U-boot、uimage和其他组件的选项:U-boot代码中的两个示例: update_uboot=tftpboot 0x80000100 u-boot.bin && protect off 0x48000000 +${filesize} && erase 0x48000000 +${filesize} &&

具有嵌入式系统的硬件设备。NVRAM已损坏,我想更换NVRAM。是否可以从U-boot外壳模式内更新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-boot代码中没有NVRAM升级的任何说明或提示。nvram.bin偏移地址在u-boot设置中指定,是否可以从u-boot外壳模式替换nvram?如何从u-boot外壳中解锁NVRAM进行写入?我尝试写入NVRAM,但它不允许

这是U-boot,里面有所有命令。
span SION串行闪存S25FL064A

您提供了以下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中通过0x487fffff映射到0x487b0000

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

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

dd if=/dev/mtdblock4 of=save_nvram.img
将此图像文件与要写入的图像文件进行比较,以查看它是否确实已损坏

是否可以从U-boot外壳模式内更新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-Bootprintenv命令中,bootargs定义为:

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}
但是内核日志表明实际传递的comand行是

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

您还可以详细说明当您尝试引导时会发生什么吗?因为这与软件开发/编程无关,所以可能与此无关。然而,我不确定它应该去哪里。引导加载程序工作正常。我试图找到如何访问nvram进行写入。我想问的是,您如何知道nvram已损坏,以及是否可以从固件中引导设备来修改nvram。您的问题无法回答,因为您尚未描述硬件配置。“NVRAM”是一个通用术语,U-Boot通常使用不同的命令处理NAND闪存、串行闪存和EEPROM。
命令输出有什么帮助?用于更新U-Boot和内核映像的这两个环境变量表明,无论使用什么存储设备,都是映射到地址空间的软内存。此内存映射应该在启动时显示,因此您应该将所有U-Boot启动输出粘贴到您的帖子中。感谢您帮助解决此问题。我以前尝试过这个命令,但没有成功——因为我使用了错误的NVRAM地址格式:0x007b0000,而不是0x487b0000。因此,我得到了
错误:结束地址(0x007fffff)不在闪存中!地址格式不正确。
更换NVRAM后,管理界面再次启动,因此可以肯定,这是NVRAM的问题。仅供参考,以下是升级前后的信息。注意:是否可以使用U-boot shell命令通过tftp将nvram复制并下载到计算机?注意:是的,U-boot printenv命令和内核日志(实际命令)的引导参数不一致。我想这是因为固件是在不同的硬件上开发和编译的。我是否应该将U-boot设置中的bootarg更改为内核日志中的实际值?正确的语法是什么?“是否可以通过tftp将nvram复制并下载到使用U-boot的计算机上”--不,U-boot的tftp是从服务器到目标的单向传输。“我应该更改引导参数吗”--我不确定这是否来自同一块板。您或维护该板的人员需要记住,内置命令行是使用的,而不是从U-Boot使用的。如果要使它们相同,则需要学习基本的U-Boot命令,如setenv和saveenv。使用
setenv bootargs root=…
,其中“root=…”文本与实际内核命令行相同。