> 下列为软件从上电复位到进入"边录边播(ADC+DAC 同时使能)"状态时,对 Codec(I2C bus 0,7-bit 地址 0x50)下发的寄存器写入,**按实际发送顺序排列**。 > > - 阶段 1~3 在开机 `probe/reset` 时执行(阶段 3 为驱动新增,原始 I2C block write)。 > - 阶段 4~7 在每次开流(`set_fmt` / `hw_params` / DAPM)时执行。 > - 内核驱动经 regmap 访问 Page 0~12;Page 17 由 `tac5x1x_write_mixer_coefficients()` 直接 I2C 写入。 > - 部分写入为"读-改-写"(update_bits),下表给出写入后的最终值。 > > 命令格式:`i2cset -f -y 0 0x50 `;block write 加 `i` 参数。 ```bash # ===== 阶段 1:软复位 ===== i2cset -f -y 0 0x50 0x00 0x00 # 选 Page0 i2cset -f -y 0 0x50 0x01 0x01 # SW_RESET 软复位 # >>> 延时 ≥10ms <<< # ===== 阶段 2:写默认值表(复位后逐条,按驱动数组顺序)===== i2cset -f -y 0 0x50 0x00 0x00 # PGSEL = Page0 i2cset -f -y 0 0x50 0x42 0x10 # INT_CFG i2cset -f -y 0 0x50 0x50 0x04 # ADC_CH1_CFG0 i2cset -f -y 0 0x50 0x55 0x04 # ADC_CH2_CFG0 i2cset -f -y 0 0x50 0x64 0x20 # OUT1_CFG0 = DAC Input i2cset -f -y 0 0x50 0x6b 0x20 # OUT2_CFG0 = DAC Input i2cset -f -y 0 0x50 0x76 0x00 # CH_EN = 0(通道先全关) i2cset -f -y 0 0x50 0x1e 0x20 # PASI_TX_CH1_CFG(TX ch1=ADC1,slot0) i2cset -f -y 0 0x50 0x1f 0x01 # PASI_TX_CH2_CFG(TX ch2 三态,slot1) i2cset -f -y 0 0x50 0x28 0x20 # PASI_RX_CH1_CFG(RX ch1,slot0) i2cset -f -y 0 0x50 0x29 0x01 # PASI_RX_CH2_CFG(RX ch2 三态,slot1) i2cset -f -y 0 0x50 0x00 0x01 # 切 Page1 i2cset -f -y 0 0x50 0x73 0xb0 # MICBIAS_CFG = 8V i2cset -f -y 0 0x50 0x00 0x00 # 切回 Page0 i2cset -f -y 0 0x50 0x78 0x20 # PWR_CFG(仅 MICBIAS 开,ADC/DAC 未上电) i2cset -f -y 0 0x50 0x02 0x01 # VREF_CFG i2cset -f -y 0 0x50 0x00 0x01 # 切 Page1 i2cset -f -y 0 0x50 0x2f 0xff # INT_MASK0 i2cset -f -y 0 0x50 0x30 0xff # INT_MASK1 i2cset -f -y 0 0x50 0x31 0x7f # INT_MASK2 i2cset -f -y 0 0x50 0x46 0x90 # DIAG_CFG0(input-open-fault 诊断) i2cset -f -y 0 0x50 0x00 0x00 # 切回 Page0 # ===== 阶段 3:Page 17 Mixer Coefficients(上电前,TI reference code)===== # 驱动 tac5x1x_write_mixer_coefficients() 等效脚本;须 block write,两次完整切页 i2cset -f -y 0 0x50 0x00 0x00 # 选 Page0 i2cset -f -y 0 0x50 0x7f 0x00 # book = 0 i2cset -f -y 0 0x50 0x00 0x11 # 选 Page17 i2cset -f -y 0 0x50 0x58 0x00 0x00 0x40 0x00 i # TX mixer: 0x58-0x5B i2cset -f -y 0 0x50 0x00 0x00 # 切回 Page0 i2cset -f -y 0 0x50 0x7f 0x00 # book = 0 i2cset -f -y 0 0x50 0x00 0x11 # 再选 Page17 i2cset -f -y 0 0x50 0x60 0x40 0x00 0x00 0x00 i # RX mixer: 0x60-0x63 i2cset -f -y 0 0x50 0x00 0x00 # 切回 Page0 # ===== 阶段 4:GPIO 配置 ===== i2cset -f -y 0 0x50 0x0a 0x30 # GPIO1_CFG0 bit[7:4]=3 → IRQ # ===== 阶段 5:DAI 接口格式(set_fmt:DSP_A/TDM + 从机)===== i2cset -f -y 0 0x50 0x37 0x20 # CNT_CLK_CFG2 bit4=0 → PASI 从机 i2cset -f -y 0 0x50 0x1a 0x00 # PASI_CFG0 bit[7:6]=00 → TDM(字长见阶段6) i2cset -f -y 0 0x50 0x1c 0x01 # PASI_TX_CFG1 偏移=1(DSP_A) i2cset -f -y 0 0x50 0x26 0x01 # PASI_RX_CFG0 偏移=1(DSP_A) # ===== 阶段 6:采样率/字长(hw_params,以 8kHz/16-bit 为例)===== i2cset -f -y 0 0x50 0x32 0x00 # CLK_CFG0 PASI_SAMP_RATE=0 → 自动检测 i2cset -f -y 0 0x50 0x1a 0x00 # PASI_CFG0 bit[5:4]=00 → 16-bit # 注:边录边播测试样例 ql_audio_stream_record_play 使用 16kHz/16-bit,驱动同样走自动检测 # ===== 阶段 7:通道与电源使能(DAPM,进入边录边播最终状态)===== i2cset -f -y 0 0x50 0x1e 0x20 # ASI TX ch1 使能(bit5) i2cset -f -y 0 0x50 0x28 0x20 # ASI RX ch1 使能(bit5) i2cset -f -y 0 0x50 0x76 0xcc # CH_EN = ADC ch1+ch2 + DAC ch1+ch2 i2cset -f -y 0 0x50 0x78 0xe0 # PWR_CFG = ADC_PDZ + DAC_PDZ + MICBIAS ``` ### 进入边录边播后的最终寄存器状态(实测,供 TI 比对) | 寄存器 | Page/Offset | 值 | 含义 | |---|---|---|---| | ASI_CFG0 | P0/0x18 | 0x40 | 主 ASI 开,副 ASI 关 | | PASI_CFG0 | P0/0x1A | 0x00 | TDM + 16-bit,极性默认 | | PASI_TX_CFG1 | P0/0x1C | 0x01 | TX 偏移 1 | | PASI_TX_CH1 | P0/0x1E | 0x20 | TX ch1 = ADC1,slot0 | | PASI_RX_CFG0 | P0/0x26 | 0x01 | RX 偏移 1 | | PASI_RX_CH1 | P0/0x28 | 0x20 | RX ch1,slot0 | | CLK_CFG0 | P0/0x32 | 0x00 | 采样率自动检测 | | CLK_CFG2 | P0/0x34 | 0x40 | 时钟源 = PASI BCLK,自动 PLL | | CNT_CLK_CFG2 | P0/0x37 | 0x20 | 从机模式 | | **CH_EN** | P0/0x76 | **0xCC** | ADC ch1/ch2 + DAC ch1/ch2 全开 | | DYN_PUPD | P0/0x77 | 0x00 | 无动态上下电配置 | | **PWR_CFG** | P0/0x78 | **0xE0** | ADC_PDZ + DAC_PDZ + MICBIAS | | TX mixer coeff | P17/0x58-0x5B | `00 00 40 00` | 从 0x58 连续读,已写入 | | RX mixer coeff | P17/0x60-0x63 | `40 00 00 00` | 从 0x60 连续读,已写入 |