空を見上げて
トップページ » 電子工作 » USB

USBデバイスの製作(11)

USB162のBulk転送の続き。

UUSBDが使える段階になったのでテンプレートを見直しする。
とは言え転送するものがない。雛形はループバックなのでこれを利用してみる。

パケットサイズで64byteとれるのでこれだけでもHIDの8倍は出るはず。
早速これをビルド。

次に本体ソフトにとりかかる。
これはUUSBD.DLLを呼び出して通信することになる。
以前(伽藍堂のバーコードの時代)にPascalのヘッダを書いていたので、それで作ってみる。
Pipeの番号がよくわからなかったが、0と1で動く。
データを見るとちゃんとループバックしているようだ。

やっと肝心のベンチマークを行う。
1パケット64Byteなのでそれを書いて読み出すというのを1024回のループをかけた。
つまり総合的には64KByteのReadとWriteになる。
結果は0.2秒。つまり片側は0.1秒であるので、少なくとも0.5MByte/secは出ている。
思ったよりは優秀である。(^^)
SCIもこれでブリッジすれば取りこぼしなどもなさそうである。
なんせUSB速度>>シリアル速度になる。

結論からすると
・Bulk転送を使えば0.5MByte/S以上の転送性能は可能である
・USB-IOのようにデバイスプログラムなしというのはできないがEZ-USB(2313の方)程度以上に開発環境が良い。
 例えばコンパイラの制限もないし、I2Cロムに書かなくても良い。
 デバイスもC8051よりはAVRの方が使いやすい(と思う)
・UUSBDのおかげでドライバは書かなくてよい
 DLLを呼び出せば簡単に制御できる。(柏野さんに感謝)
という感じで旧EZ-USB並みの使い方ができることがわかった。
これなら低速から中速まではこのICだけでOKである。

まあ、これにしてもやはりシリアル経由でスレーブにAVRがあれば使いやすいように思う。
サンプルにはインタラプト転送(入力)があるが、これはどういうわけかうまく動かない。
サンプルにまだ間違いがありそうだ。
例えば
template\demo\template\usb_specific_request.c

void usb_user_endpoint_init(U8 conf_nb)

usb_configure_endpoint(EP_TEMP_INT_IN,\
TYPE_BULK, \
TYPE_INTERRUPT,\
SIZE_64, \
ONE_BANK, \
NYET_ENABLED);
は、どう考えても
usb_configure_endpoint(EP_TEMP_INT_IN,\
TYPE_INTERRUPT,\
DIRECTION_IN, \
SIZE_64, \
ONE_BANK, \
NYET_ENABLED);
の間違いに思う。勿論これは修正した。
ちなみにInterroput転送をBulk転送にしても同じく入力でエラーする。
これはインターフェイスが2つであるが、1つにまとめても同じだった。
しかし入力はダメなのだが、出力として定義するとちゃんと動く。
LEDがDebugには重宝する。(^^!

サンプルがちゃんと動かないのは残念なのだが、別段Bulkエンドポイントを増やさなくても1パケットの64Byteで定義すればシリアルにも切替できる。
とりあえずは後はやる内容によって考えることにすればよいと思うので深く追求はしてはいない。
いずれにしても実際はループバックなどということはないわけで、何かを書かないと使えない。

EZ-USB並みに動くというので、ここは少し感動的であった。
アトメルがドライバとdllを提供してくれれば、EZ-USBのユーザは(後継がないので)全部こっちにくるように思う。(柏野さんのおかげでそれはいいのだが。)
EZ-USBが@3000程度であることを考えると価格的メリットも大きい。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(10)

紆余曲折はあったものの以下の2つは完成し無事動作した。
USB-IOより若干高いが、機能も上だし生産中であるのが心強い。

1)汎用USB-IOもどき
入力7bit、出力7bit、シリアル1ch(2bit)

2)汎用USB-IOもどき+マスストレージ(SPI使用)
・入力7bit、出力7bit、シリアル1ch(2bit)
・マスストレージ(今は2MByte)

さて、アトメルのサンプルにはもう1つあって
series2-usb_software_library_template-2_0_0-doc.zip
という雛形がある。
(他にも別のサイトではオーディオのサンプルもあって興味深いのだが)

眺めてみるとこれはどうもBulk転送のサンプルのようである。
考えるとUSB162はどの程度の転送速度が限度なのかよくわからない。
USBの規格ではなくある程度のソフトを走らせた場合である。
バスは出ていないがシリアル・SPIはあるし、ポートとしてなら8+8+5=21bitある。
つまりはそういう幅で入出力できる素子であることには違いない。
EZ-USBでは主にBulk転送を使ったが、C8051がAVRと思えば似たようなことはできそうである。

そこでバルク転送の雛形にチャレンジする。
ところがサンプルではまりまくった。(TT)
周波数のパッチをあててビルドし、つなぐと「不明なデバイス」になりドライバすら要求してこない。
ディスクリプタを見直して何度もトライしたが症状は変わらない。

ずっと追っていくと
template\demo\template\usb_descriptors.h

// USB Device descriptor

#define EP_CONTROL_LENGTH 64
があるが、コントロールの長さが64ってのはおかしい。

#define EP_CONTROL_LENGTH 8
にしてやるとちゃんとドライバを要求してくるようになる。(^^v

さてそうなるドライバがいるのだが、アトメルが提供しているわけではない。
そこで汎用ドライバである柏野さんのUUSBDを導入する。
infを作ってインストールする。
ここでめでたくUUSDBデバイスになりUUSBD.DLLが使えるようになる。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(9)

汎用USB-IOもどきの続き。
結局結構欲張った仕様にする。
入力7bit、出力7bit、シリアル1ch(2bit)でSPIはあけておく。
SPIは前にも書いたが、SPIのROMをつけるとマスストレージとして使える。
これはこれで面白いと思う。
例えばドライバ(HIDでは不要だが)やアプリを入れておけば、これだけ持ち運べばどのPCでも実行できる。
ドライバを探し回ったり、アプリの最新版を探し回ったりしなくてもよい。
まあ2MByteもあれば、我慢できる範囲であるといえる。

アトメルのUSB-Keyもそうなっていて、ドキュメントはここに格納されている。
便利な時代だが、開発ツールも入れてほしかった。(大きくて入らない?)

それはともあれこの発想で2種作成することに決めた。
1)汎用USB-IOもどき
入力7bit、出力7bit、シリアル1ch(2bit)
シリアルはボーレイトも切替が可能。
2)汎用USB-IOもどき+マスストレージ(SPI使用)
・入力7bit、出力7bit、シリアル1ch(2bit)
・マスストレージ(今は2MByte)
の2種。

ここまでは汎用であるので、USB-IOのように
・デバイスのプログラムは書かなくても良い
・HID(とマスストレージ)なのでドライバも書かなくて良い
・アトメルのdllを使えばアプリも簡単に書くことが出来る
というお手軽なデバイスである。

シリアルは256byteのバッファがあるものの、それ以上の入力がなると入力と出力の速度差問題がある。
出すほうはPCが制御するのだからいいのだが、デバイスから大量のデータがくるものをシリアルで受けるとPCが引き取る前に書き換わる可能性がある。
またこれらはPCのアプリにもよる。
HIDとアシリアルのブリッジなのでしょうがないといえばしょうがない。
考えて作ればそれなりに思う。

まだやってはいないのだが、アイデアとしてこれでAVRにプログラムするのも面白いと思う。
ベストテクノロジー社に「ATmegaシリーズ 簡易ブートローダ」なるものがある。
つまりこれをあらかじめAVRに書き込んでおけば、XMODEMでファイルが書ける。
想定としてはHIDのシリアルの先にAVRをつないでおいて、それをUSB経由でプログラムする。
このあたりAruduinoみたいな感じであるがPCとはHIDでつながる。
Bootは2Kらしいが、ATmega168/32/644/128などが使える。(BootはISP経由になるが)

このUSB162は強力ではあるが時間待ちが多いような制御は難しい。
・例えば液晶ではないが、1ms待って次を書くとかそういう類は面倒である。
USBのタスクは擬似マルチみたいで、1つのタスクが占有するような書き方は好ましくないと思う。
そこで細かな機器制御になるとやはりAVRをつないで処理したい。
・もう1つはUSB162にはADコンバータがない(TT)
 別のものを買う以外には、SPIのADコンバータをつけるという手もある。
ただ価格を調べてみると(性能はともかく)AVRでAD付と大差ない感じがする。それならいっそAVRをつないだほうが入手性もよいし汎用性もある。
それならCDCでいいのであるが、それだとUSB162の意味は少なくFTDI社のものでよい。(Aruduinoがそういう感じ)
もっともUSB162でもCDCになるので、それでも可能には違いないが。

