アルテラSoC FPGAチップに基づいたデバイスでのLinux:失われた機能の回復

テラシックDE0-Nano-SoC



少し前に、アルテラCyclone VチップをベースにしたDE0-Nano-SoC開発者キットが私の手に落ちました。 これらのタスクごとに、FPGA用の回路が作成され、HPS用のプログラムが作成されます。 FPGAの回路はQuartus IIで作成され、開発中にUSBブラスターを介してJTAGインターフェイスを介してFPGAにロードされます。 回路が最終的にデバッグされると、ファームウェアファイルの形式でSDカードに書き込まれます。 その後、何らかの目的でボードを使用する必要がある場合、必要なファームウェアが取得され、次の形式のコマンドでFPGAにロードされます

cat hardware.rbf > /dev/fpga0
      
      



そして、目的のプログラムが起動します。



すべてはいつものように行われましたが、ボードのLinuxカーネルを更新したら、 この記事で説明しました 。 そしてしばらくして、FPGAマネージャーがドライバーのリストから消えたことがわかりました。これにより、同様の方法でFPGAにファームウェアをロードできました。 最初に考えたのは、カーネルを構築するときに構成にドライバーを含めるのを忘れたことです。 しかし、驚いたことに、このドライバーは原則としてソースコードに含まれていなかったことがすぐに明らかになりました! もちろん、他の方法でファームウェアをFPGAにロードすることもできますが、少なくとも3つあります。 しかし、この方法は私にとって最も効率的で便利でした。そのため、失われた機能を復元することにしました。 これがどのように行われたかに興味があるなら、猫へようこそ。



わずかな余談



この問題を解決するには、まずFPGAマネージャーのソースコードを見つける必要がありました。 当然、最初に検討されたのはアルテラのリポジトリでした。 そして再び、私はこのドライバーが彼らの中にいなかったことに驚いた。 私はgithub全体を検索する必要があり、その結果、ソースはTerasikリポジトリで見つかりました。 そしてここで再びレーキが形成されました:Terasikは長い間githubに何も公開しておらず、最新のカーネルはバージョン3.12でした。 その結果、このリポジトリから取得したFPGAマネージャーのソースコードは、新しいバージョンから単純に削除された「古い」構造を使用したため、新しいカーネル用のコンパイルを拒否しました。 新しい現実のためにドライバーをやり直すことに、私を惹きつけたものはありませんでした。 したがって、検索は継続され、最終的に成功を収めました-カナダからの特定の氏のリポジトリに、ニックネームxaxaxaの適応されたドライバーソースがありました。 彼にはなんという低い弓でしょう。



それでは始めましょう



カーネルアセンブリの詳細については、 前回の記事で確認できます。後で繰り返さないように、随時参照します。 それ以降のナレーションはすべて、その記事で説明されているカーネルアセンブリプロセス全体が既に完了しており、すべてのカーネルソースが同じ場所にあるという前提に基づいています。



1.ターミナルを起動してルートモードに入ります-毎回sudoコマンドを入力しないようにします。

 sudo -i
      
      





この場合、/ rootがホームディレクトリになります-その中のすべてを行います。



2. ここから FPGAマネージャードライバーのソースコードをダウンロードし、/ root / linux-socfpga-4.1 / drivers / fpga /ディレクトリに配置します。



また、ここから fpga.hヘッダー取得し、/ root / linux-socfpga-4.1 / include / linux /ディレクトリに書き込みます



3. /root/linux-socfpga-4.1/drivers/Kconfigファイルを編集します-1行追加します:

 source "drivers/fpga/Kconfig"
      
      





特に追加する場所は実際には重要ではありません。 主なことは、ファイルの最初の行でも最後の行でもないことです。 最初の行の直後に追加しました。 次のようになりました。

 menu "Device Drivers" source "drivers/fpga/Kconfig" source "drivers/amba/Kconfig" ...
      
      





4. /root/linux-socfpga-4.1/drivers/Makefileファイルを編集します-1行追加します:

 obj-$(CONFIG_FPGA) += fpga/
      
      





