Режим поставщика тактового сигнала I2S не поддерживается – Как это включить?

Вопрос или проблема

Введение:
У меня есть HDMI PHY SII9022A. Я хочу включить аудио на этом PHY.

Требования:

Мне нужно создать правильное дерево устройств для SII9022A.

https://www.kernel.org/doc/Documentation/devicetree/bindings/display/bridge/sil%2Csii9022.yaml

Согласно этому файлу, мне нужно активировать audio-graph-card bindings и, конечно, i2s.

Я создал свое дерево устройств. Обратите внимание, что я не использую MCLK (Мастер Час), поскольку вместо MCLK может использоваться PLL.

вставьте описание изображения здесь

вставьте описание изображения здесь

Моя конфигурация ядра linux выглядит следующим образом.

вставьте описание изображения здесь

Мое дерево устройств выглядит следующим образом:

hdmi-transmitter@39{
    compatible = "sil,sii9022";
    reg = <0x39>;
    iovcc-supply = <&v3v3_hdmi>;
    cvcc12-supply = <&v1v2_hdmi>;
    reset-gpios = <&gpioe 8 GPIO_ACTIVE_LOW>;
    interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
    interrupt-parent = <&gpiog>;
    #sound-dai-cells = <0>;
    sil,i2s-data-lanes = <0>;
    /*clocks = <&mclk>;
    clock-names = "mclk";*/
    status = "okay";

    ports{
        #address-cells = <1>;
        #size-cells = <0>;

        port@0{
            reg = <0>;

            sii9022_in:endpoint{
                remote-endpoint = <&ltdc_ep0_out>;
            };
        };

        port@1{
            reg = <1>;

            sii9022_out:endpoint{
                remote-endpoint = <&hdmi_connector_in>;
            };
        };

        port@3{
            reg = <3>;

            sii9022_tx_endpoint:endpoint{
                remote-endpoint = <&i2s2_endpoint>;
            };
        };
    };
};

&i2s2{
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&i2s2_pins_mx>;
    pinctrl-1 = <&i2s2_sleep_pins_mx>;
    status = "okay";

    /* USER CODE BEGIN i2s2 */
    clocks = <&rcc SPI2>, <&rcc SPI2_K>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
    clock-names = "pclk", "i2sclk", "x8k", "x11k";

    i2s2_port:port{
        i2s2_endpoint:endpoint{
            remote-endpoint = <&sii9022_tx_endpoint>;
            dai-format = "i2s";
            mclk-fs = <256>;
        };
    };
    /* USER CODE END i2s2 */
};

Вопрос:

Как вы можете видеть, я использую dai-format = "i2s", но тем не менее, я получаю эти отладочные сообщения.

drivers/gpu/drm/bridge/sii902x.c:577 [sii902x]sii902x_audio_hw_params =p "%s: Unsupported i2s format %u\n"
drivers/gpu/drm/bridge/sii902x.c:560 [sii902x]sii902x_audio_hw_params =p "%s: I2S clock provider mode not supported\n"

Из этого .c кода: https://github.com/torvalds/linux/blob/master/drivers/gpu/drm/bridge/sii902x.c

static int sii902x_audio_hw_params(struct device *dev, void *data,
                   struct hdmi_codec_daifmt *daifmt,
                   struct hdmi_codec_params *params)
{
    struct sii902x *sii902x = dev_get_drvdata(dev);
    u8 i2s_config_reg = SII902X_TPI_I2S_SD_DIRECTION_MSB_FIRST;
    u8 config_byte2_reg = (SII902X_TPI_AUDIO_INTERFACE_I2S |
                   SII902X_TPI_AUDIO_MUTE_ENABLE |
                   SII902X_TPI_AUDIO_CODING_PCM);
    u8 config_byte3_reg = 0;
    u8 infoframe_buf[HDMI_INFOFRAME_SIZE(AUDIO)];
    unsigned long mclk_rate;
    int i, ret;

