follow me

mt7620a wm8960構成で音を鳴らす (OpenWrt 23.05 kernel 5.15.198)

mt7620a wm8960構成で音を鳴らす話です。
OpenWrt 23.05 kernel 5.15.198がベースになります。
OpenWrt 25.12ではない理由は、動きませんでした。(kernel 6.xはさらに状況悪くなってた。。。)
mt7620aのi2s周りは、dma含め昔から動きが怪しい話があり、kernel 6.xでは諦められた感があります。

かろうじて動作するのが、5.15が最後なのかなという感じがあります。
しかも再生だけ、録音はどうしてもFIFOがカウントアップされません。かといって、3.18の頃の様なトリッキーな事をしてもノイズが多いので、再生だけで妥協するのが落としどころなのかな。。。
mt76x8だと動く気配はあるので、mt7620の問題な気はしています。
kernel 6.xは既にmt7620ではスペック的にも重いので、5.15で妥協。ユーザランドは、脆弱性のあるものを個別に上げるというのが、延命の方法かな。


で、動かす手順。


OpenWrt 23.05をベースとします。
https://github.com/openwrt/openwrt/tree/openwrt-23.05
commit: 7f61f9625550a6214e5cc53424e105bcbcff8c7a をベースに確認をとりました。

ハードウェアは、既にOpenWrtにマージされているYUKAI BOCCOを利用。
MT7620Aとwm8960をi2sで繋いだ組み合わせになります。
注意する箇所は、wm8960のMCLKが、MT7620AのWDT_RST_Nから供給される点ぐらいでしょうか。
それ以外は、よくある構成と思われます。


1. WDT_RST_NをREFCLK0_OUTとして使用する。
残念ですが、動いてませんでした。
なんども修正が出ていたはずなのですが、pinctrl-mt7620の定義が間違っています。
何故、"wdt rst"と同じ"0"を設定してるんだ???というオチ。
960-fix_mt7620_pinctl_wdt_refclk.patch
diff -urNp a/drivers/pinctrl/ralink/pinctrl-mt7620.c b/drivers/pinctrl/ralink/pinctrl-mt7620.c
--- a/drivers/pinctrl/ralink/pinctrl-mt7620.c	2026-01-19 12:10:20.000000000 +0000
+++ b/drivers/pinctrl/ralink/pinctrl-mt7620.c	2026-06-02 22:47:00.316791155 +0000
@@ -78,7 +78,7 @@ static struct ralink_pmx_func uartf_grp[
 };
 static struct ralink_pmx_func wdt_grp[] = {
 	FUNC("wdt rst", 0, 17, 1),
-	FUNC("wdt refclk", 0, 17, 1),
+	FUNC("wdt refclk", 1, 17, 1),
 	};
 static struct ralink_pmx_func pcie_rst_grp[] = {
 	FUNC("pcie rst", MT7620_GPIO_MODE_PCIE_RST, 36, 1),

dtsには、refclk0_outの定義を追加します。
function = "refclk"; するとクラッシュするので、必ず "wdt refclk"です。
&state_default {
	gpio {
		groups = "spi refclk", "rgmii1";
		function = "gpio";
	};
	refclk0_pins: refclk0_out {
		groups = "wdt";
		function = "wdt refclk";
	};
};


2. dts の simple-audio-card の定義
simple-audio-card の定義を大幅に変更。
3.18の頃のドライバだろ、この辺おそらく読んでない。。。
MTK SDKベースのドライバだと、ドライバ内部のコードで勝手に設定しているものが多すぎw

i2cのvm8960の定義から、"wlf,shared-lrclk;" を削除します。
残っていても変わりませんが。。。
理由は、回路上繋がっているので、wlf,shared-lrclkされている様な状態になっている。内部で接続する必要はない。
&i2c {
	status = "okay";

	codec: wm8960@1a {
		#sound-dai-cells = <0>;
		compatible = "wlf,wm8960";
		reg = <0x1a>;
		/* wlf,shared-lrclk; */
 	};


sound内、clock周りの定義をハードウェアに合わせて修正。
system-clock-frequencyが無いと、再生速度がおかしくなります。
40MHzなんだっけ?というのはありつつも、20MHz設定だと再生が倍速だったので、この設定に。
あと、simple-audio-card,widgets、simple-audio-card,routing から、動作しない録音側は削ってもいいのですが、そのうち対応したら使うので記述しています。
録音は動きません。がんばってもFIFOのカウントが変化しません。
大本でこけているのか、DMA辺りでこけているのか、
	sound {
		compatible = "simple-audio-card";
		simple-audio-card,name = "Audio-I2S";
		simple-audio-card,format = "i2s";
		simple-audio-card,bitclock-master = <&dailink0_master>;
		simple-audio-card,frame-master = <&dailink0_master>;
		simple-audio-card,widgets =
			"Microphone", "Mic Jack",
			"Headphone", "Mono Jack";
		simple-audio-card,routing =
			"Mic Jack", "MICB",
			"LINPUT1", "Mic Jack",
			"Left Boost Mixer", "LINPUT1",
			"Mono Jack", "HP_L";
		simple-audio-card,mclk-fs = <256>;

		dailink0_master: simple-audio-card,cpu {
			sound-dai = <&i2s>;
			system-clock-frequency = <40000000>;
			system-clock-direction-out;
		};

		simple-audio-card,codec {
			sound-dai = <&codec>;
		};
	};


3. vocore2のパッチを適用しておく
https://github.com/Vonger/vocore2/tree/master/openwrt.2305/sound/patch-5.15 にある、
900-ASoC-soc-pcm-add-option-to-start-DMA-after-DAI.patch
901-ASoC-add-new-trigger-ordering-method.patch
902-ASoC-remove-old-trigger-ordering-method.patch
903-ASOC-mt7620-specify-trigger-stop.patch
の4個を適用します。
このパッチが無いと、再生時にフリーズします。
パッチの内容は、VoCore2: OpenWrt 23.05 Part2 | Vonger's Blog を確認いただければと。


4. 再生前に
"Left Output Mixer PCM" を on にするのを忘れない様に。
# amixer sset "Headphone" 90
# amixer sset "Left Output Mixer PCM" on
mt7620a wm8960構成で音を鳴らす (OpenWrt 23.05 kernel 5.15.198) | 0 件のコメント | アカウント登録
サイト管理者はコメントに関する責任を負いません。