特に追加する場所-ここでも、問題ではありません。 最初のコメントの直後に追加しました。 次のようになりました。

 # # Makefile for the Linux kernel device drivers. # # 15 Sep 2000, Christoph Hellwig <hch@infradead.org> # Rewritten to use lists instead of if-statements. # obj-$(CONFIG_FPGA) += fpga/ obj-y += irqchip/ ...
      
      





5. Alterスクリプトを実行します。これにより、新しいBASHが起動され、その中のいくつかの環境変数(PATHなど)が修正されます。 このBASHを離れることなく、すべてのコンパイルアクションを実行します。

 cd /root/altera/15.0/embedded ./embedded_command_shell.sh
      
      





6.いくつかの環境変数を作成します。

 export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export LOADADDR=0x8000
      
      





7.カーネルソースがあるディレクトリに移動し、FPGAマネージャードライバーをカーネル構成に追加します。

 cd /root/linux-socfpga-4.1 make menuconfig
      
      





これにより、メニューのある擬似グラフィックウィンドウが開きます。 [ デバイスドライバー]サブメニューに移動します。 ここでは、最初にFPGAデバイスの新しいサブメニューが表示されたことがわかります。 内部にはFPGA Frameworkドライバーがあります-カーネルに追加します:スペースを2回クリックします-同時にアスタリスク記号がその反対側に表示され、このドライバーがカーネルに組み込まれることを示します。 これらの手順を実行した直後に、別のアルテラドライバがリストに表示されます-オンにします:ダブルクリックします:







make socfpga_defconfigコマンドを使用して構成を元の状態にリセットしなかったため 、残りの設定は、カーネルビルドプロセス中に設定した状態と同じままでなければなりません。



メニューを終了します。 終了するまで[ 終了 ]を押します。 質問に対して-設定を保存する必要がありますか- はいと答えます。



8.カーネルをコンパイルします。

 make uImage
      
      





カーネルは以前にコンパイルされていたため、新しいドライバーでカーネルを再構築するのにほとんど時間はかかりません。



9. FPGAマネージャーに関する情報をデバイスツリーに追加します。

これを行うには、次の行を/root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga.dtsiファイルに追加します。

  fpgamgr: fpgamgr@0xff706000 { compatible = "altr,fpga-mgr-1.0", "altr,fpga-mgr"; transport = "mmio"; reg = <0xFF706000 0x1000 0xFFB90000 0x1000>; interrupts = <0 175 4>; };
      
      





これらの行は、 socブロックに追加できます。

例えばここに。
 ... qspi_clk: qspi_clk { #clock-cells = <0>; compatible = "altr,socfpga-gate-clk"; clocks = <&f2s_periph_ref_clk>, <&main_qspi_clk>, <&per_qspi_clk>; clk-gate = <0xa0 11>; }; }; }; fpgamgr: fpgamgr@0xff706000 { compatible = "altr,fpga-mgr-1.0", "altr,fpga-mgr"; transport = "mmio"; reg = <0xFF706000 0x1000 0xFFB90000 0x1000>; interrupts = <0 175 4>; }; gmac0: ethernet@ff700000 { compatible = "altr,socfpga-stmmac", "snps,dwmac-3.70a", "snps,dwmac"; altr,sysmgr-syscon = <&sysmgr 0x60 0>; reg = <0xff700000 0x2000>; interrupts = <0 115 4>; ...
      
      







10.デバイスツリーファイルをバイナリ形式に変換します。

 make socfpga_cyclone5_sockit.dtb
      
      





11.カーネルと.dtbファイルをFAT32セクションのカードにコピーします。 繰り返しはしません。これを行う方法については この記事の「 カーネルアセンブリ」セクションのサブセクション13で詳しく説明します



それだけです-FPGAマネージャードライバーを使用してカーネルアセンブリプロセスが完了しました。



ヘルスチェック



SDカードをボードに挿入し、起動してパフォーマンスを確認します。

これを行うには、最初に/ devディレクトリの内容を確認します-fpga0ドライバーファイルがそこに表示されます。







最後に、いくつかのファームウェアをFPGAにアップロードします。







出来上がり! すべてが期待どおりに機能します。



ご清聴ありがとうございました!



All Articles