Moiz's journal

プログラミングやFPGAなどの技術系の趣味に関するブログです

2016年にuClinuxをDE0ボードで動かす

2016年にuClinuxをDE0ボードで動かす
FPGAボードDE0と、参考書籍「FPGAボードで学ぶ組み込みシステム開発入門[Altera編]」
最近FPGAで遊びたくなり、「FPGAボードで学ぶ組み込みシステム開発入門[Altera編]」と、書籍中で使われているTerasic社のDE0を買ってみた。

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

DE0 開発学習ボード

DE0 開発学習ボード

DE0はこの手の学習向け目的では定番であり、またこの書籍もとてもわかりやすく、特に、つまづきがちなボードの設定やツールの細かい使い方などが詳しく説明されているために非常に役にたつ。書籍のサポートページもあり、今でもこの手の内容を学習する人には広くすすめたい良書だ。
ただ、発売から5年ほど経つと言うことで、現在のAlteraのツール類やLinuxの環境との違いがでてきているのは否めない。また、ツール類の細かい設定方法を紹介するという書籍のスタイルのため、そういった環境の変化が内容の再現性に直接インパクトを与えており、そのままでは動作しない部分が若干あった。そこで、完全ではないが回避方法を参考として紹介したい。
ちなみに私の環境はDell XPS8700 (Core i7-4770)+Windows 10 Home Anniversary updateで、内容はすべてこの環境を前提としている。また、書籍へのリファレンスはすべて初版第2刷をもとにしている。
このブログの内容は筆者の環境にて試した内容を参考として記した物であり、同様の内容を実行することによって正常に動作することを保証する物ではありません。また、記事の後半で紹介する問題点も残っており、全ての人に内容をすすめるものではありませんし、この内容を試したことにによって生じる結果について、いかなる責任も負いかねます。製品または書籍についての質問は、出版社およびボードのメーカーに問い合わせされるか、Alteraのforumに投稿されることをおすすめします。
書籍の内容と現在のツール類
2016年時点でも、当該書籍中第8章までは書籍の記述をほぼおいかけるだけで内容を再現することができた。書籍で使われているQuarusII Web Editionの11.0はAlteraのホームページから正常にダウンロードできる。注意点としては、

  • 付録I-2、USB-Blasterドライバのインストール
    • Windows10環境では、USB-Blasterドライバのインストール時に「ドライバーの署名を無効にする」にチェックを入れること。(入れないとエラーがでる)
  • 5−3 プログラムの作成と実行
    • NIOS2 II EDSを互換モードで動作させる。(こうしておかないと私の環境ではNIOS HWが認識されなかった)

このあたりは新しいツールを使うことで回避できるようだ。現時点でDE0に対応するQuartusの最新バージョンは13.1.0.162だった。第8章までの内容は新しいツールでも若干の手順の変更で再現できるし、書籍の付録(App. III)にも関連情報があるので、第8章までの内容を試すのなら新しいツールを使っても可能だ。(ただし、手順は一部変更になるので、そのあたり痛し痒しの面はある)
2016年にuClinuxをDE0にインストールするには
このように第8章までは、わずかな設定変更で2016年時点でも書籍の内容を再現することができるが、最後の第9章に入るととたんに難しくなる。
Ubuntuのインストール
まず、書籍中App. I-3で紹介されているUbuntu11.04だが、ダウンロードとインストールは問題無いものの、すでにサポート期間が終了している。そのため、apt-getで環境をアップデートしたりツールを追加しようとしてもサーバーが見つからないなどのエラーがでる。このあたりはサーバーのURLなどを更新することで改善可能だが、私自身は全てのツールを集めることができなかった。
現時点(2016年9月)での最新の安定版Ubuntuは16.04LTSだったのでこちらを使う事にする。また書籍で紹介されているコンパイル済みのツールチェーンは32bit環境向けなので、32bit版を選ぶ。*1
VMWareは最新版(12)を使ったが特に問題は起きていないようだ。
Ubuntuのツール類
書籍中P296でインストールしているツール中、uboot-mkimageが入手できなかったので代わりとして表示されたu-boot-toolsをインストールした
また、Altera.wikiの中にMakeのバージョンが3.82以降だとエラーがでるという記述を見つけたので一応make3.81をインストールしておいた。(ただし、これが実際に意味があるのかどうかはわからない)
http://stackoverflow.com/questions/31912233/how-to-update-make-3-81-linux
同様にGCCのバージョンも4.2でないとエラーが出るという記述がAltera.wiki内にあるが、こちらのアップデートは上手くいかなかったので、最新のGCC(5.4.0)を使っている。(もしかするとこれが次の項の原因かもしれない。)
スクリプトの変更
上記の事を行ってもmake menuconfigが正常に動作しなかったので、以下の変更を行った

  • zconf.tab.cの改変
    • uClinux-dist/config/kconfigでコンパイルエラーが出る。内容はzconf.tab.cで未定義のオブジェクト(kconf_id_lookup)への参照があるというものなので、zconf.hash.cから関数の定義部分をコピーしてzconf.tab.cにペースト
  • timeconst.plの改変

