DE0/DE0-nano拡張基板で.bmpファイルをHDMI出力
アルテラマスターPさん( @s_osafune )のKYANITE基板を使ってビットマップファイルをHDMI出力させてみました。
KYANITE基板はDE0/DE0-nanoにサクッと挿すだけで
といったIOを増やせる拡張基板です。
アルテラマスターPさんがこの基板のデモプログラムを用意してくれていたので試してみました。
KYANITE基板 マニュアル
https://docs.google.com/file/d/0Bw0BfOQoAOEEVTFhWHdHT3V1czA/edit
DE0用デモプロジェクト https://t.co/uz4mRicSzm
DE0-nano用デモプロジェクト https://t.co/JcZD4q8mBc
(以下 DE0-nanoを使って動作確認したためDE0-nanoオンリーで書いていきます)
基本的には
1. DE0-nanoをコンフィグレーション
2. microSDに必要なファイルをコピーしてKYANITEに挿入
3. HDMIディスプレイと繋ぐ
4. DE0-nanoに電源投入
でおk。
1. DE0-nanoをコンフィグレーションする
output_files/cineraria_nano_DVI.jic
をEPCSに焼いておきます。
EPCSに焼きたくない場合は
output_files/cineraria.sof
を使います。コンフィグレーションするタイミングは後(4.DE0-nanoに電源投入)でOK。
2. microSDに必要なファイルをコピーする
microSDに DE0 ディレクトリを作って
software/nano_bmpwav/nano_bmpwav.elf を
microSDの DE0/bootnano.elf ※
にコピーします。
あと、適当なビットマップファイルを用意して
microSDの DE0/uzuko3-nano.bmp ※
にコピーします。
※ファイル名でロードされるのでこの名前にする
できたmicroSDをKYANITE基板に挿しておきます。
3. HDMIディスプレイと繋ぐ
KYANITE基板にHDMIポートが付いているので
HDMIディスプレイとHDMIケーブルで繋ぎます。
4. DE0-nanoに電源投入
jicで焼いた場合は電源投入すればHDMIディスプレイにbmpファイルが映ると思います。
sofファイルの場合はここのタイミングで焼けばOKかと。
ちなみにDE0-nanoのKEY0ボタンがリセットになっているようです。
これで映るはず。
FPGA内ではNiosIIをつかって
ブート時にmicroSDからelfファイルをロードしている様子。
参考URL
アルテラマスターPこと長船さんのblog
http://j-7system.blog.so-net.ne.jp/
KYANITE 取り扱い説明書 v0.99
https://docs.google.com/file/d/0Bw0BfOQoAOEEVTFhWHdHT3V1czA/edit
オススメ書籍
HDLについて書かれた本はたくさんありますが
Alteraはツールが便利なので、この本に書かれているツールの使い方を覚えておくと幸せになれます。
git log で変更ファイルもあわせて表示させる
git log に --name-status をつけるとaddしたファイルも一緒に表示してくれる。
--name-statusをつけない場合
git log
commit f581ad79d8ff71151cd92f6bfd533af9f9b04cbf Author: xxx <xxx@gmail.com> Date: Tue Sep 4 20:42:09 2012 +0900 added a REX-USB60MI device's VID/PID commit ba7ce532be746cdc264d5ff15d3814e6ade4adb7 Author: xxx <xxx@gmail.com> Date: Tue Sep 4 20:34:00 2012 +0900 added NOTICE.txt
--name-statusをつけた場合
git log --name-status
commit f581ad79d8ff71151cd92f6bfd533af9f9b04cbf Author: xxx <xxx@gmail.com> Date: Tue Sep 4 20:42:09 2012 +0900 added a REX-USB60MI device's VID/PID M FTDriver/src/jp/ksksue/driver/serial/FTDriver.java commit ba7ce532be746cdc264d5ff15d3814e6ade4adb7 Author: xxx <xxx@gmail.com> Date: Tue Sep 4 20:34:00 2012 +0900 added NOTICE.txt A NOTICE.txt
オープン・リード・ライト・クローズで見るAndroid FTDI公式 ドライバ
どんなデバイスプログラミングでも共通して言えることは、オープン・クローズ・リード・ライトさえしっかり押さえておけばOK。
ということで、公式のサンプルコードを元に、UARTの部分だけを抜き出したシンプルなコードを作りました。
デバイスを動かすにはとにもかくにも動くソースというのは重要です。
こいつを叩き台にして肉付けしていけばひとまず動くアプリは出来るでしょう。
全てのコードはgithubに上げています。
https://github.com/ksksue/Android-FTDI-UART-Sample/
javaソースコードはこれ
https://github.com/ksksue/Android-FTDI-UART-Sample/blob/master/src/com/ksksue/app/ftdi_uart/MainActivity.java
Nexus 7で動作確認をしています。
テスト環境はこんなかんじで
FTDIチップのRxDとTxDを繋いでループバックさせています。
宣言部分
private static D2xxManager ftD2xx = null; private FT_Device ftDev; static final int READBUF_SIZE = 256; byte[] rbuf = new byte[READBUF_SIZE];
使うのは D2xxManagerとFT_Deviceです。
D2xxManagerはUSBを介したFTDIデバイスとの接続を管理するクラス
FT_DeviceはFTDIデバイスと通信させるためのクラス
あと、readするときに一時的にバッファリングするbyte配列を用意しておきます。
try { ftD2xx = D2xxManager.getInstance(this); } catch (D2xxManager.D2xxException ex) { Log.e(TAG,ex.toString()); }
おまじないのようにD2xxManagerのインスタンスを作っておきます。
オープン
オープンするところは、インデックス(要はUSBを挿した順番)で検索してオープンさせるようにしました。
インデックスでオープンさせる方法以外にも
特定のSerialID(openBySerialNumber)で検索する方法もあるようなので
Hubを介しての接続先指定にはSerialID検索が良いかと。
int devCount = 0; devCount = ftD2xx.createDeviceInfoList(this); Log.d(TAG, "Device number : "+ Integer.toString(devCount)); D2xxManager.FtDeviceInfoListNode[] deviceList = new D2xxManager.FtDeviceInfoListNode[devCount]; ftD2xx.getDeviceInfoList(devCount, deviceList); if(devCount <= 0) { return; }
USBのデバイスが1つもつながっていなかったらそのままreturnです。
下に続きます。
if(ftDev == null) { ftDev = ftD2xx.openByIndex(this, 0); } else { synchronized (ftDev) { ftDev = ftD2xx.openByIndex(this, 0); } } if(ftDev.isOpen()) { if(mThreadIsStopped) { updateView(true); SetConfig(9600, (byte)8, (byte)1, (byte)0, (byte)0); ftDev.purge((byte) (D2xxManager.FT_PURGE_TX | D2xxManager.FT_PURGE_RX)); ftDev.restartInTask(); new Thread(mLoop).start(); } }
ftD2xx.openByIndex(this, 0) でオープンします。このコードでは1つのデバイスを繋ぐことを想定しているため
インデックスは0固定にしています。
オープンしたら、FTDIデバイスの初期化処理にうつります。
SetConfigメソッドでまとめてボーレート 9600bps, データビット 8bit, ストップビット 1bit, パリティなし、フロー制御なし
にしていますが、SetConfigメソッド内では
ftDev.setBaudRate(baud); ftDev.setDataCharacteristics(dataBits, stopBits, parity); ftDev.setFlowControl(flowCtrlSetting, (byte) 0x0b, (byte) 0x0d);
をそれぞれ呼んでます。
ftDev.purge((byte) (D2xxManager.FT_PURGE_TX | D2xxManager.FT_PURGE_RX));
でチップ内の送受信バッファをクリアしておきます。
ftDev.restartInTask();
でreadタスクがスタートします。
readタスクはおそらくFT_Deviceクラス内のスレッドで走っており
バックグランドタスクとして常にreadされたデータをバッファリングしています。
リード
synchronized (ftDev) { readSize = ftDev.getQueueStatus(); if(readSize>0) { mReadSize = readSize; if(mReadSize > READBUF_SIZE) { mReadSize = READBUF_SIZE; } ftDev.read(rbuf,mReadSize); ... } }
readはwriteとftDevを共有するためsynchronizedで囲みます。
ftDev.getQueueStatus()はチップから読み出されたデータのbyte数を返します。
(このあたりArduinoのSerial.avilable()と同じですね)
一応、rbufのサイズ以上コピーされないようにREADBUF_SIZEでリミットをかけておきます。
ftDev.read(rbuf,mReadSize) でreadタスクのバッファからrbufへデータをコピーします。
以下省略しましたが、このあとrbufの内容をTextViewへ表示しています。
ライト
ftDev.setLatencyTimer((byte)16); String writeString = etWrite.getText().toString(); byte[] writeByte = writeString.getBytes(); ftDev.write(writeByte, writeString.length());
ftDev.setLatencyTimer*1;で書込み。
書き込むためにString => byte[] 変換をしています。
クローズ
if(ftDev != null) { ftDev.close(); }
これでクローズします。
特筆すべきことはないです。
参考資料
D2XX for Android ライブラリとデモソース
http://www.ftdichip.com/Support/SoftwareExamples/Android/TN_147_Java_D2xx_for_Android_Demo_Source.zip
公式 D2XX for Android API Manual
http://www.ftdichip.com/Support/Documents/AppNotes/AN_233_Java_D2xx_for_Android_API_User_Manual.pdf
オススメ書籍
*1:byte)16);で適当にレイテンシを持たせておきます。 ftDev.write(writeByte, writeString.length(
■
GeekleBoardWiki公開中
http://ksksue.com/wiki/
Arduino Leonardoのデバイスデスクリプタ情報
Arduino Leonardo のデバイスデスクリプタ情報
Arduino UnoにはないHIDインタフェースが存在している。
Bus 001 Device 119: ID 2341:8036 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x2341 idProduct 0x8036 bcdDevice 1.00 iManufacturer 1 iProduct 2 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 100 bNumInterfaces 3 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 500mA Interface Association: bLength 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 2 bFunctionClass 2 Communications bFunctionSubClass 2 Abstract (modem) bFunctionProtocol 1 AT-commands (v.25ter) iFunction 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications bInterfaceSubClass 2 Abstract (modem) bInterfaceProtocol 0 None iInterface 0 CDC Header: bcdCDC 1.10 CDC Call Management: bmCapabilities 0x01 call management bDataInterface 1 CDC ACM: bmCapabilities 0x06 sends break line coding and serial state CDC Union: bMasterInterface 0 bSlaveInterface 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 64 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 10 CDC Data bInterfaceSubClass 0 Unused bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.01 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 101 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1
第1回 関西FPGA・DE0勉強会(2012/5/19)やってみた
はい、やってみました。
参加募集したATNDはこちら
http://atnd.org/events/28025
第0回の様子はこちら
[FPGA][DE0] 第0回 関西FPGA・DE0勉強会やってみた - Geekleboard
http://d.hatena.ne.jp/ksksue/20120115/1326638079
今回はライブコーディングやライブパワーポインティング、ライブテレフォンショッキング(?)など
いろいろライブ感をたのしめました。
以下、発表内容と資料のまとめ。
※資料はアップしていただいた方から更新していきます。
日時 :2012/05/19 13:00 to 17:00
参加人数 :21人 + α
会場 :ECCコンピュータ専門学校3号館 2階 (ECCコンピュータ専門学校3号館)
- FPGAで再現するレトロPC(改めまして編) (Oh!石 氏)
- AndroidとFPGAを高速FIFO通信させちゃう (す〜 @ksksue)
- コマンドラインでFPGAプロジェクト〜Quartus, SOPC Builder編〜(@iseroid氏)
- DE0でラジコンカー作ってみた(@yishii 氏)
- はまらないNiosIIの使い方(アルテラマスターP 氏)
- モテるハード開発 (juju 氏)
- ライブコーディング(バサロ 氏)
- 【ステマ】書籍 Android ADK プログラミング&電子工作バイブル の紹介 (@dietposter 氏)
FPGAで再現するレトロPC(改めまして編) (Oh!石(@oec_Nibbleslab) 氏)
資料:https://docs.google.com/file/d/0B_Ib9AQe3nWoaFVCaTRseGVPYjg/edit?pli=1
MZ80CをDE0にのっけてます。
データロードは、テープレコーダの代わりにNiosを使ってSDからロードしてるようです。
MZ80CよりNiosの方が高性能じゃね?
という点については「MZ80Cではよくあること」(スライド参照)らしいです。
組込みは速いだけが能じゃないですからね。ええ。
AndroidとFPGAを高速FIFO通信させちゃう (す〜 @ksksue)
資料:http://www.slideshare.net/KeisukeSuzuki1/androidfpgafifo
はい自分の発表内容です。
いまんとこ700KB/secくらい出てますよ、のデモとかしました。
ちと解説図が少なかったのでライブパワーポインティングを試験的にやってみました。
yishiiさんからライブテレフォンショッキングなんかもありましたね。
コマンドラインでFPGAプロジェクト〜Quartus, SOPC Builder編〜(@iseroid氏)
資料:http://www.slideshare.net/iseroid/1fpgade0-fpgaquartus-sopc-builder
必要なファイルとコマンドがシンプルにまとめていて、めっちゃわかりやすかったです。
オープンソースなどで配布するときに、コマンド一発でコンパイルできる環境なんかにもってこいのワザですね。
DE0でラジコンカー作ってみた(@yishii 氏)
資料:http://www.slideshare.net/YasuhiroIshii/de0-de0-fpga20120519
Altera本とDE0に興味を持って、Niosでさくっと作ってしまったようです。
yishiiさんのサクッとぷりはいつも脱帽します。
はまらないNiosIIの使い方(アルテラマスターP (@s_osafune) 氏)
資料:https://docs.google.com/open?id=0Bw0BfOQoAOEEU1hROUI4dlpkNlU
バッドノウハウをいろいろと披露していただきました。
NiosでSystemIDが見えなくなったら、ボクは
「Run Configuration で refleshボタンをクリックしまくる」
という技ひとつでなんとかしているんですが
それ以外にも全然知らなかったハマりポイントがあって
とても参考になりました。
モテるハード開発 (juju (@juju_suu) 氏)
わざわざ福岡からいらしてくださったということで
ボクのわがまま一つで急遽LTをお願いしました。
FPGAではないのですが、米粒サイズのAVRでフルカラーLEDを制御するLT & デモをしていただきました。
発表まで2,3時間くらいしかなかったにもかかわらずきっちり資料まで作ってデモ付きの発表していただきました。さすがです。
ライブコーディング(バサロ (@basaro_k) 氏)
資料:https://docs.google.com/presentation/d/1Vrl3w2eW2kPjLWXxvGlamMBqAxraMbnOs7rW61fNnTo/edit#slide=id.p
ライブコーディングで作成したファイル:LEDDEMO.ZIP
30分でカウンタを作成していただきました。
解説しながらコーディング、その場でコンパイル
こまかいテクニックに目から鱗な技を披露していただきました。
ボクはXilinxの開発環境を見たことがなかったのですが
使い方が見れて参考になりました。
【ステマ】書籍 Android ADK プログラミング&電子工作バイブル の紹介 (@dietposter 氏)
資料:http://www.slideshare.net/ssuser3261c5/android-adk-12991345
会場のご提供・設営いただいた吉田さんの発表です。
だれかさんがタイトルにステマと表しましたが、
Androidに関する情報いろいろいただきました。
ECCの学生さんが刺激されたのか次回は発表してくれるようなことを耳にしました。
次回、楽しみにしています。
ECCのキャンパスニュースに掲載されました!
http://comp.ecc.ac.jp/news/campus/detail.php?id=2592
当日のUst配信の録画
※スライドの文字つぶれていて、かなり読みづらいので、別で資料みながらのほうが良いです
内容
はまらないNiosIIの使い方(アルテラマスターP (@s_osafune) 氏)
途中切れてしまいました(汗
内容
はまらないNiosIIの使い方(アルテラマスターP (@s_osafune) 氏)
モテるハード開発(juju (@juju_suu) 氏)
ライブコーディング(バサロ (@basaro_k) 氏)
【ステマ】書籍 Android ADK プログラミング&電子工作バイブル の紹介 (@dietposter 氏)
わりとエイヤッとやっているところがあって、なにかと不備があったのですが、
皆さんにサポートいただいてとても助かりました。
次回もよろしくお願いします!