Raspberry pi zero WH で作った LDAC 対応 USB to Bluetooth オーディオトランスミッターを Windows にも対応させる備忘録

Photo by hyt.

Raspberry pi zero WH で作った LDAC 対応 USB to Bluetooth オーディオトランスミッターを Windows にも対応させる備忘録です.

以前の記事,

で,Raspberry pi zero WH で USB to Bluetooth オーディオトランスミッターを作ってみたのですが,残念ながらWindows10 ではうまく動きませんでした.

今回,これをなんとかすることができましたので,ご紹介したいと思います.

対応方法

今回は usb_f_uac2.ko という Raspbian (Linux) を USB 接続 UAC2 音源として認識させるためのカーネルモジュールを改変します.なぜ必要かは以下のページの議論を追えば書いてありますが,要は,usb_f_uac2.ko に Windows で動作させるのに十分なコードが追加されてないからみたいです.

Using gadget-import (initial config retrieved via gadget-uac2 + gadget-export) to initialize a UAC2 audio device, but it fails to load completely on Windows 10....

さらに残念なことに,現在最新のカーネルでも全く対応は進んでいないようです.だから,これはどうにもならないなと思っていたのですが,ググっると Rockchip 上で動く Linux だと動いているような記述があります.実際,Rockchip の公開しているソースソースコード

We find that the UAC2 gadget can't be recognized on Windows 10. It's because that the descriptors of UAC2 doesn't meet the requirements of Windows. ...

を見ると,Windows で動くように一時的な対応を施したと書いてある.と言うことは,このコードを持ってくれば Raspbian の場合も Windows の UAC2 ドライバで使える使えるんじゃね,と思った訳です.

はじめる前に

はじめる前に注意として,今回は,作業を終えるのにほぼ,

24時間

くらいは掛かります.カーネルのコンパイルを伴うからです.

最初は usb_f_uac2.ko のみの部分的なコンパイルで済ませようとアレコレ試したのですが,Linux カーネルの整合性対策の壁に阻まれ叶いませんでした.

もちろん,クロスコンパイル環境を作るなりすれば相当程度時間を短縮できるとは思いますが,今回は面倒なので試していません.と言うか,Raspberry pi zero WH はシングルコアとは言え,CPU は 1GHz で動くので,長くても数時間で終わるだろうと思って始めたのですが,大間違いでした.カーネルって,でっかいんですね(当たり前!).

カーネルコンパイルの前準備

今回は,以下の記事を参考にしました.

そんなわけで、RaspberryPi 3でカーネルをセルフビルドすると、何時間で終わるのでしょうか?セルフビルドの良いところは、ビルド後の運用が素早いという点と、クロス環境(Linuxマシン)を用意する必要がない点です。 最初のビルド時間は長いですが、その後は差分のみですので、短ければ1~2分のビルド時間、5分程度のサ...
概要 元記事 Compiling Raspberry Pi kernel modules RTL8812AUって、標準で対応してない、と探してたら、↑の記事を発見. 環境 Raspberry Pi 3 2016-0...

まず,コンパイルするのに必要なパッケージをいくつか持ってきます.

次に,Raspbian のカーネルを最新版にします.なお,この作業は一般的には推奨されないものであることにご注意ください.

次に,最新版のカーネルのソースコードを取得し,コンパイルするために展開しておきます.

さらに,現在利用中のカーネルでどのような機能が有効なのかの一覧も取得し,モジュールをコンパイルする前準備を行います.

これでカーネルをコンパイルする前準備が整いました.

f_uac2.c と u_uac2.h の改変

次は,usb_f_uac2.ko のソースコードを改変します.

まず,モジュールが含まれているソースコードの位置に移動します.usb_f_uac2.ko の元となるコードは f_uac2.c と u_uac2.h なので,これらが含まれる drivers/usr/gadget/function が対応する個所です.

ソースコードを改変します.本来ならばパッチを用意するのだと思いますし,私の場合もはじめはそうしようと思っていたのですが,Rockchip のカーネルは ver 4.4 で Raspbian のものと比べるとかなり古いせいか,f_uac2.c にもかなり大きな改変があり,パッチ作るのがかなり面倒だったので,以下の通りまるごと ver 4.4 のコードで置き換えました.

また,このままだとコンパイルが通らないことから,f_uac2.c を以下の通り改変しました.

また,改変したソースコードを元にしたカーネルであることが分かるよう,Makefile を以下の通り書き換えました.


結局パッチを作りました.こちらの方が安定してます.


あとは,この書き換えたコードを元にカーネルをコンパイルしました.

Raspberry pi zero WH は 1-core の CPU なので,-j4 とかしてもコンパイルは速くはなりませんのでご注意ください.

改変カーネルへの置き換え

元のカーネルから改変カーネルへの置き換えは以下の通り実行しました.

リブート後,改変カーネルが有効かどうかを確かめるには uname -r の表示を見れば良いと思います.

モジュールの利用

モジュールの利用の仕方については基本的には以前の記事,

をご覧ください.以下は,この記事から書き換えと追加が必要な部分を示します.

まず,変更が必要な部分は /usr/local/bin/on.usb_dac で,以下のように書き換えました.

以前の記事は usb_f_uac2.ko を modprobe -r g_audio で呼び出していましたが,これはレガシーな方法で,現在は推奨されなくなっているようです.代わりに GadgetFS の仕組みを用いて usb_f_uac2.ko を呼び出します.上の改変はこれを行うスクリプト /usr/local/bin/on.uac2_audio を使うような変更を行っているだけです.

肝の GadgetFS を利用して usb_f_uac2.ko を呼び出すスクリプトは以下の通りとなります.実行権限を忘れずにつける(chmod +x /usr/local/bin/on.uac2_audio)ようにしてください.

前回の記事もそうですが,これ,適当に組んだ(泥縄式に組んだ)動けば良い,という程度のものなので,エラー処理等全くしていないことにご注意ください.

なお,Windows 10 からは UAC2 Audio Gadget として認識されますが,対応のさせ方としてがかなり乱暴(Rockchip のソースコードでまるごと塗り替える)なので,きちんとパッチを作った方が良いかなとは思っています.

以上!

スポンサーリンク
large rectangle advertisement
スポンサーリンク
large rectangle advertisement
Top