Bananapi M1 Plus + PCM5102

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 的取值，参照如下表格：



例如，音频文件为 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