Bananapi M1 Plus + PCM5102

From eLinux.org
Jump to: navigation, search

sun4i-codec

for 44.1KHz:

PLL2_CFG_REG: 0x90104F15
	PLL2_PRE_DIV: 0x0005
	PLL2_Factor_N: 0x004F
	PLL2_POST_DIV: 0x0004
	PLL2_Enable: 0x0001

for 48KHz

PLL2_CFG_REG: 0x90105615
	PLL2_PRE_DIV: 0x0005
	PLL2_Factor_N: 0x0056
	PLL2_POST_DIV: 0x0004
	PLL2_Enable: 0x0001

sunxi audio clock

  • 如下代码,将 PLL2 输出设定为 24576KHz 或者 22579.2KHz
    switch (rate) {
        case 176400:
        case 88200:
        case 44100:
        case 22050:
        case 11025:
                clk_rate = 22579200;
                break;

        case 192000:
        case 128000:
        case 96000:
        case 64000:
        case 48000:
        case 32000:
        case 24000:
        case 16000:
        case 12000:
        case 8000:
        clk_rate = 24576000;
                break;

        default:
        return -EINVAL;
        }

    printk("%s +%d\n", __func__, __LINE__);

    clk_set_rate(sdai->mod_clk, clk_rate);
    if ( clk_rate == 22579200 ) {
        writel(0x90104F15, sdai->ccu_regs + 0x0008);
    } else {
        writel(0x90105615, sdai->ccu_regs + 0x0008);
    }
    writel(0x80030000, sdai->ccu_regs + 0x00B8);
  • PLL2 输出的时钟,通过 MCLKDIV 和 BCLKDIV 两个分频器,进一步分解到音频文件的采样率 (Sample Rate) 上。数学关系是:
PLL2/(fs*wss*ch) = m * b

m 和 b 的取值,参照如下表格:

mclkdiv

例如,音频文件为 CD 格式: 44.1KHz/16Bit/双声道。

PLL2/(fs*wss*ch) = 22579.2/(44.1*16*2) = 16

所以 m*b = 16 即可。查询表格,可以任意选择一种 m 和 b 的组合。

音频文件 >16bit 时,物理宽度都是 32Bit ,这时,我们通常设定 wss=32。所以假设我们有 24Bit/96KHz 的音频文件,则公式为:

PLL2/(fs*wss*ch) = 24576/(96*32*2) = 4

也就是说 m*b = 4 即可满足条件。所以如下两个组合是等价的:

[root@alarm a20]# ./a20_reg 0x01C22000 0x424 0x00000081
1c22000, 424, 81
page = 0xB6FC6000
val = 0x00000090
val = 0x00000081

MARK:
0x90 = 4*1
0x81 = 2*2