    if (daifmt->bit_clk_provider || daifmt->frame_clk_provider) {
        dev_dbg(dev, "%s: I2S clock provider mode not supported\n", __func__); <--------------------------
        return -EINVAL;
    }

    switch (daifmt->fmt) {
    case HDMI_I2S:
        i2s_config_reg |= SII902X_TPI_I2S_FIRST_BIT_SHIFT_YES |
            SII902X_TPI_I2S_SD_JUSTIFY_LEFT;
        break;
    case HDMI_RIGHT_J:
        i2s_config_reg |= SII902X_TPI_I2S_SD_JUSTIFY_RIGHT;
        break;
    case HDMI_LEFT_J:
        i2s_config_reg |= SII902X_TPI_I2S_SD_JUSTIFY_LEFT;
        break;
    default:
        dev_dbg(dev, "%s: Unsupported i2s format %u\n", __func__, daifmt->fmt); <--------------------------------
        return -EINVAL;
    }

Так как же я могу правильно настроить режим провайдера тактовой частоты I2S?

Ответ или решение

Как включить режим поставщика тактового сигнала I2S при использовании HDMI PHY SII9022A

Введение

Вы столкнулись с проблемой при использовании HDMI PHY SII9022A для передачи аудио через интерфейс I2S. Ошибка, с которой вы сталкиваетесь, связана с тем, что режим поставщика тактового сигнала I2S не поддерживается. Давайте разберемся, как решить эту проблему, и предоставим вам полное руководство по настройке.

Problem Description: Ошибки и Контекст

Вы видите следующие сообщения об ошибках в ваших логах:

[sii902x] I2S clock provider mode not supported
[sii902x] Unsupported I2S format

Эти ошибки возникают в результате проверок в функции sii902x_audio_hw_params, где устройство проверяет, если ваш интерфейс поддерживает поставку тактового сигнала, а также валидирует формат передачи.

Анализ настроек устройства

Ваш текущий файл Device Tree настроен достаточно хорошо, в нем обозначены необходимые параметры:

  • dai-format = "i2s"
  • Указание на использование PLL вместо MCLK.

Однако, ошибка указывает на то, что необходимые параметры не передаются корректно, или отсутствует настройка поставщика тактового сигнала для I2S.

Решение проблемы

1. Добавление Параметров Клоков

Убедитесь, что в вашей конфигурации dai-format правильно настроен флаг bit_clk_provider и/или frame_clk_provider. Вам нужно убедиться, что одно из этих значений установлено в true. Это позволит драйверу понять, что ваше устройство будет предоставлять тактовый сигнал. Это можно сделать, добавив:

bit_clk_provider = <1>; // или true
frame_clk_provider = <1>; // или true, в зависимости от вашей конфигурации

Эти параметры должны быть добавлены в раздел i2s2_port в вашем Device Tree.

2. Изменение формата DAI

Также стоит удостовериться, что используемый вами формат соответствует поддерживаемым в sii902x. Вы используете dai-format = "i2s", что должно корректно обрабатываться, однако в зависимости от ваших условий может потребоваться экспериментировать с другими форматами, например:

dai-format = "left_j";
3. Проверка Драйвера

Убедитесь, что версия вашего ядра Linux поддерживает необходимые API и не содержит известных ошибок. Если возможно, обновите драйвер или используйте патчи, доступные в сообществе, чтобы устранить ошибки.

4. Отладка

Попробуйте добавить дополнительные сообщения отладки в код драйвера, чтобы понять, какой именно параметр или состояние не соответствует ожиданиям.

Заключение

Ваша проблема с поддержкой режима поставщика тактового сигнала I2S может быть решена путем корректной настройки параметров в файле Device Tree и проверки поддержки формата в драйверах. Убедитесь, что все необходимые настройки и значения установлены верно, и, если проблема сохраняется, рассмотрите возможность обращения к более детальной документации или сообществу разработчиков.

Следуя указанным шагам, вы сможете правильно настроить SII9022A для передачи аудио через I2S. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их в специализированных форумах, где участники с похожими задачами смогут поделиться своим опытом.

Оцените материал
Добавить комментарий

Капча загружается...