バックアップNANDフラッシュメモリ領域

バックアップNANDフラッシュメモリ領域

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

NANDとは何かオフセットアドレスこれには何が必要ですか? ダンプするパーティション サイズが指定されていません。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"

NVRAM オフセット アドレスですか0x01f00000? NVRAM サイズはいくらですか? 0x80000 ですか? U-boot にもコマンドがありますmd - memory display

=> help md
md - memory display
Usage:
md [.b, .w, .l] address [# of objects]
=>

ターミナルに nvram を表示するコマンドを試しましたmd.b 0x01f00000 0x80000が、何も出力されず、ターミナルがハングアップしました。


編集: [追加]

# 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 dumb は、あなたが考えているようには動作しません。

デバイスを入手する

nand info

デバイスを設定する

nand device nand0

パーティションの名前を使用するだけです

nand read 0x20000000 NVRAM 0x00080000

これが何をするかを明確にするために、パーティションの nvram から 524288 (16 進数で 0x00080000) バイトをメモリ位置 0x20000000 に読み取ります。パーティション全体が必要な場合は、サイズを省略することもできます。

nand read 0x20000000 NVRAM

NVRAM をメモリに書き込む必要があるので、それをどこかに書き込む必要があります。ext4 ファイル システムとします。

ext4write LINUX_ROOTFS /NVRAM.img 0x20000000 0x00080000

関連情報