GENMAIボードでのブートについて

Hiroです。

GENMAIボードでLinux搭載を実施しています。

NORフラッシュにブートを書き込んだ場合は、ブートが起動するのですが、

シリアルフラッシュにブートを書き込んだ場合、ブートが起動しません。

(ブートの起動は、USBからカーネルのダウンロードを実行することで起動と判断しております)

初期設定から変更したSWは以下です。

JP5:1-2、JP8:Short、SW1-1:OFF、SW1-3:OFF

シリアルフラッシュの内容はメモリダンプで書き込まれていることを確認しました。

 

ブートモード3での起動を確認したいので、足りない設定、操作などをご存知の方、ご教示をお願いします。

Parents
  • LinuxはRZ/A1H Linux BSP(RZLSP-V3.0.0)を使用されているとして、

    GENMAIボードのユーザーズマニュアル
    r20ut2596jj0100_r7s72100evum.pdf
    によると、
    ブートモード3では、シリアルフラッシュメモリ1 から読み出す
    ということなので、JP5とJP8はデフォルトのままで構わず、
    (RZLSP-V3.0.0)の release_note_J.txt に記載されているように
    SW1のみ、
    ------------------------------------------
    (bootmodeの指定=bootmode3)
    SW1-1:SW1-2:SW1-3
    OFF : ON : OFF
    ------------------------------------------
    と設定で良いと思います。

    なお、USBメモリにLinuxとルートファイルシステムを置く場合は、
    release_note_J.txt に記載されているように、
    u-boot環境変数の設定が必要です。
Reply
  • LinuxはRZ/A1H Linux BSP(RZLSP-V3.0.0)を使用されているとして、

    GENMAIボードのユーザーズマニュアル
    r20ut2596jj0100_r7s72100evum.pdf
    によると、
    ブートモード3では、シリアルフラッシュメモリ1 から読み出す
    ということなので、JP5とJP8はデフォルトのままで構わず、
    (RZLSP-V3.0.0)の release_note_J.txt に記載されているように
    SW1のみ、
    ------------------------------------------
    (bootmodeの指定=bootmode3)
    SW1-1:SW1-2:SW1-3
    OFF : ON : OFF
    ------------------------------------------
    と設定で良いと思います。

    なお、USBメモリにLinuxとルートファイルシステムを置く場合は、
    release_note_J.txt に記載されているように、
    u-boot環境変数の設定が必要です。
