一年ほど前にDIPサイズのBlackfin基板として、金子システムのACB-BF592を紹介しました。この一年ほど、TOPPERS/JSP for BlackfinをADSP-BF592に対応させたり、Uzumeの実装を進めたりしていましたが、その間に同基板がマルツで販売されるようになりました。また、オーディオ・コーデック基板もマルツで販売が始まっています。
最近はUzumeも正式リリースに向けて詰めの段階に入り、安定性・移植性ともに高まっています。そこで、これらの基板を使ってブレッドボード上にオーディオ信号処理のプラットホームを作ってみることにしました。
作ったのは手のひらサイズの400MHz DSPによる信号処理プラットホームです。48kHzオーディオ信号処理を簡単に試すことができます。
使用する部品
使用する部品は2.5mmピッチの部品ばかりです。入手はいずれも容易です。
- ACB-BF592
- UMB-SGTL5000
- UB232R
- TA48M033F
- LED
- その他電源用C、プルアップ、プルダウン用R
ざっとこんな感じです。
ACB-BF592は400MHzのADSP-BF592が搭載されているDIPサイズモジュールで、このサイズにDSP、ブート用SPIフラッシュ、クロック発信器、リセット・スーパーバイザー、コアクロック・レギュレータ、ブートモード選択スイッチ、JTAGポートが搭載されています。おおむね、最近のマイコンが内蔵していてアナデバが内蔵をサボったコンポーネントはすべて搭載されています。600mil幅40pin DIPパッケージサイズで、3.3Vを与えればDSPが動作します。上で紹介したようにマルツで購入することができます。
UMB-SGTL5000は、フリースケールのI2SコーデックSGTL-5000を搭載したボードで、そのほかにクロック発信器、入出力のレセプタクルが内蔵されています。足の配置はDIPではありませんが、2.54mmピッチのブレッドボードに搭載して使うことができます。これもマルツで購入することができます。
UB232RはFTDI社製のモジュールです。このモジュールはなんといっても小さいことが取り柄です。後ろに余分なでっぱりがあるとはいえ、ブレッドボードや基板上で大面積を占有しないため、愛用している部品です。VCCピンからUSBの5Vが出てきますので、ボードの電源としても活躍します。なお、調べた限りでは日本では店頭売りはされておらず、digi-keyやchip one stopから購入することになります。
TA48M033Fは東芝製の3.3V LDO三端子レギュレータです。2.54mmピッチで使いやすく、秋葉原で大量に売っていたので買い込んで使い回ししています。LDOは負荷キャパシタに敏感ですので発振に気を付けて、必要に応じてキャパシタを変更する必要があります。なお、秋葉原で買ったのはスルーホール用三本足パッケージですが、公式データシートは現在SMDパッケージしか掲載していません。やがてはスルーホール品の供給が途絶えると思われます。
回路図
回路図へのリンクを以下に示します。
回路図 : bb_bf592_sgtl5000.pdf
ほとんどの重要な回路がモジュールに搭載されているため、ほぼ結線だけで終わります。プルダウンやプルアップの抵抗は必須要素というよりノウハウです。
UA_TX/HWAITのプルアップはUARTブート時の安定動作用です。リセット直後の信号がHi-Zになるため雑音の影響を受けやすくなります。ブート時に信号に雑音が乗るとブートに失敗するためプルアップしておきます。これはADSP-BF592のハードウェア・リファレンス・マニュアルに書いてあります。
また、CODECのデータ線にプルダウンを入れているのはデバッグ時の雑音防止用です。BlackfinをJTAGでデバッグ中にリセットをかけると、端子がHi-Zになります。その結果ガリガリという大きな雑音がコーデックから出てきます。ミュート端子があればいいのですがUMB-SGTL5000にはミュート端子がありませんのでこのようにデータ線をプルダウンしておきます。端子がHi-Zになるとぷちっと雑音が入りますが、大きなガリガリという雑音は入りません。
ボード
ボードの写真を以下に示します。
サンハヤトの小型ブレッドボードに組んでいます。モジュールのピンは秋月の細ピンヘッダを使っています。細ピンなりにしっかりとボードに噛みこんでいますのでステレオジャックの抜き差しも不安なく行えます。UB232Rの足は初めからはんだ付けされておりピンが細めなのでUSBの抜き差しでぐらつきますが、仕方ありません。
タクトスイッチはリセット用です。後述するUARTブート時に重宝します。
ソフトウェア
このボードはオーディオ信号処理用にブレッドボードを使ってみようと、思い付きで作ったものです。製作は簡単でしたが、ソフトウェアがなければ意味がありません。
ソフトウェアはUzumeフレームワークを使います。このフレームワークはTOPPERS/JSP for Blackfinに実装されており、使用も拡張も容易にできるように作られています。現在ベータ版ですがGW前をめどにリリース予定です。
開発はUbuntu 12.04 LTS上で行います。Windowsしか持っていない人は敷居が高いと思われるかもしれませんが、VMware Player上に仮想環境を作ってUbuntuを入れれば安全に開発できます。
Ubuntuのインストールが完了したら、開発ツールのインストールを行います。ツールのインストールには、TOPPERS/JSP for Blackfinプロジェクトが用意しているインストールスクリプトを使います。このスクリプトはUbuntu側のツールの設定、GCCの取得とインストール、Kermitの設定まで行います。スクリプトの入手方法、使い方については、TOPPERS/JSP for Blackfinの文書サブプロジェクトにある「TJBN002 ユーザーズマニュアル」を参照してください。
なお、このスクリプトはKermitの設定も行いますので、FTDIのシリアルドライバまで含めて直ちに使えるようになります。しかし、もう一歩使い心地を高めたいと感じたら、同サブプロジェクトの「TJBN006 Kermit」を読んでみてください。
最後にUzumeフレームワークを入手します。ブレッドボード対応は手慰みで行いましたので本家ブランチから分離しています。gitレポジトリのexperimentalブランチからソースをダウンロードして、適当なディレクトリに展開してください。展開したらコマンドライン・ウィンドウを開き、今展開した中のuzumeappディレクトリに入ります。
ビルド
Uzumeフレームワークは複数種の基板に対応しなければなりません。そのため、BSP(Board Support Package)という考え方を導入しています。Uzume開発者は対応するボードごとにBSPを作ります。ユーザーはどのBSPを使うか決めてコンフィギュレーションをかけます。原則としてすべてのBlackfin BSPは単一ソースツリーで管理しますので、管理コストが低く使いやすい方式です。
BSPの選択はコマンドラインから専用のコンフィギュレーション・スクリプトを呼び出して行います。
uzumeapp $ ./configure_uzume bsp_bb_bf592_sgtl5000_nts
以上でコンフィギュレーションは完了です。この後makeコマンドを実行すればビルドが行われて実行ファイルが生成されます。
こんな長いコマンドじゃ入力できない!というそこのあなた、心配ありません。Uzumeプロジェクトのコンフィギュレータはbash completion対応です。kernel/uzume/bash_completionディレクトリにある説明通りにファイルをシステムにコピーしてください。後はコマンドライン上で[TAB]キーを使った簡易入力が可能になります。上の例の場合、現在は以下のようにたった7ストロークで入力が完了します。
./c[TAB]bb[TAB]
gdb/gnICEによる実行
ビルドしたオブジェクトを実行する方法については二つの方法があります。一つはgdbとgnICEを使う方法です。
Blackfin用のgdbはbfin-elf-gdbというコマンド名でコンパイラと一緒にインストールされていますので特に設定の必要はありません。gnICEはBlackfin用の低価格用ICEで、digi-keyから購入できます。使用方法の詳細はTOPPERS/JSP for Blackfinの文書サブプロジェクトにある「TJBN005 デバッグ」を参照してください。
デバッガ起動の前にgdbproxyを起動します。これはICEとgdbの仲立ちをするソフトウェアです。基本的には気道が終わったら何もすることはありません。太字がユーザー入力です。なお、gdbとは別ウィンドウで起動します。
takemasa@hertz:~/git/uzume_bfin/uzumeapp$ bfin-gdbproxy -q
Found USB cable: gnICE+
Connected to libftdi driver.
IR length: 5
Chain length: 1
Device Id: 00100010100000000010000011001011 (0x228020CB)
Manufacturer: Analog Devices, Inc. (0x0CB)
Part(0): BF592 (0x2802)
Stepping: 2
Filename: /opt/uClinux/bfin-elf/bin/../share/urjtag/analog/bf592/bf592
warning: bfin: no board selected, BF592 is detected
notice: bfin: jc: waiting on TCP port 2001
notice: bfin: jc: (you must connect GDB before using jtag console)
notice: bfin-gdbproxy: waiting on TCP port 2000
デバッガのコマンドは以下のようになります。太字がユーザー入力コマンドです。
takemasa@hertz:~/git/uzume_bfin/uzumeapp$ bfin-elf-gdb jsp -q
(gdb) target remote localhost:2000
Remote debugging using localhost:2000
0xffa10000 in ?? ()
(gdb) monitor reset
(gdb) load
warning: Can not parse XML memory map; XML support was disabled at compile time
Loading section .rodata, size 0x1548 lma 0xff800000
Loading section .ctors, size 0x8 lma 0xff801548
Loading section .dtors, size 0x8 lma 0xff801550
Loading section .data, size 0x58 lma 0xff801558
Loading section .start, size 0x114 lma 0xffa00000
Loading section .text, size 0x625c lma 0xffa00114
Loading section .init, size 0x58 lma 0xffa06370
Loading section .fini, size 0x30 lma 0xffa063c8
Start address 0xffa00000, load size 31144
Transfer rate: 268193 bits/sec, 3460 bytes/write.
(gdb) c
Continuing.
これで実行が始まります。デフォルトのUzumeの信号処理は「スルー」ですので入力した音が出力されます。
BlueBootによる実行
BlueBootはshintaさんによるBlackfin用ブートローダーで、UART経由でBlackfin DSPを起動し、SPI Flashへアプリケーションを書き込むことができる便利なツールです。
このツールはマルチ・プラットホーム対応であり現在はWindows用のバイナリが公開されています。利用するためには、まずBlackfinブート用のLDR呼ばれる形式にアプリケーションを変換しなければなりません。変換はubuntuのコマンドライン上で以下のように行います。
takemasa@hertz:~/git/uzume_bfin/uzumeapp$ bfin-elf-ldr -T BF592 -c jsp.ldr jsp
Creating LDR jsp.ldr …
Adding DXE ‘jsp’ … [jump block to 0xFFA00000] [ELF block: 17608 @ 0xFF800000] [ELF block: 25592 @ 0xFFA00000] OK!
Done!
こうして作ったjsp.ldrファイルをWindows環境にコピーしてください。コピーしたらBlueBootを起動し、ターゲットとしてADB-BF592を選択します。そしてアプリケーションとして先にコピーしたjsp.ldrを指定します。基板のほうはブートモードをUARTスレーブブートに変更します(詳細はACB-BF592のマニュアル参照)。そして基板のリセットボタンを押し、BlueBootの書き込みボタンを押してください。あとは自動で書き込みまで終わります。
書き込みが終わったらブートモードをSPIマスターブートに変更してリセットボタンを押します。アプリケーションがFLASHから読み込まれて実行が始まります。
独自信号処理の組み込み
Uzumeはリリースに向けて準備中で、まだドキュメントが整っていません。しかし、試してみたいという方は、uzumeapp/uzume_callback.c を覗いてみてください。
ユーザーが最低限変更するのはinit_audio()関数とprocess_audio()関数です。コメントもありますので簡単な処理であればやることは自明かと思います。もう少し詳しい情報がほしい方は、リリースをお待ちください。
今後の方向
ブレッドボードによる400MHzの信号処理プラットホームを紹介しました。組立は容易で、ソフトウェアも間もなくリリースされます。
この記事を読んで「パラメタの調整が何もできない」と思った方もいるかと思います。現在、Kermit端末から仮想ボリュームのコントロールを行うモジュールの構想があり、完成すれば追加ハードウェアなしにリアルタイムにパラメータを変えて信号処理を行うことができます。
また、アナログデバイスのAD799x I2C ADC対応モジュールがすでにgitのソースツリーに組み込まれています。これらのBSPの統合は5分もあれば可能です。その場合金子システムのTOL-POT-4を使用してボリューム・コントロールができます。
さらに、今回のブレッドボードと同等の機能を持つと思われるTUNA-CANが金子システムから発表されています。まだ詳細は不明ですが、多分このボードとTOL-POT-4を組み合わせて容易に実験ができるようになるでしょう。
ADSP-BF592は純正開発ツールを使わずともGCCから16bit信号処理ライブラリを使用することができます(LGPL)。32bit 信号処理についてはこれから利用者側での整備が必要ですが、基本的なアルゴリズムに関しては実装する端から公開する予定です。