kcontrol 总结

27 篇文章 2 订阅

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值