1 kcontrol 表示一种功能 控制一个或多个寄存器

2 tinymix 可以看出 kcontrol 名字对应的 序号

3 如何使用kcontrol
首先 open 打开 dev/snd 里面 控制节点

4所有的 kcontrol 都会经过 tinyalsa 里面的 control.c 文件中的 snd_ctl_ioctl

5 snd_soc_dapm_path不需要自己定义,会在注册snd_soc_dapm_route时动态地生成。

6 widget
应用程序无法直接访问 widget

7 widget 是为了连接而生的, 那么控制连接或者不连接 只能是 kcontrol
(根据 kcontrol 状态, 设置 path状态标志位。
所以有些没用 kcontrol的path,标志位一直是连接 )

8 那么 xml 中的 kcontrol 应该都存在于 snd_soc_dapm_route 中呀

9 添加widget snd_soc_dapm_new_controls
添加route snd_soc_dapm_add_routes

10 如果 把几个 设置通路的话,应该有 widget route

11 kcontrol 的名字(尤其是 mix 跟 mux)
​​​ALSA中Widget、route、kcontrol 命名规则​

12 kcontrol 的get 和 set 函数
的参数
snd_ctl_elem_value 存着 在用户层设置的参数。
​​​linux alsa 音频路径切换​

13 用户层通过 kcontrol 传进来的参数的数据可以进行限制。
例如 SOC_ENUM_EXT 可以设置 kcontrol 可选的 value

static const char *rt5659_micbias2_power_mode[] = {
"Disable", "Enable"
};

static const struct soc_enum rt5659_micbias2_power_enum =
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rt5659_micbias2_power_mode),
rt5659_micbias2_power_mode);

static int rt5659_micbias2_power_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
int pwr = snd_soc_read(codec, RT5659_PWR_ANLG_2);

if (pwr & 0x0400)
ucontrol->value.integer.value[0] = 1;
else
ucontrol->value.integer.value[0] = 0;

return 0;
}

static int rt5659_micbias2_power_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
int pwr = ucontrol->value.integer.value[0];

if (pwr == 1) {
snd_soc_update_bits(codec, RT5659_PWR_ANLG_3, 0x0002, 0x0002);
snd_soc_update_bits(codec, RT5659_PWR_ANLG_1, 0x0200, 0x0200);
snd_soc_update_bits(codec, RT5659_PWR_ANLG_2, 0x0400, 0x0400);
dev_info(codec->dev, "enable micbias2 power\n");
} else {
snd_soc_update_bits(codec, RT5659_PWR_ANLG_3, 0x0002, 0x0000);
snd_soc_update_bits(codec, RT5659_PWR_ANLG_1, 0x0200, 0x0000);
snd_soc_update_bits(codec, RT5659_PWR_ANLG_2, 0x0400, 0x0000);
dev_info(codec->dev, "disable micbias2 power\n");
}

return 0;
}

SOC_ENUM_EXT("micbias2 power", rt5659_micbias2_power_enum,
rt5659_micbias2_power_get, rt5659_micbias2_power_put),

参考:​​Asoc dapm(一) - kcontrol​