Rockchip · AI & Linux Hub

Android и BSP

Руководство разработчика модуля Android 3A Rockchip

Руководство разработчика модуля Android 3A Rockchip — V1.0.0

· ArmSoM Editorial · Rockchip source documentation · 28 мин чтения

Полное техническое издание четырёх глав китайского RK-KF-YF-793 V1.0.0 от : сборка, включение, параметры и устранение ошибок. Таблица применимости указывает все чипы и версии ядра; это историческая область источника, не обещание текущей совместимости. Есть только китайский источник, английских оригинальных рисунков нет. Символьные схемы аудиотракта сохранены как редактируемый код и дополнены исходными фрагментами китайского PDF; изображения не объявляются локализованными. Исключены юридические страницы, аудитория, история изменений и повторное оглавление, но не технические параметры. Команды, запись и аппаратные тесты не выполнялись.

Редакционные замечания: соединены разрывы кода и таблиц между страницами, восстановлены UUID и последний символ заголовка 4.1. Пустые описания attenuate_time и пяти параметров DOA оставлены пустыми, как в источнике. supEnergy2 описан как «точка 1»; fRk1/fRk2 — неактивный наклон экспандирования; регистр HardThreshold/PrioriRatio сохранён без догадок об алгоритме. Комментарии кода, UUID, имена параметров, журналы и исходные многоточия сохранены. Безопасность: adb root/remount и setenforce 0 предназначены только для разрешённой отладки; последняя команда отключает принудительное применение SELinux, после теста восстановите политику. Аудиодампы могут содержать личные записи: ограничьте доступ и удаляйте ненужные файлы.

1. Сборка

1.1 Найдите BoardConfig.mk проекта

Расположение BoardConfig.mk зависит от чипа и product, выбранного через lunch. Пример: чип rk3588, product rk3588_u.

# echo $TARGET_PRODUCT
# rk3588_u

Тогда BoardConfig.mk расположен в device/rockchip/rk3588/rk3588_u/BoardConfig.mk.

1.2 Добавьте флаг сборки

Добавьте следующий флаг в BoardConfig.mk проекта для сборки hardware/rockchip/audio/preprocess.

BOARD_USE_AUDIO_PREPROCESS := true

2. Включение

2.1 Объявление эффектов

Измените frameworks/av/media/libeffects/data/audio_effects.xml, объявив следующий набор эффектов.

<libraries>
    <!-- 保留已有内容, 添加下面的配置项 -->
    <library name="rkpreprocess" path="librkpreprocess.so"/>
</libraries>
<effects>
    <!-- 保留已有内容, 添加下面的配置项 -->
    <effect name="preproc_aec_normal" library="rkpreprocess" uuid="bb392ec0-8d4d-11e0-a896-0002a5d5c51b"/>
    <effect name="preproc_aec_delay" library="rkpreprocess" uuid="55fa4ede-4adb-45fe-80b9-0002a5d5c51b"/>
    <effect name="preproc_aec_array_reset" library="rkpreprocess"
uuid="49cd17f2-819f-4acd-9541-0002a5d5c51b"/>
    <effect name="preproc_bf_fast_aec" library="rkpreprocess" uuid="b5bfc822-0b26-4230-adcb-0002a5d5c51b"/>
    <effect name="preproc_bf_wakeup" library="rkpreprocess" uuid="9ed2a703-5336-4a49-9bbf-0002a5d5c51b"/>
    <effect name="preproc_bf_dereverb" library="rkpreprocess" uuid="bd266323-f95b-4c4f-ab34-0002a5d5c51b"/>
    <effect name="preproc_bf_nlp" library="rkpreprocess" uuid="53e4a6d1-4e6b-4421-afbc-0002a5d5c51b"/>
    <effect name="preproc_bf_aes" library="rkpreprocess" uuid="3ad36ef7-2f2a-42cc-afa3-0002a5d5c51b"/>
    <effect name="preproc_bf_agc" library="rkpreprocess" uuid="aa8130e0-66fc-11e0-bad0-0002a5d5c51b"/>
    <effect name="preproc_bf_anr" library="rkpreprocess" uuid="20b2732e-28e9-4b6b-968a-0002a5d5c51b"/>
    <effect name="preproc_bf_gsc" library="rkpreprocess" uuid="19d4a390-7e23-488b-8568-0002a5d5c51b"/>
    <effect name="preproc_bf_gsc_method" library="rkpreprocess" uuid="79dbccc7-d690-4ed3-be87-0002a5d5c51b"/>
    <effect name="preproc_bf_fix" library="rkpreprocess" uuid="8e8fe0d9-e335-4a75-847a-0002a5d5c51b"/>
    <effect name="preproc_bf_dtd" library="rkpreprocess" uuid="97ef38d0-9346-48d3-aeed-0002a5d5c51b"/>
    <effect name="preproc_bf_cng" library="rkpreprocess" uuid="c0c12199-fccb-45a0-a912-0002a5d5c51b"/>
    <effect name="preproc_bf_eq" library="rkpreprocess" uuid="5f4428b2-6827-4a06-842f-0002a5d5c51b"/>
    <effect name="preproc_bf_chn_select" library="rkpreprocess" uuid="874978b4-1b82-470f-be80-0002a5d5c51b"/>
    <effect name="preproc_bf_howling" library="rkpreprocess" uuid="22075603-4d9d-40a6-bfac-0002a5d5c51b"/>
    <effect name="preproc_bf_doa" library="rkpreprocess" uuid="50404545-a180-40ad-a8f4-0002a5d5c51b"/>
    <effect name="preproc_bf_wind" library="rkpreprocess" uuid="2b8fea18-547e-4af7-85c9-0002a5d5c51b"/>
    <effect name="preproc_bf_ainr" library="rkpreprocess" uuid="a2913959-f123-43bc-ad9c-0002a5d5c51b"/>
    <effect name="preproc_rx_anr" library="rkpreprocess" uuid="9b6b4c6f-9fba-453b-9f33-0002a5d5c51b"/>
    <effect name="preproc_rx_howling" library="rkpreprocess" uuid="f55efb11-dc37-4844-a160-0002a5d5c51b"/>
    <effect name="preproc_ref_hw" library="rkpreprocess" uuid="b95396ba-60ed-424d-8ec7-0002a5d5c51b"/>
    <effect name="preproc_ref_sw_dlp" library="rkpreprocess" uuid="7583028a-e283-4cb5-9c0f-0002a5d5c51b"/>
    <effect name="preproc_ref_sw_alp_playback" library="rkpreprocess"
