2019年11月26日火曜日

EZ-USB FX2LP を動かしてみる (31)Audio class device descriptor

今回はモロにEZUSBネタです.

前回書いたとおり、EZUSBをaudio classで動かせないかと思っていて、まだ調査段階.

EZUSBをいじくり回す前に他の選択肢を調べてみた.

EZUSBと同じCypress社のPSoC(EZUSBとは別シリーズ)を使えないかなと調査してみたのだけど、撤退した.
PSoCにはCPUグレード別に5種類ある.
 PSoC1   CPU M8C
 PSoC3   CPU Intel 8051
 PSoC4   CPU ARM Cortex M0
 PSoC5LP CPU ARM Cortex M3
 PSoC6   CPU ARM Cortex M4
これらのうち数100円で買える1と3を調べたのだが、USB転送レートが12Mbpsしか出ない.ARMが載っている456はお値段高そうで採用不可だった.撤退、撤退、

PSoCの他に探したのは、Silicon LabsのUSB Audio ICも安くていいんだけど、12Mbpsなのさ.48kHz24bitぐらいしか通せないだろ、なので撤退.

というわけで、お値段安くて480Mbpsが出るEZUSB CY7C68013Aは有能なのさ.

------
Audio Classを実装したことなどないわたしだ.先人の足跡を辿るべくググる.

Cypressの質問コーナーに「Audio Classやった人いる?」みたいなスレがあるけれど、まとまった情報にはありつけなかった.

EZ-USBでAudio Classをやっているサイトは唯一ここだけかもしれない.ありがたく参考にさせていただきます.
このサイトには、EZ-USBをAudio Classで動かすためのdescriptorが書かれている.USBデバイスを作るには最初のとっかかりとしてdescriptorが判らないと身動きとれない.なのでここの情報には感謝しかない.

descriptorを知らない人が居るかもなので少し説明すると、USB機器をPCに繋いだときにPCが「オマエはどんな機能なのだ?」と探りを入れる.USB機器は「わたしはHiRes Audioを奏でる者です」などと回答する.USB機器がする回答がdescriptorだ.descriptorはUSB機器に記憶され、サイズは数100BYTEsぐらいだ.

さっそく同サイトのdescriptor丸パクリでEZUSBを動かしてみる.windowsのデバドラは「USBサウンド機器」だと認識してくれた.(EZUSB開発toolの取り扱いについてはこちらのページの最初の頃の投稿を注意深く読んでくれ)

長いので同サイトのdescriptorをここに転記はしないが、そのdescriptorには特徴がある.TIのUSB DAC IC PCM2704のdescriptorに似ているのだ.descriptorの最初の方にはメーカー名と製品名の記載がある.そこがTI PCM2704になっている.
つまり、EZUSBをPCM2704もどきに擬態している.そうすることで、windowsのデバドラにPCM2704と誤解させて音を出すという目論見があるのだろう.

USB Device Tree Viewerというtoolがある.
これを利用するとUSB機器のdescriptorを全部表示させることができるので、「擬態PCM2704」をチェックしてみたところ、いくつかのエラーが表示されていた.

エラー1:
string descriptorを読めてない.原因は、EZUSBの仕様でstring descriptorをword境界で配置すべきなのに、半端だったこと.同サイトのdescriptorにはMAKE_EVENというコンパイラ制御コマンド?が記述されているがわたしが使っているKeil IDEはMAKE_EVENが通らなかった.
   MAKE_EVEN ;; macro (FX2LP needs 2bytes alignment)
なので、string descriptorの直前に db 00 を入れて1BYTEずらして回避した.

エラー2:
同サイトのdescriptorにはHID report descriptorが書かれておらず、そこにもエラーが表示されていた.しかしHID report descriptorなんか初耳なんだな. →参考はここ
参考サイト曰く、
・HIDクラスでは、レポートと呼ばれる単位でデータを転送する
・レポートのデータ構造はレポートディスクリプタによって定義される
・レポートディスクリプタは、他のディスクリプタと構造が全く違う
・HIDディスクリプタに続いて送られ、可変長
・レポートディスクリプタのサイズはHIDディスクリプタのwDescriptorLengthで定義
これは初耳なので難物だなぁ.
エラー状況は、wDescriptorLength=24Hと定義されているのに中身が無いという状況だ.
PCM2704のdescriptorには謎の36BYTEs(24H)のバイナリが存在するので、それをコピペしたらどうだろうか? 少なくともエラーは無くなるはずだ.追加した36BYTEsはこれ.
  db 09,02,BEh,00h,03,01,00,80h,FAh,09,04,00h,00h,00,01,01
  db 00,00,09h,24h,01,00,01,28h,00h,01,01,0Ch,24h,02,01,01
  db 01,00,02h,03h
でもエラーは消えなかった.36BYTEs全部ゼロも試したのだがwindowsがハングアップした.このエラーについては原因不明で放置プレイ.

EZUSBに焼いたdescriptor fileをこちらに置いときます.

------
次の取り組みとして、USB Device Tree Viewerで採取したdescriptorをじっくり読んでみる.またこの2つを比較してみる.
・真正PCM2704のdescriptor   →こちら
・擬態PCM2704(EZUSB)のdescriptor →こちら

datasheetから、真正PCM2704のエンドポイントの対応はこうなっているらしい.
・Control endpoint (EP0)
・Isochronous-out audio data-stream endpoint (EP2)
・HID endpoint (EP5)
要するに、volumeはEP0、PCMはEP2、HIDはEP5、 ということだ.
HIDはvolume/play/stopなどの操作を含む.
descriptorからそれを確認した.

