おせわになります。いっとうです。
APRZA0AとLCD-KIT-B01の組み合わせで、アメリカサイトのBSPv1.3にて動作させようとしています。
buildrootの先のアドバイスのお陰でU-bootは動くようになりましたが、kernelの方が手こずっております。
APRZA0AのBSPはかなり古いため(linux3.8.13)、まずはここにあるboard-rskrza1.cとBSPv1.3(linux3.14)のboard-rskrza1.cの差分を
把握しようとしていますが、前者は446行、後者は2311行とかなり増えていて、何が変わったのか把握出来ず困っています。
まずはlogin画面まで行きたいと思っているのですが、1ヶ月やってみたもののStarting kernel …で止まったままでお手上げになりました。
このバージョン間の履歴みたいなものを調べる方法は無いものでしょうか。https://github.com/renesas-rz を見ても、linux3.14以前のデータを見つけることが出来ません。
RZ/A1 に対しては、
(1) 最初に GENMAI ボードに Linux 3.8 が、(2) 次いで RSK ボードに Linux 3.8 が、(3) その後、RSK ボードに Linux 3.14 が、
この順序で移植されました。現在、ここ(Japanese community サイトの "サンプルプログラム等")には、(1) が、English community サイトの "RZ Forum" の "Files - Linux" には、(3) が、それぞれ登録されています。ですから、RZ/A1 Linux BSP に 3.8 と 3.14 の間の履歴は、存在しません。
また、(1) の board-rskrza1.c と (3) の board-rskrza1.c の差分を調査されているようですが、(1) の board-rskrza1.c は、GENMAI ボード用、(3) の board-rskrza1.c は RSK ボード用です。(1) の board-rskrza1.c と (3) の board-genmai.c が正しい組み合わせです。諸般の事情でこのようになっていますが、混乱されたかもしれません。お詫び致します。
移植については、最初は、RZ/A1 Linux BSP Porting Guide などを参考にして、(3) の BSP を APRZA0A に新規に移植するつもりで作業された方が速いかもしれません。"Starting kernel …" で止まってしまうということですから、Porting Guide の "12. Kernel: Enable (Early) Low Level Debugging for Linux Booting" の early_printk が役に立つかもしれません。
出力されたエラーメッセージを素直に解釈すると、uImage が正しく作れていない、(RZ/A1 の BSC が正しく初期化出来ていない、何かの領域とオーバラップしている、などの理由で) USB からのロード後に壊れた/壊された、と思われますが、
念のため、正しい手順で再度、カーネルを起動して結果をみてください。
とりあえず、次のように、この4点を修正して試してみてください。
=> usb start=> ext2load usb 0 0x0d000000 /uImage=> ext2load usb 0 0x0d800000 /hoge.dtb => set bootargs 'console=ttySC4,115200 console=tty0 ignore_loglevel root=/dev/sda1 rootwait earlyprintk'=> bootm 0x0d000000 - 0x0d800000
> アドバイス頂いた部分を反映してみましたが、状況は変わりませんでした。
何かが修正されたから、
> => bootm 0x0c100000 - 0x0c000000> Wrong Image Format for bootm command> ERROR: can't get kernel image!
が
> => bootm 0x0d000000 - 0x0d800000> ## Booting kernel from Legacy Image at 0d000000 ...(中略)> Starting kernel ...
に変わったのだと考えられないと、暗闇の中を手探りで進むようなことも少なくない組み込みソフトのデバッグは、かなり厳しいと思いますよ。(笑)
いっとうさんは、最初の書き込みで、
> まずはlogin画面まで行きたいと思っているのですが、1ヶ月やってみたものの> Starting kernel …で止まったままでお手上げになりました。
とおっしゃっていましたが、今回、そこにたどり着いたということです。
> boardファイルを完全に移植しないと、一切ブートしないものでしょうか。
いっとうさんが、カーネルの Early Low Level Debugging 機能を正しく有効にしたうえで、カーネルコマンドラインに earlyprintk を指定しているのであれば、この時点で、カーネルの起動メッセージ程度は、表示されるはずです。何も表示されないのは、Early Low Level Debugging 機能を有効にする作業にミスがあったのではないか、と考えられます。
次のことを試して頂けますか?board ファイルの修正は、起動メッセージが表示出来てからにしましょう。
(1) カーネルをビルドしたディレクトリの先頭で、
$ grep -e CONFIG_DEBUG_LL -e CONFIG_EARLY_PRINTK \-e CONFIG_DEBUG_R7S72100_SCIF .config
(2) カーネルのソースがあるディレクトリの先頭で、
$ grep CONFIG_DEBUG_R7S72100_SCIF `find . -iname "KConfig*"`
> デバイスツリーがまずいのかと見直しているのですが、
デバイスツリーですが、現時点では、ご提示の <r7s72100から作成したdts> の内容で構いません。なお、上の書き込みでは確認できないので、念のためのご注意ですが、次のコメントにもある通り、bootargs の文字列の空白は、削除しないでください。/* Add lots of white space so we have room to overwirte in u-boot */
> アドバイス頂いた点を見直して、何かしら表示されるようになりました。
earlyprintk が有効になったようですから、board ファイルの修正を始めましょう。
> => bootm 0x0d000000 - 0x0d800000> ## Booting kernel from Legacy Image at 0d000000 ... (略)> Starting kernel ...> > Booting Linux on physical CPU 0x0 (略)> Kernel command line: console=ttySC4,115200 root=/dev/sda1 rw rootdelay=3 ignore_loglevel earlyprintk=sh-sci.2,115200 (略)> bootconsole [earlycon0] disabled
bootargs 指定時、起動メッセージがここで途切れてしまうのは、bootargs で指定した ttySC4 のドライバが正しく初期化できていないからです。
「BSP Porting Guide」の「13. Kernel: Editing Your Board File」に従って、最初に board ファイル(仮に board-aprza0a.c とします) を作成してください。RSKRZA1 ボードは、ttySC2 をコンソールにしていますから、これを ttySC4 に変更します。次の2か所を修正します。# 行番号は、Github の最新のソースのものです。
---- 1159 /* BOARD: To save on RAM usage, we are only declaring the SCIF 1160 channels we plan on using. Modify if you plan on 1161 using other channels */ 1162 //R7S72100_SCIF(0, 0xe8007000, gic_iid(221)); /* Not used */ 1163 //R7S72100_SCIF(1, 0xe8007800, gic_iid(225)); /* Not used */- 1164 R7S72100_SCIF(2, 0xe8008000, gic_iid(229));+ //R7S72100_SCIF(2, 0xe8008000, gic_iid(229)); 1165 //R7S72100_SCIF(3, 0xe8008800, gic_iid(233)); /* Not used */- 1166 //R7S72100_SCIF(4, 0xe8009000, gic_iid(237)); /* Not used */+ R7S72100_SCIF(4, 0xe8009000, gic_iid(237)); /* Not used */ 1167 //R7S72100_SCIF(5, 0xe8009800, gic_iid(241)); /* Not used */
---- 1879 static void __init rskrza1_add_standard_devices(void) 1880 { (略) 2041 2042 // r7s72100_register_scif(0); /* SCIF ch0 */ /* Not used */ 2043 // r7s72100_register_scif(1); /* SCIF ch1 */ /* Not used */- 2044 r7s72100_register_scif(2); /* SCIF ch2 */+ // r7s72100_register_scif(2); /* SCIF ch2 */ 2045 // r7s72100_register_scif(3); /* SCIF ch3 */ /* Not used */- 2046 // r7s72100_register_scif(4); /* SCIF ch4 */ /* Not used */+ r7s72100_register_scif(4); /* SCIF ch4 */ /* Not used */ 2047 // r7s72100_register_scif(5); /* SCIF ch5 */ /* Not used */ 2048 // r7s72100_register_scif(6); /* SCIF ch6 */ /* Not used */ 2049 // r7s72100_register_scif(7); /* SCIF ch7 */ /* Not used */ 2050 (略) 2060 }
私は、APRZA0A の場合、SCIF のチャネル 4 の信号 TXD4 や RXD4 がどの兼用端子に割り当てられているか知りません。兼用端子の設定は、u-boot が行ったものを引き継ぐので、上の修正だけで ttySC4 が有効となり、引き続き、起動メッセージが表示されるはずですが、board-aprza0a.c の他の場所で、その兼用端子を他の用途に使用してしまうと、表示出来なくなります。
r7s72100_pfc_pin_assign 関数が、兼用端子の設定を行う関数ですから、そうしたことが無いようにしてください。また、もし、この時点で、全ての兼用端子の設定を見直して正しく修正できるなら、直してください。
> 1. r7s72100_pfc_pin_assign 関数でPINの設定をしているとのことですが、> U-bootでも設定しているという認識で良いでしょうか。
はい、(新BSPのu-bootでは) pfc_set_gpioやpfc_set_pin_function関数で設定しています。
> 2. 旧BSPのU-bootと新BSPのU-bootではPINの設定をしているソースが違うのでしょうか。> 旧はlowlevel_init.Sで設定し、新はrskrza1.cで設定している?
はい、旧BSPは、lowlevel_init.Sで1ポートごとに(16端子まとめて)、新BSPは、rskrza1.cで1端子ごとに、それぞれ初期化しています。移植しやすいように変更したのだと思います。
> 結果としてU-bootは何も表示されなくなってしまいました。> U-bootが全く動かなくなって、手も足もでなくなっています。
最初に申し上げた通り、「移植については、最初は、RZ/A1 Linux BSP Porting Guide などを参考にして、(3) の BSP を APRZA0A に新規に移植するつもりで作業された方が速いかもしれません。」です。
まず最初に、(u-boot のプロンプトが出るまでは無理でも) シリアルコンソールに何か出るようにしましょう。rskrza1.c 相当のファイルのシリアルコンソールの兼用端子設定は、出来ているようですから、後は、
include/configs/rskrza1.h 相当のファイル
の修正が出来ていないのでしょう。BSP Porting Guide の
「6. u-boot: Serial Console Port Select」
を読んで修正してください。
なお、上のコードを少し見ただけですが、これ以前のいっとうさんの書き込みを参照すると、
> 旧:at24 0-0050: 128 byte 24c01 EEPROM, writable, 1 bytes/write> 新:at24 3-0050: 2048 byte at24 EEPROM, writable, 16 bytes/write
となっていますから、AP-RZA-0A で使用している I2C のチャネルは、0だと推測するのですが、上のコードでは、チャネル3の兼用端子を初期化しています。間違えていませんか? また、
> m25p80 spi5.0: found n25q128a13, expected s25fl512s> m25p80 spi5.0: n25q128a13 (16384 Kbytes)
となっていますから、シリフラは、N25Q128A13 だと推測するのですが、上のコードでは、
> Micron N25Q512Aの関数をコメントアウト、
していますが、これも、BSP Porting Guide の
「8.1 Add Support for your SPI Flash」
を参照して、適切に修正してください。それ以外に、(以降、原文の誤りを訂正)
などの問題が散見/推測されます。Alpha Project さんが移植された u-boot や Linux kernel のソースコードと RZ/A1 Linux BSP Porting Guide を参照して、適切に修正してください。
> pcが0x0800800cということで、起動早々にこけているということでしょうか。
メッセージを見る限り、u-boot が Linux を起動した直後(未だ Linux が例外を処理する準備が出来る前) に例外を起こし、u-boot の例外ルーチンが呼び出されているように見えます。
以前のカーネルは、どうされたのですか?
> 先の実行結果ですが、カーネルとデバイスファイルのアドレスが逆になっていました。
新旧の実行結果を比較して、古いカーネルと間違ったデバイスツリーをロードして実行した、と理解しました。
> 旧BSPで動作したkernelとユーザランドは有りますので、現行U-bootを使って起動させようとしたところ、> ロードするアドレスが0c000000-0x0c8000000の場合、0d000000-0d800000の場合共に、starting kernelで> 止まってしまいます。
ロードするアドレスが 0x0c000000-0x0c800000 の場合は、以前にご説明した通り、カーネルをロードした領域とカーネルの実行領域が、一部、オーバラップしますから、正常に動作しません。
ロードするアドレスが 0x0d000000-0x0d800000 の場合は、bootargs に earlyprintk が指定されていますから、通常、何らかの表示があります。以前にご説明した通り、まず、earlyprintk を有効にしてみてください。
> これはU-bootのPIN初期設定が上手く出来ていないということでしょうか。
ご質問が解りません。u-boot の端子設定が (完璧ではないにせよ、それなりに)出来ているから、上のように u-boot が動いているのだと思いますが...
> 旧U-bootと旧kernel(earlyprintk有り)は動き、新U-bootと旧kernel(earlyprintk有り)はStarting kernelで止まって> 何も表示されませんでした。 (中略)> U-bootに問題が有ると考えたのですが、間違っているでしょうか。
新旧が自由に入れ替えて組み合わせられる前提での経験則のようですが、前提が正しいことを確認しましたか?u-boot とカーネルの間にもインタフェースがあります。単にジャンプすれば良いという訳ではありません。
確認ですが、いっとうさんは、3.14 のカーネルを最初にコンフィギュレーションする際、3.8 のカーネルのコンフィギュレーションファイルを使用しませんでしたか?
また、7/3のいっとうさんの書き込みですが、
> なんとかU-bootの起動までは復帰することが出来ました。> LowLevelDebugも有効になって、Starting kernel以降に以下が表示されるようになりました。> > I2C: ready> DRAM: 10 MiB> Using default environment (中略)> r7 : 00000000 r6 : 08008000 r5 : 209a61fc r4 : 00000000> r3 : 00001dd1 r2 : 208e7000 r1 : 00000dd1 r0 : 00000dd1> Flags: nZCv IRQs off FIQs off Mode SVC_32> Resetting CPU ...> > resetting ...
Starting kernel 以降に表示されているメッセージは、全て u-boot のコードが出しています。ですから、earlyprintk が有効になっているかは不明です。
同じ日の私の書き込みで
> 以前のカーネルは、どうされたのですか?
これは、5/22 のいっとうさんの書き込みに出てくる 3.14 のカーネルです。途中で "bootconsole [earlycon0] disabled" と表示してそのままになるようですがそれでOKです(その後、UART の端子設定を見直しているなら更にOK)。そのカーネルと新 u-boot を組み合わせて実行したログを見せてください。ログには、u-boot での操作も含めたフルのログをください。