# PR17:DPD结束后恢复ORx FAGC实时跟踪 ## 1. 背景 当前冷启动流程会调用 `boot_cfg_fagc_update()`,向 FPGA 的 `FPGA_ADDR_DPD_CTRL3` 写入 `DPD_CTRL3_FAGC_UPDATE`,因此在未执行 DPD Update 时,ORx FAGC保持实时跟踪。 执行DPD Update后,FAGC在训练阶段工作一段时间,然后被锁定。DPD完整结束后, 当前流程没有恢复冷启动时的FAGC工作状态,导致后续ORx反馈射频电平发生较大变化时, FAGC不能再次收敛。 ## 2. 需求 DPD Update完整结束后,恢复与设备冷启动后相同的ORx FAGC实时跟踪状态。 要求: - 只修改i.MX6应用代码。 - 不修改FPGA RTL。 - 不修改ORx DAGC逻辑。 - 不改变DPD训练期间现有的FAGC启停和锁定时序。 - 不触发新的DPD训练,不清除已经生成的DPD系数。 ## 3. 修改方案 目标文件: ```text imx6/src/atsc_app/bsp/dpd_proc.c ``` 复用现有函数: ```c boot_cfg_fagc_update(); ``` 该函数定义于: ```text imx6/src/atsc_app/bsp/fpga.c ``` 如果 `dpd_proc.c` 中没有函数声明,则增加: ```c extern void boot_cfg_fagc_update(void); ``` 在DPD Update完整成功结束、即将退出更新状态机的位置,调用: ```c /* 恢复冷启动后的ORx FAGC实时跟踪状态。 */ boot_cfg_fagc_update(); log_printf(LOG_INFO, I_USER_CFG, "[DPD] update complete, ORx FAGC tracking restored\n"); ``` 如果该完整结束出口当前执行以下最终清零: ```c fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, 0); ``` 则将这一次最终清零替换为 `boot_cfg_fagc_update()`。 必须保留phase 1、phase 7以及其他DPD训练阶段内部用于锁定FAGC的 `FPGA_ADDR_DPD_CTRL3 = 0` 操作。这些操作属于现有DPD收敛流程,不能替换。 如果工程中存在多套DPD Update状态机,应分别检查它们的完整成功结束出口,确保最终都恢复FAGC。 ## 4. 修改后的工作状态 1. 冷启动、不执行DPD Update:行为不变,FAGC持续实时跟踪。 2. DPD训练期间:行为不变,FAGC先收敛,再按现有流程锁定。 3. DPD Update完整结束:重新置位 `DPD_CTRL3_FAGC_UPDATE`。 4. 后续ORx反馈电平超出RTL现有死区时,FAGC再次调整ADRV9009 ORx增益。 5. DAGC控制方式和已完成的DPD系数保持不变。 ## 5. 注意事项 - `boot_cfg_fagc_update()` 只有在ADRV9009 SPI控制权属于FPGA时才会写入;DPD结束时应确认SPI控制权已经交还FPGA。 - 不增加 `DPD_CTRL3_FAGC_SLOWDN`,确保恢复状态与当前冷启动后的状态完全一致。 - 不触发 `DPD_START`。 - 只修改整个DPD Update的最终出口,不修改phase之间的临时控制操作。 ## 6. 验证步骤 1. 冷启动设备,不执行DPD Update,记录FAGC控制字或ORx `gain_index`的工作状态。 2. 执行一次完整DPD Update。 3. 确认DPD结束后日志出现: ```text [DPD] update complete, ORx FAGC tracking restored ``` 4. DPD结束后改变反馈链路衰减,使ORx输入电平变化超过现有约±1 dB死区。 5. 确认FAGC控制字及ADRV9009 ORx `gain_index`重新变化并最终稳定。 6. 确认DPD系数没有被清除或重新训练,发射输出保持正常。 ## 7. 验收标准 - DPD Update结束后,FAGC工作状态与冷启动且未执行DPD时一致。 - 反馈射频电平明显变化后,FAGC能够重新收敛。 - DPD训练阶段原有的FAGC锁定逻辑不变。 - 不涉及RTL和DAGC修改。