mt7620a wm8960構成で音を鳴らす (OpenWrt 23.05 kernel 5.15.198)
2026年6月 9日(火) 21:38 JST
閲覧数 16
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
dtsには、refclk0_outの定義を追加します。
function = "refclk"; するとクラッシュするので、必ず "wdt refclk"です。
2. dts の simple-audio-card の定義
simple-audio-card の定義を大幅に変更。
3.18の頃のドライバだろ、この辺おそらく読んでない。。。
MTK SDKベースのドライバだと、ドライバ内部のコードで勝手に設定しているものが多すぎw
i2cのvm8960の定義から、"wlf,shared-lrclk;" を削除します。
残っていても変わりませんが。。。
理由は、回路上繋がっているので、wlf,shared-lrclkされている様な状態になっている。内部で接続する必要はない。
sound内、clock周りの定義をハードウェアに合わせて修正。
system-clock-frequencyが無いと、再生速度がおかしくなります。
40MHzなんだっけ?というのはありつつも、20MHz設定だと再生が倍速だったので、この設定に。
あと、simple-audio-card,widgets、simple-audio-card,routing から、動作しない録音側は削ってもいいのですが、そのうち対応したら使うので記述しています。
録音は動きません。がんばってもFIFOのカウントが変化しません。
大本でこけているのか、DMA辺りでこけているのか、
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 にするのを忘れない様に。
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


