新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

xilinx の git を使う

Xilinx が git サーバを提供しているのでそこからソースを一式ダウンロードして Linux を動かすことにする。対象は ML405。

まず .config の設定。おもむろに次のコマンド叩くと
make ARCH=powerpc CROSS_COMPILE=ppc_405- 40x/virtex_defconfig
ちゃんと .config ができてしまう。何をやっているかは V=1 とすればよい。

heavens-door:linux-2.6-xlnx> make V=1 ARCH=powerpc CROSS_COMPILE=ppc_405- 40x/virtex_defconfig
make -f scripts/Makefile.build obj=scripts/basic
rm -f .tmp_quiet_recordmcount
mkdir -p include/linux include/config
make -f scripts/Makefile.build obj=scripts/kconfig 40x/virtex_defconfig
scripts/kconfig/conf -D arch/powerpc/configs/40x/virtex_defconfig arch/powerpc/Kconfig
#
# configuration written to .config
#

powerpc 以外のほかのアーキテクチャーでも使えるようだ。これでひな形がある場合は menuconfig などで聞かなくてよい。Makefile をみると defconfig というキーワードが最後にあると、そういう動きをするように設計されている。もはや make ではないな、、、

つぎに dts をつくる。これも git からダウンロードして bps 以下を EDK のローカルな管理ファイルと同じ場所に置く。これが一番簡単と wiki に書いてあったtが、、、今後はちゃんと共通ファイルにしたい。これだと各 EDK にコピーが必要。かといって Xilinx の元ファイルにはコピーしたくないからね。

で XPS でライブラリつくらせると、ライブラリと一緒に dts もできる。これを Linux のカーネルソースの arch/powerpc/boot/dts の下に置く。この時名前が重要!!! powerpc はなぜか arch/powerpc/boot/wrapper というのがあって、こいつがやけにいろいろなことをしてくれる。make 時の名前を見てリンクするものまで決めてくれるのだ。気が付かんかったぞ。ここでは virtex.o などをリンクさせたいから、virtex405 で始まる名前にする必要がある。viretex405-lltemac.dts としよう。

その前になぜか dts に次の記述が欠けているので追加。(これもソース・アセンブラを追う羽目に、、、)

        chosen {
                bootargs = "console=ttyS0 root=/dev/xsysace2";
                linux,stdout-path = "/plb@0/serial@83e00000";
        } ;

抜けていたのは linux,stdout-path 。boot/serial.c にserial_get_stdout_devpという関数があるが、ここでこのプロパティを参照している。ないと、-1 が返り、最終的には Linux が立ち上がらずに無限ループになる。このとき serial の初期化がされていないので、当然、何も画面に出ない。でその原因を追うためにアセンブラを追う羽目になる。

あと、コンソールに出ない場合が上の dts の名称。これを virtex405 がないとコンソールの初期化が行われない。具体的には boot/simpleboot.c の platform_init の最後で

        if (platform_specific_init)
                platform_specific_init();

となっている。platform_specific_init は boot/virtex.c の中にあるが、こいつは weak の設定になっているため、なくてもリンクエラーにならず通ってしまう。というか上のソースでわかるとおり、そういうケースでもいいようになっている。
xmd は con した後にどうも PLB のリセットまでするようなので、直前でメモリのテストプログラムなどが動いていてコンソールを使っていても、やはりコンソールには出ない。
アセンブラを見るとその差がわかる。
だめなときは次ようになる。

  400308:       41 9e 00 08     beq-    cr7,400310 <platform_init+0x308>
  40030c:       4b bf fc f5     bl      0 <_start-0x400000>
  400310:       48 00 2b 39     bl      402e48 <serial_console_init>

問題なく動くものは

  400338:       41 9e 00 08     beq-    cr7,400340 <platform_init+0x308>
  40033c:       48 00 00 21     bl      40035c <platform_specific_init>
  400340:       48 00 31 0d     bl      40344c <serial_console_init>

さて、make をする。

make ARCH=powerpc CROSS_COMPILE=ppc_405- simpleImage.virtex405-lltemac

make では名前が重要。zImage というのがなくなった。simpleImage となった。しかし、wrapper をみるとちゃんと圧縮しているので心配しなくてよい。さらに . 続けて dts と同じ名前を打ち込む。これで dts が組み込まれる。dts は Device Tree S? の略だ S は System か?Source か?とにかく、こいつがちゃんとリソースを管理してくれる。それと Linux の of のリソース管理と組み合わせてめでたく、いろんなリソースに対応できる。やったことがないが、おそらく FPGA 側のリソース(たとえば アドレスとか)が変わった時には dts だけを変えればカーネルのリコンパイルはいらないはずだ。これは powerpc と microblaze にのみ採用されている。他のアーキテクチャに採用されるかどうかは分からない。

さて、これで後は CF の設定と ace ファイルを作れば Linux がちゃんと立ち上がるシステムができるはずなのだが、、、(現在は rootfs のマウントに失敗するようだ)。