uuid="d3cb7c9b-79a1-4a84-b26c-0002a5d5c51b"/>
    <effect name="preproc_ref_sw_alp_capture" library="rkpreprocess"
uuid="4f7f9f58-122b-4dc6-831d-0002a5d5c51b"/>
</effects>

2.2 Включение эффектов

Подробности об эффектах см. в Rockchip_Developer_Guide_Microphone_Array_Tuning.pdf. Перед включением выполните два изменения:

1) Установите длительность кадра записи tinyalsa_hal в 16 мс с округлением вниз.

period_size = (int)(rate * 0.016 / 4) * 4

При 48000 Гц period_size = (int)(48000 * 0.016 / 4) * 4 = 768. При 44100 Гц period_size = (int)(44100 * 0.016 / 4) * 4 = 704. Затем измените соответствующий pcm config в hardware/rockchip/audio/tinyalsa_hal/audio_hw.c.

static struct pcm_config pcm_config_in = {
    // ...
    .rate = 48000,
    .period_size = 768,
};

2) Измените число каналов MIC.

Уточнив число каналов MIC, измените конфигурацию ниже; пример для двух каналов MIC в hardware/rockchip/audio/tinyalsa_hal/audio_hw.c.

#define PCM_CAPTURE_CHANNELS 2

Один MIC сейчас обрабатывается как два канала.

2.2.1 AEC

effect Описание
preproc_aec_normal Модуль AEC
preproc_aec_delay Подмодуль оценки задержки AEC
preproc_aec_array_reset Перестановка входных аудиоканалов AEC
preproc_ref_hw Аппаратный опорный сигнал обратного захвата
preproc_ref_sw_dlp Программный опорный сигнал через DLP
preproc_ref_sw_alp_playback Программный обратный захват: буферизация данных Aloop
preproc_ref_sw_alp_capture Программный обратный захват: получение данных Aloop

Для подавления эха AEC необходим опорный сигнал обратного захвата; конфигурация зависит от аудиотракта или топологии.

1) Аппаратный обратный захват. На схемах [L1][R1]… — опорные данные, возвращаемые с точки перед SPK на аудиоинтерфейс CPU DAI1; [L2][R2]… — данные MIC.

HAL                 | Kernel                             | Hardware
                    |                                    |
                    |                      +----------+  |
+----------------+  | [L1][R1]...          | CPU DAI0 |  |               +-----+
| Output Stream  *------------------------>*          *----\------------>* SPK |
+----------------+  |                      +----------+  |  \            +-----+
                    |                                    |  |(Wired)
                    |                      +----------+  |  |
+----------------+  | [L2][R2][L1][R1]...  | CPU DAI1 |  |  v [L2][R2]...+-----+
| Input Stream   *<========================*          *<====+<-----------* MIC |
+----------------+  |                      +----------+  |               +-----+
                    |                                    |

Audio

HAL                 | Kernel                             | Hardware
                    |                                    |
                    |                      +----------+  |
+----------------+  | [L1][R1]...          | CPU DAI0 |  |               +-----+
| Output Stream  *------------------------>*          *----\------------>* SPK |
+----------------+  |                      +----------+  |  \            +-----+
                    |                                    |  |
                    |                     +------------+ |  |(Wired)
                    |                     | Combo DAI  | |  |
                    |                     |+----------+| |  |
                    |                     || CPU DAI1 || |  /
                    |                     ||          *<---/
+----------------+  | [L2][R2][L1][R1]... |+----------+| |
| Input Stream   *<=======================*            | |
+----------------+  |                     |+----------+| |
                    |                     || CPU DAI2 || |    [L2][R2]...+-----+
                    |                     ||          *<-----------------* MIC |
                    |                     |+----------+| |               +-----+
                    |                     +------------+ |

Audio

Audio

Измените число опорных каналов; пример: два канала в hardware/rockchip/audio/tinyalsa_hal/audio_hw.c.

#define PCM_REFERENCE_CHANNELS 2

В frameworks/av/media/libeffects/data/audio_effects.xml привяжите соответствующие потоки к следующим эффектам.

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_hw"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_hw"/>
    </stream>
</preprocess>

2) Программный обратный захват DLP применяется, когда запись и воспроизведение используют один cpu dai. На схеме [L1][R1]… — опорные данные в буфере DLP, [L2][R2]… — данные MIC.

HAL                 | Kernel                             | Hardware
                    |                                    |
                    |                      +----------+  |
