Skip to content

TDM4 on I2S3: frame clock (FCLK) at 48 kHz is not continuous (gaps/packetized output) #446

@truebest

Description

@truebest

Hey everyone.

Summary
When running TDM4 on I2S3, playback works in some cases, but the frame clock (FCLK/FSYNC) at 48 kHz is not continuous. Instead of a stable 48 kHz clock, it appears in bursts (“packetized”) with brief pauses between packets. For my use case, a continuous, gap-free 48 kHz FCLK is required.

Environment

  • Board: Raxda Zero 3W V1.11
  • Kernel: 6.1.84.-12-rk2410-nocsf
  • GPIO: GPIO3_A3", GPIO3_A4",ter "GPIO3_A5", "GPIO3_A6";

DTS Configuration

/dts-v1/;
/plugin/;

/ {
    metadata {
        title = "Enable I2S3 TDM4";
        compatible = "radxa,zero3";
        category = "audio";
        exclusive = "GPIO3_A3", "GPIO3_A4", "GPIO3_A5", "GPIO3_A6";
        description = "Enable I2S3 TDM4.";
    };
};

&i2s3_2ch {
    status = "okay";
    rockchip,bclk-fs = <128>;
    rockchip,clk-trcm = <1>;
    rockchip,playback-only;
    rockchip,playback-channels = <4>;
    //rockchip,i2s-broken-burst-len;
    //rockchip,grf = <0x16>;
    pinctrl-names = "default";
    pinctrl-0 = <&i2s3m0_sclk &i2s3m0_lrck &i2s3m0_sdi &i2s3m0_sdo>;
};

&{/} {
    sound {
        status = "okay";
        compatible = "simple-audio-card";
        simple-audio-card,name = "i2s3-tdm4";
        simple-audio-card,format = "dsp_a";
        simple-audio-card,mclk-fs = <256>;
        simple-audio-card,bitclock-master = <&cpu_dai>;
        simple-audio-card,frame-master = <&cpu_dai>;

        cpu_dai: simple-audio-card,cpu {
            sound-dai = <&i2s3_2ch>;
            system-clock-frequency = <12288000>;
            system-clock-direction = "out";
            dai-tdm-slot-num = <4>;
            dai-tdm-slot-width = <32>;
            dai-tdm-slot-tx-mask = <0xf>;
        };

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

    tdm_dummy: dummy-codec {
        #sound-dai-cells = <0>;
        compatible = "rockchip,dummy-codec";
        status = "okay";
    };
};

Evidence
Image
Image

Questions

  • Is there a driver setting or DTS property to force continuous FCLK/FSYNC at 48 kHz?
  • If not supported, what would be the recommended approach to modify the driver to keep the clock running continuously (e.g., gating policy, clocking mode, or DMA configuration)?
  • Are there known workarounds (dummy DMA, keep-alive frames, different DAI format flags) for maintaining a stable 48 kHz frame clock on I2S3 in TDM4?

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions