Watch
1
0
Fork
You've already forked souveraine
0
souveraine/.handoff-from-phone/pixel3-microphone
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Fimeg 19fe6b1d0e shell: dock reorder, fullscreen detection fix, idle-power, sessiond, misc shell work
- Dock drag-to-reorder for pinned apps (insertion gap, quick-slide vs dwell)
- Fullscreen detection: scan all windows via HyprlandData.windowList
- IdleCoordinator, GlobalStates, Session.qml updates
- Deploy script, qmldir, settings, wallpaper, visualizer fixes
- sessiond server, memory module updates

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-22 22:18:20 -04:00
..
README.md shell: dock reorder, fullscreen detection fix, idle-power, sessiond, misc shell work 2026-07-22 22:18:20 -04:00

Pixel 3 (blueline) — microphone / SLIM TX capture bug

Status: 2026-07-18 — BUG HAS MOVED. Transport is now FIXED; still zeros. The CONNECT_SRC timeout the rest of this doc chases no longer happens (kernel is now g8cbfbb939327, was g56b0a053bef8 when that was found). Port-connect, channel activate, and q6afe port_start all succeed (ret=0), yet capture is still pure zeros. The fault is now DOWNSTREAM of transport, in the WCD934x SLIM-PGD data-plane. See "## 2026-07-18 UPDATE" below; the older sections are kept for history but their root-cause conclusion is superseded.

2026-07-18 UPDATE — transport fixed, data-plane is the new fault

Re-ran on a clean 58-min-uptime boot, ADSP never restarted. Findings:

  • The SLIM CONNECT_SRC (MC 0x2c) timeout is GONE. Every capture now logs connect_port: dir=1 port_id=N ch_id=NNN la=0xcf ret=0, DEF_ACT_CHAN xfer ret=0, and q6afe port_start OK (port 0x4001, cfg 0x10212). Zero timed out / failed:-110 lines in dmesg.
  • Still 0/144000 nonzero samples on every path tried:
    • DMIC4 → DEC7 → TX7 (enchilada recipe)
    • DMIC0 → DEC6 → TX6 (handset, via cleancap.sh)
    • AMIC1 → ADC1 → DEC0 → TX0 (analog!) — also zeros. So it is NOT DMIC-specific and NOT a DMIC-clock problem. Common to every decimator and every TX port.
  • Decimator path is fully powered and unmuted: decN POST_PMU TX_PATH_CTL=0x24 [clk_en=1 mute=0 rate=0x4], DEC6/DEC7 Volume = 84 (0 dB), MICB on. DAPM all On. So routing/gain/mute are ruled out.
  • The smoking gun is now IRQ 213. /proc/interrupts line 213: 0 ... wcd934x_irq 0 Edge slim — the WCD934x's own SLIM/data interrupt has fired 0 times in the machine's entire life, including across capture. (Contrast IRQ 212 wcd934x_irq control line = 18, so the codec IRQ domain is alive; button-detect 215 = 17.) The codec arms its TX PGD port (PGD_TX_INT_STATUS=0x0000, port STATUS=0x00) but never raises the data interrupt → port never actually streams → ADSP reads zeros.

New working hypothesis

Control-plane port connect (NGD user messages) succeeds, but the WCD934x SLIM PGD port is never enabled/started on the data side — the register write that arms the port's data engine and its interrupt (SLIM_PGD_PORT_INT_EN*, per-port PORT_CFG/enable) isn't happening or isn't taking. That's why IRQ 213 stays 0 and the port emits zeros. This is a codec-side (wcd934x.c) or CDC_IF data-lane issue, NOT an ADSP/satellite issue.

The instrumentation gap (next patch)

The current MICDBG patch logs the decimator, connect_port, and DEF_ACT_CHAN, but does NOT dump the SLIM PGD port-enable / port-interrupt registers — the exact layer where the bug now lives. Next kernel patch should log, right after "prepare CAPTURE armed":

  • WCD934X_SLIM_PGD_PORT_INT_EN0 (0x341?) and INT_EN for the TX port
  • per-port SLIM_PGD_TXn_CFG / port enable bit
  • SLIM_PGD_PORT_INT_SRC / _STATUS DURING an active stream (not just at prepare — need a delayed read or a sysfs poke) Then check: is the port-enable bit actually set? Is IRQ 213 masked at the codec? Compare this whole sequence against enchilada (mic works) on 6.x.