+----------------+  | [L1][R1]...          | CPU DAI0 |  |
| Output Stream  *-------------------------*---\      |  |
+----------------+  |                      |    \     |  |
                    |                      |    |(DLP)|  |
+----------------+  | [L2][R2][L1][R1]...  |    v     |  |  [L2][R2]...  +-----+
| Input Stream   *<========================*====+<----*------------------* MIC |
+----------------+  |                      |          |  |               +-----+
                    |                      +----------+  |

Audio

Измените конфигурацию ядра для сборки DLP.

CONFIG_SND_SOC_ROCKCHIP_DLP_PCM

В dts включите DLP для соответствующего cpu dai.

&i2s {
        rockchip,digital-loopback;
};

Варианты cpu dai: i2s0_8ch, i2s1_8ch, i2s2_2ch, i2s3_2ch, sai0, sai1 и другие. Добавьте маршрут в tinyalsa_hal. Имена звуковых карт соответствуют разным файлам конфигурации; проверьте sound_card_config_list. При отсутствии совпадения используется default_config.h. Пример: два канала MIC + два опорных канала.

diff --git a/tinyalsa_hal/codec_config/default_config.h
b/tinyalsa_hal/codec_config/default_config.h
index a554492..114e3d2 100755
--- a/tinyalsa_hal/codec_config/default_config.h
+++ b/tinyalsa_hal/codec_config/default_config.h
@@ -198,6 +202,10 @@ const struct config_control
default_main_mic_capture_controls[] = {
         .ctl_name = "Capture MIC Path",
         .str_val = "Main Mic",
     },
+    {
+        .ctl_name = "Software Digital Loopback Mode",
+        .str_val = "4CH: 2 Mics + 2 Loopbacks",
+    },
 };

 const struct config_control default_hands_free_mic_capture_controls[] = {

Доступные варианты перечислены ниже; выберите согласно числу каналов MIC и опорных каналов.

static const char *const dlp_text[] = {
        "Disabled",
        "2CH: 1 Loopback + 1 Mic",
        "2CH: 1 Mic + 1 Loopback",
        "2CH: 1 Mic + 1 Loopback-mixed",
        "2CH: 2 Loopbacks",
        "4CH: 2 Mics + 2 Loopbacks",
        "4CH: 2 Mics + 1 Loopback-mixed",
        "4CH: 4 Loopbacks",
        "6CH: 4 Mics + 2 Loopbacks",
        "6CH: 4 Mics + 1 Loopback-mixed",
        "6CH: 6 Loopbacks",
        "8CH: 6 Mics + 2 Loopbacks",
        "8CH: 6 Mics + 1 Loopback-mixed",
        "8CH: 8 Loopbacks",
        "10CH: 8 Mics + 2 Loopbacks",
        "10CH: 8 Mics + 1 Loopback-mixed",
        "16CH: 8 Mics + 8 Loopbacks",
};

Измените число опорных каналов; пример: два канала в hardware/rockchip/audio/tinyalsa_hal/audio_hw.c.

#define PCM_REFERENCE_CHANNELS 2

В frameworks/av/media/libeffects/data/audio_effects.xml привяжите соответствующие потоки к следующим эффектам.

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_sw_dlp"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_sw_dlp"/>
    </stream>
</preprocess>

3) Программный обратный захват Aloop используется при разных cpu dai для записи и воспроизведения. [L1][R1]… — опорные данные в Aloop, [L2][R2]… — данные MIC. Данные объединяются на Step#4.

HAL                 | Kernel                             | Hardware
                    |                                    |
  <Far End In>      |                      +----------+  |
+------*---------+  | [L1][R1]...          | CPU DAI0 |  |               +-----+
| Output Stream  *------------------------>*          *----------------->* SPK |
+------*---------+  |                      +----------+  |               +-----+
       | Step#1     |                                    |
       |[L1][R1]... |                                    |
       v            |                                    |
+------*--------+   |                      +----------+  |
|               |   |                      | Aloop    |  |
|(optional pre  *------------------------->* Playback |  |
|  resampler)   |   |                      | PCM      |  |
+---------------+   |                      +----------+  |
                    |                        |#cable0    |
                    |                        |           |
                    |                        v           |
+---------------+   |                      +-*--------+  |
|               |   | Step#2               | Aloop    |  |
|(optional post *<-------------------------* Capture  |  |
|  resampler)   |   |                      | PCM      |  |
+-----*-*-------+   |                      +----------+  |
Step#4| ^ Step#3    |                                    |
<AEC> | |[L2][R2]...|                                    |
      v |           |                      +----------+  |            <Near End>
+-----*-*--------+  | Step#2'              | CPU DAI1 |  |  [L2][R2]...  +-----+
| Input Stream   *<------------------------*          *<-----------------* MIC |
+-----*----------+  |                      +----------+  |               +-----+
  <Far End Out>     |                                    |

Audio

Измените конфигурацию ядра для сборки Aloop.

CONFIG_SND_DRIVERS
CONFIG_SND_ALOOP

Число опорных каналов задавать не нужно: Aloop использует два канала по умолчанию. Файл: hardware/rockchip/audio/tinyalsa_hal/audio_hw.c.

#define PCM_REFERENCE_CHANNELS 0

В frameworks/av/media/libeffects/data/audio_effects.xml привяжите соответствующие потоки к следующим эффектам.

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_sw_alp_capture"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_sw_alp_capture"/>
    </stream>
</preprocess>

<!-- 如果没有声明 postprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<postprocess>
    <stream type="voice_call">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_ref_sw_alp_playback"/>
    </stream>