一方、EZUSBではHIDをEP1に割り当てている.(EP2,EP5は同じ)
descriptorからそれを確認した.

比較してわかったことは、、、
 ・両者のdescriptorはとてもよく似ている
 ・真正PCM2704にはステレオ/モノラルのdescriptorがある
 ・擬態PCM2704(EZUSB)にはステレオだけしかない
 ・ICによりFIFOサイズには違いがあるのでMaxPacketSizeが違っている
 ・擬態PCM2704(EZUSB)にはHID report descriptorがない
このくらい.

EZUSBに仕込むdescriptorはこんなもんで良いでしょ、というところまではわかった.

かしこ

→INDEXページへ

7 件のコメント:

  1. いつもの通りすがりの人2019年11月27日 1:04

    「PSoC」といえば、「アップルiPodのホイール部分の静電容量センサーの制御」で、
    一世を風靡してましたが、なんか最近はラズパイやArduinoにも使われてる「ARM勢」
    に、押されて「パッとしないなー」と、思っていたら、PSoC自体が「ARM化」してたんですね。

    ※最近の組み込み系って、この傾向が多いですね。ルネサスやNECも「独自路線」
    を捨てて、「ARM化」に走ってるし。過去の資産とか、どーすんだろ?

    PSoCは「アナログ制御がマトモに出来る、組み込みCPU」と、思っていたのですが、
    なんか単に「A/D,D/Aコンバータが付いてるARM」に、成り下がったような気がする。

    EZUSBですけど、その昔OMRON?が「2400Baud」のUSBモデム(携帯用だったと思う)
    の制御に使ってましたね。なので、それ位まではいけるのかな?
    ハイレゾオーディオは、厳しいかもです。

    返信削除
    返信
    1. いつもの通りすがりの人2019年11月27日 9:43

      >ハイレゾオーディオは、厳しいかもです。
      すみません。あんまりよく調べないで、言ってました。資料ページみたんですが、
      ・bcdUSB は、0x200(USB2.0) にしたほうがいいのでは?
      (PCM2704のほうは、対応してないんで 0x110(USB1.1)なんだと思いますが)
      ・bInterfaceProtocol を、0x20(IP_VERSION_02_00)に、することで、
      USB Audio Class 2.0 に、なるようです。(でないと、ハイレゾ対応しない。
      あと、もう既に3.0なんて規格があるんですね・・・)
      この辺は、https://www.wdic.org/w/TECH/USB%20%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%20%E3%82%AF%E3%83%A9%E3%82%B9 とか、ここ
      https://www.usb.org/document-library/usb-audio-devices-rev-30-and-adopters-agreement
      (これは、本家です。ちなみに何故か、USB_Audio_v2.0.zip はありませんw
      あと、CONTRIBUTORS に、Google, Inc.の人が居るのが、時代を反映してますね・・・)が、参考になるかも。

      ※スペックちゃんと見てないのですが、最近のチップは、高性能だから
      処理時間は問題ないか・・・ というか、メーカーの能書きにちゃんと、
      Video Processing(!) Audio Equipment って、ありますね。

      ※あと、ホントどうでもいいことですが、Cypressのロゴ(木陰の絵)って、昔はもっと、
      「高解像度」というか、こんなドット絵じゃなかったような気がするのですが・・・
      気のせいかな?

      削除
    2. いつもの通りすがり様こんにちわ

      >PSoCは「アナログ制御がマトモに出来る、組み込みCPU」

      わたしもそう思ってたんです.プログラマブルなOPAMPかなと.

      >PSoC自体が「ARM化」してたんですね。

      いえてます、笑い.みーんなARMで孫さんウハウハ

      削除
    3. 「A/D,D/Aコンバータが付いてるARM」 ← 爆笑

      だったらSTM32でも同じじゃんとも思います.

      削除
    4. >bcdUSB は、0x200(USB2.0) にしたほうがいいのでは?

      そうですね.デバドラさんを悩ませないために.

      Cypressってのは植物名でしたか.ブレードランナーの最初の画像を思い出します.

      削除
  2. いつもの通りすがりの人2019年11月29日 18:19

    Cypress社の、旧ロゴ?を、発掘しました。
    https://makezine.jp/event/wp-content/uploads/sites/2/2016/07/04_Cypress.jpg
    こんなのもありました。
    http://2.bp.blogspot.com/-6EBsK3bcpPg/VWnjdNT4O5I/AAAAAAAAAzc/57YQ1r5jMEA/s1600/DSC_0009.JPG
    https://fastly.4sqi.net/img/general/width960/253490_Ir0vUokqx_IY0CD0nmHMVt3yY-8f4NQY40lfKQdOEzc.jpg

    ちなみに、新(現行)ロゴ
    https://www.cypress.com/sites/all/themes/cypress_3/images/cypress.svg

    ※旧ロゴだとsvg化しずらいので、デザインを変えたのかな? ファミコンのドット絵みたい。
    個人的には、旧ロゴの方が好き。

    >Cypressってのは植物名でしたか.
    Wikipediaによると、和名は「イトスギ」「セイヨウヒノキ」で、クリスマスツリーに使われているそうです。
    小さいのは、街路樹とかに使われているそうです。たしかに、この細長い葉っぱは
    どこかで見たことがあります。

    返信削除
    返信
    1. 3枚目の入口写真を見たら、外資のofficeてどこでもあんな感じなのねって思っちゃいました.無人で受話器を取ると代表の人が出るんですね.

      やっぱアニメっぽく手描きの色トレスが一番ですよ.旧ロゴでよろしくお願いしたいです.

      削除