Verified-safe method notes (this session)

  • Never touched remoteproc; ADSP stayed running throughout.
  • alsactl restore 0 does NOT fully clear AIF*_CAP SLIM TXn mixer bits — stale TX routes leak into the next run (saw map=[134 128 ...] = TX6+leftover TX0). Explicitly cset ... 0 every AIF*_CAP SLIM TXn you touched.
  • cleancap.sh (in ~) is the good harness: forces TX7 off (its comment flags TX7 as an "Android-replay wedge trigger"), sets the DMIC0/TX6 handset path, and measures IRQ 213 delta + nonzero-sample count. Use/extend it.

(Historical — superseded) original 2026-07-12 root-cause

Status: ROOT CAUSE LOCALIZED 2026-07-12 — not fixed yet. All capture sources record pure digital zeros because the SLIMbus CONNECT_SRC port-connect message to the ADSP master times out, so the WCD9340's TX port is never attached to the data channel. The DSP then delivers a valid-but-empty stream. Control traffic (codec register reads/writes over slimbus) works fine. (As of 2026-07-18 this timeout no longer occurs — see UPDATE above.)

The smoking gun

With dynamic debug on drivers/slimbus/*, every capture start logs 3×:

qcom,slim-ngd qcom,slim-ngd.1: TX timed out:MC:0x2c,mt:0x2
qcom,slim-ngd qcom,slim-ngd.1: Tx:MT:0x2, MC:0x2c, LA:0xcf failed:-110
  • MC 0x2c = SLIM_USR_MC_CONNECT_SRC (qcom satellite user message that connects the codec TX port to the allocated data channel)
  • Value-element messages (MC 0x60 REQUEST_VALUE / 0x68 CHANGE_VALUE — i.e. regmap traffic to the codec) all succeed with no timeouts
  • So: NGD hardware messaging works; the ADSP-side slimbus master/satellite service does not answer port-connect requests
  • TODO: identify LA 0xcf — codec device or the ifd (ports live on the interface device ifd@0,0)?

Enable debug: echo 'file drivers/slimbus/* +p' > /sys/kernel/debug/dynamic_debug/control

What was proven (2026-07-12, kernel 7.1.1-sdm845-g56b0a053bef8)

  1. Capture streams open and run fine on hw:0,1 (MultiMedia2) and hw:0,0 (MultiMedia1) routed from SLIMBUS_0_TX — but 100.0% of samples are exactly 0 (not noise floor; digital silence).
  2. Swept EVERY input: AMIC ADC1-4 (via ADC MUX0→DEC0→SLIM TX0) and DMIC0-5, plus the enchilada-style TX7 slot layout (DMIC MUX7=DMIC4 → ADC MUX7=DMIC → CDC_IF TX7 MUX=DEC7 → AIF1_CAP Mixer SLIM TX7). All zeros.
  3. DAPM (debugfs) during capture: entire codec path reports On (ADC, AMIC/ADC muxes, SLIM TX0 mixer, MIC BIAS1). So it's not routing.
  4. DT declares 4 mics (/proc/device-tree/sound/audio-routing): AMIC1←MIC BIAS1, DMIC0←MIC BIAS1, DMIC3←MIC BIAS3, DMIC4←MIC BIAS4. Codec node has ifd@0,0 + codec@1,0 + slim-ifc-dev; micbias 1.8 V ×4; extclk 9.6 MHz. Structurally like working devices.
  5. pmOS never solved this either: their blueline UCM (gitlab.com/sdm845-mainline/alsa-ucm-conf, ucm2/Google/blueline) has the whole mic section commented out. Their intended bottom-mic path: DMIC4 → DEC7 → SLIM TX7 → AIF1_CAP → SLIMBUS_0_TX → MultiMedia2, CaptureMixerElem "DEC7".
  6. OnePlus 6 (enchilada) mic works on pmOS 6.x kernels with the same driver stack (AMIC4, TX7/DEC7, AMIC4_5 SEL=AMIC4) → this is either a 6.x→7.x regression in slimbus/ngd/wcd934x, or blueline-specific (ADSP firmware? satellite service difference?).
  7. WCD RX (playback) direction could NOT be verified: EAR PA powers on and streams (path: SLIMBUS_0_RX Audio Mixer MultiMedia2, SLIM RX0 MUX= AIF1_PB, RX INT0_1 MIX1 INP0=RX0, RX INT0 DEM MUX=CLSH_DSM_OUT — note EAR hangs off RX INT0, not INT8), but no sound heard — and the Pixel 3 has NO WCD-driven transducer to hear: both front speakers incl. the "earpiece" are CS35L36s on QUAT_TDM, and there's no 3.5mm jack. Inconclusive by hardware design. Whether CONNECT_SINK (MC 0x2d) also times out is STILL UNKNOWN — never got a clean dmesg on an RX stream.
  8. QUAT_TDM_TX (would allow CS35L36 VMON/IMON digital loopback = objective transport test) is not a wired backend in the DT — stream open fails EINVAL. Could be added in DT to get an ear-free TDM capture reference.

Hazards learned (do not repeat)

  • Do NOT restart the adsp remoteproc while debugging: slim-ngd fails to re-handshake ("QMI wait timeout", no new "Rcvd master capability") and slimbus stays degraded until full reboot. Happened twice, reproducible.
  • Don't leave MultiMedia2 with BOTH SLIMBUS_0_RX (playback) and SLIMBUS_0_TX (capture) routes enabled — ADM open starts failing (q6adm cmd 0x10325 error 2) and then q6asm sessions wedge (-22 on any further prepare).
  • Restore baseline with sudo alsactl restore 0 (HPH*/Impedance write errors are harmless read-only controls).
  • Speaker README's rule still applies: volume 100% + unsuspended sink before trusting any "silent" result.