</postprocess>

2.2.2 BF

effect Описание
preproc_bf_fast_aec Линейное подавление остаточного эха BF для дополнительной очистки тракта пробуждения
preproc_bf_wakeup Модуль пробуждения BF
preproc_bf_dereverb Модуль подавления реверберации BF
preproc_bf_nlp Нелинейное подавление остаточного эха BF в тракте разговора (устаревший модуль)
preproc_bf_aes Нелинейное подавление остаточного эха BF
preproc_bf_agc Автоматическая регулировка усиления BF
preproc_bf_anr Подавление шума BF
preproc_bf_gsc Постфильтр формирования луча BF для дополнительного шумоподавления; включать по результатам проверки
preproc_bf_gsc_method BF: выключено — GSC использует LMS; включено — RLS, требующий больше вычислений, чем LMS
preproc_bf_fix BF с фиксированным направлением луча
preproc_bf_dtd Определение односторонней/одновременной речи BF
preproc_bf_cng Комфортный шум BF
preproc_bf_eq Регулировка эквалайзера BF
preproc_bf_chn_select BF для индивидуального расширения MIC
preproc_bf_howling Подавление акустической обратной связи BF; включать по необходимости
preproc_bf_doa Локализация источника звука BF оценивает его направление; включать по необходимости
preproc_bf_wind Подавление ветрового шума BF; включать по необходимости
preproc_bf_ainr Шумоподавление BF с ИИ; при включении ANR принудительно отключается

Для preproc_bf_fast_aec и preproc_bf_aes сначала настройте AEC. В frameworks/av/media/libeffects/data/audio_effects.xml привяжите потоки к эффектам ниже.

1) Рекомендуемые эффекты BF для пробуждения:

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_bf_wakeup"/>
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_dtd"/>
        <apply effect="preproc_bf_agc"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_bf_wakeup"/>
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_dtd"/>
        <apply effect="preproc_bf_agc"/>
    </stream>
</preprocess>

2) Рекомендуемые эффекты BF для голосовых вызовов:

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_dtd"/>
        <apply effect="preproc_bf_aes"/>
        <apply effect="preproc_bf_anr"/>
        <apply effect="preproc_bf_agc"/>
        <apply effect="preproc_bf_dereverb"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_dtd"/>
        <apply effect="preproc_bf_aes"/>
        <apply effect="preproc_bf_anr"/>
        <apply effect="preproc_bf_agc"/>
        <apply effect="preproc_bf_dereverb"/>
    </stream>
</preprocess>

3) При необходимости привяжите другие эффекты.

2.2.3 RX

effect Описание
preproc_rx_anr Подавление шума; включать согласно условиям применения
preproc_rx_howling Подавление акустической обратной связи; включать по необходимости

В frameworks/av/media/libeffects/data/audio_effects.xml привяжите потоки к необходимым эффектам ниже.

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_rx_anr"/>
        <apply effect="preproc_rx_howling"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_rx_anr"/>
        <apply effect="preproc_rx_howling"/>
    </stream>
</preprocess>

2.3 Проверка

1) Проверьте регистрацию в AudioFlinger командой dumpsys media.audio_flinger.

# dumpsys media.audio_flinger
[...]
Libraries loaded:
 [...]
 Library rkpreprocess
  path: /vendor/lib/soundfx/librkpreprocess.so
  Aloop Capture / Rockchip Electronics Co. Ltd.
    UUID: 4f7f9f58-122b-4dc6-831d-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  Aloop Playback / Rockchip Electronics Co. Ltd.
    UUID: d3cb7c9b-79a1-4a84-b26c-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820204
  Digital Loopback / Rockchip Electronics Co. Ltd.
    UUID: 7583028a-e283-4cb5-9c0f-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  HW Loopback / Rockchip Electronics Co. Ltd.
    UUID: b95396ba-60ed-424d-8ec7-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  RX HOWLING / Rockchip Electronics Co. Ltd.
    UUID: f55efb11-dc37-4844-a160-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  RX ANR / Rockchip Electronics Co. Ltd.
    UUID: 9b6b4c6f-9fba-453b-9f33-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF AINR / Rockchip Electronics Co. Ltd.
    UUID: a2913959-f123-43bc-ad9c-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF WIND / Rockchip Electronics Co. Ltd.
    UUID: 2b8fea18-547e-4af7-85c9-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF DOA / Rockchip Electronics Co. Ltd.
    UUID: 50404545-a180-40ad-a8f4-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
