板载 Linux 版本 2.6.26.5 嵌入式系统。设备使用完整的图像内核。文件系统存储在 NAND 闪存上,Hynix NAND 32MiB 3,3V 8 位。
# printenv
baudrate=115200
ethaddr=FF:FF:FF:FF:FF:FF
netmask=255.255.255.0
ipaddr=192.168.1.1
serverip=192.168.1.100
bootfile=firetux.kernel
bootcmd1=setenv bootargs ${bootargs} && nboot 0x20200000 0 ${image_addr} && bootm 0x20200000
bootcmd2=setenv bootargs ${bootargs} && tftpboot 20200000 firetux.kernel && bootm 20200000
phymode=auto
mtdids=nand0=gen_nand
unlock=yes
verify=y
update.uboot=echo Update u-boot && tftpboot 0x20000000 nandboot.flash && nand erase 0x0 0x03ffff && nand write.jffs2 0x20000000 0x0 ${filesize}
update.kernel=echo Update kernel && tftpboot 0x20000000 uImage && nand erase 0x80000 0x180000 && nand write.jffs2 20000000 0x80000 0x180000
update.romimg=echo Update RomImage && tftpboot 0x20000000 romimage.img && nand erase 0x80000 0x13e0000&& nand write.jffs2 20000000 0x80000 ${filesize}
update.halfimg=echo Update HalfImage && tftpboot 0x20000000 recovery.img && nand erase 0x1460000 0x700000&& nand write.jffs2 20000000 0x1460000 ${filesize}
eraseenv=echo Erase Environment && nand erase 0x60000 0x20000
HwModel=Hw_Model=NXPi02
bootcmd=run bootcmd1
halfImage=half_image=0
cy_boot_code_ver=1.0.1 (Oct 6 2011 - 20:04:00)
RouterMode=Router_Mode=0
stdin=serial
stdout=serial
stderr=serial
bootcmd=run bootcmd1
image_addr=0x80000
bootargs=console=ttyS1,115200n8 rootfstype=squashfs noalign half_image=0 verify=y Hw_Model=NXPi02 Router_Mode=0
ethact=ETN1
bootdelay=3
需要从 U-boot 备份 NAND 存储器(NVRAM)的某些区域,通过串行接口(UART)连接到板,网络连接不可用。 U-boot 有一些管理 nand 内存的选项:
# help nand
nand info - show available NAND devices
nand device [dev] - show or set current device
nand read - addr off|partition size
nand write - addr off|partition size
read/write 'size' bytes starting at offset 'off'
to/from memory address 'addr', skipping bad blocks.
nand erase [clean] [off size] - erase 'size' bytes from
offset 'off' (entire device if not specified)
nand bad - show bad blocks
nand dump[.oob] off - dump page
nand scrub - really clean NAND erasing bad blocks (UNSAFE)
nand markbad off - mark bad block at offset (UNSAFE)
nand biterr off - make a bit error at offset (UNSAFE)
尤其,nand dump[.oob] off - dump page
什么是与非偏移地址为了这?没有指定要转储的分区大小。我需要转储整个 NVRAM。
设备加载内核映像后,会创建 11 个 MTD 分区:
Creating 11 MTD partitions on "gen_nand":
0x00000000-0x00060000 : "u-boot"
0x00060000-0x00080000 : "u-bootenv"
0x00080000-0x01460000 : "ROMIMAGE"
0x01460000-0x01b60000 : "HALFIMAGE"
0x00200000-0x01460000 : "LINUX_ROOTFS"
0x01b60000-0x01d60000 : "HS_FW"
0x01d60000-0x01e60000 : "FPAR"
0x01e60000-0x01ee0000 : "SNOM"
0x01ee0000-0x01f00000 : "EEPROM"
0x01f00000-0x01f80000 : "NVRAM"
0x01f80000-0x02000000 : "CA_DATA"
是0x01f00000
nvram偏移地址吗? nvram 大小是多少?是0x80000吗? U-boot也有命令md - memory display
。
=> help md
md - memory display
Usage:
md [.b, .w, .l] address [# of objects]
=>
我尝试使用命令md.b 0x01f00000 0x80000
在终端上显示 nvram,但它不输出任何内容,终端挂起。
编辑:[补充]
# nand info
Device 0: NAND 32MiB 3,3V 8-bit, sector size 16 KiB
# nand device nand0
Device 0: NAND 32MiB 3,3V 8-bit... is now current device
# nand read 0x20000000 NVRAM
NAND read: mtdparts variable not set, see 'help mtdparts'
incorrect device type in NVRAM
'NVRAM' is not a number
# nand read 0x20000000 0x01f00000 0x00080000
NAND read: device 0 offset 0x1f00000, size 0x80000
524288 bytes read: OK
BusyBox v1.10.2 (2015-09-06 10:58:05 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
/bin/sh: can't access tty; job control turned off
# help
Built-in commands:
-------------------
. : [ [[ alias bg break cd chdir continue echo eval exec exit
export false fg hash help jobs let local pwd read readonly return
set shift source test times trap true type ulimit umask unalias
unset wait
# ext4write LINUX_ROOTFS /NVRAM.img 0x20000000 0x00080000
/bin/sh: ext4write: not found
答案1
您需要更加小心地使用命令。 md 命令显示该位置的内存。当您使用 md.b 时,它以字节为单位输出,这无疑会混淆您的 tty。你的命令基本上是说通过线路向我发送内存中从 0x01f00000 到 0x01f00000 + 0x80000 的所有字节。而且 nand mud 不会做你认为它会做的事情。
获取设备
nand info
设置您的设备
nand device nand0
只需使用分区名称即可
nand read 0x20000000 NVRAM 0x00080000
要清楚它的作用:从分区 nvram 读取 524288(十六进制为 0x00080000)字节到内存位置 0x20000000。如果您想要整个分区,您也可以省略大小。
nand read 0x20000000 NVRAM
现在 NVRAM 已在内存中,您需要将其写入某处。假设有一个 ext4 文件系统。
ext4write LINUX_ROOTFS /NVRAM.img 0x20000000 0x00080000