V124 1.修正功率配置过程,避免升功率或降功率时配置瞬间可能超出目标功率值的问题;2.修正上一版本配置功率时按下确认键,导致瞬间功率下降问题;3.调整LCD配置功率上限为衰减器最大上限;4.修正RS485通讯问题;

This commit is contained in:
2026-07-21 17:30:38 +08:00
parent 7601c270d5
commit b03e270dab
17 changed files with 310 additions and 53 deletions
+95 -2
View File
@@ -79,8 +79,33 @@ void uart_debug(uint8 *pbuf,uint32 len)
#define HMC472_STEPS_MAX 63
#define ADRV9009_ATT_BASE 8000
static int32 g_last_total_mdb = -1;
static uint16 g_last_adrv9009_att = 0xFFFF;
static volatile uint8 g_adrv9009_ready = 0;
/*
* Validate a stored power command only after the current channel's WE power
* has been loaded. A raw attenuation of zero is a valid physical maximum;
* only a negative raw attenuation proves that the stored db value is beyond
* the range represented by the new HMC472 + ADRV9009 power model.
*/
static uint8 normalize_new_power_rf_db(S_WE_PARA *pwe, S_RF_PARA *prf)
{
int32 raw_total_mdb;
raw_total_mdb = (int32)RAW_MAX_OUTPUT_MDB
- ((int32)prf->db + (int32)pwe->power - (int32)REF_POWER_UNITS)
* (int32)PWR_UNIT_TO_MDB;
if(raw_total_mdb >= 0)
return 0;
printf("new power cfg reset invalid rf db: we=%d power=%d db=%d raw_total_mdb=%d\n",
pwe->power, prf->power, prf->db, raw_total_mdb);
prf->db = DEFAULT_RF_POWER_DB;
prf->power = RF_POWER_ZERO;
return 1;
}
#endif
#if USE_NEW_POWER_CFG
@@ -111,6 +136,8 @@ static void fpga_restore_rf_att(S_RF_PARA *prf)
static void fpga_set_rf_output_with_para(uint8 rf, S_RF_PARA *prf)
{
uint8 current_rf;
rf = rf ? 1 : 0;
#if USE_DELAYED_RF_ENABLE
@@ -121,6 +148,19 @@ static void fpga_set_rf_output_with_para(uint8 rf, S_RF_PARA *prf)
}
#endif
current_rf = fpga_byte_read(0x01, 0x26) & 0x01;
if(rf && current_rf)
{
/*
* RF is already exposed at the connector. Re-running the complete
* enable sequence would first force HMC472 to 31.5 dB and create a
* visible output-power dip before restoring the requested setting.
* Keep the path enabled and only refresh its attenuation instead.
*/
fpga_restore_rf_att(prf);
return;
}
cfg_fpga_agc_att(RF_OFF_AGC_ATT);
if(rf)
@@ -1003,14 +1043,45 @@ void fpga_save_wd(S_WD_PARA *ppara)
}
uint16 fpga_limit_power_target(S_WE_PARA *pwe, S_RF_PARA *prf, uint16 target_power)
{
#if USE_NEW_POWER_CFG
int32 total_mdb;
uint32 power_up_steps;
if(target_power <= prf->power)
return target_power;
total_mdb = (int32)RAW_MAX_OUTPUT_MDB
- ((int32)prf->db + (int32)pwe->power - (int32)REF_POWER_UNITS)
* (int32)PWR_UNIT_TO_MDB;
if(total_mdb <= 0)
return prf->power;
power_up_steps = (uint32)total_mdb / PWR_UNIT_TO_MDB;
if((uint32)(target_power - prf->power) > power_up_steps)
target_power = (uint16)(prf->power + power_up_steps);
#else
(void)pwe;
(void)prf;
#endif
return target_power;
}
void fpga_save_power(S_WE_PARA *pwe,S_RF_PARA *prf)
{
#if USE_NEW_POWER_CFG
int32 total_mdb = 0;
uint32 hmc_extra = 0;
uint8 agc_att_val = 0;
uint8 adrv9009_first = 0;
uint16 adrv9009_att_val = 0;
if(normalize_new_power_rf_db(pwe, prf))
e2rom_save_power(prf);
total_mdb = (int32)RAW_MAX_OUTPUT_MDB
- ((int32)prf->db + (int32)pwe->power - (int32)REF_POWER_UNITS)
* (int32)PWR_UNIT_TO_MDB;
@@ -1040,14 +1111,35 @@ void fpga_save_power(S_WE_PARA *pwe,S_RF_PARA *prf)
agc_att_val = RF_OFF_AGC_ATT;
}
/*
* Use one safe ordering rule for every adjustment, including large
* changes and HMC472 crossover steps:
* output power rising (total attenuation falling): ADRV9009 first;
* output power falling (total attenuation rising): HMC472 first.
* This keeps every intermediate state at or below the requested/previous
* output level. Unknown direction (initialization) uses HMC472 first.
*/
if(g_adrv9009_ready &&
(g_last_total_mdb >= 0) &&
(g_last_adrv9009_att != 0xFFFF) &&
(total_mdb < g_last_total_mdb) &&
(adrv9009_att_val != g_last_adrv9009_att))
{
cfg_adrv_att(adrv9009_att_val);
g_last_adrv9009_att = adrv9009_att_val;
adrv9009_first = 1;
}
cfg_fpga_agc_att(agc_att_val);
if(g_adrv9009_ready && (adrv9009_att_val != g_last_adrv9009_att))
if(!adrv9009_first && g_adrv9009_ready && (adrv9009_att_val != g_last_adrv9009_att))
{
cfg_adrv_att(adrv9009_att_val);
g_last_adrv9009_att = adrv9009_att_val;
}
g_last_total_mdb = total_mdb;
printf("[power] we=%3d db=%3d total_mdb=%5d | agc_att=%d adrv_att=%d\n",
pwe->power, prf->db, total_mdb, agc_att_val, adrv9009_att_val);
@@ -1355,7 +1447,7 @@ void fpga_save_all_para(BOOL flag)
enter_menu(1);
/* oneshu@20220404
/*
当系统守护进程启动的时候 g_restart_app_flg 为1, 不会重新配置38j82. 然后恢复g_restart_app_flg=0.
若 LCD/网页/串口/udp/tcp 协议,再进此函数 会保证能执行38j82 */
log_printf(LOG_DEBUG,I_NOUSED,"g_restart_app_flg=%d\n", g_restart_app_flg);
@@ -1376,6 +1468,7 @@ void fpga_save_all_para(BOOL flag)
cfg_adrv_orx_manu_gain(atsc_para.system_para.orx_manu_gain);
#if USE_NEW_POWER_CFG
g_adrv9009_ready = 1;
g_last_total_mdb = -1;
g_last_adrv9009_att = 0xFFFF;
fpga_save_power(&atsc_para.we_para, &atsc_para.rf_para);
#else