BF HOWLING / Rockchip Electronics Co. Ltd.
  UUID: 22075603-4d9d-40a6-bfac-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF CHN Select / Rockchip Electronics Co. Ltd.
  UUID: 874978b4-1b82-470f-be80-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF EQ / Rockchip Electronics Co. Ltd.
  UUID: 5f4428b2-6827-4a06-842f-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF CNG / Rockchip Electronics Co. Ltd.
  UUID: c0c12199-fccb-45a0-a912-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF DTD / Rockchip Electronics Co. Ltd.
  UUID: 97ef38d0-9346-48d3-aeed-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF FIX / Rockchip Electronics Co. Ltd.
  UUID: 8e8fe0d9-e335-4a75-847a-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF GSC Method / Rockchip Electronics Co. Ltd.
  UUID: 79dbccc7-d690-4ed3-be87-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF GSC / Rockchip Electronics Co. Ltd.
  UUID: 19d4a390-7e23-488b-8568-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF ANR / Rockchip Electronics Co. Ltd.
  UUID: 20b2732e-28e9-4b6b-968a-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF AGC / Rockchip Electronics Co. Ltd.
  UUID: aa8130e0-66fc-11e0-bad0-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF AES / Rockchip Electronics Co. Ltd.
  UUID: 3ad36ef7-2f2a-42cc-afa3-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF NLP / Rockchip Electronics Co. Ltd.
  UUID: 53e4a6d1-4e6b-4421-afbc-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF De-Reverberation / Rockchip Electronics Co. Ltd.
    UUID: bd266323-f95b-4c4f-ab34-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF Wakeup / Rockchip Electronics Co. Ltd.
    UUID: 9ed2a703-5336-4a49-9bbf-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF Fast AEC / Rockchip Electronics Co. Ltd.
    UUID: b5bfc822-0b26-4230-adcb-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  AEC Array Reset / Rockchip Electronics Co. Ltd.
    UUID: 49cd17f2-819f-4acd-9541-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  AEC Delay / Rockchip Electronics Co. Ltd.
    UUID: 55fa4ede-4adb-45fe-80b9-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  AEC Normal / Rockchip Electronics Co. Ltd.
    UUID: bb392ec0-8d4d-11e0-a896-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
[...]

2) Проверьте привязку к нужному потоку. Во время записи или разговора используйте dumpsys media.audio_flinger. Пример: разговор с программным опорным сигналом Aloop.

<preprocess>
    <stream type="voice_communication">
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_aes"/>
        <apply effect="preproc_bf_anr"/>
        <apply effect="preproc_bf_dereverb"/>
        <apply effect="preproc_rx_anr"/>
        <apply effect="preproc_ref_sw_alp_capture"/>
    </stream>
</preprocess>

<postprocess>
    <stream type="voice_call">
        <apply effect="preproc_ref_sw_alp_playback"/>
    </stream>
</postprocess>
# dumpsys media.audio_flinger
[...]
Output thread 0xb40000784395ba60, name AudioOut_D, tid 642, type 0 (MIXER):
  I/O handle: 13
  Standby: no
  [...]
  1 Effect Chains
    1 effects for session 249
        In buffer    Out buffer                           Active tracks:
        0x78439e0000   0x7843d34000 -> 0xb400007730317020   1
        Effect ID 75:
                [...]
                - UUID: d3cb7c9b-79a1-4a84-b26c-0002a5d5c51b
                [...]
                - name: Aloop Playback
                [...]
  [...]
[...]
Input thread 0xb40000784388dc60, name AudioIn_2E, tid 6501, type 3 (RECORD):
  I/O handle: 30
  Standby: no
  [...]
  1 Effect Chains
    7 effects for session 257
        In buffer    Out buffer         Active tracks:
        nullptr   nullptr   0
        Effect ID 139:
                [...]
                - UUID: bb392ec0-8d4d-11e0-a896-0002a5d5c51b
                [...]
                - name: AEC Normal
                [...]
        Effect ID 147:
                [...]
                - UUID: b5bfc822-0b26-4230-adcb-0002a5d5c51b
                [...]
                - name: BF Fast AEC
                [...]
        Effect ID 155:
                [...]
                - UUID: 3ad36ef7-2f2a-42cc-afa3-0002a5d5c51b
                [...]
                - name: BF AES
                [...]
        Effect ID 163:
                [...]
                - UUID: 20b2732e-28e9-4b6b-968a-0002a5d5c51b
                [...]
                - name: BF ANR
                [...]
        Effect ID 171:
                [...]
                - UUID: bd266323-f95b-4c4f-ab34-0002a5d5c51b
                [...]
                - name: BF De-Reverberation
                [...]
        Effect ID 179:
                [...]
                - UUID: 9b6b4c6f-9fba-453b-9f33-0002a5d5c51b
                [...]
                - name: RX ANR
                [...]
        Effect ID 187:
                [...]
                - UUID: 4f7f9f58-122b-4dc6-831d-0002a5d5c51b
                [...]
                - name: Aloop Capture
                [...]
  [...]
[...]

3. Параметры

Значения по умолчанию находятся в rkaudio_effect_preprocess.xml: в SDK — hardware/rockchip/audio/preprocess/, на устройстве — /vendor/etc/.

3.1 Описание параметров

См. Rockchip_Developer_Guide_Microphone_Array_Tuning.pdf. После интеграции параметры по умолчанию хранятся в rkaudio_effect_preprocess.xml; далее рассматриваются этот документ и XML.

3.2 Настройка параметров

3.2.1 Параметры AEC

Атрибут Описание
pos Позиция опорных каналов: 0 — перед данными MIC, 1 — после них.
drop_ref_channel Число необрабатываемых опорных каналов.
delay_len Без оценки задержки — точка задержки аппаратного опорного сигнала по умолчанию; с оценкой — начальная точка оценки задержки.
look_ahead Длина буфера MIC. Настраивать только если известно, что захват MIC запаздывает относительно опорного сигнала; иначе оставить 0.
filter_len Длина линейного фильтра AEC. Большая длина повышает точность оценки эха, но замедляет сходимость и увеличивает вычисления. Типичные значения: 2/4/6/8.
Array_list Порядок аудиоканалов; требуется preproc_aec_array_reset.

Параметры оценки задержки (требуется preproc_aec_delay).

