Hiroです。
GENMAIボードを使用して、組み込みLinuxの研修を検討しております。
作業中にカーネルの置き場所に疑問を持ちましたので質問いたします。
release_note_J.txtを参考に、USBへuImazeとrza1-rskrza1.dtbをコピーし、
rootfs.tarとmodules.tarを展開したものをブート時に読み込んでいると思います。
実際の組み込み機器ではUSBを接続して起動することは考えづらいので
カーネル部分はフラッシュ等に書き込んで、ブート時にフラッシュから読み込むものだと考えております。
そこで疑問に思ったことは、USBにファイルとして書き込んでいるものをそのままフラッシュにダウンロードすることは
できないのではないかと思いました。
組み込み機器にカーネルを書き込む方法をご教示願いたく投稿しました。
以上、よろしくお願いします。
Hiroさん
今回、お使いになっているGENMAI用Linuxは、English communityで公開されているRSKボード用Linuxと異なり、XIP(eXecute In Place)実行には、対応していませんから、
GENMAI用Linuxカーネル(uImage)とデバイスツリーブロブ(rza1-rskrza1.dtb)は、ファイルを「そのまま」フラッシュメモリに書き込んで使用するのが、最も簡単です。
ここでは、SPIBSC のチャネル0、ポート0 に接続された S25FL512S を 1個のみ使用する場合を考えましょう。このシリアルフラッシュメモリには、既に、その先頭から u-boot 本体が書き込み済みであり、また、u-boot が環境変数を保存するために、その先頭からのオフセットで 0x80000 から 0x40000 バイト分、使用しているはずです。
ですから、現状、シリアルフラッシュメモリの先頭からのオフセットで 0x000C0000 以降が空いています。ここに、デバイスツリーブロブ、Linux カーネル保存用に、それぞれ、256KB、7168KB を予約しましょう。すると、現在までのシリアルフラッシュメモリのマップは、次のようになります。
0x00000000~0x0007FFFF ( 512KB) u-boot 本体0x00080000~0x000BFFFF ( 256KB) u-boot が環境変数保存用に予約0x000C0000~0x000FFFFF ( 256KB) デバイスツリーブロブを保存0x00100000~0x006FFFFF (7168KB) Linux カーネルを保存
「適当なツール」を使って、それぞれの領域の先頭から、uImage と rza1-rskrza1.dtb を書き込みます。念のためですが、例えば「デバイスツリーブロブをシリアルフラッシュメモリの先頭からのオフセット 0x000C0000 から書き込む」というのは、ICE などを使って書き込む場合には、「デバイスツリーブロブをアドレス 0x180C0000 から書き込む」ということですから、注意してください。
起動する場合には、
=> setenv bootcmd run spiload \; bootm 0x0c000000 - 0x0bf00000 => setenv bootargs console=ttySC2,115200 root=/dev/sda1 rw rootdelay=3 ignore_loglevel earlyprintk=sh-sci.2,115200 => setenv spiload sf probe 0 \; cp.b 0x18100000 0x0c000000 0x700000 \; cp.b 0x180c0000 0x0bf00000 0x40000 => saveenv
上で「適当なツールを使って書き込みます」と書きましたが、必ずしも ICE を使わなくても良く、u-boot 自体で USB メモリから SDRAM にファイルを読み込み、u-boot の sf コマンドでシリアルフラッシュメモリに書き込んでも構いません。
また、rootfs.tar や modules.tar を USB メモリに書き込むのではなく、Linux のループデバイス(loop device)を使用して、ファイルシステムイメージをファイルとして作成し、Linux カーネルの後ろの空き領域に書き込んで使うことも可能です。
Hiroさんの工夫次第です。