マイコン工作実験日記

Microcontroller を用いての工作、実験記録

W-SIM/USBの動作の様子

2007-12-16 16:25:16 | W-SIM
いちおうUSB Speaker/Micまで動くようになったので、現時点での動作の様子を載せておきます。本実験ボードではカーネルとしてTOPPERS/JSPを使用していますが、AT91SAM7S256のデバック用シリアルポートをログポートとして使用しています。そのため、ソフト中にデバック用のメッセージをsyslog() で入れておくことにより、シリアルポートにそのメッセージが出力されることになります。

ボードをUSBポートにつなくと、TOPPERS/JSPの起動メッセージに続いてUSBのデバックメッセージが表示されます。SET_INTERFACEに続く2つの番号は、最初がインタフェース番号、次がAlternative settingsの番号を示しいます。Alternate settingsは対応するインタフェースで使用する帯域幅を選択するための手段ですが、0番では帯域幅がゼロに設定されています。そのため、0を選択するとSpeakerならびにMicが非活性化されることになります。

続いてW-SIMに投入しているATコマンドとその応答が確認できます。"at*i2:1"はW-SIMの動作モードを音声呼が利用できるDTEモードに変更します。"at@r1"は音声呼の着信を許可するためのコマンドです。

ブート時画面


ブートした状態でDevice Managerを開くとUSB複合デバイスとして認識できていることが確認できます。プロパティを開いてみるとW-SIM Adaptorという名前が見えますが、この名前はDevice DescriptorのiProductで与えておいたものです。



さらにサウンドレコーダを立ち上げて、プロパティを開くとSpeaker/MicとしてW-SIM Adaptorが選択されていることが確認できます。



W-SIMに呼を入れるとRI端子が変化します。EV_RIはRI端子の変化で生じた割り込みによりイベントが生じたことを示しているデバックメッセージです。EV_DCDは同様にDCD信号の変化を示します。RING, PROTOCOL, ID= の3行は着呼時にW-SIMから送られてきたメッセージで、呼種別が音声であることと相手の発信者番号がわかります。
実際には、RI信号を受けてataコマンドが送られているのですが、メッセージの改行の都合で、その後のEV_DCDによって上書きされてしまっています。


EV_DCDが出た時点で、呼がつながっています。サンドレコーダで、音声ファイルの再生を開始するとSET INTERFACE 1,1のメッセージが表示され、再生された音声がW-SIM側に流れます。再生を停止するとSET INTERFACE 1,0が表示されます。同様にマイクでの録音の開始/停止でSET INTERFACE 2,xが表示されます。

相手側が呼を切断すると、再度RI信号が変化します。そこで、athコマンドを送ってやるとW-SIMからOK応答が返ってくるとともにDCDが落ちます。

以上が、ブートから着信、再生/録音、そして切断の動作の様子でした。

USB Audio - Mic

2007-12-15 20:12:21 | W-SIM
USB Speakerに続いて、USB Mic機能を追加しました。Config Descriptorには、マイク部分を追加すればいいわけで、それも構成としてはSpeakerと同じ要領で作成すればいいだけなのですが、それでもDescriptorの長さの計算を間違えて何度かBlue screenを見ることとなってしました。

Speaker/Micを構成するTerminal IDとUnit IDは次のように割り当てました。

IDDescriptor TypeTerminal TypeSource ID
Speaker1Input TerminalUSB streamingN/A
2Feature UnitN/A1
3Output TerminalSpeaker2
Mic4Input TerminalMicrophoneN/A
5Feature UnitN/A4
6Output TerminalUSB streaming5

Speaker/Micは、それぞれInput Terminal, Feature Unit, Output Terminalの3つの部分がつながって構成されています。Feature Unitは、ボリュームのように制御をおこなう機能部分です。Speakerの場合には、USBポートで受けた音声データを物理的なスピーカに出力することになるので、Input TerminalがUSB Stream, Output TerminalがSpeakerとなります。3つの部分のつながり方の順番はSource IDによって表現されています。

インターフェースについては、全部で3つあり、次のような構成となっています。
Interface NumberSubClassAlternate setting
0Audio ControlN/A
1Audio Streaming0
Audio Streaming1
2Audio Streaming0
Audio Streaming1

0番がFeature Unitを制御するためのインタフェース、1番がスピーカ、2番がマイクに対応するインタフェースとして定義しています。Alternate settingは、0番がバンド幅0のインタフェースとなっており、デバイスを非活性化する際に使用されます。この使われ方については、次回記事で示す動作ログを見るとわかりやすいと思います。

W-SIM実験ボード Rev.2

2007-12-15 10:29:59 | W-SIM
購入したW-SIMソケットを使って、新たな実験ボードを作成しました。前回と同じくW-SIMとOLIMEXのヘッダボードSAM7S-H256を直結しただけの単純なものです。W-SIM部分はソケットだけになったので、今度はひとまわり小さい秋月の両面基板に載せてみました。

W-SIMソケットは端子が小さいのでUEWを使って配線しましたが、ほとんどチョン付けしかできていないような状態なので、後で接着剤でも使って固めておいた方が良さそうです。


W-SIMとSAM7-H256との接続は次のような対応になっています。
W-SIM       SAM7-H256
---------------------
TXD     <--- TXD1
RXD ---> RXD1 RTS <--- RTS1
CTS ---> CTS1 DTR <--- DTR1
DCD ---> DCD1 RI ---> RI1 INS ---> DSR1 VCC ---- 3.3V GND ---- GND PCMCLK ---> RK PCMSYNC ---> RF PCMIN ---> RD PCMOUT <--- TD
IFSEL ---- GND DISP1 ---- N/C DISP2 ---- N/C DISP3 ---- N/C

INS端子はW-SIMの装着状態を示しますが、Active Lowなので実質的にDSRと同じ機能とみなせます。

DISPの各端子は未使用です。当初IFSELはオープンにしていたのですが、その状態だと、TXDにATコマンドを送っても何の反応もありませんでした。どうやら、IFSEL端子は内部でプルアップされており、Lにしないとモデムは非選択状態でATコマンドに応答してくれないようです。しばらくこれに気がつかず悩んでしまいました。

電源にはパスコンすら入れていませんが、とりあえず問題無く動作するようです。ただし、電源を入れた状態でW-SIMを挿入すると突入電流の影響でBODリセットがかかってしまいます。活線挿抜を考慮すれば本来はインダクタをつなげておくべきですが、しょせんは実験目的ですので、対処しないことにします。

USB Audio - Speaker

2007-12-14 22:33:56 | W-SIM
USBオーディオデバイスとしては、まず最初にスピーカを作成しました。USBの基本スタックはAtmelのサイトからも入手できますが、わたしはARM ProjectsにあったCDCのコードをもともと使っていたので、これを元にSpeakerの機能を付け加えるととしました。SpeakerのConfig DescriptorについてはKeilのサイトにあったLPC2148用のAudio sampleから拝借して使っています。

SpeakerやMicといった基本デバイスは、Windowsで使う場合には特にWindows側のドライバを用意することなく、つなげてEnumerationさえ正しく機能すればWindowsから見えるようになります。そのためには、Config Descriptorが間違いなく作成されていることが重要です。ちょっと間違っていると、Windows PCにデバイスを刺したとたんにBlue Screenとなってしまうようです。

デバイスを刺してもBlue screenにならなくなったら、次は意図したようにDeivce/Config descriptorが読めているかどうかを確認します。Linuxであればprocfsやlsusbコマンドで確認することもできるでしょう。わたしは、動作確認はWindowsでおこなっているので、FTDIのサイトで紹介されていたMSのUSBViewを使っています。Descriptorの長さが間違っているために、全項目が読み取れないバグをこれで検出することができました。

W-SIMの音声はG.711 mu-Lawになっています。そこで、当初はSpeakerのStreaming Interface DescriptorにおいてwFormatTagをmu-Lawにしてみました。ところが、この設定だとデバイスマネージャではSpeakerとして見えているのに、アプリケーションとしてサウンドレコーダを立ち上げてみると、スピーカデバイスとしてW-SIMが選択できないのです。wFormatTagをPCMに設定すれば、サウンドレコーダからもW-SIMがスピーカとして見えるようになりました。どうやら、サウンドレコーダが対象とできるデバイスはPCMで入出力できる必要があるようです。

wFormatTagをPCMにすると、PCからAT91SAM7S256に送られるIsoパケットのデータはPCMになりますが、W-SIMに送るデータはmu-Lawである必要があります。そのため、AT91SAM7S256でPCMからmu-Lawへの変換をする必要が生じます。SAM7S256はフラッシュが256Kもあるので、この変換はテーブルを引くことでCPU負荷を最小限に抑えています。

このようにしてUSB Speaker機能を実装したので、"Hello World"を再生中にPC上のサウンドレコーダ(あるいはWMPでもかまわない)で音声を再生開始すると、"Hello World"の代わりに、その再生音声がW-SIMに流れるようにしてみました。

USB Audio の検討

2007-12-13 10:53:01 | W-SIM
これまでの試験ソフトでは、USBポートは電源の供給をしているだけでした。次の段階として、USBでオーディオデバイスとしてホストが利用できるようにしてみます。つまり、ホストで再生した音声をW-SIMで流せるようにします。また、相手の通話をマイク経由で録音できことを目指します。

AT91SAM7SのUDP(USB Device Port)は4つのEPをサポートできますが、オーディオデバイスで必要となるIsochronous転送はEP1とEP2でしか使えないので、おのずとEPの割り当ては次のようになります。

EP0Control
EP1Iso IN - Mic
EP2Iso OUT - Speaker
EP3未使用


ほんとは、モデムのATコマンドの処理もCDCドライバにより仮想COMポート経由で操作できるようにしたいのですが、残りはEP3ひとつしかないので、入力か出力のどちらか片方しかサポートできないことになってしまいます。LPC2148は、物理EPとして32個もサポートできるのに比べて少なすぎますね。

AT91SAM7シリーズを調べてみると、AT91SAM7SEがEPを8つサポートできて良さそうです。内蔵SRAMは最大32KBですが、外部RAMをサポートできます。その代わりにピン数が増えてしまい128ピンになってしまいます。変換基板を使うとかなりデカくなりそうだし、配線するにも根気が要りそうです。プリント基板作った方がいいのでしょうが、プリント基板作成を最後にやったのはかれこれ30年近く前のことだし....

W-SIM用ソケット

2007-12-12 10:23:37 | W-SIM
注文してあったW-SIM用ソケットが届いたので、新しい実験基板の作成を開始しました。このソケットはアルプス製ですが、秋月や千石で扱っているわけでもないので、入手方法を探さねばなりません。

先人によれば、chip1stopで扱っているとのことだったので、数量3個で見積もりをとってみると単価1,800円で、納期に3週間かかるとのことでした。ダメもとでアルプス製品も扱っているmouserで検索してみるとなんと在庫あるではありませんか。W-SIMでも検索できちゃうし。ちなみに、単価は$2.89でした。

今度のボードではモデム信号もつなぐので、ようやく自動着信できるようになる予定です。

W-SIM 試験ソフトウェア-その2-- Echo Test

2007-12-11 10:22:15 | W-SIM
"Hello World"で、W-SIM側への音声送信の確認はとれたので、次の段階として受信の確認をします。スピーカをつながて鳴らすにはハードの追加も必要となるので、Echo Testをすることにします。受信した音声を、送り返すだけです。

W-SIMとAT91SAM7S256のSSCの接続をおさらいしておくと、次のようになります。
SSCでは受信/送信で独立したクロックと同期信号を使うことができますが、W-SIMの場合には、これらはSSCの設定により送受で共有することができるので、TKとTF端子は未接続でかまいません。
W-SIM       SSC
---------------
PCMCLK  ---> RK
PCMSYNC ---> RF
PCMIN   ---> RD
PCMOUT  <--- TD

受信の処理は送信と同じようにPDCによるDMAです。ダブルバッファを用意しておき、DMA完了割り込みにより、新たな受信バッファを割り当てます。同時に、受信が完了したバッファを送信DMAアドレスとして設定してやればエコーすることになります。
DMAバッファのサイズは64バイトとしたので、DMA完了待ちによる遅延は64/8000=8msとなります。実際に試してみると、電話/PHS網の遅延も加わって、かなりの遅延があってエコーされてくる気がします。

使用する必要の無いTF信号は、PIOとして使用することとし、タクトSWをつなげました。こいつを押すたびに、"Hello World"と "Echo"の試験を切り替えることとしています。

W-SIM 試験ソフトウェア-その1 -- Hello World

2007-12-10 15:52:58 | W-SIM
最初のソフトウェアとしては、あらかじめフラッシュに焼いてある音声ファイルを繰り返し再生するだけのものを作成してみました。再生する音声は、もちろん"Hello World"です。

W-SIMは着信応答後、音声通話が始まるとPCM信号の出力を開始します。通話状態でない場合には、PCMCLKやPCMSYNCは出力されませんので、じつは音声処理部分は呼制御部分の動作をまったく気にしなくても大丈夫なことになります。AT91SAM7SはPDCと呼ばれるDMA機能を持っています。送信したい音声データの先頭をPDCで転送を開始する先頭番地として設定しておけば、あとはPCMSYNC信号に同期して1オクテットずつ自動的に送信してくれます。音声ファイルの長さだけのDMA転送が終了すると、DMA完了割り込みが発生しますので、再度DMA開始アドレスを設定してやれば、音声の再生が繰り返されることになります。

しばらくSSCに対する適切なパラメータがわからずに試行を繰り返しましたが、わかってしまえば、ほんとうに設定だけの変更できれいな音声が流れるようになりました。

W-SIMが期待するPCM音声データはG.711 mu-Lawですので、あらかじめこれをconst char[ ] のデータとして用意してフラッシュに焼いておきます。AT91SAM7S256を使っていますので、フラッシュは256KBもあります。20秒くらいの音声を入れてもまだまだ余裕です。

このように、ソフトウェアといっても、SSC/PDCのドライバを書くだけで、ほとんどの処理はCPUが介在せずに再生処理がおこなえてしまいます。いまのところ、W-SIMのRXD/TXD信号は処理していませんので、DDのUSBポートをつないだ端末画面から、手動でATコマンドを叩いてモデムを設定したり、着呼に応答したりしてます。

なお、システム的にはTOPPERS JSPカーネルを使用しています。音声再生だけなら、カーネルなんて不要なのですが、もはやJSP最初から入れて使うのに慣れていますので。

W-SIM実験ボード

2007-12-10 11:50:27 | W-SIM
2週間ほど前にWillcomのW-SIMのインタフェース概要が公開されていることを知りました。詳細を知るためにはフォーラムの会員にならないと正式な技術資料は入手できないようですが、とりあえずピンの意味がわかればマイコンとつなぐことは、それほど難しくなさそうです。また、ATコマンドを調査したWikiもあったので、これだけの情報があれば、自分でW-SIMを使った音声端末を作ることもできそうです。

そういうわけで、早速端末としてDDを購入。DDはデータ通信専用端末で、音声通話機能は具備されていませんが、こちらが欲しいのはW-SIM本体とそのソケットだけですから、それでかまわいません。さっそく、DDをバラして中の基板をマイコンと接続する実験基板を作成しました。



使用しているマイコンは、AT91SAM7S256. OLIMEXのARMヘッダーボードを利用しています。このマイコンが持っている同期シリアルコントローラ(SSC)は、I2SやCODECのようなチップも接続できるように設計されているため、W-SIMのPCM信号を直結できるだとうと推測したのです。

右上のボードは秋月のTTLレベルSerial-USB変換ボード。AT91SAM7S256のデバックポートの入出力用です。そのため、実質的にはW-SIMをAT91SAM7S256に直結しているだけのハードです。



W-SIM部分を拡大すると上のとおり。PCM信号PCMCLK, PCMSYNC, PCMIN, PCMOUTの4本をSSCに直接接続。モデム信号はRIとDCDの2本だけをUSART1に接続。DD側のUSBインタフェースをまだ生かしたままにしているので、モデムのTXやRXはそちら側で制御することにしています。本来であれば、W-SIMのモデム信号もすべてSAM7のUSART1に接続すればいいのですが、その作業はW-SIM用のソケットを別途入手してからおこなうつもりでいます。

結果として、USBが3ポートもあるボードになってしまいました。

  1. DDのUSBポート。ATコマンドの入出力のためCOMポートとして使用
  2. SAM7のUSBポート。W-SIMからの音声通話をUSBでホストに接続するために使用
  3. デバック用のシリアルCOMポート

電源はDDまたはSAM7のUSBポートからのUSB給電にて動作。DDではW-SIMを5Vで使っていますが、SAM7の各I/Oは5V-tollerantであるので、そのまま直結です。