Атрибут Описание
max_frame Максимальное число кадров оценки; обычно 16.
least_delay Минимальное число кадров оценки; рекомендуется 0, если MaxFrame не особенно велик.
jump_frame Число кадров, пропускаемых в начале; обычно 12.
delay_offset Смещение в кадрах, предотвращающее запаздывание MIC относительно опоры из-за чрезмерной оценки задержки; обычно 1.
mic_amp_thr Минимальная энергия MIC: ниже порога оценка задержки не обновляется. Обычно 50.
ref_amp_thr Минимальная энергия опорного сигнала: ниже порога оценка задержки не обновляется. Обычно 50.
start_freq Начальная частота оценки задержки. Выбирайте основной речевой диапазон и корректируйте по результатам записи; обычно 500.
end_freq Конечная частота оценки задержки. Выбирайте основной речевой диапазон и корректируйте по результатам записи; обычно 4000.
smooth_factor Коэффициент сглаживания, обычно [0.95,1). Большие значения стабилизируют оценку задержки, меньшие ускоряют обновление. Обычно 0.97/0.99.

3.2.2 Параметры BF

Атрибут Описание
ref_pos Позиция опорных каналов: 0 — перед данными MIC, 1 — после них.
targ Направление приёма при включённом preproc_bf_fix.
drop_ref_channel Число необрабатываемых опорных каналов.

1) Параметры AES (требуется preproc_bf_aes).

Атрибут Описание
beta_up Скорость нарастания: большие значения усиливают нелинейное подавление. Рекомендуется 0.001-0.01.
beta_down Скорость спада: большие значения ослабляют нелинейное подавление. Рекомендуется 0.001-0.01.
beta_up_low Низкочастотная скорость нарастания; свойства и диапазон как у beta_up.
beta_down_low Низкочастотная скорость спада; свойства и диапазон как у beta_down.
low_freq Граница низкочастотного диапазона.
high_freq Граница высокочастотного диапазона.
thd_flag 1 включает подавление гармонических искажений, 0 отключает.
hard_flag 1 включает Hard mode: сильнее подавляет эхо, но может чрезмерно подавлять речь.
limit_ratio_0 Минимальная доля остаточного эха в диапазоне; рекомендуется [1.0f, 5.0f]. Большие значения усиливают подавление. Три столбца — низкий, средний и высокий диапазоны, задаваемые low_freq и high_freq.
limit_ratio_1 Доля подавления остаточного эха по диапазонам; рекомендуется [1.0f, 3.0f]. Большие значения усиливают подавление. Три столбца — низкий, средний и высокий диапазоны, разделённые low_freq и high_freq.
thd_split_freq_0 Диапазоны подавления гармоник. Неиспользуемую строку заполните нулями. Каждая строка — диапазон: начало в столбце 1, конец в столбце 2; диапазон обоих значений [0,1/2 * sample rate].
thd_split_freq_1 То же, что выше.
thd_split_freq_2 То же, что выше.
thd_split_freq_3 То же, что выше.
thd_sup_degree_0 Коэффициенты подавления гармоник для указанных диапазонов. Нулевая строка диапазона отключает соответствующую строку коэффициентов. Столбцы задают подавление основной частоты, способной образовать в диапазоне гармоники со 2-й по 11-ю. Рекомендуется [0.001f,1.0f]; большее значение усиливает подавление.
thd_sup_degree_1 То же, что выше.
thd_sup_degree_2 То же, что выше.
thd_sup_degree_3 То же, что выше.
hard_split_freq_0 Диапазоны Hard mode и диапазон вычисления среднего усиления. Столбцы 1/2 — начало/конец в [0,1/2*sample rate]. Не более четырёх диапазонов Hard mode; последняя строка задаёт диапазон среднего усиления для HardThreshold ниже.
hard_split_freq_1 То же, что выше.
hard_split_freq_2 То же, что выше.
hard_split_freq_3 То же, что выше.
hard_split_freq_4 То же, что выше.
hard_threshold Пороги включения Hard mode: четыре порога соответствуют четырём диапазонам выше. Если среднее усиление ниже порога, в соответствующем диапазоне включается Hard mode.

2) Параметры AGC (требуется preproc_bf_agc).

Атрибут Описание
attack_time Рекомендуется 20-600 мс. Время атаки — время увеличения усиления AGC.
release_time Рекомендуется 20-600 мс. Время восстановления — время снижения усиления AGC.
attenuate_time  
max_gain Рекомендуется 0-50 дБ. Максимальное усиление, также усиление линейного участка.
max_peak Диапазон от 0 до -87 дБ. Максимальная энергия речи после AGC.
fRth0 Диапазон от 0 до -87 дБ. Порог шумового затвора: речь ниже него не усиливается.
fRth1 Диапазон от 0 до -87 дБ. Энергетический порог конца экспандирования; речь выше него усиливается на max_gain.
fRth2 Диапазон от 0 до -87 дБ. Порог начала компрессии; выше него усиление речи постепенно падает до 0 дБ.
fRk0 Наклон участка экспандирования.
fRk1 Наклон участка экспандирования (неактивный параметр).
fRk2 Наклон участка экспандирования (неактивный параметр).
fLineGainDb Повышение линейного участка в дБ (неактивный параметр).
swSmL0 Число точек временного сглаживания экспандирования (неактивный параметр).
swSmL1 Число точек временного сглаживания линейного участка (неактивный параметр).
swSmL2 Число точек временного сглаживания компрессии (неактивный параметр).

3) Параметры ANR (требуется preproc_bf_anr).