それはともあれ、そういう代案はあるにしろ、
・汎用USB-IO
・汎用USB-IO+マスストレージ
にさらにAVR(A/D)という拡張があり、USB経由でプログラムできるのならかなり柔軟なことが可能になると思われる。

雛形としては
・汎用USB-IOはSTK526-series2-hidio-2_0_1-doc.zip
・汎用USB-IO+マスストレージはSTK526-series2-ms_hidmouse-2_0_2-doc.zip
から作成する。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(8)

HIDホストの覚書。アトメル社の
generic_usb_hid_2008-11-19.zip
のところで書き忘れたのだが、HIDのdllでイベントの通知ができる。
例えばデバイスの抜き差しでイベントが発生する。
この中の資料を読めばいいのだが

1.デバイスにコネクトする(VIDとPIDを入れて呼び出す)
DYNCALL(findHidDevice)(Vid, Pid)

2.デバイスのイベント通知を登録する
DYNCALL(hidRegisterDeviceNotification)((m_hWnd));
メッセージマップに ON_WM_DEVICECHANGE()
を入れておく。

すると
OnDeviceChange(UINT nEventType, DWORD dwData)
のイベントがくるようになる。
nEventTypeはDBT_DEVICEARRIVALかDBT_DEVICEREMOVECOMPLETE。
来たら
DYNCALL(isMyDeviceNotification(dwData))
を呼んで自分のイベントかどうかをチェックすることで判定している。

Delphiでも一般的なメッセージフックは可能なので、それでやってみる。
無事動いているようだ。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(7)

サンプルをコンパイルして書き込むのはできたし環境も出来た。
今度は自分独自のものをやってみることにする。

まずはUSB-IOもどきに挑戦する。
ベースは
EVK527-series4-hidio-2_0_1-doc.zip
というのがそれにあたる。
ただ今回はホストも作りたいので
generic_usb_hid_2008-11-19.zip
も一緒に調べる。

このプログラムはいいのだが、
出力:1バイト目にOnかOffか、2バイト目にLED番号を書く。

if(Led1 == false) {
Led1 = true;
m_Led1.SetWindowText(_T("LED 1 ON"));
DYNCALL(writeData)((UCHAR *)"11");
}
else {
Led1 = false;
m_Led1.SetWindowText(_T("LED 1 OFF"));
DYNCALL(writeData)((UCHAR *)"01");
}
入力:1バイト目を見る。
if(sbuffer[0]==1) {
AddRecievedData("Button as been pressed");
}
else {
AddRecievedData("Button as been released");
}
となっている。
これでもいいが、もっと単純に投げたデータをそのまま書いたり読んだりするようにする。
ホストプログラムはAtUsbHid.dllが使える。
これは入力8バイトと出力8バイトを転送するもので簡単な呼び出しで実行できる。
(ヘッダは後者に含まれている。)
面倒なのでDelphi用のPascalヘッダを作成する。
これでホストにサンプルを書き込んで実験。
ここまでは簡単に動く。

162側も書き換えてみる。LedとかJoyとかいう名前もおかしいので自前で書き換える。
するといろりろなファイルに変更が波及する。こうやって勉強するものなのかもしれない。
それやこれやをやっているとめでたく動作する。
USB-IOみたいに使えるしdllもある。

それでは面白くないので拡張を考える。
仕様を読むとSCIがある。CDCにするとブリッジ風なので、HIDとSCIの変換を考える。
これはCypressのものでもMOTOという会社からサンプルがあった。
こういうブリッジをやると転送速度の違いを考慮して設計しなくてはいけない。
つまりアプリにはある程度制限がかかる。
しかしメリットもある
・HostはComとして扱う必要がない(設定が要らない)
・DeviceはSCIで拡張が簡単。例えばAVRをもう1つなど
というメリットがある。
この162にはADコンバータがない。(TT)
外付けでSPI経由というのもあるのだが、価格とか入手性とか柔軟性からすれば、AVRをもう1つつないでも似た様なものである。(するとCDC+AVRと変わらないが、IOが使える。)
それもあって、このSCIを活用することにする。


by   at 10:03  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(6)

シリアルROMが届いたので早速組み上げる。
1.27mmのSMTなので秋月の変換基板でDIPに変換する。
こんな感じ。