Next steps

  1. Fresh boot → repeat one capture with slimbus dyndbg on; confirm the 0x2c timeout on a clean system (rule out long-uptime NGD state; uptime was ~23h when found).
  2. Same boot: start a WCD RX playback stream and check whether CONNECT_SINK (MC:0x2d) times out too. Both-fail → all port-connects dead (satellite service issue); TX-only → look at TX-specific code.
  3. Diff drivers/slimbus/{qcom-ngd-ctrl.c,stream.c,messaging.c} and sound/soc/codecs/wcd934x.c between pmOS linux-postmarketos-qcom-sdm845 (6.x, mic works on enchilada) and this 7.1.1 tree. Focus: user-message port connect path, LA used for port ops (codec vs ifd), TX port numbering.
  4. If an enchilada is handy: run this 7.1.1 kernel on it and test mic — cleanly separates "7.x regression" from "blueline-specific".
  5. Ask in #sdm845-mainline / linux-arm-msm about the signature "Tx:MT:0x2, MC:0x2c failed:-110 while value messages work" — someone may recognize the satellite/ADSP state.
  6. Longer shot: wire up QUAT_TDM_TX_0 in DT for VMON capture as a transport-known-good reference and UCM debugging aid.

Quick repro

echo 'file drivers/slimbus/* +p' | sudo tee /sys/kernel/debug/dynamic_debug/control
amixer -c 0 cset name='MultiMedia2 Mixer SLIMBUS_0_TX' 1
amixer -c 0 cset name='AIF1_CAP Mixer SLIM TX7' 1
amixer -c 0 cset name='CDC_IF TX7 MUX' DEC7
amixer -c 0 cset name='ADC MUX7' DMIC
amixer -c 0 cset name='DMIC MUX7' DMIC4
sudo dmesg -C
arecord -D hw:0,1 -f S16_LE -r 48000 -c 1 -d 2 /tmp/t.wav
sudo dmesg | grep 'timed out'      # -> MC:0x2c
# zeros check:
python3 -c "import wave,struct;w=wave.open('/tmp/t.wav');d=struct.unpack('<%dh'%w.getnframes(),w.readframes(w.getnframes()));print(max(map(abs,d)))"
# afterwards:
sudo alsactl restore 0

References

  • pmOS blueline UCM (mic commented out): https://gitlab.com/sdm845-mainline/alsa-ucm-conf → ucm2/Google/blueline/HiFi.conf
  • enchilada UCM (working mic recipe): same repo, ucm2/OnePlus/enchilada/HiFi.conf
  • Speaker fix project (methodology + amp/TDM background): ~/projects/unfinished/pixel3-speaker-routing/