Атрибут Описание
noiseFactor Уровень оценки шума, обычно [0.5f,1.5f]; большие значения сильнее удаляют шум.
swU Временной интервал оценки шума, обычно [2,20]. Большие значения точнее оценивают стационарный шум, но замедляют сходимость при скачках; меньшие быстрее реагируют на скачки, но могут чрезмерно подавлять речь.
psiMin Порог вероятности наличия речи, [0.0f,1.0f]; большие значения усиливают шумоподавление.
psiMax Порог вероятности наличия речи, [0.0f,1.0f]; большие значения усиливают шумоподавление.
fGmin Минимальное значение шумоподавления, [0.0f,1.0f]; меньшие значения усиливают подавление.
supFreq1 Точка 1 подавления тонального шума, [0,1/2*sample rate]; шум на заданной частоте подавляется постоянно.
supFreq2 Точка 2 подавления тонального шума, [0,1/2*sample rate]; шум на заданной частоте подавляется постоянно.
supEnergy1 Энергетический порог точки 1 подавления тонального шума, обычно 100000. При превышении энергии частотной составляющей оценка тонального шума обновляется.
supEnergy2 Энергетический порог точки 1 подавления тонального шума, обычно 100000. При превышении энергии частотной составляющей оценка тонального шума обновляется.
interV Интервал выборки кадров, обычно [2,20]. Большие значения делают оценку шума стабильнее, подобно swU.
biasMin Компенсация шума, обычно [1.0f, 2.0f]; большие значения усиливают подавление.
updateFrm Длина быстрой сходимости, обычно 15: ускоренная сходимость первых 15 кадров.
nPreGammaThr Порог вероятности чистого шума, обычно (3.0f,5.0f); большие значения усиливают подавление.
nPreZetaThr Порог вероятности чистого шума, обычно (1.0f,3.0f); большие значения усиливают подавление.
sabsGammaThr0 Порог вероятности отсутствия речи, обычно (0.5f,1.5f); большие значения усиливают подавление.
sabsGammaThr1 Порог вероятности отсутствия речи, обычно (2.f,4.0f); большие значения усиливают подавление.
infSmooth Коэффициент сглаживания входного сигнала, (0.0f,1.0f).
probSmooth Коэффициент сглаживания вероятности наличия речи, (0.0f,1.0f).
compCoeff Компенсация шума, обычно [1.0f, 2.0f], для диапазонов ниже средней оценки шума. Большие значения усиливают подавление.
prioriMin Минимальное априорное SNR, (0.0f, 0.5f); большие значения ослабляют шумоподавление.
postMax Максимальное апостериорное SNR; обычно 40.
prioriRatio Коэффициент сглаживания априорного SNR, (0.0f,1.0f); большие значения усиливают шумоподавление.
prioriRatioLow Коэффициент сглаживания априорного SNR, (0.0f,1.0f); большие значения усиливают шумоподавление.
splitBand Индекс разделения диапазонов, [0,32]. Ниже него априорное SNR сглаживается PrioriRatioLow, иначе — PrioriRatio.
prioriSmooth Коэффициент сглаживания априорного SNR, (0.0f,1.0f); большие значения усиливают шумоподавление.
tranMode Режим импульсного шума: 0 — выключен, 1 — подавление по обнаружению, 2 — по оценке.

4) Параметры подавления реверберации (требуется preproc_bf_dereverb).

Атрибут Описание
rlsLg Порядок RLS-фильтра подавления реверберации для пробуждения. В определённых пределах больший порядок усиливает эффект и увеличивает вычисления. Рекомендуется 4.
curveLg Порядок кривой распределения для подавления реверберации в разговоре. Большие значения усиливают эффект и риск чрезмерного подавления. Рекомендуется 10.
delay Задержка RLS-фильтра определяет сохранение ранней реверберации. Рекомендуется 2.
forgetting Коэффициент забывания RLS. Меньшие значения усиливают подавление реверберации и риск чрезмерного подавления. Рекомендуется 0.98-0.999.
t60 Оценка времени реверберации в секундах. Большие значения усиливают подавление и риск чрезмерной обработки. Рекомендуется 0.68 при слабой реверберации, 1.5 при средней/сильной.
coCoeff Коэффициент взаимной когерентности против чрезмерного подавления. Меньшие значения усиливают эффект. Рекомендуется 2 при слабой реверберации, 1 при средней/сильной.

5) Параметры комфортного шума (требуется preproc_bf_cng).

Атрибут Описание
fGain Рекомендуется 0-50 дБ. Коэффициент амплитуды добавляемого комфортного шума; по умолчанию 2.
fMpy Рекомендуется 0-50 дБ. Амплитуда случайного генератора белого шума; по умолчанию 5.
fSmoothAlpha Диапазон 0.0f-1.0f. Сглаживание комфортного шума; по умолчанию 0.92.
fSpeechGain Диапазон 0.0f-1.0f. Степень имитации речевой структуры комфортного шума; по умолчанию 0.3.

6) Параметры DTD (требуется preproc_bf_dtd).

Атрибут Описание
ksiThd_high Верхний порог односторонней/одновременной речи; выше него определяется односторонняя речь.
ksiThd_low Нижний порог; ниже него определяется односторонняя речь.

7) Параметры DOA (требуется preproc_bf_doa).

Атрибут Описание
rad  
start_freq  
end_freq  
lg_num  
lg_pitch_num  

8) Параметры EQ (требуется preproc_bf_eq).

Атрибут Описание
shwParaLen Число коэффициентов фильтра.
filter_bank_0 Коэффициенты фильтра.
filter_bank_1 Коэффициенты фильтра.
filter_bank_2 Коэффициенты фильтра.
filter_bank_3 Коэффициенты фильтра.
filter_bank_4 Коэффициенты фильтра.

