おせわになります。いっとうです。
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 が役に立つかもしれません。
> アドバイス頂いた点を見直して、何かしら表示されるようになりました。
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 での操作も含めたフルのログをください。
いっとうさん
アルファプロジェクトの APRZA0A のマニュアルを見る限り、外付け SDRAM は 0x0C000000~0x0DFFFFFF に32MB 実装されているようです。であれば、少なくとも、
$ make menuconfig$ make uImage LOADADDR=0x08008000$ make dtbs
指定しているアドレスがおかしいと思いませんか?
uImage は、mkimage コマンドを使って、
(a) 単純なメモリイメージのカーネル Image から、(b) Image を Z/BZ2 圧縮したカーネル zImage/bzImage から、(c) (b) の先頭に自己解凍用のルーチンを付加して、
などの方法で作成され、LOADADDR は、無圧縮の(解凍された)カーネルの最終ロードアドレス (及び、エントリポイント) を指定します。# ですから、修正した LOADADDR は、正しいだろうと思います。
2つ上の、いっとうさんの書き込みだと、
$ make uImage LOADADDR=0x0c008000Image Name: Linux-3.14.79-ltsi+Created: Mon Dec 4 20:32:25 2017Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 2636944 Bytes = 2575.14 kB = 2.51 MBLoad Address: 0c008000Entry Point: 0c008000Image arch/arm/boot/uImage is ready
と、uImage のサイズが 2.6MB 程度しかなので、多分、(b) か (c)、また、無圧縮(uncompressed) と表示されていますから、多分、(c) だろうと推測出来ます(RZ/A1 Linux BSP は、その形式で作成しますし)。
ですから、
=> ext2load usb 0 0x0d000000 /uImage2637008 bytes read in 2258 ms (1.1 MiB/s)=> ext2load usb 0 0x0d800000 /r7s72100-aprza0a.dtb7633 bytes read in 76 ms (97.7 KiB/s)=> set bootargs 'console=ttySC4,115200 console=tty0 ignore_loglevel root=/dev/sda1 rootwait earlyprintk'=>=> bootm 0x0d000000 - 0x0d800000Wrong Image Format for bootm commandERROR: can't get kernel image!
は、本来であれば、
自己解凍形式の uImage を 0x0d000000 にロード、DTB を 0x0d800000 にロード、その後、bootm で uImage の実行を開始すると、uImage 自身が圧縮を解凍しつつ、カーネルを最終ロードアドレスの LOADADDR に配置し直してから、エントリポイント LOADADDR にジャンプすることでカーネルの実行が始まる、
のですが、実際には、
自己解凍形式の uImage を 0x0d000000 にロード、DTB を 0x0d800000 にロード、その後、bootm がロードした uImage の先頭に付いているヘッダ情報を確認し、不正あるいは未サポート、と判断して「Wrong Image Format for bootm command」を表示しています。
当該のメッセージは、common/bootm.c の boot_get_kernel が出力しており、u-boot で、CONFIG_IMAGE_FORMAT_LEGACY が未定義なコンフィギュレーションをするか、mkimage が不正な(u-boot が未サポートの)ファイルを作成すれば出力されますが、実際の所、考えにくいです。
現状、u-boot は、内蔵 RAM で実行されますし、USB は、端子固定ですから、UART(SCIF) の初期化や設定を間違えない限り、何もしなくても、普通は動作しますが、ボードを正しく初期化出来ているとは限りません。
以前にも申し上げましたが、> 出力されたエラーメッセージを素直に解釈すると、uImage が正しく作れていない、> (RZ/A1 の BSC が正しく初期化出来ていない、何かの領域とオーバラップしている、> などの理由で) USB からのロード後に壊れた/壊された、と思われますが、
u-boot がボード(特に BSC)を正しく初期化出来ているか、確認してください。