@val = @{$canned_values{$hz}};
# if (!defined(@val) ) {
# @val = compute_values($hz);
# }
output($hz, @val);

実をいうとこの二つの変更は実際に正しい変更なのかどうか自分でもわからない。仕事であれば絶対やらないような、「やったら動いた」レベルのものなので、もし同様のエラーに遭遇されているかたは、影響について調査された上で正しい方法を実行されることをお勧めしたい。もし、上記の内容を試されるかたは、必ず各ファイルのバックアップを作成し異常があったばあいすぐに戻せるようにしておくよう留意される事をおすすめする。(繰り返しになるが、このブログでは結果については一切の責任はとれない)
アプリケーションの作成
私の環境ではp.317まですすめてもmake romfsでエラーが出てromfs/binの下に実行ファイルが作成されなかった。そこで、直接romfs-inst.sh /bin/helloを呼び出したところ無事実行ファイルが作成され、その後のimageのビルド、nios IIでの実行まで進めることができた。ただし、romfs-inst.shでエラーが出ているが、romfs/binの下にファイルはできているので良しとした。書籍注9-8にも同様の記述があるので、既知の問題と思われる。
実を言うと、なぜこの部分が動作しないのかよくわからない。単に自分のMakefileにエラーが残っているだけの可能性もあるし、これまでに行ってきた変更点が悪さをしている可能性もある。
Nios IIへの転送
最後にビルドイメージのNios IIへの転送だが、私の環境ではNios II 11.0sp1 Command Shellでイメージを転送したあと、Nios IIがポーズしてしまい以降動作しないことがあった。新しいVersionの13.0ではポーズする率が減ったので、以降はそちらを使用している
ともあれ、これらの変更で、9−3までの内容(uClinuxカーネルのビルドとNiosII上での動作、アプリケーションの作成と実行)は再現することができた。以下は証拠写真

残った問題点
ここまでの方法でどうにか9-3までの内容は再現できたが、9-4の「デバイスドライバの組み込みとテスト」に関してはまだ成功していない。どういうわけか、デバイスドライバの実行ファイルがromfs/lib/modules/2.6.30/kernel/drivers/char内に作られないし、nios IIにimageを転送してデバイスドライバをロードしようとしても、そんなドラバーは無いというエラーが表示される。
もしかするとここまでやってきたエラー回避策のどれかが悪さをしているのかもしれないし、他にツール類の依存性があるのかもしれない。または、単に自分の入力した内容にエラーが残っているのかもしれない。もし解決作が見つかったら、改めて別エントリで紹介したいと思う

*1:64bit環境で動作させる方法もないわけではないようだが、私の試した範囲では上手く動作しなかった。同様にWindows10のBashでもツールチェーンが動作しなかった。また、今回はツールチェーンのコンパイルはためしていない。