Children
  • kuniさん。ご回答ありがとうございます。

    JP5、JP8を初期設定にしてみたところ、ブートが反応しました。
    JP5とJP8はr20ut2596jj_r7s72100evum.pdfの
    表3.2.1ジャンパ設定一覧から判断して設定しました。
    設定方法に特に問題が見られないので、JP5とJP8を設定し直しても
    ブートが反応しました。
    結果、質問を上げた時の現象は発生しなくなりました。
    ご回答いただくまでの間には、NORフラッシュで起動させて、デバイスドライバの
    組み込みなどを試していたのですが、関係はないと思っています。

    ブートが反応しましたと明記しましたが、途中でCRCエラーのWarningが
    発生してブートが完了しておりません。
    release_note_J.txtの「既知の問題」が影響していると考え
    ダウンロードサイズを4の倍数にして再度挑戦します。

    結果はまたご報告します。

    以上
  • ブートのダウンロードサイズを確認したところ#0x18000000 - #0x18040e23と4の倍数でした。
    いくつかのソースコードを見ても4byteの区切りが宣言されておりました。
    よって、CRCエラーになる理由が検討付きません。(環境設定は、release_note_J.txtに準じて実施しています)
    どなたか、CRCエラーになる原因をご存知の方、ご教示をお願いします。
    ブート時のメッセージは以下の通りです。

    U-Boot 2013.04-RZLSP-V3.0.0 (Dec 09 2016 - 14:06:03)

    I2C: ready
    DRAM: 128 MiB
    Flash: 128 MiB
    SF: Detected S25FL512S with page size 512, total 64 MiB
    *** Warning - bad CRC, using default environment

    In: serial
    Out: serial
    Err: serial
    riic_wait_for_icsr2: Timeout!(bit = 80 icsr2 = 0, iccr2 = e0)
    riic_wait_for_icsr2: Timeout!(bit = 8 icsr2 = 0, iccr2 = e8)
    Net: sh_eth
    =>

    プロンプト状態になり、停止してしまいます。
    NORフラッシュでは、「SF:・・・」部分が無く、この後キー入力待ち状態になり、
    キー未入力でUSBからの読み込みを実施します。

    以上、よろしくお願いします
  • 警告メッセージ
    *** Warning - bad CRC, using default environment
    は、u-boot の環境変数が正しく保存出来ていない(初期化していない、何かの理由でデータが化けた/壊れた、など)場合に表示されるもので、u-boot 自体は、正しく動作しています。

    この警告メッセージを消したければ、
    => saveenv
    のように、一度、saveenv コマンドを実行して、環境変数を初期化し、ボードをリセットしてください。
    あるいは、そのまま、作業を進めても、
    4-4. u-bootの環境変数の設定
    の中で、一度、saveenv コマンドを実行すれば、消えてしまいます。

    但し、別件として、I2C のタイムアウト・エラーメッセージ
    riic_wait_for_icsr2: Timeout!(bit = 80 icsr2 = 0, iccr2 = e0)
    riic_wait_for_icsr2: Timeout!(bit = 8 icsr2 = 0, iccr2 = e8)
    が出ています。そのままでは、
    4-3.MACアドレスの設定
    で支障となり、EEPROM に MACアドレスが正しく保存出来ない「かも」しれません。

    とりあえず、先に進み、MACアドレスが EEPROM に正しく保存出来なかった場合には、
    後程、ポストする回避策を適用してください。
  • 下のパッチファイルを適用して、u-boot を作り直してください。

    パッチの適用は、下のパッチファイルを適当な場所に保存してから、u-boot のソースコードのディレクトリに移動し、

        $ patch -p1 --dry-run <パッチファイルのパス名     # お試し

        $ patch -p1 <パッチファイルのパス名     # 本番

    とりあえず、お試しのコマンドで、正しくパッチが当たることを確認してから、本番のコマンドでパッチを適用してください。

    u-boot のビルドは、同じディレクトリで、

        $ make distclean
        $ make rskrza1_config
        $ make

    を実行します。同じ場所に u-boot.bin が作成されます。

    なお、パッチファイルを保存する場合、改行コードは、Linux の改行コード(LF のみ) にしてください。

     

     

    20170111_u-boot_bugfix_eeprom+i2c.patch.txt
    diff --git a/drivers/i2c/sh_riic.c b/drivers/i2c/sh_riic.c
    index 498a4f0..cee9d87 100644
    --- a/drivers/i2c/sh_riic.c
    +++ b/drivers/i2c/sh_riic.c
    @@ -145,7 +145,8 @@
     #define ICBRL_RESERVED	0xe0	/* The write value shoud always be 1 */
     #define ICBRL_BRL_MASK	0x1f
     
    -#define RIIC_TIMEOUT	10000	/* 100msec (unit = 10usec) */
    +#define	RIIC_ICCR2_TIMEOUT	1	/* 1 ms (bus-free-time: 4.7 us(Sm) */
    +#define	RIIC_ICSR2_TIMEOUT	100	/* 100 ms */
     
     struct riic_data {
     	unsigned int reg;
    @@ -257,11 +258,16 @@ static int riic_set_clock(struct riic_data *pd, int clock)
     
     static int riic_check_busy(void)
     {
    -	if (riic_read(pd, RIIC_ICCR2) & ICCR2_BBSY) {
    -		printf("i2c bus is busy.\n");
    -		return -EBUSY;
    -	}
    -	return 0;
    +	ulong start, timeout = (ulong)RIIC_ICCR2_TIMEOUT;
    +
    +	start = get_timer(0);
    +	do {
    +		if (!(riic_read(pd, RIIC_ICCR2) & ICCR2_BBSY))
    +			return 0;
    +	} while (get_timer(start) < timeout);
    +
    +	debug("%s: i2c bus is busy.\n", __func__);
    +	return -EBUSY;
     }
     
     static int riic_init_setting(struct riic_data *pd, int clock)
    @@ -288,20 +294,19 @@ static int riic_init_setting(struct riic_data *pd, int clock)
     static int riic_wait_for_icsr2(struct riic_data *pd, unsigned short bit)
     {
     	unsigned char icsr2;
    -	int timeout = RIIC_TIMEOUT;
    +	ulong start, timeout = (ulong)RIIC_ICSR2_TIMEOUT;
     
    -	while (timeout-- > 0) {
    +	start = get_timer(0);
    +	do {
     		icsr2 = riic_read(pd, RIIC_ICSR2);
     		if (icsr2 & ICSR2_NACKF)
     			return -EIO;
     		if (icsr2 & bit)
     			return 0;
    -		udelay(10);
    -	}
    -
    -	printf("%s: Timeout!(bit = %x icsr2 = %x, iccr2 = %x)\n", __func__,
    -		bit, riic_read(pd, RIIC_ICSR2), riic_read(pd, RIIC_ICCR2));
    +	} while (get_timer(start) < timeout);
     
    +	debug("%s: ICSR2 timeout! (bit = %x ICSR2 = %x)\n", __func__,
    +		bit, riic_read(pd, RIIC_ICSR2));
     	return -ETIMEDOUT;
     }
     
    @@ -351,7 +356,7 @@ static int riic_i2c_raw_read(u8 *buf, int len)
     	int ret = 0;
     	int index = 0;
     
    -	while (len > index) {
    +	do {
     		ret = riic_wait_for_icsr2(pd, ICSR2_RDRF);
     		if (ret < 0)
     			return ret;
    @@ -362,7 +367,7 @@ static int riic_i2c_raw_read(u8 *buf, int len)
     		else
     			index++;
     		riic_set_receive_ack(pd, 1);
    -	}
    +	} while (index < (len - 1));
     
     	ret = riic_wait_for_icsr2(pd, ICSR2_RDRF);
     	if (ret < 0)
    diff --git a/include/configs/rskrza1.h b/include/configs/rskrza1.h
    index 2a11425..d69504f 100755
    --- a/include/configs/rskrza1.h
    +++ b/include/configs/rskrza1.h
    @@ -128,10 +128,10 @@
     #define CONFIG_SYS_MAX_I2C_BUS		4
     #define CONFIG_SYS_I2C_SPEED		100000 /* 100 kHz */
     #define CONFIG_SYS_I2C_EEPROM_ADDR	0x50
    -#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
    -#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS	4	/* 16-Byte Write Mode */
    +#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	2
    +#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS	6	/* 64-Byte Write Mode */
     #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	10	/* 10ms of delay */
    -#define CONFIG_SYS_I2C_MODULE		3
    +#define CONFIG_SYS_I2C_MODULE		2
     #define CONFIG_SH_I2C_BASE0		0xFCFEE000
     #define CONFIG_SH_I2C_BASE1		0xFCFEE400
     #define CONFIG_SH_I2C_BASE2		0xFCFEE800
    

  • ご回答ありがとうございます。

    先にご回答いただいた結果をご報告します。
    saveenvコマンドを実行したのち、Warningが消えたことが確認できました。
    その後、プロンプト状態からMACアドレスの登録を行ったところ
    シリアルフラッシュからのブート起動に成功しました。

    NORフラッシュでの起動では、初回にMACアドレスを登録して、2回目以降はしていませんでした。
    よってシリアルフラッシュでも書き込まれているものだと、またNORフラッシュ起動時と
    異なる動作をしていたのでMACアドレスの登録まで検討するに至りませんでした。

    I2CのエラーメッセージはNORフラッシュからの起動時にも表示されたので
    あまり意識はしておりませんでした。

    今回のご回答に関しては、参考にさせていただきます。

    GENMAIボードのシリアルフラッシュからの起動に関しては、解決とさせていただきます。
    ありがとうございました。