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
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions