先日、追加でCEV-RZ/A1L を数枚購入させていただき、評価をしておりますが、
プリインストールされているU-Bootにて不具合と思われる現象が発生しております。
概要を申しますと、saveenv にて環境設定を SPIフラッシュに書き込むと、
1バイト前にずれて書き込まれてしまうのではないか?という問題です。
fw_printenv を使いたいので何とか解決したいと思いますが、どのような対策が取れますか?
以下にその調査結果を示します。
まず、fw_printenv で Bad CRCエラーが出てしまい、異変に気がつきました。
===============================
# fw_printenv
Warning: Bad CRC, using default environment
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
===============================
設定は以下です
===============================
# cat /etc/fw_env.config
# Configuration file for fw_(printenv/setenv) utility.
# Up to two entries are valid, in this case the redundant
# environment sector is assumed present.
# Notice, that the "Number of sectors" is ignored on NOR and SPI-dataflash.
# Futhermore, if the Flash sector size is ommitted, this value is assumed to
# be the same as the Environment size, which is valid for NOR and SPI-dataflash
# MTD device name Device offset Env. size Flash sector size Number of sectors
/dev/mtd1 0x0000 0x1000 0x10000
===============================
SPIフラッシュをダンプしました。先頭のCRCが3バイトしか無い?、末尾も1バイト足りない?
===============================
# hexdump -C /dev/mtd1
00000000 b9 3c 93 62 61 75 64 72 61 74 65 3d 31 31 35 32 |.<.baudrate=1152|
00000010 30 30 00 62 6f 6f 74 61 72 67 73 3d 63 6f 6e 73 |00.bootargs=cons|
00000020 6f 6c 65 3d 74 74 79 53 43 33 2c 31 31 35 32 30 |ole=ttySC3,11520|
00000030 30 20 72 6f 6f 74 3d 2f 64 65 76 2f 73 64 61 31 |0 root=/dev/sda1|
00000040 20 72 77 20 72 6f 6f 74 64 65 6c 61 79 3d 33 00 | rw rootdelay=3.|
00000050 62 6f 6f 74 64 65 6c 61 79 3d 33 00 65 74 68 61 |bootdelay=3.etha|
00000060 63 74 3d 73 68 5f 65 74 68 00 65 74 68 61 64 64 |ct=sh_eth.ethadd|
00000070 72 3d 30 30 3a 61 30 3a 30 62 3a 30 32 3a 31 34 |r=00:a0:0b:02:14|
00000080 3a 33 36 00 67 61 74 65 77 61 79 69 70 3d 31 39 |:36.gatewayip=19|
00000090 32 2e 31 36 38 2e 30 2e 31 00 69 70 61 64 64 72 |2.168.0.1.ipaddr|
000000a0 3d 31 39 32 2e 31 36 38 2e 30 2e 78 78 00 6e 65 |=192.168.0.xx.ne|
000000b0 74 6d 61 73 6b 3d 32 35 35 2e 32 35 35 2e 32 35 |tmask=255.255.25|
000000c0 35 2e 30 00 72 3d 62 6f 6f 74 6d 20 63 30 30 30 |5.0.r=bootm c000|
000000d0 30 30 30 00 73 65 72 76 65 72 69 70 3d 31 39 32 |000.serverip=192|
000000e0 2e 31 36 38 2e 30 2e 31 00 73 74 64 65 72 72 3d |.168.0.1.stderr=|
000000f0 73 65 72 69 61 6c 00 73 74 64 69 6e 3d 73 65 72 |serial.stdin=ser|
00000100 69 61 6c 00 73 74 64 6f 75 74 3d 73 65 72 69 61 |ial.stdout=seria|
00000110 6c 00 75 73 62 62 6f 6f 74 3d 75 73 62 20 73 74 |l.usbboot=usb st|
00000120 61 72 74 3b 65 78 74 32 6c 6f 61 64 20 75 73 62 |art;ext2load usb|
00000130 20 30 20 63 30 30 30 30 30 30 20 2f 62 6f 6f 74 | 0 c000000 /boot|
00000140 2f 75 49 6d 61 67 65 3b 62 6f 6f 74 6d 20 63 30 |/uImage;bootm c0|
00000150 30 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 |00000...........|
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000ff0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff |................|
00001000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00010000
===============================
まえのパーティションの末尾に1バイトCRCらしきものがある
===============================
# hexdump -C /dev/mtd0 |tail
0002df00 00 00 00 10 00 07 00 5d 00 00 00 c0 b3 08 20 00 |.......]...... .|
0002df10 00 00 00 10 00 0a 00 43 00 00 00 a8 de 04 20 00 |.......C...... .|
0002df20 00 00 00 10 00 08 00 3e 00 00 00 58 df 04 20 00 |.......>...X.. .|
0002df30 00 00 00 10 00 08 00 35 00 00 00 a8 de 04 20 00 |.......5...... .|
0002df40 00 00 00 10 00 07 00 01 00 00 00 00 00 02 20 00 |.............. .|
0002df50 00 00 00 10 00 01 00 ff ff ff ff ff ff ff ff ff |................|
0002df60 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
0006fff0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff bd |................|
00070000
===============================
参考:CKB-RZ/A1H の結果です。
設定
===============================
# cat /etc/fw_env.config
# Configuration file for fw_(printenv/setenv) utility.
# Up to two entries are valid, in this case the redundant
# environment sector is assumed present.
# Notice, that the "Number of sectors" is ignored on NOR and SPI-dataflash.
# Futhermore, if the Flash sector size is ommitted, this value is assumed to
# be the same as the Environment size, which is valid for NOR and SPI-dataflash
# MTD device name Device offset Env. size Flash sector size Number of sectors
/dev/mtd2 0x0000 0x800 0x10000
===============================
正しく表示されます
===============================
# fw_printenv
baudrate=115200
bootargs=console=ttySC0,115200
bootcmd=fread_kernel 0x0C007FC0;bootm 0x0C007FC0
bootdelay=3
ethact=sh_eth
ethaddr=00:a0:0b:02:16:85
fk=flash_titleimage 0x20100000;flash_kernel 0x0C007FC0
r=bootm 0x0C007FC0
spiboot=fread_kernel 0x0C007FC0;bootm 0x0C007FC0
stderr=serial
stdin=serial
stdout=serial
usbboot=usb start;fatload usb 0 0x0C007FC0 /uImage.bin;bootm 0x0C007FC0
#
===============================
CRCは4バイトあります
===============================
# hexdump -C /dev/mtd2
00000000 38 80 7f 78 62 61 75 64 72 61 74 65 3d 31 31 35 |8..xbaudrate=115|
00000010 32 30 30 00 62 6f 6f 74 61 72 67 73 3d 63 6f 6e |200.bootargs=con|
00000020 73 6f 6c 65 3d 74 74 79 53 43 30 2c 31 31 35 32 |sole=ttySC0,1152|
00000030 30 30 00 62 6f 6f 74 63 6d 64 3d 66 72 65 61 64 |00.bootcmd=fread|
00000040 5f 6b 65 72 6e 65 6c 20 30 78 30 43 30 30 37 46 |_kernel 0x0C007F|
00000050 43 30 3b 62 6f 6f 74 6d 20 30 78 30 43 30 30 37 |C0;bootm 0x0C007|
00000060 46 43 30 00 62 6f 6f 74 64 65 6c 61 79 3d 33 00 |FC0.bootdelay=3.|
00000070 65 74 68 61 63 74 3d 73 68 5f 65 74 68 00 65 74 |ethact=sh_eth.et|
00000080 68 61 64 64 72 3d 30 30 3a 61 30 3a 30 62 3a 30 |haddr=00:a0:0b:0|
00000090 32 3a 31 36 3a 38 35 00 66 6b 3d 66 6c 61 73 68 |2:16:85.fk=flash|
000000a0 5f 74 69 74 6c 65 69 6d 61 67 65 20 30 78 32 30 |_titleimage 0x20|
000000b0 31 30 30 30 30 30 3b 66 6c 61 73 68 5f 6b 65 72 |100000;flash_ker|
000000c0 6e 65 6c 20 30 78 30 43 30 30 37 46 43 30 00 72 |nel 0x0C007FC0.r|
000000d0 3d 62 6f 6f 74 6d 20 30 78 30 43 30 30 37 46 43 |=bootm 0x0C007FC|
000000e0 30 00 73 70 69 62 6f 6f 74 3d 66 72 65 61 64 5f |0.spiboot=fread_|
000000f0 6b 65 72 6e 65 6c 20 30 78 30 43 30 30 37 46 43 |kernel 0x0C007FC|
00000100 30 3b 62 6f 6f 74 6d 20 30 78 30 43 30 30 37 46 |0;bootm 0x0C007F|
00000110 43 30 00 73 74 64 65 72 72 3d 73 65 72 69 61 6c |C0.stderr=serial|
00000120 00 73 74 64 69 6e 3d 73 65 72 69 61 6c 00 73 74 |.stdin=serial.st|
00000130 64 6f 75 74 3d 73 65 72 69 61 6c 00 75 73 62 62 |dout=serial.usbb|
00000140 6f 6f 74 3d 75 73 62 20 73 74 61 72 74 3b 66 61 |oot=usb start;fa|
00000150 74 6c 6f 61 64 20 75 73 62 20 30 20 30 78 30 43 |tload usb 0 0x0C|
00000160 30 30 37 46 43 30 20 2f 75 49 6d 61 67 65 2e 62 |007FC0 /uImage.b|
00000170 69 6e 3b 62 6f 6f 74 6d 20 30 78 30 43 30 30 37 |in;bootm 0x0C007|
00000180 46 43 30 00 00 00 00 00 00 00 00 00 00 00 00 00 |FC0.............|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000800 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00020000
===============================
前パーティションの末尾も正常です
===============================
# hexdump -C /dev/mtd1 | tail
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00060000
===============================
よろしくお願いいたします。