3.3 Настройка и отладка параметров

Используйте сборку userdebug и проверьте подключение ПК через ADB. На ПК выполните две следующие команды.

adb root
adb remount

3.3.1 Обновление параметров

Измените rkaudio_effect_preprocess.xml и отправьте его через push в соответствующий каталог устройства.

adb push rkaudio_effect_preprocess.xml /vendor/etc/

3.3.2 Анализ выхода

Перезапустите запись для проверки результата либо разговор для проверки выхода удалённой стороны. Также можно выгрузить вход/выход и проанализировать потоки напрямую.

setenforce 0
setprop vendor.audio.preproc.debug 1

Затем экспортируйте два следующих файла и проанализируйте их в Audacity или другом инструменте ПК.

/data/misc/audioserver/preproc_input_xxxhz_xxxch.pcm
/data/misc/audioserver/preproc_output_xxxhz_xxxch.pcm

xxxhz обозначает частоту дискретизации, xxxch — число каналов. В Audacity выберите «Файл», «Импорт», «Необработанные данные», затем задайте частоту и каналы. После проверки результата обновите rkaudio_effect_preprocess.xml в hardware/rockchip/audio/preprocess/.

4. Вопросы и ответы

4.1 После добавления DLP запись с заданным числом каналов MIC + опоры завершается ошибкой параметров

Пример: два канала MIC и два опорных канала.

# tinycap /sdcard/mic.wav -D xxx -c 4 -r 48000
Unable to open PCM device (cannot set hw params: Invalid argument)
Captured 0 frames

xxx — индекс соответствующей звуковой карты в выводе cat /proc/asound/cards.

4.1.1 Проверка маршрута

(1) Проверьте возможность установки маршрута.

# tinymix -D xxx "Software Digital Loopback Mode" "4CH: 2 Mics + 2 Loopbacks"

При ошибке проверьте три пункта:

Invalid mixer control: Software Digital Loopback Mode

Проверьте наличие поддержки DLP в текущем ядре; иначе обновите SDK или примените патч.

# grep rockchip,digital-loopback -r ./sound/soc/rockchip/
./sound/soc/rockchip/rockchip_sai.c:    if (device_property_read_bool(&pdev->dev,
"rockchip,digital-loopback"))
./sound/soc/rockchip/rockchip_i2s.c:    if (device_property_read_bool(&pdev->dev,
"rockchip,digital-loopback"))
./sound/soc/rockchip/rockchip_i2s_tdm.c:        if
(device_property_read_bool(dev, "rockchip,digital-loopback")) {

Проверьте, включён ли DLP в ядре.

CONFIG_SND_SOC_ROCKCHIP_DLP_PCM

Включите DLP для соответствующего cpu dai в dts.

&i2s {
        rockchip,digital-loopback;
};

cpu dai может быть i2s0_8ch, i2s1_8ch, i2s2_2ch, i2s3_2ch, sai0, sai1 и т. д. (2) Проверьте, применён ли маршрут.

# tinymix -D xxx
...
13      ENUM    1       Software Digital Loopback Mode           4CH: 2 Mics + 2
Loopbacks
...

4.1.2 Проверка звуковой карты

Проверьте, объявляет ли привязанный в dts codec dai driver поддержку четырёхканального захвата.

// ...
demo_sound: demo-sound {
    compatible = "simple-audio-card";
    // ...
    simple-audio-card,codec {
        sound-dai = <&demo>;
    };
    // ...
};

// ...
// 或者
demo_sound: demo-sound {
    compatible = "rockchip,multicodecs-card";
    // ...
    rockchip,codec = <&demo>;
    // ...
};
struct snd_soc_dai_driver demo_dai = {
    // 没有 capture, 或者 channels_max 小于 4 channel, 则说明不支持
    .capture = {
        .channels_min = 1,
        .channels_max = 2,
    },
    // ...
};

Если нет, используйте “rockchip,multicodecs-card” с дополнительным вспомогательным виртуальным codec.

// 修改前 (例1)
#if 0
demo_sound: demo-sound {
    status = "okay";
    compatible = "simple-audio-card";
    simple-audio-card,format = "i2s";
    simple-audio-card,name = "rockchip,demo-codec";
    simple-audio-card,mclk-fs = <256>;
    simple-audio-card,cpu {
        sound-dai = <&i2s>;
    };
    simple-audio-card,codec {
        sound-dai = <&demo>;
    };
};
#endif

// 修改前 (例2)
#if 0
demo_sound: demo-sound {
    status = "okay";
    compatible = "rockchip,multicodecs-card";
    rockchip,format = "i2s";
    rockchip,card-name = "rockchip,demo-codec";
    rockchip,mclk-fs = <256>;
    rockchip,cpu = <&i2s>;
    rockchip,codec = <&demo>;
};
#endif
// 修改后
// 声明虚拟 codec 节点
demo_aux: demo-aux {
    status = "okay";
    compatible = "rockchip,dummy-codec";
    sound-name-prefix = "demo-aux";
    #sound-dai-cells = <0>;
};

// 使用 "rockchip,multicodecs-card" 绑定 codec 和虚拟 codec
demo_sound: demo-sound {
    status = "okay";
    compatible = "rockchip,multicodecs-card";
    rockchip,format = "i2s";
    rockchip,card-name = "rockchip,demo-codec";
    rockchip,mclk-fs = <256>;
    rockchip,cpu = <&i2s>;
    rockchip,codec = <&demo &demo_aux>;
};

Другие статьи по теме → · Учебные маршруты →