プリインストールのU-Boot の saveenv で書き込まれる位置がずれている?

417 views
Skip to first unread message

Toshikazu Honda

unread,
Aug 25, 2016, 5:47:24 AM8/25/16
to cevrza1l-board

先日、追加で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

===============================


よろしくお願いいたします。

Toshikazu Honda

unread,
Aug 25, 2016, 6:06:43 AM8/25/16
to cevrza1l-board
自己レスですが、U-Boot側のバグではなく、LinuxのSPIフラッシュドライバ側の問題のようです。
他のパーティションを読んでも全て1バイト前にずれて読めているようです。
CKB-RZ/A1Hのドライバと比較してみます。

2016年8月25日木曜日 18時47分24秒 UTC+9 Toshikazu Honda:

Toshikazu Honda

unread,
Aug 25, 2016, 9:10:37 PM8/25/16
to cevrza1l-board
さらに自己レス
U-Bootでも読んでみたが、やはりカーネル側ですね。
SPIフラッシュや、SPIBSCのドライバ読んでますがまだ判っていません。
挙動から見てもっと上位か、ボードの初期設定かといったところでしょうか...

=> md.b 18000000  ←U-Bootの先頭
18000000: 15 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5    ................
18000010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5    ................
18000020: 20 02 02 20 80 02 02 20 e0 02 02 20 40 03 02 20     .. ... ... @..
18000030: a0 03 02 20 00 04 02 20 60 04 02 20 78 56 34 12    ... ... `.. xV4.

=> md.b 18070000  ←環境設定(CRCが正しく4バイト入っている)
18070000: bd b9 3c 93 62 61 75 64 72 61 74 65 3d 31 31 35    ..<.baudrate=115
18070010: 32 30 30 00 62 6f 6f 74 61 72 67 73 3d 63 6f 6e    200.bootargs=con
18070020: 73 6f 6c 65 3d 74 74 79 53 43 33 2c 31 31 35 32    sole=ttySC3,1152
18070030: 30 30 20 72 6f 6f 74 3d 2f 64 65 76 2f 73 64 61    00 root=/dev/sda

2016年8月25日木曜日 19時06分43秒 UTC+9 Toshikazu Honda:
Reply all
Reply to author
Forward
0 new messages