酔漢電子工作手帳

2007-09-20

入出力バッファ

| 12:57 | 入出力バッファ - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - 入出力バッファ - 酔漢電子工作手帳

FTDIのFTCJTAG.DLLやFTCSPI.DLLは入出力にそれぞれ64KBのバッファを持っています。この範疇でやんなさいというこのよう。OK,それでいくしかなさそうですね。SPIは特に問題ありませんが、JTAGのほうはちと小さすぎます。

トラックバック - http://ecrafts.g.hatena.ne.jp/suikan/20070920

2007-09-18

スレッドセーフじゃない?

| 07:51 | スレッドセーフじゃない? - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - スレッドセーフじゃない? - 酔漢電子工作手帳

実は先週あたりから、プログラムのマルチスレッド化を目指して実験を進めていますが、ことごとく失敗しています。

C#側のスレッド制御には問題はなさそうです。いくつかの方法を試すに当たって、何度もテスト・プログラムを書いていますがまったく問題なく動きます。

問題は、テストにパスしたプログラムでreadとwriteを同時に行うと、途端にアプリケーションフリーズすることです。これは使い捨てのスレッドであっても、サーバー型のスレッドであっても同じです。また、readのスレッド化とwriteのスレッド化の両方を試しましたが、同じ結果になりました。

まだ、完全に信じているわけではありませんが、FTDIのライブラリはreadとwriteがスレッド・セーフではないのかもしれないと考え始めています。

トラックバック - http://ecrafts.g.hatena.ne.jp/suikan/20070918

2007-09-12

新SPIクラス

| 22:42 | 新SPIクラス - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - 新SPIクラス - 酔漢電子工作手帳

結局、フル・デュープレックスSPIクラスを作りました。昨日の実験コードを元に、送受のバッファ長が異なる場合を許す*1、よう改造しました。このクラスのユーザーはSpiFlashクラスで、これも以前のものを少しだけ書き換えて使っています。

動作確認済みです。

あとひとつ、SPI FLASHには不要ですが、FT2232を使うばあい、Read APIとWrite APIバッファ長を知っておく必要があります。SPIの場合、長大なフル・デュープレックス転送を行うことは考えにくいのですが、可能であればやってしまうのがユーザーです。FT2232の中には数百バイト程度のバッファしかありません。そのため、数百キロバイトのデータをフル・デュープレックスで転送する場合に制限がないか知っておく必要があります。

要するにFTDIのデバイス・ドライバの内部バッファの大きさを知らなければなりません。無論、Read API とWrite APIを異なるスレッドから読めば何の不安を感じる必要もありません。

*1:可能な限り送受を同時に行い、残りは送か受、バッファの長いほうだけを実行する

トラックバック - http://ecrafts.g.hatena.ne.jp/suikan/20070912

2007-09-08

コード整理進行中

| 23:27 | コード整理進行中 - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - コード整理進行中 - 酔漢電子工作手帳

勢いに任せて書いたSPI Flash Programmerのコードを整理中です。今風に言うとリファクタリング。名前やnamespaceの階層、ファイルへの分割をネット上で入手できた命名規則にしたがって変更しました。また、やっつけでクラス化したものも、必要に応じて抽象クラスとその具象に分割するなどしています。

ディレクトリ名前空間にあわせて整理しました。少しずつ作業は進んでいます。

次はDoxygenコメントの再整理です。これがえらい作業なんだよなぁ orz

トラックバック - http://ecrafts.g.hatena.ne.jp/suikan/20070908

2007-09-02

IDCODE読めた

| 15:02 | IDCODE読めた - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - IDCODE読めた - 酔漢電子工作手帳

ようやくここまで来ました。ターゲットはDWM 2006 4月号の付録基板。

f:id:suikan:20070902145658p:image

IDCODEは、3F0F0F0F。これは以前FTDIのサンプルプログラムで読んだ値と同じです。これを読む部分のコードは、こんな感じ。

        private void IdCodeButton_Click(object sender, EventArgs e)
        {
            byte[] idcode = new byte[4];
            int readBytes;

            FTDI.JTAG.Write(
                    handle,
                    true,       // instruction
                    target[1].inst_bitlength,
                    target[1].inst_idcode,
                    target[1].inst_idcode.Length,
                    FTDI.JTAG.TapState.TestLogicState
                    );

            FTDI.JTAG.Read(
                    handle,
                    false,      // data
                    32,         // idcode is always 32 bit
                    idcode,
                    out readBytes,
                    FTDI.JTAG.TapState.TestLogicState
                    );

            textBox1.AppendText(
                "IDCODE is : " +
                idcode[3].ToString("X2") + " " +
                idcode[2].ToString("X2") + " " +
                idcode[1].ToString("X2") + " " +
                idcode[0].ToString("X2") + Environment.NewLine
            );
        }

テキストボックスへの表示を除けば、関数2つを呼ぶだけでJTAGのIDCODEを読み出すことができます。とっても簡単。ですが、最初の関数のtarget変数を組み立てるためにはXMLによるターゲット宣言ファイルの読み込みルーチンを書かなければなりません。それに、Amontec JTAGKEY(実はベステクのTINY-JTAG)の初期化を支えるルーチンも必要です。たとえばこんな感じ。

        public static void EnableTap(int handle)
        {
            FTDI.JTAG.InputOutputPins gpioL, gpioH;

            gpioL.bPin0InputOutputState = true;  // Output. Tap Enable Pin
            gpioL.bPin1InputOutputState = false; // Input
            gpioL.bPin2InputOutputState = false; // Input
            gpioL.bPin3InputOutputState = false; // Input

            gpioL.bPin0LowHighState = false; //  L. Tap Enable
            gpioL.bPin1LowHighState = false; //  L
            gpioL.bPin2LowHighState = false; //  L
            gpioL.bPin3LowHighState = false; //  L

            gpioH.bPin0InputOutputState = true; //  Output;
            gpioH.bPin1InputOutputState = true; //  Output;
            gpioH.bPin2InputOutputState = true; //  Output;
            gpioH.bPin3InputOutputState = true; //  Output;

            // amontec circuit dependent
            gpioH.bPin0LowHighState = true;    // deassert TRST;
            gpioH.bPin2LowHighState = false;   // enable TRST

            gpioH.bPin1LowHighState = false;    // keep it L always
            gpioH.bPin3LowHighState = true;    // Hi-Z  SRST

            errorCheck(
                FTDI.JTAG.SetGPIOs(
                                handle,
                                true,           // control GPIO_L
                                ref gpioL,
                                true,           // control GPIO_H
                                ref gpioH
                                )
                );
        }

そんなわけで、優雅な水鳥も水面下では激しく水をかいているのでした。

chakokuchakoku2012/08/04 20:38はじめまして。掲載していただいたソースコードのお陰で、試作中のJTAG制御ソフト?でも
デバイスIDが読めました。助かりました!!

トラックバック - http://ecrafts.g.hatena.ne.jp/suikan/20070902