« 絶賛引っ越し中! | トップページ | Win7 64bitでのDMAもちゃんと動くようになった »

2013.03.21

EXPARTAN-6Tを64bit版Windowsで動かす!

Exp6tEXPARTAN-6Tを64bit版Windowsで動かすことに成功しました。

EXPARTAN-6Tというのは、特殊電子回路製のSpartan-6 PCI Express評価ボードです。いままでこのボードは32bit版のドライバしかリリースしてきませんでした。その理由は、

 

  1. なひたふがこのボードを設計したときに、64bit版のWindows Vistaはまるで人気がなかった
  2. EXPARTANのサンプルデザインにあるBAR(Base Address Register)の仕様が、Lagacy(32bitタイプ×6本)であり、Nativeの64bit BARを実装していなかった
  3. このボードを設計したときに、64bit版ドライバの作り方や署名のやりかたを知らなかった

このような理由により、いままで32bit版しかリリースしてきませんでした。でも、昨今の64bit人気を鑑みて、Windows7 64bit版ドライバを作ることにしました。

32bit版のWDMスタイルのドライバから64版ドライバを作る時は、ポインタのサイズが問題になるのですが、ULONG *をULONG_PTR *に変えるという単純作業を行うのですが、カーネルモードなので理解せずにやると危険です。

ULONG_PTRというのは、32bitになったり64bitになったりする整数型です。そのコンパイルする対象の環境でのポインタが何バイトかによって長さが変わります。

だから、関数の引数に、ReturnedByteのような値を書き込んでほしいアドレスを渡すような引数を与えたい場合は、ULONG *ではなくULONG_PTR *に書き換えます。

こんなことを思い出しながら、1つ1つ注意深く変換していきます。
署名をつけて、ほいっ!

Exp6t_64

やった!うまくいきました。

BAR0~BAR2は32bit BARですが、問題なく64bit Windowsでも認識できています。(当然ですよね。そうでないと99%のPCI/PCIeカードは使えなくなってしまう)

Exp6t_64_1

そして、DMA転送や割り込みもちゃんと動きました。

Exp6t_64_2

上のアプリは、PC内で計算した乱数列をDMA転送でFPGAに送って、EXPARTAN-6T上のDDR SDRAMに蓄えて、その内容をDMAで戻してきて、元のデータと比較するというものです。ただ、なぜか64bit版では速度の表示がおかしいです。こんなに速いわけがない(笑)

あと、DMAのサイズが4MBを超えると突如画面が乱れてブルースクリーンになります。共有バッファという方法でDMA転送を実現していて、そのサイズが4MBだからかもしれません。

Crash

このエラーの意味はPAGE_FAULT_IN_NONPAGED_AREA ですから、DMA転送してきたところがはみ出したのかもしれません(怖っ) このあたりも直していこうと思います。

これで64bit版のWindowsでのPCI Expressのふるまいを試せる環境が整いました。たとえば、x86環境ではDMAのときにキャッシュを無効にしようとしても強制的にキャッシュONになってしまいます。x64ならどうなるか、とかそういうことが試せていければ面白いと思います。

|

« 絶賛引っ越し中! | トップページ | Win7 64bitでのDMAもちゃんと動くようになった »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 絶賛引っ越し中! | トップページ | Win7 64bitでのDMAもちゃんと動くようになった »