This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

tas5805m设置采样率和数据长度

Other Parts Discussed in Thread: TAS5805M

你好:

我正在使用tas5805m,平台是MTK8516. 现在5805m已经可以驱动喇叭发出声音了。我想在驱动中加上设置I2S采样率和数据长度的接口。但加上后PA输出没有声音。想知道从哪方面查找原因。

我加的代码如下:

1.增加hw_params接口。

static const struct snd_soc_dai_ops tas5805m_dai_ops = {
    .digital_mute = tas5805m_mute,
    .hw_params = tas5808m_hw_params,
};

static struct snd_soc_dai_driver tas5805m_dai = {
    .name       = "tas5805m ASI1",
    .playback   = {
        .stream_name    = "Playback",
        .channels_min   = 2,
        .channels_max   = 2,
        .rates      = TAS5805M_RATES,
        .formats    = TAS5805M_FORMATS,
    },
    .ops = &tas5805m_dai_ops,
};

2. 再 tas5808m_hw_params实现设置数据宽度和I2S采样率

static int tas5808m_hw_params(struct snd_pcm_substream *substream,
        struct snd_pcm_hw_params *params,
        struct snd_soc_dai *dai)
{
......
tas5805m_set_bitwidth(....)
......
tas5805m_set_samplerate(....)
......
}

3.设置数据宽度函数的实现

static int tas5805m_set_bitwidth(struct tas5805m_priv *tas5805m, int bitwidth)
{
    regmap_update_bits(tas5805m->regmap, TAS5805M_REG_00, 0xFF, TAS5805M_PAGE_00);
    regmap_update_bits(tas5805m->regmap, TAS5805M_REG_7F, 0xFF, TAS5805M_BOOK_00);
    regmap_update_bits(tas5805m->regmap, TAS5805M_REG_00, 0xFF, TAS5805M_PAGE_00);
    switch (bitwidth) {
    case SNDRV_PCM_FORMAT_S32_LE:
            regmap_update_bits(tas5805m->regmap, TAS5805M_REG_33, \
            TAS5808M_REG33_WORDLEN32_Mask, TAS5808M_IIS_DATA_32BIT);    
        break;
......
    default:
        printk("Not supported params format\n");
        return -EINVAL;
    }

    return 0;
}

4.设置采样率函数的实现

static int tas5805m_set_samplerate(struct tas5805m_priv *tas5805m, int samplerate)
{
    regmap_update_bits(tas5805m->regmap, TAS5805M_REG_00, 0xFF, TAS5805M_PAGE_00);
    regmap_update_bits(tas5805m->regmap, TAS5805M_REG_7F, 0xFF, TAS5805M_BOOK_00);
    regmap_update_bits(tas5805m->regmap, TAS5805M_REG_00, 0xFF, TAS5805M_PAGE_00);

    switch (samplerate) {
    case 48000:
        regmap_update_bits(tas5805m->regmap,\
        TAS5805M_REG_28,\
        TAS5808M_REG28_FS_MODE_Mask,\
        TAS5808M_REG28_FS_MODE_48K);
            break;
......
}