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