趣味でのんびり作成中のHuman68k用の汎用USBドライバを利用した実験などの箇条書き。
■USBドライバの仕様
OHCIの仕様を参考程度に作成。
コントロール転送、バルク転送、インタラプト転送、アイソクロナス転送の4つ全てに対応。
■USBメモリからのREAD(10)によるセクタリード(バルク転送)
・BUFFALO RUF2-S / SONY Play Station Portable + MEMORY STICK PRO 512MB
| 転送回数/frame | 転送バイト数/frame | 転送バイト数/sec |
X68000XVI(10MHz) | 3 回 | 192 Byte | 187.5 KB (192,000 Byte) |
X68000XVI(24MHz) | 5 回 | 320 Byte | 312.5 KB (320,000 Byte) |
060turbo(Local Mem) | 6 回 | 384 Byte | 375.0 KB (384,000 Byte) |
060turbo(High Mem) | 7 回 | 448 Byte | 437.5 KB (448,000 Byte) |
※1frameは1/1000秒
USB FULL SPEEDの帯域は12Mbps(1.5MByte/sec)ですから実転送速度は大体こんなものですね。
ストレージばかリ弄ってると飽きるので、次はアイソクロナス転送を利用したUSBスピーカーの実験予定。
■USBスピーカーによるPCM再生
・ELECOM MS-90UBK
調べたところ、このデバイスにはステレオ 16bit 48kHz リトルエンディアンのデータを流し込んでやればPCMが鳴るようです。
つまり、1frameにつき192バイトずつアイソクロナス転送をすればよいという事になります。
ボリュームコントロール、およびミュートコントロールはコントロール転送。
USBプロトコルアナライザでプロトコルを調べ、数時間でなんとかPCMが聞けるようになりました。
取り合えず、コマンドラインレベルのPCMプレイヤーを作成。
作成中に流していたサンプル曲は「D4プリンセス」の「ドリルでルンルン クルルンルン」。
これしかHDDに残ってなかったので・・・
■USBスピーカーによるPCM再生2
・SANWA SUPPLY MM-ADUSB25V
市販のUSBスピーカーはUSBデバイスである以上、電源に制限があることもあり大抵音が貧弱です。
ジャンク屋で購入してきたこのデバイスは、内部でDA変換機能を行っており自分の好きなスピーカーを使えます。
※写真では見えませんが、右端にステレオミニジャックがあります。

■USBスピーカーによるPCM再生3
バルクIN転送が2回しか通らない10MHzのX68000では再生が間に合わないと思っていたのですが、なんとか再生できている様子。
調べてみると時間が掛かっているのは転送自体ではなく、転送前処理にメインメモリからSL811HSTのバッファに転送している部分。
とは言え1バイトずつバッファに送る以外の方法は存在しないので、対策はループ展開しか無いですね。
ループ展開してみたら、10MHzのX68000のバルクIN転送(64Byte)が3回通るようになりました。
1frame = 1/1000秒って事は、10MHzのX68000では最大でも10,000クロック分の命令しか実行できない訳で。
dbra1つ取っても10クロックも掛かるものね・・・
今日は、X68030の下部基板のコンデンサ総取替え作業で一日潰れました。
これだけは壊れないうちにやっておくのがいいよ。ホントに。
■プラグ&プレイ
Human68kのようなシングルタスクのOSでプラグ&プレイ実現する際に一番ネックになるのが、プラグ&プレイ監視専用の割り込みリソースの不足だと思います。
唯一標準で空いているハードウェア割り込みのTimer-Dも、バックグラウンド処理に占有されてしまうので、自由に占有できる割り込みリソースの空きは無い事になります。
LAN関係でバックグラウンド処理が必要になるようなので仕方が無いのですが。
割り切って、プラグ&プレイ監視専用のタスクをバックグラウンド対応にしてしまうしか手はなさそうですね。
Human68kがマルチタスクOSだったら、割り込みリソースなど気にせずに単純に別タスクで動かせば事は足りるのですが…
■USBJOY ver.1.3e
Xbox360の「ストリートファイターIV」用にHORIのFighting Stick EX2を購入したので、さくっとXbox 360系コントローラ全般(有線接続のみ)が動作するように対応させてみました。
バグが無ければUSB機器単体接続はこのバージョンまでの予定。

■USBCOREその1
ルートHUBの初期化状態。

■USBCOREその2
Transfer Descriptor Reservation Table確認画面。
画面上は「Non Periodic転送テーブル(Control / Bulk / 特殊Isochronous)」
画面下は「Periodic転送テーブル(Interrupt : 32ms〜1ms / Isochronous : 1ms)」
「Open Host Controller Interface」の仕様を知らないと、まず理解不能。
ルートハブを自動認識して、ポートステータス変化確認用のインターラプト転送が、Periodic転送テーブル32msの0番に登録された所。
ハブはもう少し。 次はクラスドライバとの連携部分。

■USBCOREその3
デバイスIDの確保/開放ルーチンの設計を多少見直し。
■G.I.M.I.Cの制御実験その1
68の日(2012年6月8日)向けのネタにNereidのUSBでG.I.M.I.Cを動かしてみた。
USB制御周りの仕様等は特に公開されていないので、USBプロトコルアナライザでパケットを独自解析し、USBホストドライバ(SL811HST)の若干の修正と、G.I.M.I.C制御ドライバの作成、加えて自前のサウンドドライバのG.I.M.I.C対応。
時間が無く68の日には間に合わなかったが、取り合えず自前のサウンドドライバで曲が鳴るようになった。
060turbo辺りだと余裕があるので、G.I.M.I.Cの複数制御も可能。
Nereidに加えてG.I.M.I.Cまで所持している人は少ないとは思うが、そのうち汎用サウンドドライバにも対応したい。
|