FC2カウンター FPGAの部屋 DE0でuClinux 6(デバイスドライバの組み込み)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

DE0でuClinux 6(デバイスドライバの組み込み)

DE0でuClinux 5(アプリケーションの作成)”の続き。

今回は本の通りにuClinuxに7セグメントLEDのデバイスドライバを組み込んでみる。
(追加:カーネルのmoduleを選べないのは、Kernel ConfigurationでEnable loadable module supportに*を入れてなかったのが原因でした。もう一度ブログを書きなおします。)

(追加の追加:デバイスドライバを動的モジュールにすると、uClinux起動時にbooting the kernel.で止まってしまって、uClinuxが起動しなかった。これは、起動時に動的モジュールを呼び出しているのが原因だった。menuconfigで明示的にmoduleをunloadする必要がある。参考文献、Build loadable module

1.nios2-linux/uClinux-dist/linux-2.6.x/source/driversディレクトリに行く。

2.Kconfigに7セグメントLEDの項目を追加した。
nois2_uClinux_32_111126.png

3.Makefileにも同様に追加した。
nois2_uClinux_33_111126.png

4.nios2-linux/uClinux-distディレクトリに戻って、make menuconfigを実行した。

4A.Linux Kernel ConfigurationでEnable loadable module support に*を入れた。更にリターンキーを押して設定を続ける。
nois2_uClinux_42_111126.png

4B.Module unloadingとForce module unloadingに*を入れる。これで起動時にデバイスドライバの動的モジュールは読まれない。(こうしないとuClinuxが起動しなかった)
nois2_uClinux_43_111126.png

5.設定を行って一旦Exitし、もう一度立ち上がった設定画面で、7 segment LED driver をスペースで選択してMを選択した。(追加:カーネルのmoduleを選べないのは、Kernel ConfigurationでEnable loadable module supportに*を入れてなかったのが原因でした。)

nois2_uClinux_34_111126.png

6.makeコマンドを実行して、makeした。

6A.nios2-linux/uClinux-dist/romfs/lib/modules/2.6.30/kernel/driversにleddev.ko ができていた。
nois2_uClinux_40_111126.png

7.今度は、nios2-linux/mywork/leddevに移動して、leddev_test.cをコンパイルする。nios2-linux/mywork/leddevに移動した。

8.MakefileのROOTDIRを自分のパスに変更した。

9.makeを実行して、leddev_test.cをコンパイルした。

10.make romfsを実行した。
nois2_uClinux_37_111126.png

11.nios2-linux/uClinux-dist/romfs/binを見るとleddev_testが出来ていた。
nois2_uClinux_38_111126.png

12.nios2-linux/uClinux-distに移動して、make imageを実行した。

13.nios2-linux/uClinux-dist/images にzImageができた。zImageをzImage_7segleddrv に変更した。
nois2_uClinux_35_111126.png

14.zImageをzImage_7segleddrvをUSBメモリ経由でWindowsに移した。

15.Quartus II 11.0を立ち上げて、DE0にダウンロードした。
nios2_ucliunx_18_111124.png

16.Nios2 11.0 Command Shellを開いて、zImage_7segleddrvの置いてあるフォルダに移動した。

17.nios2-download -g zImage_7segleddrvを実行して、zImage_7segleddrvをダウンロードした。
nios2_ucliunx_36_111126.png

18.nios2-terminalでuClinuxを起動し、動的モジュールをロードした。
nios2_ucliunx_44_111126.png

19.leddev_testを起動して、7セグメントLEDのテストを行った。無事に動作した。
nios2_ucliunx_45_111126.png

いろいろミスって、動作するまでが大変だった。やっと動作して安心した。特にデバイスドライバの動的モジュールをunloadする設定を見つけるまでが大変だった。
  1. 2011年11月26日 06:36 |
  2. FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
  3. | トラックバック:0
  4. | コメント:5

コメント

参考になります

ご無沙汰しています^^

ブログを拝見させて頂いていますとuClinux環境で順調に開発できてなによりです^^;
私も以前にNios uClinux環境を構築して遊んでいた時期がありましたが環境構築??で非常に苦戦しました(汗)^^;

uClinuxバージョンにMMUがあるものと無いものがあってどれを使おうか迷ったのですがとりあえずその時点の最新をバージョンを選択して環境構築しましたが、
toolchainのbuildでエラーが出て、kernelのbuildでエラーが出て、自力で修正しようと階層ディレクトリの深い位置まで追いかけましたが力尽きて散々な目にありました。
選んだuClinuxのバージョンが悪かったかな?とuClinux-distの別の日付のバージョンをダウンロードし直してやってはみましたが、
どのバージョンもエラーが出て何が悪いのか分かりませんでした。

結局、上手くbuildできた環境はmarseeさんが使われたバージョンと同じnios2-linux-20090730.tarだけでした。
このバージョンは手持ちのNEEKボードや初期のAltera純正Cycloneボードへ実装してuClinuxの動作は確認して遊びました。
後は、Microtronix's release 1.4というのもあったんですが、Quartus5.0の対応でkernelも古いのでつかいませんでした。

で、今回marseeさんがuClinuxの記事を書かれていたので私もその影響を受けてやってみようかと・・・
丁度、ネットを回ってたら新しいnios2-linux-20100621.tarがあるようなのでちょっとだけチャレンジしてみました。

Altera Wikiの手順を参考にしながらやってみたところ・・・
やはり今回も toolchain の build でエラーが出てしまいました^^;
う~んコンパイラのバージョンとか相性がシビアなんですかね・・・

素直にBinary toolchain をダウンロードして使えばいいのでしょうが前回のこともあるので意地になってやってます。
  1. 2011/11/26(土) 17:50:04 |
  2. URL |
  3. hypermac #bWCE5pAU
  4. [ 編集 ]

こんにちは。ご無沙汰しております。

今回、なんとかうまく行って良かったです。
私もtoolchainのビルドでは痛い目というか、ビルドできないという目に何度もあっています。そのため、ビルドされたtoolchainがあるという理由でMSP430を使ったこともあります。
Xilinxのgitから落としてlinuxを動かそうとしたんですが、ビルドできませんでした。
このように、いろいろlinux系のOSをFPGAで動かそうと試みて動いたことが無かったので、本の内容におんぶにだっこという状態でもuClinuxが動いて嬉しかったです。

つぎは、XilinxのAXIバスのカスタムIPをやってみようと考えています。
  1. 2011/11/26(土) 18:41:13 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

Altera Forumでも同じようなエラーで悩んでいる海外の方もいるようです。やはりみなさんも見えないところでいろいろご苦労があるんですね^^;

>XilinxのAXIバスのカスタムIPをやってみようと考えています。

MicroBlazeはBusのデータのビット並び順はlittle Endianですよね。
以前、自作したBig endianの記述のVHDL コンポーネントをMicroBlaze側のwrapperとインターフェースしてデータの受け渡しをしたときにこれまた振り回されたこともしばしばありました(笑)

最近はXPS環境でデバックも終了して最新のdownload.bit作ったはずなのにMCSでROM化後、いざ電源いれてみると反映されていない状態だったりと。。。あぶないあぶない。

なのでbitファイルを作り直す毎にLEDの点灯する位置を変更するなどして変わったことが確実に分かるようにしています^^;
  1. 2011/11/26(土) 20:26:18 |
  2. URL |
  3. ご無沙汰しています^^ ブログを拝見させて頂いていますとuClinux環境で順調に開発できてなによりです^^; 私も以前にNios uClinux環境を構築して遊んでいた時期がありましたが環境構築? #bWCE5pAU
  4. [ 編集 ]

あっ!すみません!!!
名前のところに文章を入力してしまったようです。
気が付かずそのまま投稿してしまいました。

申し訳ございませでした。
  1. 2011/11/26(土) 20:28:38 |
  2. URL |
  3. hypermac #bWCE5pAU
  4. [ 編集 ]

MicroBlazeはIBMと同じでbit0がMSBだったと思います。仕事でPowerPCを使っているので、この辺は慣れていると思います。でも、いろんな罠がありますよね。
一番危ない罠はアウト・オブ・オーダー実行でした。設定のWriteよりも結果を見るReadの方が早いなんて、オーマイゴッドでした。しばらくなんでだめなのかわかりませんでした。今では、CのコードにインラインアセンブラでEIEIOを入れてもらうようにしています(PowerPCです)。
  1. 2011/11/27(日) 06:57:01 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1981-d66c9f0f
この記事にトラックバックする(FC2ブログユーザー)