少し狭くなってきた。(^^!
このシリアルROMは電源が3.3Vなのでそれも作成が必要になる。
ただ入出力は5Vトレラントなので直結可能。
STK526の接続と同じでよい。

次にソフトを修正する。
これは結構箇所が多い。(TT)

・usb162\ms_hidmouse\lib_board\stk_526\stk_526.h
// One AT45DB642D
#define DF_8_MB

#define DF_2_MB
に。
・usb162\ms_hidmouse\lib_mem\df\df.h
に以下を追加。4Mまでの定義があるが2Mの定義がない。
DF_DENSITY、DF_PAGE_MASKは他のROMのデータシートと比べながら修正。
結果的にはあっていたようである。
//_____ D E F I N I T I O N ________________________________________________
#ifdef DF_2_MB // AT45DB161 memories
#define DF_SHFT_DFIDX (21) // RShift to apply to an absolute
// * Byte address to get the DF idx
#define DF_DENSITY ((Byte)0x2C) // Status Register Format???
#define DF_PG_BUF_1 ((Byte)0x82) // fast main memory program through buf1
#define DF_PG_BUF_2 ((Byte)0x85) // fast main memory program through buf2
#define DF_PAGE_SIZE (512) // page length
#define DF_PAGE_MASK ((Byte)0x00) // mask MSB page bits
#define DF_SHFT_B1 (1)
#define DF_SHFT_B2 (7)
#endif
・usb162\ms_hidmouse\lib_mem\df\df_mem.c
以下を追加(メモリ容量)
#ifdef DF_2_MB // AT45DB161 memories
*u32_nb_sector = ((DF_NB_MEM*2*1024L*1024L)/512)-1;
#endif
後2箇所512B PAGESと1024B PAGESの切替箇所がある。
8MのROMは1024で2Mと4Mは512である。
#ifndef DF_8_MB // 512B PAGES
//#ifdef DF_4_MB // 512B PAGES
を書き換え。

試行錯誤だったのだが、だいたいそんな感じだったと思う。
動かしてみると「フォーマットされていない」とメッセージが出てフォーマットするとちゃんと動く。
一応読み書きも正常である。早くはないし、2MByteにしても小さいのだが、便利そうでである。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(5)

調子にのって幾つかのサンプルを動かしてみる。
Atmelさんのサイトには以下のものがある。
・hidio(HIDの汎用ポート)
・hidmouse(HIDのマウス)
・cdc(シリアルポート)
・ms_hidmouse(マスストレージ+HIDマウス)
上の2つはLEDとスイッチであっさり動く。
cdcはドライバがない。(^^!
MSの標準ドライバで動くのだが、VIDとPIDの問題でinfを書く必要がある。
しょうがないので自前で書いて、なんとか動いた。
動作は
・USRATで受信したものをエコーバックしLEDを点滅
・ボタンを押すとUSRTに文字列を送信
みたいな動きをする。
汎用のブリッジの方が使い勝手は良いと思うが、調べるとここここが参考になる。

とりあえず残るのはms_hidmouseだけになった。
これを動かすにはSPIのシリアルROMが必要である。STK526は8MByteらしい。
ネットで探すとスイッチサイエンスさんにAT45DB161D-SUが1個¥360であった。
2MByteだがピンは同じだし、なんとかなるだろうという気持ちで注文した。
¥3000以上で送料無料なので10個にしようとしたら、1名4個までだった。(TT)
支払いにはPayPalが使える。
届いたら、マスストレージに挑戦することにする。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(4)

アトメルのサンプルソフトをコンパイルする。
あっさりコンパイルできるので、FlLIPで書き込む。
書き込みはここが参考になる。
とりあえず、
・HIDの汎用IO
をやってみる。しかし動かない。
よくよく調べるとSTK526は8MHzなのに、ストロベリーLinuxさんのものは16MHzだ。(^^!
STK526-series2-hidio-2_0_1-doc\STK526-series2-hidio-2_0_1-doc\demo\STK526-series2-hidio\conf\config.h

//! CPU core frequency in kHz
#define FOSC 8000
とあるが
#define FOSC 16000
に修正する。

動いた。デモソフトも同梱してあった。このdllも有難い...と思う。
同じようなファイル構成なので他もこの方法で修正できる。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(2)

さっそく届いたので組み上げる。
と言っても殆ど作らなくて良い。

ストロベリーLinuxさんのここにチュートリアルがある。「インストール」を参考にインストールする。
FLIPというソフトでUSB経由で書き込む。ブートはあらかじめ書いてあるので、ジャンパでBootを走らせることになる。
・ハードリセットするときBootPinをショートさせておく
・ハードリセットを解除する(Bootが走る)
・Bootのショーとを外す
という手順。BootはHWBが正式名称?USB-KEYも同じである。
ところが、ストロベリーLinuxさんのはジャンパピンでこれがやりにくい。
しょうがないので押しボタンスイッチをつける。

ついでにピンもたてておく。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(3)

さっそく動かしてみるというので、まずは同社のサンプルソフトを動かす。
サンプルソフトはアトメル社のこのページにある。
AVR USB Series2というのがAT90USB162用なので全てダウンロードしてみる。
サンプルは
・USBマウス
・HIDの汎用IO
・マウス+マスストレージ
・CDC(つまりシリアル変換)
などがある。
STK526用であるが、これは同社の評価Kitである。
AVRではおなじみのHEROさんのページで和訳を見つける。有難く参考にする。
STK526では
・スイッチ4個
・LED4個
・シリアル1個
・SPIのFlash
で成り立っているらしい。
SPIのフラッシュ以外はなんとかなるのでつけてみる。

シリアルはどうせ+5なのでストロベリーLinuxさんのUSBシリアルをつける。

こんな感じ。

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)

USBデバイスの製作(1)

汎用のUSBチップがどんどん生産終息になる。
まあ、工作などならいいのだが、やはり生産品を使いたいもの。
今までで工作に良いと思ったものは以下なのだがいずれも生産終息。(TT)

シリアルはPCの関係もあってUSBに移ってきたのだが、USBの工作は敷居が高い。
シリアルと違うのは
1.デバイスのプログラムが面倒だし、よくわからない
 Chipごとに違う作法を覚えなくてはならない。
2.ドライバが必要になり、これまた敷居が高い
 DDKなどから作るのは至難。
3.アプリの製作が面倒
 Comをあけてデータを送受信という具合になかなかならない。
となる。
ComとUSBを変換するChipもあるので、それを使えば解決はするが、それでも最適とはいえない。
例えば単純にPCにスイッチを1つつけて、その動作を読む場合を考えるとする。
これをUSBでやろうとすると、Comで変換してもその先にまたChipが必要である。
もっともFTDIでBitBangもあるので、そちらが手っ取り早いし安いのだが。
それでは、スイッチ4個とLED4つなると、これはもうCom+AVRなりになる。
これはこれで優れた解決方法だと思うのだが、もっと柔軟性もほしい。 

■USB-IO
Cypress CY7C63001Aを使っている。書籍も出ていて知名度も高い。
元はPDAを目指したモルフィー企画の企画製品であったが、同社が解散したため、Km2Netさんテクノキットさんで現在も扱われている。
Kit価格はだいたい@1,500程度である。
このChipはワンタイムだしライターが必要なのだが、それをうまくまとめてある。
・ドライバはHIDなので不要
・アプリ用のDLLが有志により提供されている
なのでユーザはアプリに専念できる。

■EZ-USB
Cypress AN2131SCを使ったもの。C8051CPUを内蔵している。
開発プログラムをダウンロードして使えるので様々な応用が可能。
現在、オプティマイズさんから販売されている。
Kit価格はだいたい@3,000程度である。
また現役のFX2は同社のほかストロベリーLinuxさんからも販売されている。(Kit価格はだいたい@4,000)
このChipは開発環境が必要なのだが、Freeだしライターなどの必要ない。
・ドライバはCypressから提供されるので不要
・アプリは同社のドライバがBulk転送なので、それを作ることになる
なのでユーザは少し面倒ではあるが柔軟な開発が可能になる。

ところが最近はPICやAVRにその機能が内蔵されてきた。
・PIC
 書籍も出ている(有名な後閑 哲也さん執筆)。販売は上のオプティマイズさんが扱っている(PIC24FJ256GB106)。また有名な秋月通商さんにもある(PIC18F2550)。
 これも悪くはないのだが、開発環境が限定なのがどうもいただけない。
価格は@1,000-2,000。

・AVR
 販売は上のストロベリーLinuxさんやマイクロファンさんにある。(AT90USB162)秋月通商さんにもある(AT90USB1287)。
 開発環境は無料である。価格は@2,000-3,500。
 資料が少ないがそこはWebがある。(^^!

とりあえずはストロベリーLinuxさんから購入する。
開発環境が全て無料というのはありがたい。(^^)

by   at 09:00  | Permalink  | Comments (0)  | Trackbacks (0)