佐々木 哲(ささき さとし)
1 ルネサス エレクトロニクスが提供するUSBマイコン
ルネサス エレクトロニクス(以下ルネサスとします)のマイコンはその特性に応じたUSBコントローラが選定・内蔵され、USBマイコンとして提供されています。今回はこれら多様なUSBマイコンのうちInterface誌2010年6月号で基板が付属したSH2Aと、同じく2011年5月号で基板が付属したRX62Nについてそれぞれの特徴、USBホストドライバの対応などについて解説します。
2 ルネサス エレクトロニクスのUSBホストコントローラ
ルネサスのUSBホストコントローラのラインアップは多彩です。USB-IFで規定されたレジスタ規格OHCI、EHCI準拠のコントローラはもちろん、世界に先駆けてUSB3.0 SuperSeed対応のxHCI準拠のコントローラを提供していることは有名です。加えて、組込み向けのEmbedded HostのASSPとしてM66596、R8A66597、μPD720150を提供しています(図1)。
当社では、OHCI/EHCIのような比較的大きなシステム向けのUSBコントローラを対象とするMatrixQuestUSB/hostシリーズ、組込み向けUSBコントローラを対象とするMatrixQuestUSB/liteシリーズをそれぞれUSBホストドライバとして提供しています。それぞれルネサスUSBコントローラとのホストドライバとの対応は表1を参照ください。
表1.ルネサスUSBコントローラとMatrixQuestUSBシリーズの対応
MatrixQuestUSB/host | MatrixQuestUSB/lite | |
---|---|---|
ASSP | uPD720101 uPD720102 |
uPD720150 M66596 R8A66597 |
USBマイコン | SH7727 SH7720/SH7721 SH7760/SH7763 V850ES/Jx3-U |
RX621/RX62N RX631/RX63N SH7670/SH7672 SH7764 SH7723/SH7724 SH7205 SH7262/SH7264 SH7266/SH7267 SH7727 V850ES/Jx3-U |
SH2Aマイコンに内蔵されるUSBコントローラについて、ルネサスエレクトロニクスは公式に明言しているわけではありませんが、その仕様からM66596/ASSPに近い仕様(以下、M66596系とします)、もしくはR8A66597/ASSPに近い仕様(以下、R8A66597系とします)のコントローラが内蔵されています。
M66596/ASSPはFullSpeedデバイスに加えてUSB2.0HighSpeedデバイスに対応していますが、残念なことにLowSpeed接続に対応していません。一般的なUSBマウスやUSBキーボードはLowSpeedデバイスが大半ですのでこれらを接続することができません。また、HUB接続に対応していません。
MatrixQuestUSB/liteではソフトウェアによるHUB管理機構によりHUB接続を実現しています。しかし、コントローラがSplitTransactionに対応していないため、HighSpeedで接続したHUBにFullSpeedデバイスを接続することができません。M66596に続いて登場した R8A66597/ASSP ではこれらの制限事項が解消されました。
具体的には、外部HUB1段の接続が正式に対応されSplitTransactionにも対応しています。また、HighSpeed接続,FullSpeed接続に加えてLowSpeed接続に対応し、また、エンドポイントを2本増して計10本、バッファメモリを3.5kbytes増して8.5kbytesとなっています。そのほかにも仕様の違いがありますが、詳細については表2を参照してください。
USBマイコンを選定する場合、構築するUSBホスト機能搭載システムがM66596の制限事項に関わるようであれば、搭載するUSBコントローラがM66596系かR8A66597系かを見極める必要があります。Interface誌2010年6月号付属基板に搭載されているUSBマイコン、SH7262には、R8A66597系USBコントローラが内蔵されています。
3 R8A66597系USBコントローラの特徴
R8A66597系USBコントローラはR8A66597/ASSPに近い仕様であることは最初に説明しましたが、実際には幾つかの仕様の違いがあり、また、その違いもUSBマイコン毎で変わる場合があります。
3-1 FIFOポート
一つ目の違いは、コントローラ内のバッファメモリにアクセスするためのFIFOポートに対するアクセス幅です。R8A66597/ASSPの場合、アクセス幅は16bitになっています(表2参照)。USBマイコンに内蔵されるUSBコントローラでは全て32bit幅でのアクセスが可能になっています。
表2. M66596/ASSPとR8A66597/ASSPの仕様の違い(ルネサスのホームページより抜粋)
項目 | M66596 | R8A66597 | |
---|---|---|---|
USBホスト機能 | USBポート数 | 1 | 2 |
接続可能 ファンクション数 |
1 | 10 (外付けHUB一段可) | |
対応スピード | Hi-Speed / Full-Speed | Hi-Speed / Full-Speed / Low-Speed | |
転送タイプ | Control, Interrupt, Bulk, Isochronous | Control, Interrupt, Bulk, Isochronous | |
エンドポイント数 | 8pipes (Endpoint) | 10pipes (Endpoint) | |
FIFO | Total 5KByte内蔵 | Total 8.5KByte内蔵 | |
外付け回路の軽減 | USBプルダウン抵抗内蔵 (ホスト用) |
USBプルダウン抵抗内蔵 (ホスト用) |
|
USB出力抵抗(Full-Speed時)、USB終端抵抗(Hi-Speed時)内蔵 | USB出力抵抗(Full-Speed時)、USB終端抵抗(Hi-Speed時)内蔵 | ||
スケジューリング | 自動 | 自動 | |
ホスト/ペリフェラルの切り替え | ファームウエアで切り替え可能 | ファームウエアで切り替え可能 | |
USBペリフェラル機能 | USBポート数 | 1 | 1 |
対応スピード | Hi-Speed / Full-Speed | Hi-Speed / Full-Speed | |
転送タイプ | Control, Interrupt, Bulk, Isochronous | Control, Interrupt, Bulk, Isochronous | |
エンドポイント数 | 8pipes (Endpoint) | 10pipes (Endpoint) | |
FIFO | Total 5KByte内蔵 | Total 8.5KByte内蔵 | |
外付け回路の軽減 | USBプルアップ抵抗内蔵 | USBプルアップ抵抗内蔵 | |
USB出力抵抗(Full-Speed時)、 USB終端抵抗(Hi-Speed時)内蔵 |
USB出力抵抗(Full-Speed時)、 USB終端抵抗(Hi-Speed時)内蔵 |
||
接続検出 | Vbus検出回路 | Vbus検出回路 | |
インターフェース等 | 電源電圧 | 1.5V電源、3.3V電源、 I/O電源(1.8V、3.3V) |
3.3V単一電源、 I/O電源(1.8v、3.3v) |
動作温度(℃) | -20~85 | 標準:-20~85 広温度オプション:-40~85 |
|
消費電流(mA) | HS時:40 FS時:18 | HS時:70 FS時:25 | |
CPUバス インタフェース |
16ビットCPUバスインタフェース | 16ビットCPUバスインタフェース | |
スプリットバス インタフェース |
8ビットスプリットバスインタフェース | 8ビットスプリットバスインタフェース | |
DMAインタフェース | 2ch | 2ch | |
PLL周波数逓倍回路 | 内蔵 | 内蔵 | |
クロック入力周波数 | クロック入力(12/24/48MHz) | クロック入力(12/24/48MHz) | |
低消費電力モード | S/Wで設定可能 | S/Wで設定可能 | |
パッケージ | 64ピンLQFP、64ピンFBGA | 80ピンLQFP |
もう一つの違いはUSBデバイスをつなぐためのポート数の違いです。R8A66597/ASSPの場合、1つのコントローラで2つのポートを持っています(表2参照)。ところが、R8A66597系USBマイコンでは一部2つのポートを持つものがありますが、大半ポート数は1つです。
3-3 ドライバの共通化
その他、マイコンの特性に応じてレジスタの構成が変更されている場合や、機能追加、または、削除されているなどのケースもあります。逆に言えば、それ以外のレジスタ構成や動作シーケンスなどは全く同じですので、USBホストドライバとしては共通にすることが可能になります。
ただし、これらUSBマイコンに対して、R8A66597/ASSP用のドライバをそのまま適用した場合、FIFOアクセスが16bitアクセスになりパフォーマンスに悪影響を与えるばかりでなく予約領域のレジスタにアクセスした結果、想定外のレジスタ値を取得して状態異常を引き起こすなどの危険があります。そのため、それぞれのUSBマイコンのハードウェアマニュアルを良く検討してR8A66597/ASSPとの違いを明確にしドライバを改修する必要があります。
4 RX62N内蔵USBコントローラの特徴
RX62Nに搭載されるUSBコントローラもやはりR8A66597系です。このコントローラがR8A66597/ASSPやSH内蔵の仕様との最大の違いが対応する転送スピードがFullSpeedのみということです。ですので、大容量のデータを高速に転送したい場合には、転送速度としてはやや不利になります。なお、HighSpeedに関連するレジスタ、またはレジスタ内のビットが一部削除されていますので、R8A66597/ASSP用のドライバではそのまま稼働できず、改修が必要になります。
もう一つの特徴は176ピン版のRX62NにはUSBコントローラが2つ搭載されていることです。R8A66597系コントローラはUSBホストとして稼働する時2つのポートを使用できるものがありますが、この場合を含めてホストモードとファンクションモードはソフトウェアで切り替える必要がありました。RX62Nの場合も一つのコントローラに対してはやはり切り替えての使用になりますが、あらかじめ一つをホストに、もう一つをファンクションに設定することで、両方の機能を一度に稼働できます。Interface誌2011年5月号付属基板のRX62Nは144ピン版ですのでUSBコントローラは1つとなっています。
5 USBホストドライバの対応
当社のミドルウェアではMatrixQuestUSB/liteがUSBホストドライバとしてR8A66597系USBマイコンに対応しています。MatrixQuestUSB/liteは民生機器を含めた組込みシステムで多くの実績がある高機能なUSBホストドライバです。各コントローラに対応した下位の物理ドライバでコントローラによるソフトウェアの違いを吸収し、その上に共通となるUSB規格に対応したUSBホストドライバ、さらにその上に、各クラスに対応したクラスドライバといった階層構造をしています(図2)。
これにより、例えばコントローラを変更した場合も物理ドライバの付け替えだけで済み、上位アプリケーションを変更することなく稼働させることができます。また、クラスドライバは、変更できるばかりか、既存の構成に追加する事ができます。例えば、USBメモリ(MSC)に対応していて、新たにマウスやキーボードに対応する場合は、HIDクラスドライバをコンフィギュレーションで追加するだけで既存のアプリケーションを全く変更することなく実現することができます。
MatrixQuestUSB/liteはリアルタイムOS(以下RTOSとします)が動作する環境で使用される事を前提としています。RTOSを前提とする理由は大きく分けて2つあります。
1つは複数デバイスを非同期に挿抜する時のシステム負担の軽減です。デバイスをUSBホストに接続する時、エニュメレーション(接続処理)が行われます。エニュメレーションでは接続検出をしてディスクリプタ情報を取得し、デバイスの仕様を特定します。この時しばしばミリ秒単位の待ちを行ないます。また、接続失敗の対策として、異常を検出してタイムアウト、リトライを行う必要があります。
これは唯一のデバイスを接続する場合は問題ありませんが、2つ以上のデバイスを稼働中につないだり、外したりする場合にはシステムに大きな負担を与える事になります。そこで、これらエニュメレーションを行う処理をひとつのタスクに集約する事で待ち状態の時にユーザのアプリケーションや既接続のUSBデバイスの処理が滞る事を抑止します。
もうひとつがアプリケーションの簡素化です。マルチタスクを前提とすることでUSBの通信を同期型にすることができます。USBで通信するアプリケーションは複雑なUSBの処理の途中経過を気にすることなく、結果を待ちつづけるだけで済みます。この場合、他のUSBに関係ないタスクが非同期に動作することでマルチタスクのメリットを享受できます。
5-1 FIFOポートアクセス
R8A66597系コントローラでは、バッファメモリをUSBの各エンドポイントに割当てます。例えばSH7262内蔵コントローラの場合、8kbytesのバッファメモリを内蔵していますので、このメモリを各エンドポイント毎に割当てます。
バッファメモリへのアクセスは、コントロール転送に使用できるCFIFOと、DMA転送に対応したD0FIFO及び、D1FIFOの3つのポート(以下、D0FIFO・D1FIFOをまとめてDxFIFOとします。)でアクセスすることができます。つまり、4つ以上のエンドポイントと通信する場合はいずれかのFIFOポートを切り替えてアクセスする必要があります。
DMAとDxFIFOを組合わせて通信をする場合、OUT転送(送信)の場合はバッファに空きができればDMAが続きのデータを補充し、IN転送(受信)の場合は、データが入り次第、DMA受信データを取り出します。ただし、FIFOポートを経由してアクセスする必要がありますので、一度USBの通信を開始すると、その通信が完了するまでDxFIFOポートは該当するエンドポイント用のバッファメモリにつないでおく必要があります。この場合、他のエンドポイントの通信はDMAが終了するまで待つ必要が出てきます。
CFIFOポートを活用する方法も考えられますが、DxFIFOに割当てたエンドポイント以外のすべてのエンドポイントへの送受信を行う必要があり、全体のパフォーマンスを考えるとあまり良い方法ではありません。そこで、MatrixQuestUSB/liteでは、FIFOへのアクセスは通常はDMAを使用せずソフトウェアによるPIOでのアクセスとしています。これにより、全てのUSBデバイスに対して均一に通信する機会を与えることができます。逆にFIFOへのアクセス時間がパフォーマンスに影響を与えることになりますから、アクセス幅を32bitアクセスとし、可能な限り連続アクセスすることで転送速度の向上を実現しています。
5-2 ポート数の違い
次にポート数の違いについてです。例えば、SH7262内蔵USBコントローラのポート数は1つです。R8A66597/ASSPで用意されているPORT1関連のレジスタは削除されPORT0関連のレジスタのみに削減されています。さらに、削減されたレジスタに別の機能のレジスタが指定されている場合があります(表3)。
この様な差異があることを前提に、R8A66597系コントローラ用ドライバとしながらも、ポートが2つある場合とない場合でドライバがアクセスするレジスタの構成を変更しています。
表3.先頭から2番目のレジスタの差異
R8A66597/ASSP | Port1システムコンフィグレーションコントロールレジスタ(SYSCFG1) |
---|---|
SH7264 | CPU バスウェイト設定レジスタ(BUSWAIT) |
5-3 RX62N内蔵
先述の通り、転送速度はFullSpeedのみに対応しています。その為、HighSpeedに関連するレジスタの機能が削除されています。これらの機能は既存レジスタのビットの一部など、非常にきめ細かな変更があり、それぞれが予約ビットや、未使用ビットになっています。また、FIFOバッファメモリの割り当て方法も変更になっています。
RX62N対応ドライバもこれらの無効なビット操作などはコンパイルスイッチによってコンパイル時に無効化されます。FIFOバッファメモリについては従来よりユーザカスタマイズとしてきましたが、RX62Nの場合、USBのマックスパケットサイズに依存して自動変更するようになっていますので、ドライバでもそれに対応しています。
なお、MatrixQuestUSB/liteは元より同一形式のコントローラを同時に複数稼働できますので、RX62Nの様に複数のコントローラを内蔵していてもドライバの大きな修正は必要でなくコンフィギュレーションの変更だけで済みます。これらの差異をR8A66597用下位ドライバ内で吸収することでUSBのホストスタック部分、または、その上位に位置するクラスドライバはもちろん、アプリケーションを含めて完全に同じソースコードで稼働することができます。
6 マスストレージによるUSBメモリのコピー
マスストレージクラス(MSCとします)を使用して実際に動かしてみます。一般的にUSBメモリなどMSCのデバイスは、MSCの上位にファイルシステムを実装してファイルの読み書きを行いますが、この章ではMatrixQuestUSB/lite のMSCのインターフェースを直接呼び出して、USBメモリの内容を他方のUSBメモリにコピーする処理を行います。
先述のとおり、MatrixQuestUSB/lite上のアプリケーションになりますので、全く同じプログラムがSH2A基板でもRX62N基板でも稼働します。どちらもポートがひとつしかありませんので外部HUBを介して接続します。写真では使用していませんが、2つのUSBメモリとHUBを接続しますのでHUBは外部電源が取れるセルフパワータイプを使用することをお勧めします。(写真1)
リアルタイムOSとしてミスポのNORTiProfessionalを使用しています。コピープログラム、USBホストドライバ、NORTiProfessionalの関係は図3の様になります。
なお、SH7262を使用する場合はHighSpeedで接続できますが、RX62Nで使用する場合はFullSpeedでの接続となります。また、SH7262の場合は、大容量の内蔵メモリを活用できますが、RX62Nの場合、今回の構成ではコピー用のワークメモリを4kbytes確保するのが精いっぱいになり、パフォーマンスに大きな差が出ます。
- usblMscInit()
usbホストドライバとハブクラス、マスストレージクラスを初期化します。引数はエニュメレーション処理を行う管理タスクの優先順位、接続コールバック関数と切断コールバック関数のそれぞれポインタです。 - usblMscInsert()
MSCデバイス接続時のコールバック関数です。管理タスクのコンテキストで実行されます。論理的なデバイスを生成し、接続を検出した順に論理デバイス情報をusblDeviceManage配列に保存します。3つ以上接続した場合は無視されます。なお、サンプル提供したUSBホストドライバも最大接続デバイス数をハブを含めて3に制限していますので、この関数の上限を増やしても接続できません。 - usblMscRemove()
MSCデバイス切断時のコールバック関数です。管理タスクのコンテキストで実行されます。本来は、論理デバイスの解放処理などを実装しますが、このサンプルではメッセージを出力するほかは何もしません。 - usblMscCopy()
コピーを行います。USBメモリが2つ接続されるまで待ってコピーを開始します。全体のフローを図4に示します。
メモリ内の全ての内容をコピーすると実行に長時間要しますので先頭から0x40000セクタ(128MBytes)分だけコピーして終了します。
コピー元のUSBメモリとしてフォーマットした直後に128MBytesより十分小さいファイルしか書いていないものを用いれば、コピー後のUSBメモリをWindows等に接続してみると、あたかもコピーできた様に見えます。
なお、本サンプルプログラムでは切断処理に対応していないため、一度実行するとリセットしなければ再度実行できません。また、ホストドライバはサンプルとなっているため、およそ一時間で通信が停止する仕様になっています。コピーサイズを増やす場合は留意してください。サンプルプログラムの具体的な使用方法はプロジェクト内のreadme.txtを参照してください。
7 RX62Nの機能を活用したWAVファイルの再生
USBメモリがつながるようになったので、少し応用事例を紹介します。RX62NにはSH2A(SH7262)の様な高機能なオーディオ出力はありませんが、10bitのDACが搭載されており拡張基板WKLCD-62Nを使用すると簡単にステレオオーディオ出力が実現できます。この機能を用いてUSBメモリに保存されたWAVファイルを再生することにします(写真2)。
USBメモリのコピーでは、ファイルシステムを使用せずに稼働させましたが、今度はファイルを扱うためにファイルシステムが必要です。MatrixQuestFs/fatを使用すればコンパイルしてMatrixQuestUSBにリンクするだけで容易に実現できますが、今回はInterface誌でおなじみのfatFsをMatrixQuestUSBにポーティングしてみることにします。今回の構成は図5の様になります。
7-1 fatFsとMatrixQuestUSBの接続
移植に必要となる最小限のユーザ作成関数は、disk_initialize() disk_status() disk_read()ですが、サンプルにはdisk_write() disk_ioctl()を合わせて実装しています。全関数共通の仕様として、サポートドライブは一つとしますので、各関数の引数Driveは0のみ有効です。
- disk_initialize()
ディスク・ドライブを初期化する関数です。USBの初期化はあらかじめ別途行う事としますので、ここではフラグ STA_NOINIT をクリアします。 - disk_status()
ディスク・ドライブの状態を取得する関数です。戻り値と今回のサンプルの関連については以下の表を参照してください。(表4)
表4. disk_statusが示す状態とUSBの状態の対応
STA_NOINIT | ドライブが初期化されていないことを示すフラグ。システム・リセットやメディアの取り外し等でセットされ、disk_initialize() の正常終了でクリア、失敗でセットされます。 |
---|---|
STA_NODISK | メディアがセットされていないことを示すフラグ。このバージョンではUSBメモリの有無を示します。USBカードリーダなどでメディアが無い場合でもこのフラグはクリアされますので、使用できません。 |
STA_PROTECTED | メディアがライト・プロテクトされていることを示すフラグ。常にクリアされています。 |
- disk_read()
ディスクからセクタを読み出す関数です。若干の型変換が必要なことを除けばそのまま渡すことができます。
usblBlkRd(usblFatFsInfo.pUsblBlk,(UINT)SectorNumber,(UINT)SctorCount,Buffer); - disk_write()
ディスクにデータを書き込む関数です。disk_read()同様若干の型変換が必要なことを除けばそのまま渡すことができます。
usblBlkWrt(usblFatFsInfo.pUsblBlk,(UINT)SectorNumber,(UINT)SectorCount,Buffer); - disk_ioctl()
ディスク・ドライブ自体に対する様々な制御をします。今回はfatFsのサンプルffsample.zipで実装を求められているCTRL_SYNC GET_SECTOR_SIZE GET_SECTOR_COUNT GET_BLOCK_SIZE CTRL_ERASE_SECTOR を実装します。実際にはほとんど何もする必要はありません。(表5)
表5. disk_ioctlのコマンド対応一覧
コマンド | 解説 | 戻り値 | Bufferの値 |
---|---|---|---|
CTRL_SYNC | ディスクへの書き込みを完了します。USBドライバの場合、SYNCで何等かの処理が必要な場合はありません。 | RES_OK | N/A |
GET_SECTOR_SIZE | それぞれの情報はMSCのクラスドライバで取得して保持しています。この情報が必要となるのは(_USE_MKFS == 1)の場合のみですから、今回は非対応としています。 | RES_PARERR | N/A |
GET_SECTOR_COUNT | RES_PARERR | N/A | |
GET_BLOCK_SIZE | サンプルでは固定値を返します。 | RES_OK | 512 |
CTRL_ERASE_SECTOR | フラッシュ・メモリ用ということですので、USBホストドライバについては無関係ですので、常にOを返します。 | RES_OK | N/A |
たった上記の実装だけでfatFsを使用してUSBメモリのファイルにアクセスできるようになります。
7-2 オーディオ再生にDMACAを使用
WAVファイルには、オーディオデータの情報が先頭に記録されており、その後ろにPCMオーディオデータが保存されています。
PCMデータの詳細については、WebサイトTechVillage(http://www.kumikomi.net/archives/2010/07/ep22onse.php)に解説記事が掲載されていますので一読すると良いでしょう。
ディジタルオーディオの出力を確実に行うためにはDAコンバータに対して決められた周期でオーディオデータを出力する必要があります。ご存知の通り、一般的なCDは44.1kHz/16bit/STEREOでサンプリングされています。このデータを滞りなく再生するためにはUSBメモリから読みだすレートを計算すると…
44.1kHz x 16bit x 2ch = 1,411,200bit/sec ≒ 1.35Mbit/sec
となり、約1.35Mbpsのビットレートが必要になります。RX62N内蔵USBを使用する場合、USBはFullSpeedになりますが、MatrixQuestUSBを使用すれば、ビットレートとしては問題になりません。
ただ、このビットレートを保持しながら44.1kHz≒22.7μsecの間隔でオーディオデータをDACに転送する必要があります。
Interface誌2011年6月号の「オープン・ソースMP3デコーダを使ったMP3プレーヤの制作」ではCMTのタイムアウトによる割込みを利用していましたが、RTOSを使用する環境では22.7μsec間隔での割込みは負担になります。
RX62NではCMTの割込みをDMAの転送開始トリガにすることができますので、DACへのオーディオデータの転送をCMTの割込みをDMAコントローラ(以下DMAC)に対するトリガとして発行し、DMACがDACにデータを転送する事でオーディオ出力を実現してみます。DMACの設定はDMAフリーランノーマル転送モードと拡張リピートモードを組み合わせて使用し再生を実現することで、確実なオーディオ再生と安定したUSBの稼働を実現します。(図6)
ただ、このモードには一つだけ欠点があります。
DMAの転送先をDACに設定しますが、拡張リピートモードでLch/Rchの順にトリガ毎に転送します。片方のチャンネルを44.1kHzで再生するためには88.2kHzの周波数で左右毎に転送する必要があります。この場合、Lchに対してRchは11.3μsec遅れて再生されることになります。今回はあくまでUSBを使う事が本来の目標ですので、ここは目を瞑ることにしましょう。
7-3 オーディオ再生処理の流れ
バッファはコンパイル時にオーディオ再生データ保存用に設定したセクションを使用することにします。 このバッファをA面、B面に分けてダブルバッファとして考えます。つまり、B面を再生中にA面にUSBメモリからのデータを読み込んで、A面再生中にB面を読むという順序になります。そのほか、以下のような流れです。
- 初期化
- USBメモリ認識
- USBメモリ内ファイルのOPEN
- WAVヘッダ読み捨て
- A面B面データ読み込み=>0x8000を全データに加算
- DMA開始
- A面再生完了待ち
- A面データ読込み
- 読み込んだデータに0x8000を加算
- B面再生完了待ち
- B面データ読込み
- 読み込んだデータに0x8000を加算
- 8または10で終了と判断しなければ7へ
- 終了
7,10では、それぞれ再生(DMACによるDACへのデータ転送)の完了を待ちます。これはDMACの転送元レジスタのアドレスが何処を処理しているかで判断できます。
9,12では、USBメモリから読みだしたデータに0x8000を加算しています。これはWAVファイル内のデータが2の補数形式で保存されているのに対して、RX62Nでは整数値で扱うことに起因します。
例えば、16bitデータの場合、WAVファイルのデータがとりうる値の範囲は符号付きで0x7fff~0x8000ですがDACは0x0000~0xffff(ただし上位10bitが有効)となりますので、WAVファイルのデータをそのままDACに書き込んでもうまくいきません。そこで、WAVファイルから読みだしたデータに対して0x8000を加算して整合性がとれるようにしています。サンプルプログラムの具体的な使用方法はプロジェクト内のreadme.txtを参照してください。
7-4 DMACの初期化
以下の様に各レジスタを設定します。
7-5 CMTの初期化
以下の様に各レジスタを設定します。
7-6 DACの初期化
以下の様に各レジスタを設定します。
7-7 DMAの開始
以下の設定でDMAが開始されます。
7-8 応用
このサンプルプログラムではUSBメモリへのアクセスが本来の目的ですので、オーディオ再生プログラムとしては未完成です。たとえば以下の様な応用が考えられます。
- マクロ定義で固定しているファイル名をディレクトリ内の一覧から選択、または、順次再生する。
- 44.1kHz,16bit,Stereoに固定しているWAV仕様をWAVヘッダの解析を行い、各設定を動的に反映する。
- 基板上のSWやタッチパネルと連携して再生、早送り、曲スキップなどの機能を加える。
- LCDを活用して曲イメージに合わせた画像やレベルメータを表示する。
- Interface誌、2011年6月号に掲載されているMP3デコーダを実装してUSBメモリプレーヤーに仕立てる。
など、応用は多彩です。
また、MatrixQuestUSBとfatFsのインターフェース部分はRX62NでもSH2A(SH7262)でも同じですから、USBメモリのコピーで用いたMatrixQuestUSB/lite SH7262版にfatFsを実装する方法はRX62Nと全く同じです。メモリも大容量ですからミドルウェアを使用するメリットを活かして是非実装してみてください。
また、今回のサンプルでは極力プログラムを簡素化するためにRTOSのシステムコールを使わない様にしています。NORTiとMatrixQuestUSB/ex(廉価版)を導入するとNORTiのシステムコールを使って高機能なアプリケーションを開発することもできます。
サンプルプログラムのダウンロード
雑誌『Interface』のダウンロードページへ → http://www.cqpub.co.jp/interface/download/contents.htm
2011年8月号 USB機器開発トラの巻!の「特集 第5章 USBメモリ内容コピー&WAVE再生プログラムの作成」から、RX62N用サンプルプログラムと、SH-2A用サンプル・プログラムがダウンロードできます。
参考文献
- CQ出版社:Interface 2010年6月号 第1章 付属SH2Aマイコン基板の使い方
- CQ出版社:Interface 2010年7月号 第4章 3.デバイス接続検知とバス・リセット
- CQ出版社:Interface 2010年9月号 第3章 FATファイル・システムの詳細
- CQ出版社:Interface 2011年5月号 Prologue 付属RX62Nマイコン基板の応用事例
- CQ出版社:Interface 2011年6月号 第4章 オープン・ソースMP3デコーダを使ったMP3プレーヤの制作
- ルネサスエレクトロニクス:SH7262 グループ、SH7264 グループハードウェアマニュアル
- ルネサスエレクトロニクス:RX62Nグループ、RX621グループ ユーザーズマニュアル ハードウェア編
- ルネサスエレクトロニクス:R8A66597FP/DFP/BG ASSP (USB2.0 2Port Host/1Port Peripheral Controller)
- ミスポ:µITRON仕様準拠リアルタイムOS NORTi version4 カーネル編 ユーザーズガイド
- ユークエスト:MatrixQuestUSB/lite USBホストドライバ ユーザーズガイド
- ユークエスト:MatrixQuestUSB/lite Mass Storage クラスドライバ ユーザーズガイド
- ユークエスト:MatrixQuest ミドルウェア共通環境 プログラマーズ・ガイド
関連製品
-
- 第1回 組込みシステムのこれから
- 第2回 IoTの成功はセキュリティ次第
- 第3回 組込みでもGPUやFPGAと早めに親しんでおこう
- 第4回 電子産業の紅白歌合戦、CEATECで垣間見えた未来
- 第5回 小口開発案件の集合市場、IoTの歩き方(上)
- 第6回 小口開発案件の集合市場、IoTの歩き方(下)
- 第7回 徹底予習:AI時代の組込みシステム開発のお仕事
- 第8回 いまどきのセンサー(上):ありのままの状態を知る
- 第9回 いまどきのセンサー(下):データを賢く取捨選択する
- 第10回 組込みブロックチェーンの衝撃(上)
- 第11回 組込みブロックチェーンの衝撃(下)
- 第12回 エネルギーハーベスティングの使い所、使い方
- 第13回 「人を育てる」から「道具を育てる」へ、農業から学ぶAI有効活用法
- 第14回 CPS時代に組込みシステム開発に求められることとは
- 第15回 次世代車のE/Eアーキテクチャに見る組込みの進む道
- 第16回 RISC-Vが拓く専用プロセッサの時代
- 第17回 振動計測の大進化で、熟練エンジニアのスキルを広く身近に
-
- 零の巻:組込みというお仕事
- 壱の巻:2進数と16進数を覚えよう!
- 弐の巻:割り込みとポーリング
- 参の巻:printf()が使えない?
- 四の巻:これにもIntelが入ってるの?
- 五の巻:Endianってなに?
- 六の巻:マルチタスクとは
- 七の巻:スタックってなあに?(1)
- 七の巻:スタックってなあに?(2)
- 八の巻:メモリを壊してみましょう
- 九の巻:コードが消える?~最適化の罠~
- 拾の巻:例外が発生しました
- 拾壱の巻:コードサイズを聞かれたら
- 拾弐の巻:キャッシュは諸刃の剣
- 拾参の巻:デバイスにアクセスするには
- 拾四の巻:セキュリティってなに?(1)
- 拾四の巻:セキュリティってなに?(2)
- 拾四の巻:セキュリティってなに?(3)
- 拾五の巻 :DMA対応と言われたら(1)
- 拾五の巻 :DMA対応と言われたら(2)
- 拾六の巻:ヒープとスタック
- 拾七の巻:フラグメンテーション
- 拾八の巻:CPU起動とブートローダ
- 拾九の巻:kmとKByteの「kとK」
- ビリーへの質問:DMAとキャッシュの関係
- ビリーへの質問:スタックオーバーフローについて
- ビリーへの質問:CPUレジスタについて