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基板に挿しておきます。
upload


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はツールが便利なので、この本に書かれているツールの使い方を覚えておくと幸せになれます。

unzipでダバァしてしまったファイル群をundoするshellスクリプト

解凍したらディレクトリが1個できるだけだろうと思ってunzipしてみたら
コーラメントスのごとくカレントディレクトリにダバァしてしまったことありませんか。


そのダバァしてしまったファイルを全部削除して元の状態に戻すシェルスクリプト

#!/bin/sh
zipinfo -1 $1 | awk -F"/" '{ print $1}' | uniq | xargs -d '\n' rm -r

ただ、ダバァで上書きされてしまったファイルはあきらめましょう。


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(

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!石 氏)
  • AndroidFPGAを高速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ではよくあること」(スライド参照)らしいです。
組込みは速いだけが能じゃないですからね。ええ。


AndroidFPGAを高速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 氏)



わりとエイヤッとやっているところがあって、なにかと不備があったのですが、
皆さんにサポートいただいてとても助かりました。
次回もよろしくお願いします!