WM8731ドライバカッコカリ

C700でだいたい再生ができたので。

以下メモっぽい何か。ほぼ終電帰り後なんで整理するほど頭が回ってません。

  • zaudioデバイスはWM8750という別の石なのでコピペして別デバイスを作成
    • つーかいきなり統合させながら作れる能力なんぞないわー
  • んで別デバイスとして作る方向に舵を切ってみたら今度はデバイス名が決まらない
  • 途中で考えるのが面倒になったんで "zaud" というテキトー感のあふれる名前になってる
    • エライ人がきちんとしたものにしてくれると信じてます(ォィ
  • とりあえず自分のC700で一通りのフォーマットで再生できることは確認
    • ただしこの実機はU-Bootで直接起動するようになっているので、通常のzboot経由だとどうなるかは未確認
    • ついでにC3x00での確認もしてない
    • なおサンプリング周波数が32,000Hzのものを再生しようとすると22,050kHzで再生される
    • PXA250のDeveloper's Manualを見る限りだと、I2Sの32,000Hzは非対応っぽいのでたぶんそのせい
  • 録音の動作確認はいまいちやってない
    • 何度か試していたら全く録音できない(50byteくらいから一向に増えない)という現象が発生した

パッチの中身。

  • 基本的にzaudio.cのコピペ
  • レジスタ回りの扱いはWM8750とWM8731で全然違うのでその辺は見直し
    • 同じ会社の石のくせに互換性なにそれおいしいの状態
  • WM8750は出力を2系統もつがWM8731は1系統のみ
    • WM8750ならスピーカーとヘッドフォンに別々に割りふれるんで特に問題ないんだけども、WM8731では1系統しか出力できないので代わりにscoopで出力のON/OFFを指定する仕組み
  • で、スピーカー用のAPIがないのでscoop_set_speaker()を作成(C7x0系専用)
    • SCOOP0_APM_ON…Advanced Power Management? とか思ってたんだが、SHARPの原本みたらAPMとAMPが混在してたんで、用途からするとAMP(Amplifier)だろということでこっそり修正
  • scoop的にはスピーカーとヘッドフォンのON/OFFは独立しているので、どちらもON出力すること自体は可能
    • なのだが、両方制御できるような仕組みが思いつかなかったのと、必要になるユースケースがさっぱり思いつかなかったんでサックリ割り切って今は排他になってる
  • wm8731_formats[]は最初zaudio側のようにいくつか定義してあったんだけど、モノラル音声を再生させたら倍速再生しやがったんで16bit/2chのみに限定
  • …とだけやったら今度は起動時に怒られてデバイスとして使わせてくれなくなったので、uconv_set_converter()の第5引数をfalseからtrueにしたらモノラルも含め鳴るようになった