Files
smod_atsc_app/atsc_app/bsp/dpd_proc.c
T

3224 lines
117 KiB
C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#include "../inc/i2c_drv.h"
#include "../inc/os_task.h"
#include "../inc/type.h"
#include "../inc/lcd_task.h"
#include "../inc/sys_config.h"
#include "../inc/delay.h"
#include "../inc/fpga.h"
#include "../inc/eeprom.h"
#include "../inc/dpd_proc.h"
#include "../inc/type.h"
#include "../inc/general_api.h"
#include "../inc/flash.h"
#include "../inc/isys_com.h"
#define DPD_DATA_FILE "/aw/anywave/dpd_curve/dpd_data.dat"
#define USE_PHASE_78910 (1)
/* 相1/相7 的 AGC 分两段跑,前半段粗调、后半段细调。
*
* SMOD 的 FAGC 驱动的是 ADRV9009 的射频增益索引(0.43dB 量化台阶 + 2dB 死区),
* 不是 EMV7.1 那个连续 DAC。FAGC 每跳一格,就是往 DAGC 的输入上注入一个 0.43dB
* 阶跃,DAGC 只能跟着追。两个都开到相位结束,DAGC 常常还没 settle 就被下一相冻结:
* 实测相7结束时 rx_dgain=2108 而不是标称的 2048(+0.25dB 残差),这个残差一路带到
* 相9/相10,最后只能靠相6/相10 的 DPD 幅度整形去补,表现为功率波动。
*
* 所以前 FAGC_LOCK_SEC 秒 FAGC+DAGC 一起跑(粗调),之后锁死 FAGC,把剩下的时间
* 全留给 DAGC 单独收敛(细调)。相1/相7 各 20s,这里取中点。
*
* boot_tsnr_update() / update_tsnr_uimd_limd() 的相7 原本只有 2~3s,切不出像样的
* 两段,所以一并延长到 FAGC_PH7_SHORT_SEC,按 FAGC_LOCK_SEC_SHORT 切分。
*/
#define FAGC_LOCK_SEC (10)
#define FAGC_LOCK_SEC_SHORT (2)
#define FAGC_PH7_SHORT_SEC (5)
enum{PHASE6_SET_SAVE=1,PHASE10_SET_SAVE,WPP_SET_SAVE};
//-----------------------------------------
extern pthread_mutex_t mtx_phase78910_again;
extern int g_trigger_up_tsnr_flg;
extern int g_trigger_up_start_flg;
extern uint32 adpc_source_udp;
extern uint32 adpc_source_web;
extern pthread_mutex_t mux_dpd_wr_ck;
extern uint8 g_remote_dpd_ctrl;
extern char out_str[52];
extern S_ATSC_PARA atsc_para;
extern BOOL atsc_adpc_force_stop_flag;
extern uint8 dataBuffer[LEN_ADPC_DATE_BUF+4];
extern S_EXTEND_SYS_STATE st_extend_state;
extern volatile uint8 g_query_operate;
extern volatile uint8 g_query_save;
extern volatile uint8 g_query_skip;
extern volatile uint8 g_query_wpp_to_save;
extern uint32 task_resume_ignore_chk(uint32 task_id);
extern uint32 flash_get_err_time(void);
extern void set_boot_tsnr_up_state(uint8 sta);
extern uint32 auto_update;
extern S_CHECK_SIGNAL s_check_signal;
extern S_UPDATE_AUTO_ADPC update_adpc_para_flag;
//-----------------------------------------
u8 spi_blk_buf[SPI_BLK_LEN];
static U_DPDCTL_REG23 u_dpdctl_r23;
u32 dpd_total_w_cnt=0;
u32 dpd_total_r_cnt=0;
int time_start=0;
int time_stop=0;
FILE *p_dpd_log_fp = NULL;
uint8 dpd_ck_status = CK_OK;
char str_safe[2][2]={" ","s"};
static uint16 g_wpp_max; //wpp保护状态
static uint8 g_query_save_flg=0;
//-----------------------------------------
/*
Normal State: RF_AFTER + AGC_OFF + DCRM_OFF + IQB_OFF
*/
void reset_dpd_to_normal_state(void)
{
//printf("reset_dpd_to_normal_state\n");
u_dpdctl_r23.u8val = 0;
u_dpdctl_r23.dpd_bt.iqb_upd = 0;
u_dpdctl_r23.dpd_bt.rf_sel = 0; //A
u_dpdctl_r23.dpd_bt.sync_mode = 1;
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "reset set seg5-23 IQBval=0x%x\n",u_dpdctl_r23.u8val);
//fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, 0);
}
void write_unit_area_addr_to_spi_blkbuf(uint8 Taddr,uint16 Iaddr,uint8 Raddr, u8 wr_rd, u8 *pblk)
{
if(wr_rd==0)//rd
pblk[0] = 0x7f & (((Raddr&0x3)<<2) | ((Iaddr>>8)&0x3));
else//wr
pblk[0] = 0x80 | (((Raddr&0x3)<<2) | ((Iaddr>>8)&0x3));
pblk[1] = Iaddr&0xff;
pblk[2] = Taddr;
}
//---->>>>----------------------------
//区域读数据的地址和数据长度定义--不可改动
#define DPD_AREA0_WR_UNIT_DATA_LEN 8
#define DPD_AREA1_WR_UNIT_DATA_LEN 32
#define DPD_AREA3_WR_UNIT_DATA_LEN 8
#define DPD_AREA2_WR_UNIT_EXT_DATA_LEN 32
//----<<<<----------------------------
static uint8 gb_addr_auto_inc=1;
void set_dpd_unit_area_auto_inc(uint8 inc_flg)
{
gb_addr_auto_inc = inc_flg&0x1;
}
uint8 get_dpd_unit_area_auto_inc()
{
return gb_addr_auto_inc;
}
void clear_dpd_data_file(void)
{
char cmd[300];
log_printf(LOG_DEBUG, I_USER_CFG, "clear dpd_data file. %s\n", DPD_DATA_FILE);
memset(cmd, 0, sizeof(cmd));
sprintf(cmd, "rm -rf %s",DPD_DATA_FILE);
system(cmd);
}
u32 usr_get_file_size(void)
{
FILE *fp;
u32 len;
fp = fopen(DPD_DATA_FILE, "rb");
fseek(fp, 0, SEEK_END);
len = ftell(fp);
fclose(fp);
return len;
}
int get_current_time_ms(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec*1000+tv.tv_usec/1000);
//printf("time: %d.%d\n",tv.tv_sec,tv.tv_usec/1000);
}
int usr_read_file(u8 *pbuf, u32 pos, u32 len,int *perr)
{
FILE *fp;
u32 i;
int retLen=0;
int ret=0;
if(len>4096)return -1;
*perr=0;
fp = fopen(DPD_DATA_FILE, "rb");
if(NULL == fp)
{
*perr=-2;
log_printf(LOG_ERR, I_USER_CFG, "open dpd file [%s] failed.\n", DPD_DATA_FILE);
return -2; /* 要锟斤拷锟截达拷锟斤拷锟斤拷锟?*/
}
//log_printf(LOG_DEBUG, I_USER_CFG, "seek pos=%d ret=%d\n",pos,ret);
ret = fseek(fp, pos, SEEK_SET);
if(ret<0){
log_printf(LOG_ERR, I_USER_CFG, "Read File Seek err.\n");
*perr=-3;
}
else
{
//printf("\n\n\nseek pos=%d ret=%d\n",pos*4,ret);
retLen = fread(pbuf,sizeof(u8),len,fp);
if(retLen<0){
*perr=-2;
log_printf(LOG_ERR, I_USER_CFG, "retLen<0\n");
}
else if(retLen!=len)
{
if(feof(fp)){
log_printf(LOG_ERR, I_USER_CFG, "File read end.\n");
*perr=1;
}
else{
log_printf(LOG_ERR, I_USER_CFG, "File read err. retLen=%d,wantLen=%d.\n",retLen, len);
*perr=-1;
}
}
else
*perr=0;
}
fclose(fp);
return retLen;
}
int usr_write_file(u8 *pbuf,u32 len)
{
FILE *fp;
u32 i;
fp = fopen(DPD_DATA_FILE, "ab+");
if(NULL == fp)
{
return -2; /* 要锟斤拷锟截达拷锟斤拷锟斤拷锟?*/
}
fwrite(pbuf,sizeof(u8),len,fp);
fclose(fp);
return 0;
}
int usr_write_data_file(u8 *pbuf, u32 len, u8 *pfile_name)
{
FILE *fp;
u32 i;
fp = fopen(pfile_name, "ab+");
if(NULL == fp)
{
return -2; /* 要锟斤拷锟截达拷锟斤拷锟斤拷锟?*/
}
fwrite(pbuf, sizeof(u8), len,fp);
fclose(fp);
return 0;
}
uint32 rw_e2rom_dpd(uint32 kind,uint32 block,uint32 addr_k_cnt,uint8 *ptr)
{
uint8 *pData = ptr;
uint32 rw_len = 0;
uint32 address = 0;
uint16 crc = 0;
uint16 crc_read = 0;
uint32 retry_time = 0;
int err_sta = 0;
int fread_len;
int start_time;
int end_time;
if(kind==RW_ADPC_SAVE)//保存曲线
{
if(block==E_DPD_AREA_FIRST_4K){
log_printf(LOG_DEBUG, I_USER_CFG, "[store] start to sotre first 4k\n");
address = 0;
start_time = get_current_time_ms();
usr_write_file(pData, LEN_ADPC_DATE_BUF);
end_time = get_current_time_ms();
log_printf(LOG_DEBUG, I_USER_CFG, "file_4k time=%d\n",end_time-start_time);
//flash_write_buf(pData,LEN_ADPC_DATE_BUF,address);
}
//--------------------------------
else if(block==E_DPD_AREA3){
log_printf(LOG_DEBUG, I_USER_CFG, "[store] start to sotre area3\n");
address = 0;
start_time = get_current_time_ms();
usr_write_file(pData, LEN_ADPC_DATE_BUF);
end_time = get_current_time_ms();
log_printf(LOG_DEBUG, I_USER_CFG, "area3 time=%d\n",end_time-start_time);
}
//--------------------------------
else if(block==2)
{
//printf("[store] start to sotre other 4k\n");
//每次存储4k数据
//address = (addr_k_cnt+1)*4096;
usr_write_file(pData, LEN_ADPC_DATE_BUF);
}
}
else if(kind==RW_ADPC_LOAD)//读取曲线
{
if(block==E_DPD_AREA_FIRST_4K)
{
address = 0;
//flash_read_buf(pData,LEN_ADPC_DATE_BUF,address);
rw_len = usr_read_file(pData,address,LEN_ADPC_DATE_BUF,&err_sta);
}
//--------------------------------
else if(block==E_DPD_AREA3)
{
address = (addr_k_cnt+1)*4096;
//flash_read_buf(pData,LEN_ADPC_DATE_BUF,address);
rw_len = usr_read_file(pData,address,LEN_ADPC_DATE_BUF,&err_sta);
}
//--------------------------------
else if(block==2)
{
address = (addr_k_cnt+2)*4096; // (addr_k_cnt+1)*4096
//flash_read_buf(pData,LEN_ADPC_DATE_BUF,address);
rw_len = usr_read_file(pData,address,LEN_ADPC_DATE_BUF,&err_sta);
}
}
return rw_len;
}
static void * display_save_load_percent_thr(void * args)
{
u8 ret_code=0;
char temp_buf[20];
static u32 x_time_cnt = 0;
printf("enter display\n");
x_time_cnt = 0;
while(1){
log_printf(LOG_DEBUG, I_USER_CFG, "%02d%% \n", atsc_para.system_para.save_load_data_percent);
memset(temp_buf,0,sizeof(temp_buf));
sprintf((char*)temp_buf,"%02d%% ",atsc_para.system_para.save_load_data_percent);
lcd_write_string(1,15,(uint8*)temp_buf);
lcd_write_cache();
if(st_extend_state.display_stop==E_DISPLAY_STOP){
ret_code=2;
break;
}
x_time_cnt++;
if(x_time_cnt >= 200){//40/0.25
ret_code=3;
break;
}
usleep(250*1000);
};
printf(" thr exit display %d, display_sta=%d [0-start,2-stop]\n", ret_code, st_extend_state.display_stop);
st_extend_state.display_stop = E_DISPLAY_END;
}
static int thr_display_percent_thread(void)
{
int ret = -1;
pthread_t display_thr_id;
int state;
pthread_attr_t attr;
log_printf(LOG_DEBUG,I_NOUSED,"[.thr.]->-\n");
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&display_thr_id, &attr, (void *)display_save_load_percent_thr, NULL);//
if(ret != 0){
log_printf(LOG_ERR,I_NOUSED," creat thread err.\n");
return -1;
}
else{
st_extend_state.display_thr = display_thr_id;
log_printf(LOG_DEBUG,I_NOUSED," Ok. Create thr_display succeed.\n");
}
//printf("exit thr\n");
//pthread_exit(st_extend_state.display_thr);
return 0;
}
void calc_area_check_sum(u8 *pcheck, u8 *pbuf, u32 len)
{
u8 check_sum=0;
for(int j=0; j<len; j++){
check_sum = check_sum + pbuf[j];
}
*pcheck = *pcheck + check_sum;
}
void calc_area_u32_check_sum(u32 *pcheck, u8 *pbuf, u32 len)
{
u32 check_sum=0;
u32 *ptr=(u32 *)pbuf;
for(int j=0; j<len/4; j++){
check_sum = check_sum + htonl(*ptr);
ptr++;
}
*pcheck += check_sum;
}
u32 read_fpga_area_u32_check_sum(u8 check_type)
{
u32 check_sum=0;
if(check_type == E_CHECK_FOR_WIRTE){
check_sum = fpga_byte_read(DPD_SEG, 0x40)|(fpga_byte_read(DPD_SEG, 0x41)<<8)|(fpga_byte_read(DPD_SEG, 0x42)<<16)|(fpga_byte_read(DPD_SEG, 0x43)<<24);
}
else{
check_sum = fpga_byte_read(DPD_SEG, 0x44)|(fpga_byte_read(DPD_SEG, 0x45)<<8)|(fpga_byte_read(DPD_SEG, 0x46)<<16)|(fpga_byte_read(DPD_SEG, 0x47)<<24);
}
return check_sum;
}
void clear_check_sum(S_CHECK_SUM *parea_check)
{
parea_check->area_imx_w_check =0;
parea_check->area_imx_r_check =0;
parea_check->area_fpga_w_check=0;
parea_check->area_fpga_r_check=0;
}
static int load_file_and_write_area(void)
{
static int ret=0;
uint8 Taddr;
uint16 Iaddr;
uint16 Iaddr_Max;
uint8 Raddr;
uint8 temp_buf[20];
uint8 Num;
uint16 byte32Cnt=0;
uint16 saveOffset=0;
uint16 bufOffset=0;
uint32 area2_cnt=0;
static uint8 backErr=0;
uint8 dpd_data;
u32 wait_timeout=0;
S_CHECK_SUM area_check={0};
ret=0;
atsc_para.system_para.adpc_err = DPD_LOAD_DATA;
lcd_write_string(LINE_1,0," WAIT A MOMENT .... ");
lcd_write_string(LINE_2,0," LOADING DATA... ");
lcd_write_cache();
//[ 0.bypass ]
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL1, DPD_CTRL1_ALL_BYPS);
fpga_byte_write(DPD_SEG,0x41, MASK_TO_SPI_WR_RD_ENABLE);
//区域0+1
if(1){
//for area0 + area1
ret = rw_e2rom_dpd(RW_ADPC_LOAD, E_DPD_AREA_FIRST_4K, 0, &dataBuffer[0]);// 256
if(ret < 0) {
printf("Err. a0 load read dpd_file failed\n");
ret = -2;
dpd_ck_status=CK_WR_ERR;
goto CKECK_WRITE_ERR_PROC;
}
//-------------------------------------------------------------------------------
//区域0
log_printf(LOG_INFO, I_USER_CFG, "[area0] start write area0 data.\n");
clear_check_sum(&area_check);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE|MASK_TO_FPGA_CHECK_CLEAR);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE);
fpga_byte_write(DPD_SEG,0x40, MASK_DPD_DATA_AREA0_MODE);
//area_check.area_imx_w_check = 1;
for(Taddr=0; Taddr<=31; Taddr++){
memset(spi_blk_buf, 0, sizeof(spi_blk_buf));
write_unit_area_addr_to_spi_blkbuf(Taddr,0,0, E_WRITE, &spi_blk_buf[0]);
memcpy(&spi_blk_buf[3+12], &dataBuffer[0+Taddr*DPD_AREA0_WR_UNIT_DATA_LEN], 4);
memcpy(&spi_blk_buf[3+12+16], &dataBuffer[0+Taddr*DPD_AREA0_WR_UNIT_DATA_LEN+4], 4);
ispi_tx_big_block(spi_blk_buf, SPI_BLK_LEN);
calc_area_u32_check_sum(&area_check.area_imx_w_check, &spi_blk_buf[3], 32);
}
//area_check
area_check.area_fpga_w_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_WIRTE);
if(area_check.area_imx_w_check != area_check.area_fpga_w_check){
printf("Err, a0 imx_w_check not match with fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_WRITE_ERR_PROC;
}
else{
printf("a0 [u32_check]:imx_w_check and fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
}
fpga_byte_write(DPD_SEG,0x40,0);
log_printf(LOG_DEBUG, I_USER_CFG, "<< end area0\n");
//-------------------------------------------------------------------------------
//区域1
log_printf(LOG_DEBUG, I_USER_CFG, "[area1] start read area1 data.\n");
clear_check_sum(&area_check);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE|MASK_TO_FPGA_CHECK_CLEAR);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE);
fpga_byte_write(DPD_SEG,0x40,MASK_DPD_DATA_AREA1_MODE);
for(Taddr=0;Taddr<=15;Taddr++){
memset(spi_blk_buf, 0, sizeof(spi_blk_buf));
write_unit_area_addr_to_spi_blkbuf(Taddr,0,0, E_WRITE, &spi_blk_buf[0]);
memcpy(&spi_blk_buf[3], &dataBuffer[1024+Taddr*DPD_AREA1_WR_UNIT_DATA_LEN], DPD_AREA1_WR_UNIT_DATA_LEN);
ispi_tx_big_block(spi_blk_buf, SPI_BLK_LEN);
calc_area_u32_check_sum(&area_check.area_imx_w_check, &spi_blk_buf[3], 32);
}
//area_check
area_check.area_fpga_w_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_WIRTE);
if(area_check.area_imx_w_check != area_check.area_fpga_w_check){
printf("Err, a1 imx_w_check not match with fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_WRITE_ERR_PROC;
}
else{
printf("a1 [u32_check]:imx_w_check and fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
}
log_printf(LOG_DEBUG, I_USER_CFG, "<< end area1\n");
fpga_byte_write(DPD_SEG,0x40,0);
}
//-------------------------------------------------------------------------------
//区域3
if(1){
memset(&dataBuffer[0],0,sizeof(dataBuffer));
ret = rw_e2rom_dpd(RW_ADPC_LOAD,E_DPD_AREA3,0,&dataBuffer[0]);
if(ret < 0) {
printf("Err. a3 load read dpd_file failed\n");
ret = -2;
dpd_ck_status=CK_WR_ERR;
goto CKECK_WRITE_ERR_PROC;
}
log_printf(LOG_DEBUG, I_USER_CFG, "[area3] start write area3 data.\n");
clear_check_sum(&area_check);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE|MASK_TO_FPGA_CHECK_CLEAR);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE);
fpga_byte_write(DPD_SEG,0x40,MASK_DPD_DATA_AREA3_MODE);
for(Iaddr=0; Iaddr<=511; Iaddr++){
memset(spi_blk_buf, 0, sizeof(spi_blk_buf));
write_unit_area_addr_to_spi_blkbuf(0,Iaddr,0, E_WRITE, &spi_blk_buf[0]);
memcpy(&spi_blk_buf[3+12], &dataBuffer[Iaddr*DPD_AREA3_WR_UNIT_DATA_LEN], 4);
memcpy(&spi_blk_buf[3+12+16], &dataBuffer[Iaddr*DPD_AREA3_WR_UNIT_DATA_LEN+4], 4);
ispi_tx_big_block(spi_blk_buf, SPI_BLK_LEN);
calc_area_u32_check_sum(&area_check.area_imx_w_check, &spi_blk_buf[3], 32);
}
//area_check
area_check.area_fpga_w_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_WIRTE);
if(area_check.area_imx_w_check != area_check.area_fpga_w_check){
printf("Err, a3 imx_w_check not match with fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_WRITE_ERR_PROC;
}
else{
printf("a3 [u32_check]:imx_w_check and fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
}
log_printf(LOG_DEBUG, I_USER_CFG, "<< end area3\n");
fpga_byte_write(DPD_SEG,0x40,0);
}
//-------------------------------------------------------------------------------
//区域2 9*3*1024 - 9*1*896=19584
st_extend_state.display_stop=E_DISPLAY_START;
atsc_para.system_para.save_load_data_percent = 0;
printf("thr start\n");
thr_display_percent_thread();
printf("thr end\n");
if(1){
bufOffset=0;
byte32Cnt=0;
area2_cnt=0;
fpga_byte_write(DPD_SEG,0x40,MASK_DPD_DATA_AREA2_MODE);
log_printf(LOG_DEBUG, I_USER_CFG, "\n\n[area2] start read area2 data.\n");
clear_check_sum(&area_check);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE|MASK_TO_FPGA_CHECK_CLEAR);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE);
for(Taddr=0;Taddr<=8;Taddr++) {//8
for(Raddr=0;Raddr<=3;Raddr++) {//3
if(Raddr==2)
continue;
if(Raddr==3)
Iaddr_Max = 127;
else
Iaddr_Max = 1023;//1023
for(Iaddr=0; Iaddr<=Iaddr_Max; Iaddr++) {
area2_cnt++;
if(bufOffset%128==0){
memset(&dataBuffer[0],0,sizeof(dataBuffer));
ret = rw_e2rom_dpd(RW_ADPC_LOAD,E_DPD_AREA2,saveOffset,&dataBuffer[0]);// 4kByte
if(ret < 0) {
printf("Err. a2 load read dpd_file failed\n");
ret = -2;
dpd_ck_status=CK_WR_ERR;
goto CKECK_WRITE_ERR_PROC;
}
saveOffset++;
bufOffset=0;
atsc_para.system_para.save_load_data_percent = 100*(byte32Cnt)/(19584);
//area_check
area_check.area_fpga_w_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_WIRTE);
if(area_check.area_imx_w_check != area_check.area_fpga_w_check){
printf("Err, a2 imx_w_check not match with fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_WRITE_ERR_PROC;
}
}
memset(spi_blk_buf, 0, sizeof(spi_blk_buf));
write_unit_area_addr_to_spi_blkbuf(Taddr,Iaddr,Raddr, E_WRITE, &spi_blk_buf[0]);
memcpy(&spi_blk_buf[3], &dataBuffer[bufOffset*DPD_AREA2_WR_UNIT_EXT_DATA_LEN], DPD_AREA2_WR_UNIT_EXT_DATA_LEN);
if(Raddr==3){//Iaddr(0~127)-IQ(28bit)
memset(&spi_blk_buf[3], 0, 12);
memset(&spi_blk_buf[3+16],0, 12);
spi_blk_buf[3+12] =spi_blk_buf[3+12]&0x0f;
spi_blk_buf[3+12+16] =spi_blk_buf[3+12+16]&0x0f;
}
else{//IQ(106bit) (13byte+2bit)
memset(&spi_blk_buf[3], 0, 2);
memset(&spi_blk_buf[3+16],0, 2);
spi_blk_buf[3+2] =spi_blk_buf[3+2]&0x03;
spi_blk_buf[3+2+16] =spi_blk_buf[3+2+16]&0x03;
}
ispi_tx_big_block(spi_blk_buf, SPI_BLK_LEN);
calc_area_u32_check_sum(&area_check.area_imx_w_check, &spi_blk_buf[3], 32);
bufOffset++;
byte32Cnt++;
}
}
}
atsc_para.system_para.save_load_data_percent = 100*(byte32Cnt)/(19584);
//area_check
area_check.area_fpga_w_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_WIRTE);
if(area_check.area_imx_w_check != area_check.area_fpga_w_check){
printf("Err, a2 imx_w_check not match with fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_WRITE_ERR_PROC;
}
else{
printf("a2 [u32_check]:imx_w_check and fpga_w_check [0x%04x 0x%04x]!\n", area_check.area_imx_w_check, area_check.area_fpga_w_check);
}
log_printf(LOG_DEBUG, I_USER_CFG, "<< end area2 [read_check]:area2_cnt=%d\n\n", area2_cnt);
fpga_byte_write(DPD_SEG,0x40,0);
}
//-------------------------------------------------------------------------------
//[ 7.refresh & bypass clear ]
fpga_byte_write(DPD_SEG,0x41,MASK_TO_FPGA_REFRESH_DATA);
fpga_byte_write(DPD_SEG,0x41,0);
fpga_byte_write(DPD_SEG,FPGA_ADDR_DPD_CTRL1, 0);
printf("\n\n[area] load all finished.\n");
CKECK_WRITE_ERR_PROC:
if(ret<0){
fpga_byte_write(DPD_SEG,0x40,0);
fpga_byte_write(DPD_SEG,0x41,0);
st_extend_state.display_stop=E_DISPLAY_STOP;
delay_ms(500);
while(1){
if(st_extend_state.display_stop==E_DISPLAY_END){
printf(" mthr check display_stoped \n");
break;
}
delay_ms(400);
printf(" mthr wait display_stop %d\n", st_extend_state.display_stop);
wait_timeout++;
if(wait_timeout>=5){
printf("Err. timeout wait display_stop %d\n", wait_timeout);
break;
}
}
fpga_byte_write(DPD_SEG,0x41, 0);
lcd_write_string(LINE_1,0," ADPC data load error! [9]");
lcd_write_string(LINE_2,0," ");
lcd_write_cache();
delay_ms(2000);
}
else{
st_extend_state.display_stop=E_DISPLAY_STOP;
delay_ms(500);
while(1){
if(st_extend_state.display_stop==E_DISPLAY_END){
printf(" mthr check display_stoped \n");
break;
}
delay_ms(500);
printf(" mthr wait display_stop %d\n", st_extend_state.display_stop);
wait_timeout++;
if(wait_timeout>=5){
printf("Err. timeout wait display_stop %d\n", wait_timeout);
break;
}
}
lcd_write_string(LINE_1,0," WAIT A MOMENT .... ");
lcd_write_string(LINE_2,0," LOADING DATA FINISHED ");
lcd_write_cache();
delay_ms(2000);
ret = 0;
}
return ret;
}
static int read_area_and_store_file()
{
int ret=0;
uint8 Taddr;
uint16 Iaddr;
uint8 Raddr;
uint16 byte32Cnt=0;
uint16 saveOffset=0;
uint16 bufOffset=0;
uint32 area2_cnt=0;
static uint8 backErr=0;
int i;
uint8 Num;
uint8 temp_buf[20];
int start_time;
int end_time;
uint8 dpd_data;
backErr = atsc_para.system_para.adpc_err;
dpd_ck_status = CK_OK;
u16 Iaddr_Max = 1023;
u32 wait_timeout=0;
S_CHECK_SUM area_check={0};
fpga_byte_write(DPD_SEG,0x41, MASK_TO_SPI_WR_RD_ENABLE);
atsc_para.system_para.adpc_err = DPD_SAVE_DATA;
lcd_write_string(LINE_1,0," WAIT A MOMENT .... ");
lcd_write_string(LINE_2,0," SAVING DATA... ");
lcd_write_cache();
c256_bytewrite(EEPROM_DPD_FLASH_VALID,0);
clear_dpd_data_file();
//区域0+1
//----------------------------------------------------------------------------------
//区域0
if(1){
log_printf(LOG_DEBUG, I_USER_CFG, "\n\n[area0]start read area0 data.\n");
memset(&dataBuffer[0],0,sizeof(dataBuffer));
fpga_byte_write(DPD_SEG,0x40, MASK_DPD_DATA_AREA0_MODE);
clear_check_sum(&area_check);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE|MASK_TO_FPGA_CHECK_CLEAR);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE);
for(Taddr=0;Taddr<=31;Taddr++){
memset(spi_blk_buf, 0, sizeof(spi_blk_buf));
write_unit_area_addr_to_spi_blkbuf(Taddr,0,0, E_READ, &spi_blk_buf[0]);
ispi_rx_big_block(spi_blk_buf, SPI_BLK_LEN);
calc_area_u32_check_sum(&area_check.area_imx_r_check, &spi_blk_buf[3], 32);
memcpy(&dataBuffer[0+Taddr*DPD_AREA0_WR_UNIT_DATA_LEN], &spi_blk_buf[3+12], 4);
memcpy(&dataBuffer[0+Taddr*DPD_AREA0_WR_UNIT_DATA_LEN+4], &spi_blk_buf[3+12+16], 4);
}
//area_check
area_check.area_fpga_r_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_RAED);
if(area_check.area_imx_r_check != area_check.area_fpga_r_check){
printf("Err, a0 imx_r_check not match with fpga_r_check [0x%04x 0x%04x]!\n", area_check.area_imx_r_check, area_check.area_fpga_r_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_READ_ERR_PROC;
}
fpga_byte_write(DPD_SEG,0x40,0);
}
//----------------------------------------------------------------------------------
//区域1
if(1){
log_printf(LOG_DEBUG, I_USER_CFG, "\n\n[area1]start read area1 data.\n");
fpga_byte_write(DPD_SEG,0x40,MASK_DPD_DATA_AREA1_MODE);
clear_check_sum(&area_check);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE|MASK_TO_FPGA_CHECK_CLEAR);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE);
for(Taddr=0;Taddr<=15;Taddr++){
memset(spi_blk_buf, 0, sizeof(spi_blk_buf));
write_unit_area_addr_to_spi_blkbuf(Taddr,0,0, E_READ, &spi_blk_buf[0]);
ispi_rx_big_block(spi_blk_buf, SPI_BLK_LEN);
calc_area_u32_check_sum(&area_check.area_imx_r_check, &spi_blk_buf[3], 32);
memcpy(&dataBuffer[1024+Taddr*DPD_AREA1_WR_UNIT_DATA_LEN], &spi_blk_buf[3], DPD_AREA1_WR_UNIT_DATA_LEN);
}
//area_check
area_check.area_fpga_r_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_RAED);
if(area_check.area_imx_r_check != area_check.area_fpga_r_check){
printf("Err, a1 imx_r_check not match with fpga_r_check [0x%04x 0x%04x]!\n", area_check.area_imx_r_check, area_check.area_fpga_r_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_READ_ERR_PROC;
}
fpga_byte_write(DPD_SEG,0x40,0);
}
rw_e2rom_dpd(RW_ADPC_SAVE,E_DPD_AREA_FIRST_4K,0,&dataBuffer[0]);
//----------------------------------------------------------------------------------
//区域3- 5个bit地址- 2^5*8 =256Byte // 32次
if(1){
printf("\n\n[area3]start read area3 data.\n");
memset(&dataBuffer[0],0,sizeof(dataBuffer));
fpga_byte_write(DPD_SEG,0x40, MASK_DPD_DATA_AREA3_MODE);
clear_check_sum(&area_check);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE|MASK_TO_FPGA_CHECK_CLEAR);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE);
for(Iaddr=0;Iaddr<=511;Iaddr++){
memset(spi_blk_buf, 0, sizeof(spi_blk_buf));
write_unit_area_addr_to_spi_blkbuf(0,Iaddr,0, E_READ, &spi_blk_buf[0]);
ispi_rx_big_block(spi_blk_buf, SPI_BLK_LEN);
calc_area_u32_check_sum(&area_check.area_imx_r_check, &spi_blk_buf[3], 32);
memcpy(&dataBuffer[Iaddr*DPD_AREA3_WR_UNIT_DATA_LEN], &spi_blk_buf[3+12], 4);
memcpy(&dataBuffer[Iaddr*DPD_AREA3_WR_UNIT_DATA_LEN+4], &spi_blk_buf[3+12+16], 4);
}
//area_check
area_check.area_fpga_r_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_RAED);
if(area_check.area_imx_r_check != area_check.area_fpga_r_check){
printf("Err, a3 imx_r_check not match with fpga_r_check [0x%04x 0x%04x]!\n", area_check.area_imx_r_check, area_check.area_fpga_r_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_READ_ERR_PROC;
}
fpga_byte_write(DPD_SEG,0x40,0);
rw_e2rom_dpd(RW_ADPC_SAVE,E_DPD_AREA3,0,&dataBuffer[0]);
}
st_extend_state.display_stop=E_DISPLAY_START;
atsc_para.system_para.save_load_data_percent = 0;
printf("thr start\n");
thr_display_percent_thread();
printf("thr end\n");
//----------------------------------------------------------------------------------
//区域2- 9*4*1024*28=1032192Byte=1008KByte
if(1){
log_printf(LOG_DEBUG,I_NOUSED,"\n\n[area2]start read area2 data.\n");
memset(&dataBuffer[0],0,sizeof(dataBuffer));
area2_cnt =0;
byte32Cnt =0;
saveOffset =0;//存储4k计数
bufOffset =0;//数据缓冲区偏移
Iaddr_Max = 1023;
fpga_byte_write(DPD_SEG,0x40, MASK_DPD_DATA_AREA2_MODE);
clear_check_sum(&area_check);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE|MASK_TO_FPGA_CHECK_CLEAR);
fpga_byte_write(DPD_SEG, 0x41, MASK_TO_SPI_WR_RD_ENABLE);
for(Taddr=0; Taddr<=8; Taddr++){
for(Raddr=0; Raddr<=3; Raddr++){
if(Raddr==2)
continue;
if(Raddr==3)
Iaddr_Max = 127;
else
Iaddr_Max = 1023;
for(Iaddr=0; Iaddr<=Iaddr_Max; Iaddr++){
area2_cnt++;
start_time = get_current_time_ms();
memset(spi_blk_buf, 0, sizeof(spi_blk_buf));
write_unit_area_addr_to_spi_blkbuf(Taddr,Iaddr,Raddr, E_READ, &spi_blk_buf[0]);
ispi_rx_big_block(spi_blk_buf, SPI_BLK_LEN);
calc_area_u32_check_sum(&area_check.area_imx_r_check, &spi_blk_buf[3], 32);
memcpy(&dataBuffer[bufOffset*DPD_AREA2_WR_UNIT_EXT_DATA_LEN], &spi_blk_buf[3], DPD_AREA2_WR_UNIT_EXT_DATA_LEN);
end_time = get_current_time_ms();
byte32Cnt++;
bufOffset++;
if(bufOffset%128==0){//32*128=4096 // 4KByte数据
bufOffset=0;
rw_e2rom_dpd(RW_ADPC_SAVE,E_DPD_AREA2,saveOffset,&dataBuffer[0]);// 4kByte
memset(&dataBuffer[0],0,sizeof(dataBuffer));
saveOffset++;
Num=100*byte32Cnt/(19584);
//sprintf((char*)temp_buf,"%02d%% %d",Num,flash_get_err_time());
//log_printf(LOG_DEBUG,I_NOUSED,"%02d%% 4kByte-write to file\n",Num);
atsc_para.system_para.save_load_data_percent = Num;
//area_check
area_check.area_fpga_r_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_RAED);
if(area_check.area_imx_r_check != area_check.area_fpga_r_check){
printf("Err, a2 imx_r_check not match with fpga_r_check [0x%04x 0x%04x]!\n", area_check.area_imx_r_check, area_check.area_fpga_r_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_READ_ERR_PROC;
}
}
}
}
}
if(bufOffset%128!=0){
rw_e2rom_dpd(RW_ADPC_SAVE,E_DPD_AREA2,saveOffset,&dataBuffer[0]);// 1024Byte
//area_check
area_check.area_fpga_r_check = read_fpga_area_u32_check_sum(E_CHECK_FOR_RAED);
if(area_check.area_imx_r_check != area_check.area_fpga_r_check){
printf("Err, a2 imx_r_check not match with fpga_r_check [0x%04x 0x%04x]!\n", area_check.area_imx_r_check, area_check.area_fpga_r_check);
ret = -1;
dpd_ck_status=CK_WR_ERR;
goto CKECK_READ_ERR_PROC;
}
}
atsc_para.system_para.save_load_data_percent = 100*(byte32Cnt)/(19584);
printf("[read-end]read finished. area2_cnt=%d\n",area2_cnt);
fpga_byte_write(DPD_SEG,0x40, 0);
}
//----------------------------------------------------------------------------------
fpga_byte_write(DPD_SEG,0x40, 0);
fpga_byte_write(DPD_SEG,0x41, 0);
c256_bytewrite(EEPROM_DPD_FLASH_VALID,1);
system("sync");
//sync display
st_extend_state.display_stop=E_DISPLAY_STOP;
delay_ms(500);
while(1){
if(st_extend_state.display_stop==E_DISPLAY_END){
printf(" mthr check display_stoped \n");
break;
}
delay_ms(500);
printf(" mthr wait display_stop %d\n", st_extend_state.display_stop);
wait_timeout++;
if(wait_timeout>=5){
printf("Err. timeout mthr wait display_stop %d\n", wait_timeout);
break;
}
}
CKECK_READ_ERR_PROC:
if(dpd_ck_status==CK_WR_ERR){
fpga_byte_write(DPD_SEG,0x40, 0);
fpga_byte_write(DPD_SEG,0x41, 0);
//sync display
st_extend_state.display_stop=E_DISPLAY_STOP;
delay_ms(500);
while(1){
if(st_extend_state.display_stop==E_DISPLAY_END){
printf(" mthr check display_stoped \n");
break;
}
delay_ms(500);
printf(" mthr wait display_stop %d\n", st_extend_state.display_stop);
wait_timeout++;
if(wait_timeout>=5){
printf("Err. timeout wait display_stop %d\n", wait_timeout);
break;
}
}
//lcd_write_string(LINE_1,0," DPD READ FPGA CHECK ERROR ! ");
lcd_write_string(LINE_1,0," ADPC data save error! [8] ");
lcd_write_string(LINE_2,0," ");
lcd_write_cache();
log_printf(LOG_DEBUG,I_NOUSED,"CKECK_READ_ERR_PROC\n");
delay_ms(2000);
}
log_printf(LOG_DEBUG,I_NOUSED,"exit read area and store file\n");
return ret;
}
int dpd_curve_proc(uint8 proc_mode)
{
u32 u_size;
int ret = 0;
static uint8 backErr=0;
backErr = atsc_para.system_para.adpc_err;
st_extend_state.load_store_curve_flg=1;
if(proc_mode == E_LOAD_TO_MCU)
{
dpd_total_w_cnt = 0;
dpd_total_r_cnt = 0;
time_start = 0;
time_stop = 0;
clear_dpd_data_file();
time_start = get_current_time_ms();
//store
ret = read_area_and_store_file();
if(ret != 0){
log_printf(LOG_ERR, I_SYS_STATUS, "read_area_and_store_file abort!\n");
}
time_stop = get_current_time_ms();
log_printf(LOG_INFO, I_SYS_STATUS, "{time cal to mcu} total_time=%ds ret=%d\n",(time_stop-time_start)/1000, ret);
//u_size = usr_get_file_size();
//log_printf(LOG_DEBUG, I_USER_CFG, "file size=%d\n",u_size);
}
else if(proc_mode == E_LOAD_TO_FPGA)
{
//fpga_byte_write(0x01, 0x26, 0); // RF set OFF ; 此开关顺序宋博要求关闭,因客户不接受射频关掉.
//printf("OFF RF\n");
dpd_total_w_cnt=0;
dpd_total_r_cnt=0;
time_start=0;
time_stop =0;
time_start = get_current_time_ms();
//load
ret = load_file_and_write_area();
if(ret!=0){
log_printf(LOG_ERR, I_SYS_STATUS, "load_file_and_write_area abort! %d\n", ret);
}
time_stop = get_current_time_ms();
log_printf(LOG_INFO, I_SYS_STATUS, "{time_cal to FPGA} total_time=%ds ret=%d\n",(time_stop-time_start)/1000, ret);
//fpga_byte_write(0x01, 0x26, 1); // RF set ON
//printf("ON RF\n");
}
if(ret!=0){
atsc_para.system_para.adpc_err = ret;
if(atsc_para.system_para.adpc==ADPC_HOLD){
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR, ADPC_OFF);
log_printf(LOG_WARN, I_SYS_STATUS, "adpc curve err, force set adpc to off\n");
}
}
else
atsc_para.system_para.adpc_err = backErr;
st_extend_state.load_store_curve_flg=0;
return ret;
}
uint8 get_fpga_dpd_check(void)
{
return dpd_ck_status;
}
void dpd_exit(void)// 关闭dpd
{
// ctrl 顺序必须是: 2 - 1 - 3
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, 0);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL1, DPD_CTRL1_ALL_BYPS|DPD_CTRL1_DPD_ALLCLR);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, 0);
u_dpdctl_r23.u8val=0;
fpga_byte_write(5,FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
reset_dpd_to_normal_state();
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, 0);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, MASK_WPP_CLR);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, 0);
delay_ms(1000);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL1, DPD_CTRL1_ALL_BYPS);
}
void dpd_set_clr(void)// 清除曲线
{
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL1, DPD_CTRL1_ALL_BYPS|DPD_CTRL1_DPD_ALLCLR);
delay_ms(1000);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL1, 0);
}
void clear_wpp_max(void)
{
g_wpp_max=0;
}
void remote_set_dpd_clr(void)
{
dpd_set_clr();
dpd_exit();
//dpd_boot_run_init();
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL1, DPD_CTRL1_ALL_BYPS);
}
static uint8 g_tsnr_up_flg=0;
void set_tsnr_update_flg(uint8 up_flg)
{
g_tsnr_up_flg = up_flg&0x1;
}
uint8 get_tsnr_update_flg(void)
{
return g_tsnr_up_flg;
}
int boot_tsnr_update(uint8 rst_flg)
{
static uint8 up_phase = 7; // 实际上就是dpd的7、8、9、10步需要配置的内容
static uint8 phase_in_flag= 0;
static uint8 sec_cnt = 0;
static uint8 s_fagc_locked= 0; // 相7: 前半段过后锁死FAGC的一次性标志
uint8 dpd_ctl2_reg = 0;
uint8 dpd_ctl3_reg = 0 ;
uint8 rd_state = 0 ;
int ret_state = 0;
if(atsc_para.system_para.adpc >= ADPC_UPDATE1) // 正在校正就返回
return 1;
if(rst_flg) {
up_phase = 7;
sec_cnt = 0;
phase_in_flag = 1;
log_printf(LOG_DEBUG,I_NOUSED,"boot_tsnr_update start.\n");
}
switch(up_phase) // 各个phase(阶段)需要进行的处理
{
case 7:
up_phase=7;
if(phase_in_flag) //进入phase时执行一次的初始化操作
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
dpd_ctl3_reg = (DPD_CTRL3_SYNC_RESTART | DPD_CTRL3_FAGC_UPDATE | DPD_CTRL3_DAGC_UPDATE | DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.u8val = 0;
u_dpdctl_r23.dpd_bt.iqb_upd = 0;
u_dpdctl_r23.dpd_bt.sync_mode = 1;
u_dpdctl_r23.dpd_bt.rf_sel = 0;
log_printf(LOG_DEBUG,I_NOUSED,"[state] phase 7 ---------------A- 0x%x\n", u_dpdctl_r23.u8val);
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
s_fagc_locked = 0;
}
// 前半段跑完, 锁死射频AGC, 后半段只留数字AGC收敛
if(!s_fagc_locked && sec_cnt >= FAGC_LOCK_SEC_SHORT)
{
s_fagc_locked = 1;
// 只清 FAGC_UPDATE(bit0), SYNC_RESTART 保持到相8才放开
dpd_ctl3_reg = (DPD_CTRL3_SYNC_RESTART | DPD_CTRL3_DAGC_UPDATE | DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
log_printf(LOG_DEBUG,I_NOUSED,"[state] phase 7: FAGC locked at %ds, CTRL3=0x%02x\n",
sec_cnt, dpd_ctl3_reg);
}
// out
if(sec_cnt >= FAGC_PH7_SHORT_SEC){
up_phase = 8;
sec_cnt = 0;
phase_in_flag = 1;
}
break;
case 8:
up_phase = 8;
if(phase_in_flag) //进入phase时执行一次的初始化操作
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
dpd_ctl3_reg = (DPD_CTRL3_SYNC_UPDATE | DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
log_printf(LOG_DEBUG,I_NOUSED,"[state] phase 8\n");
}
//out
rd_state = fpga_byte_read(0x05, FPGA_ADDR_DPD_STATUS1);
if(rd_state & MASK_DPD_TRX_SYNC_OK) // 读取到dpd_trx_sync_ok状态为1时进入下一阶段
{
log_printf(LOG_DEBUG,I_NOUSED,"[state] phase 8 state: TX RX sync OK\n");
// set fix delay
up_phase = 9;
sec_cnt = 0;
phase_in_flag = 1;
}
else if(sec_cnt >= 15)// 80 超过80秒未读到sync ok, 同步失败,退出校正
{
log_printf(LOG_DEBUG,I_NOUSED,"[state] phase 8 state: TX RX sync failed\n");
//超时处理
up_phase = 9;
sec_cnt = 0;
phase_in_flag = 1;
}
break;
case 9:
up_phase = 9;
if(phase_in_flag)
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
// FAGC 已在相7锁死, 这里不能再放开: 它会和 DAGC 一起跑, 又把 0.43dB
// 的射频台阶注回 DAGC 的输入(主状态机的相9 本来就没有 FAGC, 这里对齐)
dpd_ctl3_reg = DPD_CTRL3_DAGC_UPDATE| DPD_CTRL3_DAGC_SLOWDN | DPD_CTRL3_ROT_UPDATE;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.dpd_bt.iqb_upd = 1;
u_dpdctl_r23.dpd_bt.sync_mode = 1;
u_dpdctl_r23.dpd_bt.rf_sel = 0;// A
log_printf(LOG_DEBUG,I_NOUSED,"[state] phase 9 ---------------A- 0x%x\n", u_dpdctl_r23.u8val);
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
}
// out
if(sec_cnt >= 3)
{
up_phase = 10;
sec_cnt = 0;
phase_in_flag = 1;
}
break;
case 10:
// in
up_phase = 10;
if(phase_in_flag) {
phase_in_flag = 0;
dpd_ctl2_reg = DPD_CTRL2_RXEQ_UPDATE;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
dpd_ctl3_reg = DPD_CTRL3_FAGC_UPDATE|DPD_CTRL3_FAGC_SLOWDN;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.dpd_bt.iqb_upd = 0;
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG,I_NOUSED,"[state] phase 10 --- 0x%x\n", u_dpdctl_r23.u8val);
}
// out
g_query_operate = 0;
up_phase = 0xff;// left must 0xff
sec_cnt = 0;
phase_in_flag = 0;
ret_state = 1; // left must 1
log_printf(LOG_DEBUG,I_NOUSED,"boot_tsnr_update end.\n");
break;
default:
break;
}
sec_cnt++;
return ret_state;
}
//static uint8 t_oneshot_flg=0;
int update_tsnr_uimd_limd(uint8 rst_flg, uint8 *p_phase)
{
static uint8 up_phase = 7; // 实际上就是dpd的7、8、9、10步需要配置的内容
static uint8 phase_in_flag= 0;
static uint8 sec_cnt = 0;
static uint8 s_fagc_locked= 0; // 相7: 前半段过后锁死FAGC的一次性标志
uint8 dpd_ctl2_reg;
uint8 dpd_ctl3_reg;
uint8 rd_state;
int ret_state = 0;
if(atsc_para.system_para.adpc >= ADPC_UPDATE1) // 正在校正就返回
return 1;
if(rst_flg){
up_phase = 7;
sec_cnt = 0;
phase_in_flag = 1;
log_printf(LOG_DEBUG, I_USER_CFG, "sta.update_tsnr_uimd_limd in new menu.\n");
}
*p_phase = up_phase;
switch(up_phase) // 各个phase(阶段)需要进行的处理
{
case 7:
up_phase=7;
if(phase_in_flag) //进入phase时执行一次的初始化操作
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
dpd_ctl3_reg = (DPD_CTRL3_SYNC_RESTART |
DPD_CTRL3_FAGC_UPDATE |
DPD_CTRL3_DAGC_UPDATE |
DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.u8val=0;
u_dpdctl_r23.dpd_bt.iqb_upd = 0;
u_dpdctl_r23.dpd_bt.sync_mode = 1;
u_dpdctl_r23.dpd_bt.rf_sel = 0;
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 7 in---------------A- 0x%x\n", u_dpdctl_r23.u8val);
s_fagc_locked = 0;
}
// 前半段跑完, 锁死射频AGC, 后半段只留数字AGC收敛
if(!s_fagc_locked && sec_cnt >= FAGC_LOCK_SEC_SHORT)
{
s_fagc_locked = 1;
// 只清 FAGC_UPDATE(bit0), SYNC_RESTART 保持到相8才放开
dpd_ctl3_reg = (DPD_CTRL3_SYNC_RESTART | DPD_CTRL3_DAGC_UPDATE | DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 7: FAGC locked at %ds, CTRL3=0x%02x\n",
sec_cnt, dpd_ctl3_reg);
}
// out
if(sec_cnt >= FAGC_PH7_SHORT_SEC){
up_phase = 8;
sec_cnt = 0;
phase_in_flag = 1;
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 7 out \n");
}
break;
case 8:
up_phase = 8;
if(phase_in_flag) //进入phase时执行一次的初始化操作
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
dpd_ctl3_reg = (DPD_CTRL3_SYNC_UPDATE|
DPD_CTRL3_DCRM_UPDATE|
DPD_CTRL3_FAGC_UPDATE);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 8 in\n");
}
//out
rd_state = fpga_byte_read(0x05, FPGA_ADDR_DPD_STATUS1);
if(rd_state & MASK_DPD_TRX_SYNC_OK) // 读取到dpd_trx_sync_ok状态为1时进入下一阶段
{
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 8 out, state: TX RX sync OK\n");
// set fix delay
up_phase = 9;
sec_cnt = 0;
phase_in_flag = 1;
}
else if(sec_cnt >= 15)// 80 超过80秒未读到sync ok, 同步失败,退出校正
{
//超时处理
up_phase = 9;
sec_cnt = 0;
phase_in_flag = 1;
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 8 out, state: TX RX sync failed\n");
}
break;
case 9:
up_phase = 9;
if(phase_in_flag)
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
dpd_ctl3_reg = DPD_CTRL3_ROT_UPDATE|DPD_CTRL3_FAGC_UPDATE;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.dpd_bt.iqb_upd = 1;
u_dpdctl_r23.dpd_bt.sync_mode = 1;
u_dpdctl_r23.dpd_bt.rf_sel = 0;// A
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 9 in---------------A- 0x%x\n", u_dpdctl_r23.u8val);
}
// out
if(sec_cnt >= 3) // 7
{
up_phase = 10;
sec_cnt = 0;
phase_in_flag = 1;
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 9 out \n");
}
break;
case 10:
// in
up_phase = 10;
if(phase_in_flag) {
phase_in_flag = 0;
dpd_ctl2_reg = DPD_CTRL2_RXEQ_UPDATE;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
dpd_ctl3_reg = DPD_CTRL3_FAGC_UPDATE;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.dpd_bt.iqb_upd = 0;
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 10 in --- 0x%x\n", u_dpdctl_r23.u8val);
}
// out
if(sec_cnt >= 2) // 7
{
g_query_operate = 0;
up_phase = 0xff;// left must 0xff
sec_cnt = 0;
phase_in_flag = 0;
ret_state = 1; // left must 1
log_printf(LOG_DEBUG, I_USER_CFG, "[state] phase 10 out. \n");
}
break;
default:
break;
}
sec_cnt++;
return ret_state;
}
int dpd_log_trig(int trig_enable)
{
#if DPD_LOG_ENABLE
if(trig_enable>1 || trig_enable<0){
log_printf(LOG_DEBUG, I_USER_CFG, "trig_enable err, set 0\n");
trig_enable = 0;
}
fpga_byte_write(5, FPGA_ADDR_DPD_LOG_TRIG, trig_enable);
#endif
return 0;
}
int dpd_log_file_open(void)
{
/*
* w+ : 打开一个文本文件,允许读写文件。
如果文件已存在,则文件会被截断为零长度,
如果文件不存在,则会创建一个新文件。
*/
#if DPD_LOG_ENABLE
if(p_dpd_log_fp != NULL){
log_printf(LOG_ERR, I_USER_CFG, "dpd log has opened.\n");
return 0;
}
p_dpd_log_fp = fopen(DPD_LOG_FILE, "w+");
if (p_dpd_log_fp == NULL){
log_printf(LOG_ERR, I_USER_CFG, "dpd log file open failed.\n");
return -1;
}else
log_printf(LOG_DEBUG, I_USER_CFG, "dpd log file open success.\n");
struct tm tmBJ;
get_beijing_time(&tmBJ);
fprintf(p_dpd_log_fp, "[%04d-%02d-%02d %02d:%02d:%02d] open %s success.\n\n",
tmBJ.tm_year, tmBJ.tm_mon, tmBJ.tm_mday, tmBJ.tm_hour, tmBJ.tm_min, tmBJ.tm_sec, DPD_LOG_FILE);
#endif
return 0;
}
int dpd_log_file_close( char *whyclose)
{
#if DPD_LOG_ENABLE
if(p_dpd_log_fp == NULL || whyclose == NULL) {
log_printf(LOG_ERR, I_USER_CFG, "[%s] null or whyclose null\n", DPD_LOG_FILE);
return -1;
}
struct tm tmBJ;
get_beijing_time(&tmBJ);
fprintf(p_dpd_log_fp, "\n\n[%04d-%02d-%02d %02d:%02d:%02d] close %s, case [%s]\n\n",
tmBJ.tm_year, tmBJ.tm_mon, tmBJ.tm_mday, tmBJ.tm_hour, tmBJ.tm_min, tmBJ.tm_sec, DPD_LOG_FILE, whyclose);
if(p_dpd_log_fp != NULL)
fclose(p_dpd_log_fp);
log_printf(LOG_DEBUG, I_USER_CFG, "dpd log file close success\n");
p_dpd_log_fp = NULL;
#endif
return 0;
}
int dpd_log_read_and_save(int phase)
{
#if DPD_LOG_ENABLE
uint8 log_data[18] = {0};
S_DPD_LOG_TYPE ldata;
struct tm tmBJ;
static int bak_phase = 0;
int i = 0;
if(p_dpd_log_fp == NULL) {
log_printf(LOG_ERR, I_USER_CFG, "%s null\n", DPD_LOG_FILE);
return -1;
}
dpd_log_trig(1);
// read data from FPGA segment 5 [0x20--0x37]
fpga_byte_reads(5, FPGA_ADDR_DPD_CTRL1, log_data, 18);
ldata.rx_fgain_cw_i = (log_data[0] << 0) + (log_data[1] << 8);
ldata.rx_dgain_i = (log_data[2] << 0) + (log_data[3] << 8);
ldata.txpow_cur_i = (log_data[4] << 0) + (log_data[5] << 8);
ldata.txaveamp_i = (log_data[6] << 0) + (log_data[7] << 8);
ldata.ob_wpp_max_i = (log_data[8] << 0) + (log_data[9] << 8);
ldata.rx_data_iq_i = (log_data[10] << 0) + (log_data[11] << 8) + (log_data[12] << 16) + (log_data[13] << 24);
ldata.tx_data_iq_i = (log_data[14] << 0) + (log_data[15] << 8) + (log_data[16] << 16) + (log_data[17] << 24);
if(bak_phase != phase) {
get_beijing_time(&tmBJ);
fprintf(p_dpd_log_fp, "[%02d:%02d:%02d]************* phase %d ****************\n",tmBJ.tm_hour, tmBJ.tm_min, tmBJ.tm_sec, phase);
bak_phase = phase;
}
fprintf(p_dpd_log_fp, "tx_data_iq_i = 0x%08x\n", ldata.tx_data_iq_i);
fprintf(p_dpd_log_fp, "rx_data_iq_i = 0x%08x\n", ldata.rx_data_iq_i);
fprintf(p_dpd_log_fp, "ob_wpp_max_i = 0x%04x\n", ldata.ob_wpp_max_i);
fprintf(p_dpd_log_fp, "txaveamp_i = 0x%04x\n", ldata.txaveamp_i);
fprintf(p_dpd_log_fp, "txpow_cur_i = 0x%04x\n", ldata.txpow_cur_i);
fprintf(p_dpd_log_fp, "rx_dgain_i = 0x%04x\n", ldata.rx_dgain_i);
fprintf(p_dpd_log_fp, "rx_fgain_cw_i = 0x%04x\n\n\n", ldata.rx_fgain_cw_i);
dpd_log_trig(0);
#endif
return 0;
}
int dpd_log_read_and_save_end(char * say)
{
#if DPD_LOG_ENABLE
uint8 log_data[18] = {0};
S_DPD_LOG_TYPE ldata;
struct tm tmBJ;
int i = 0;
if(p_dpd_log_fp == NULL) {
log_printf(LOG_ERR, I_USER_CFG, "%s null\n", DPD_LOG_FILE);
return -1;
}
dpd_log_trig(1);
// read data from FPGA segment 5 [0x20--0x37]
fpga_byte_reads(5, FPGA_ADDR_DPD_CTRL1, log_data, 18);
ldata.rx_fgain_cw_i = (log_data[0] << 0) + (log_data[1] << 8);
ldata.rx_dgain_i = (log_data[2] << 0) + (log_data[3] << 8);
ldata.txpow_cur_i = (log_data[4] << 0) + (log_data[5] << 8);
ldata.txaveamp_i = (log_data[6] << 0) + (log_data[7] << 8);
ldata.ob_wpp_max_i = (log_data[8] << 0) + (log_data[9] << 8);
ldata.rx_data_iq_i = (log_data[10] << 0) + (log_data[11] << 8) + (log_data[12] << 16) + (log_data[13] << 24);
ldata.tx_data_iq_i = (log_data[14] << 0) + (log_data[15] << 8) + (log_data[16] << 16) + (log_data[17] << 24);
get_beijing_time(&tmBJ);
fprintf(p_dpd_log_fp, "[%02d:%02d:%02d]************* will end ****************\n", tmBJ.tm_hour, tmBJ.tm_min, tmBJ.tm_sec);
if(say != NULL)
fprintf(p_dpd_log_fp, " %s \n", say);
fprintf(p_dpd_log_fp, "tx_data_iq_i = 0x%08x\n", ldata.tx_data_iq_i);
fprintf(p_dpd_log_fp, "rx_data_iq_i = 0x%08x\n", ldata.rx_data_iq_i);
fprintf(p_dpd_log_fp, "ob_wpp_max_i = 0x%04x\n", ldata.ob_wpp_max_i);
fprintf(p_dpd_log_fp, "txaveamp_i = 0x%04x\n", ldata.txaveamp_i);
fprintf(p_dpd_log_fp, "txpow_cur_i = 0x%04x\n", ldata.txpow_cur_i);
fprintf(p_dpd_log_fp, "rx_dgain_i = 0x%04x\n", ldata.rx_dgain_i);
fprintf(p_dpd_log_fp, "rx_fgain_cw_i = 0x%04x\n\n\n", ldata.rx_fgain_cw_i);
dpd_log_trig(0);
#endif
return 0;
}
int dpd_log_string_save(char* string)
{
#if DPD_LOG_ENABLE
if(p_dpd_log_fp == NULL) {
log_printf(LOG_ERR, I_USER_CFG, "dpd_log_string_save [%s] fp is null\n", DPD_LOG_FILE);
return -1;
}
if(string != NULL)
fprintf(p_dpd_log_fp, " %s \n", string);
#endif
return 0;
}
uint8 conv_adpc_err_output(uint8 raw_dpd_err)
{
uint8 output_err=0;
switch(raw_dpd_err)
{
case DPD_STATE_ERR:
output_err=1; //DPD stop,PA protection
break;
case DPD_STATE_POWER_HIGH:
output_err=2; //DPD fail,Feedback high
break;
case DPD_STATE_POWER_LOW:
output_err=3; //DPD fail,Feedback low
break;
case DPD_STATE_POWER_TOO_HIGH:
output_err=4; //DPD fail,Feedback high
break;
case DPD_STATE_POWER_TOO_LOW:
output_err=5; //DPD fail,Feedback low
break;
case DPD_STATE_ERR_OVER_RANGE:
output_err=6; //DPD stop, Over distortion or DPD stop, Check RF filter
break;
case DPD_CHECK_WPP_ERR_EXIT_HOLD:
output_err=7; //DPD stop,PA protection
break;
case DPD_READ_CKECK_ERR:
output_err=8; //DPD data save error
break;
case DPD_WRITE_CHECK_ERR:
output_err=9; //DPD data load error
break;
case DPD_SYNC_TIMEOUT:
output_err=10; //DPD SYNC_TIMEOUT
break;
default:
break;
}
return output_err;
}
void set_ab_switch(E_AB_SEL ab_val)
{
u_dpdctl_r23.dpd_bt.rf_sel = ab_val; // 1 : B , 0 : A
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
}
void little_balance(S_SYSTEM_PARA * psys)
{
S_SYS_TIME bak_time = {0xff,};//本地时间
S_SYS_TIME now_time = {0,};
int ret = 0;
uint8 reset_up = 1;
uint8 uuu_phase = 0;
uint8 old_phase = 0;
char show_perc[5] = {0};
psys->final_stage = 3;
while(1)
{
get_sys_time(&now_time);
if(bak_time.sec != now_time.sec) {
pthread_mutex_lock(&mtx_phase78910_again);
ret = update_tsnr_uimd_limd(reset_up,&uuu_phase);
if(reset_up)
reset_up = 0;
if(uuu_phase!=old_phase){
psys->final_stage = 10-uuu_phase;
old_phase = uuu_phase;
}
if(ret == 1) {
pthread_mutex_unlock(&mtx_phase78910_again);
break;
}
pthread_mutex_unlock(&mtx_phase78910_again);
get_sys_time(&bak_time);
}
usleep(20000);// 20ms
}
reset_dpd_to_normal_state();
psys->final_stage = 0xff;
}
void refresh_waiting(void *parg,void *parv)
{
uint8 retime = atsc_para.system_para.final_stage;
char show_perc[5] = {0};
lcd_write_string(LINE_1,0," WAIT A MOMENT .... ");
lcd_write_string(LINE_2,0," FINAL STAGE ");
if(retime != 0xff){
sprintf(show_perc, "%d ", retime);
lcd_write_string(LINE_2, 15, show_perc);
}
}
void refresh_update_dpd(void *parg,void *parv)
{
S_SYSTEM_PARA *psys = &atsc_para.system_para;
uint16 dpd_disp_step = 0;
//static int dpd_phase = 0;
static int phase_in_flag = 0;
static int sec_cnt = 0;
static uint32 last_sec_tick = 0;
static uint32 disp_sec = 0;
//uint8 l_imd=0,u_imd=0;
uint16 tx_pow,err_pow;
uint16 dpow_limit,dpow_cur;
uint16 u16_tsnr;
uint16 wpp_max=0; //wpp保护状态
uint8 wpp_abort=0;
float f_tsnr;
uint8 rd_reg;
uint8 dpd_ctl1_reg, dpd_ctl2_reg, dpd_ctl3_reg;
uint8 dpd_sat_flg = 0;
static uint8 st_check_wpp_en=1;
static uint16 s_ms200_cnt=0;
static uint16 g_skip_next_dly =20;
static uint8 g_prompt_skip_wpp=0;
static uint8 pflg=0;
static uint8 g_pow_state_check=0;
static uint8 stc_insert_step=0;
static uint8 s_fagc_locked=0; // 相1/相7: 前半段过后锁死FAGC的一次性标志
struct timeval now_tv;
uint32 now_sec;
disp_sec++;
//配置初始化并启动
if(psys->adpc_step == 1)
{
log_printf(LOG_DEBUG, I_USER_CFG, "\r\n ******** start dpd process ***************\r\n");
dpd_log_file_open();
/* 3 每次矫正开始之前清除一下曲线 */
/*dpd_set_clr();//SPL_CURV_LOAD_STORE
*/
//初始为phase 1
phase_in_flag = 1;
sec_cnt = 0;
last_sec_tick = 0;
wpp_max = 0;
s_ms200_cnt = 0;
set_force_stop_adpc(FALSE);
set_boot_tsnr_up_state(E_STA_BOOT_TRIGGER_END);
psys->adpc_err = DPD_STATUS_UPDATING;
u_dpdctl_r23.u8val=0;
psys->final_stage = 0xff;
if(psys->adpc == ADPC_UPDATE2)
psys->dpd_phase = 7;
else
psys->dpd_phase = 1;
log_printf(LOG_DEBUG, I_USER_CFG, "adpc=%d, start from dpd_phase %d\n", psys->adpc, psys->dpd_phase);
g_query_save = 0;
g_query_operate = 0;
g_query_skip = E_QUERY;
dpd_ck_status = CK_OK;
g_prompt_skip_wpp = 0;
g_query_wpp_to_save = 0;
st_check_wpp_en =1;
clear_wpp_max();
g_skip_next_dly = 20;
g_pow_state_check = 0;
s_fagc_locked = 0;
fpga_byte_write(5,FPGA_ADDR_DPD_CFG_STEP, 0);
fpga_byte_write(5,0x25, 0xff); // 更新间隔
fpga_byte_write(5,0x26, 0); // 更新间隔
//初始化配置,所有的 “控制”寄存器全部置0, !!! 2 - 1 - 3
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, 0);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL1, 0);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, 0);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, 0);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, MASK_WPP_CLR);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, MASK_WPP_ENABLE);
dpd_ctl1_reg = DPD_CTRL1_DPD_START;
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL1, dpd_ctl1_reg);
psys->adpc_step=2;
}
//循环检测状态,正常时才执行dpd过程的循环,错误时退出
while(psys->adpc_step == 2)
{
if(atsc_adpc_force_stop_flag == TRUE) {
goto DPD_FORCE_STOP;
}
dpow_limit = (fpga_byte_read(0x05,0x14)<<8)|fpga_byte_read(0x05,0x13);
dpow_cur = (fpga_byte_read(0x05,0x16)<<8)|fpga_byte_read(0x05,0x15);
tx_pow = (fpga_byte_read(0x05,0x03)<<8)|fpga_byte_read(0x05,0x02);
err_pow = (fpga_byte_read(0x05,0x05)<<8)|fpga_byte_read(0x05,0x04);
f_tsnr = 10*log10(tx_pow*64.0/err_pow)*100+TSNR_FIX;//放大100
if(f_tsnr < 0)
f_tsnr = 0;
u16_tsnr = (uint16)f_tsnr;
(void)check_lcd_light(TYPE_KEY); //确保屏幕不灭
if(st_check_wpp_en==1){
wpp_abort = fpga_byte_read(0x05,0x0d);
}
wpp_max = (fpga_byte_read(0x05,0x0f)<<8)|fpga_byte_read(0x05,0x0e);
#if 1
if(wpp_abort&0x01){//dpd由于脉冲功率过大导致保护 @20210907调整为出现该保护,提示结束及保持曲线确认
// 0. if checked wpp at phase 6, then clr wpp status and disable wpp check, auto skip to phase 7
if(psys->dpd_phase==6)
{
if(atsc_para.wj_para.ctl_dpd==E_DPD_NSAVE_FLITER ||atsc_para.wj_para.ctl_dpd==E_DPD_SAVE_FLITER){
// 1.clr wpp status
wpp_max = (fpga_byte_read(0x05,0x0f)<<8)|fpga_byte_read(0x05,0x0e);
log_printf(LOG_DEBUG, I_USER_CFG, "ph6 before clr maxwpp=%d,wppabort=%d\n",wpp_max,wpp_abort&0x01);
g_wpp_max = wpp_max;
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, 0);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, MASK_WPP_CLR);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, MASK_WPP_ENABLE);
wpp_max = (fpga_byte_read(0x05,0x0f)<<8)|fpga_byte_read(0x05,0x0e);
log_printf(LOG_DEBUG, I_USER_CFG, "ph6 after clr maxwpp=%d,wppabort=%d\n",wpp_max,wpp_abort&0x01);
g_query_wpp_to_save=0;
// 2.disable wpp check
st_check_wpp_en = 0;
// 3.prompt skip to next
g_prompt_skip_wpp=1;
log_printf(LOG_DEBUG, I_USER_CFG, "sta-%d wpp to next\n",psys->dpd_phase);
}
else{
// 3.prompt err
g_wpp_max = wpp_max;
g_prompt_skip_wpp=1;
}
}
else{
g_wpp_max = wpp_max;
psys->adpc_err=DPD_CHECK_WPP_ERR_EXIT_HOLD;//DPD_CHECK_WPP_ERR_EXIT
log_printf(LOG_DEBUG, I_USER_CFG, "sta-%d esc wpp maxwpp=%d,wppabort=%d\n",psys->dpd_phase,wpp_max,wpp_abort&0x01);
goto DPD_END;//DPD_SAVE_PROC;
}
}
#endif
/* 读取状态 >>>> *///-------------------------------------
rd_reg = fpga_byte_read(5,FPGA_ADDR_DPD_STATUS1);
if(rd_reg & MASK_DPD_SAT_FLG){
dpd_sat_flg = 1;//只做显示
}
else{
dpd_sat_flg = 0;
}
if(rd_reg & MASK_DPD_ERR)//bit-0 //出现 DPD error状态
{
psys->adpc_err = DPD_STATE_ERR;
log_printf(LOG_DEBUG, I_USER_CFG, "\b DPD caused tx power rise too much\r\n");
dpd_log_string_save("Step 2. DPD caused tx power rise too much. Will DPD_END");
goto DPD_END;
}
if(rd_reg & MASK_DPD_ERR_ABORT)//bit-3 //出现 adpc_err_aborto 状态
{
psys->adpc_err = DPD_STATE_ERR_OVER_RANGE;
log_printf(LOG_DEBUG, I_USER_CFG, "\b DPD Abort due to large errors\r\n");
dpd_log_string_save( "Step 2. DPD Abort due to large errors. Will DPD_END");
goto DPD_END;
}
if(g_pow_state_check)
{
if(rd_reg & MASK_DPD_PWRLOW)//bit-2 //出现 dpd_powerislow状态
{
psys->adpc_err = DPD_STATE_POWER_LOW;
log_printf(LOG_DEBUG, I_USER_CFG, "\b Feedback power is low\r\n");
dpd_log_string_save( "Step 2. Feedback power is low. Will DPD_END");
goto DPD_END;
}
if(rd_reg & MASK_DPD_PWRHIGH)//bit-1 //出现 dpd_powerishigh状态
{
psys->adpc_err = DPD_STATE_POWER_HIGH;
log_printf(LOG_DEBUG, I_USER_CFG, "\b Feedback power is high\r\n");
dpd_log_string_save( "Step 2. Feedback power is high. Will DPD_END");
goto DPD_END;
}
}
if(psys->dpd_phase>1){ // 过了phase1以后才检测的状态
if(rd_reg & MASK_DPD_DAGC_TOOLOW) //bit-6
{
psys->adpc_err = DPD_STATE_POWER_TOO_LOW;
log_printf(LOG_DEBUG, I_USER_CFG, "\b DPD Abort due to DAGC input LOW\r\n");
dpd_log_string_save( "Step 2. DPD Abort due to DAGC input LOW. Will DPD_END");
goto DPD_END;
}
if(rd_reg & MASK_DPD_DAGC_TOOHIGH)//bit-5
{
psys->adpc_err = DPD_STATE_POWER_TOO_HIGH;
log_printf(LOG_DEBUG, I_USER_CFG, "\b DPD Abort due to DAGC input HIGH\r\n");
dpd_log_string_save( "Step 2. DPD Abort due to DAGC input HIGH. Will DPD_END");
goto DPD_END;
}
}
/* 读取状态 <<<< *///-------------------------------------
//校正过程
switch(psys->dpd_phase) // 各个phase(阶段)需要进行的处理
{
case 1:
////////////// 1.AGC
// in
psys->dpd_phase=1;
if(phase_in_flag) //进入phase时执行一次的初始化操作
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
dpd_ctl3_reg = (DPD_CTRL3_SYNC_RESTART | DPD_CTRL3_FAGC_UPDATE | DPD_CTRL3_DAGC_UPDATE | DPD_CTRL3_DCRM_UPDATE ); //
fpga_byte_write(0x05,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(0x05,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
fpga_byte_write(0x05, FPGA_ADDR_WPP_EN_CLR, 0); // 关闭WPP保护
fpga_byte_write(0x05, FPGA_ADDR_WPP_EN_CLR, MASK_WPP_CLR); // 清除MAXP
fpga_byte_write(0x05, FPGA_ADDR_WPP_EN_CLR, MASK_WPP_ENABLE); //打开WPP保护
u_dpdctl_r23.u8val = 0;
u_dpdctl_r23.dpd_bt.iqb_upd = 1;
u_dpdctl_r23.dpd_bt.sync_mode = 0;
u_dpdctl_r23.dpd_bt.rf_sel = 1;
fpga_byte_write(5,FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 1: 0x%x\n", u_dpdctl_r23.u8val);
s_fagc_locked = 0;
}
// 前半段跑完, 锁死射频AGC, 后半段只留数字AGC收敛(见 FAGC_LOCK_SEC 注释)
if(!s_fagc_locked && sec_cnt >= FAGC_LOCK_SEC)
{
s_fagc_locked = 1;
// 只清 FAGC_UPDATE(bit0), SYNC_RESTART 必须继续保持到相2才放开
dpd_ctl3_reg = (DPD_CTRL3_SYNC_RESTART | DPD_CTRL3_DAGC_UPDATE | DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 1: FAGC locked at %ds, CTRL3=0x%02x\n",
sec_cnt, dpd_ctl3_reg);
dpd_log_string_save("phase 1. FAGC locked, DAGC only");
}
// out
if(sec_cnt >= 20 || g_query_skip == E_QUERY_SKIP){ // 计时超过20秒离开phase1
g_pow_state_check = 1;
if(g_query_skip == E_QUERY_SKIP)g_query_skip=E_QUERY;
psys->dpd_phase=2; // 离开前进行的操作
sec_cnt = 0;
phase_in_flag = 1;
}
break;
case 2:
////////////// 2.TX RX SYNC
// in
psys->dpd_phase=2;
if(phase_in_flag) //进入phase时执行一次的初始化操作
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
dpd_ctl3_reg = (DPD_CTRL3_SYNC_UPDATE | DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
}
//out
if(rd_reg & MASK_DPD_TRX_SYNC_OK || g_query_skip == E_QUERY_SKIP) // 读取到dpd_trx_sync_ok状态为1时进入下一阶段
{
if(g_query_skip == E_QUERY_SKIP)g_query_skip=E_QUERY;
// set fix delay
psys->dpd_phase=3;
sec_cnt = 0;
phase_in_flag = 1;
}
else if(sec_cnt >= 80)// 超过80秒为读到sync ok, 同步失败,退出校正
{
log_printf(LOG_DEBUG, I_USER_CFG, "\b TX RX sync failed\r\n");
psys->adpc_err = DPD_SYNC_TIMEOUT;
goto DPD_END;
}
break;
case 3:
////////////// 3.ROT
// in
psys->dpd_phase=3;
if(phase_in_flag)
{
phase_in_flag = 0;
dpd_ctl2_reg = 0;
//dpd_ctl3_reg = DPD_CTRL3_ROT_UPDATE;
dpd_ctl3_reg = DPD_CTRL3_DAGC_UPDATE|DPD_CTRL3_DAGC_SLOWDN|DPD_CTRL3_ROT_UPDATE;
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
}
dpd_log_read_and_save( psys->dpd_phase);
// out
if(sec_cnt >= 30 || g_query_skip == E_QUERY_SKIP) // 计时到15秒进入下一阶段
{
if(g_query_skip == E_QUERY_SKIP) {
g_query_skip = E_QUERY;
sec_cnt=0xffff;
}
dpd_log_read_and_save( psys->dpd_phase);
if(atsc_para.dpd_para.dpd_mode==E_DPD_MODE_MANUAL) {//MANUAL
if(g_query_operate==0)
g_query_operate = E_QUERY;
if(g_query_operate == E_QUERY_UP_STOP) {
g_query_operate = 0;
sec_cnt = 0;
psys->adpc_step = 3;
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR,ADPC_OFF);
dpd_log_string_save( "phase 3. MANUAL E_QUERY_SKIP. Will DPD_SUCCESS");
goto DPD_SUCCESS;
}
else if(g_query_operate==E_QUERY_OK_CONTINUE) {
g_query_operate=0;
psys->dpd_phase=4;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save("phase 3. MANUAL E_QUERY_OK_CONTINUE. Will enter phase 4");
}
else if(g_query_operate==E_QUERY_ESC_EXIT) {
g_query_operate=0;
sec_cnt = 0;
phase_in_flag = 1;
psys->adpc_err=DPD_PROC_EXIT;
dpd_log_string_save("phase 3. MANUAL E_QUERY_ESC_EXIT. Will DPD_END");
goto DPD_END;
}
}
else{//AUTO
dpd_log_read_and_save( psys->dpd_phase);
g_query_operate=0;
psys->dpd_phase=4;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save("phase 3. AUTO. Will enter phase 4");
}
}
break;
case 4:
////////////// 4.Linear update
// in
psys->dpd_phase = 4;
if(phase_in_flag)
{
stc_insert_step = 0;
phase_in_flag = 0;
dpd_ctl2_reg = (DPD_CTRL2_LIN_UPDATE | DPD_CTRL2_AMP_CHK );
fpga_byte_write(5,0x25, 0xff);
fpga_byte_write(5,0x26, 0x08);
u_dpdctl_r23.dpd_bt.iqb_upd = 0;
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 4: 0x%x\n", u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 4 0x26-0x08\n");
dpd_log_string_save("phase 4 0x26-0x08");
dpd_ctl3_reg = (DPD_CTRL3_DAGC_UPDATE|DPD_CTRL3_DAGC_SLOWDN);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
}
dpd_log_read_and_save(psys->dpd_phase);
// out
if(sec_cnt >= 90 || g_query_skip == E_QUERY_SKIP) {
if(g_query_skip == E_QUERY_SKIP){g_query_skip=E_QUERY;sec_cnt=0xffff;}
if(atsc_para.dpd_para.dpd_mode == E_DPD_MODE_MANUAL)
{//MANUAL
if(g_query_operate == 0)
g_query_operate = E_QUERY;
if(g_query_operate == E_QUERY_UP_STOP) {
g_query_operate = 0;
sec_cnt = 0;
psys->adpc_step = 3;
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR,ADPC_OFF);
dpd_log_string_save( "phase 4.(MANUAL) E_QUERY_SKIP. Will DPD_SUCCESS");
goto DPD_SUCCESS;
}
else if(g_query_operate==E_QUERY_OK_CONTINUE)
{
g_query_operate=0;
psys->dpd_phase=5;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save( "phase 4.(MANUAL) E_QUERY_OK_CONTINUE. Will enter phase 5");
}
else if(g_query_operate==E_QUERY_ESC_EXIT)
{
g_query_operate=0;
sec_cnt = 0;
phase_in_flag = 1;
psys->adpc_err=DPD_PROC_EXIT;
dpd_log_string_save( "phase 4.(MANUAL) E_QUERY_ESC_EXIT. Will DPD_END");
goto DPD_END;
}
}
else{//AUTO
if(stc_insert_step==0){
stc_insert_step = 1;
//1. 在4结束后,lin_update_set = 0, 同时把0x21的bit7 设置为1。其它都不动;
dpd_ctl2_reg = (DPD_CTRL2_AMP_CHK | DPD_CTRL2_POLYESTI_UPDATE);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);//0x21
printf("phase4 end-5s set Reg0x21=0x%x\n", dpd_ctl2_reg);
}
if(sec_cnt >= 90+5){
//2. 过个5秒左右,0x21 的bit7 设置为0,然后进入状态5;
dpd_ctl2_reg = (DPD_CTRL2_AMP_CHK );
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);//0x21
printf("phase4 end set Reg0x21=0x%x\n", dpd_ctl2_reg);
g_query_operate=0;
psys->dpd_phase=5;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save( "phase 4.(AUTO) Will enter phase 5");
}
}
}
break;
case 5:
////////////////// 5.POLY update
// in
psys->dpd_phase=5;
if(phase_in_flag) {
phase_in_flag = 0;
dpd_ctl2_reg = (DPD_CTRL2_NONLIN_UPDATE | DPD_CTRL2_SET_NONLIN_UDP_MOD(1) | DPD_CTRL2_AMP_CHK); //
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
dpd_ctl3_reg = ((DPD_CTRL3_DAGC_UPDATE|DPD_CTRL3_DAGC_SLOWDN) | (DPD_CTRL3_DCRM_UPDATE));
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 5: in\n");
}
dpd_log_read_and_save( psys->dpd_phase);
// out
if(sec_cnt >= 90 || g_query_skip == E_QUERY_SKIP) {
if(g_query_skip == E_QUERY_SKIP) {
g_query_skip = E_QUERY;
sec_cnt = 0xffff;
}
if(atsc_para.dpd_para.dpd_mode == E_DPD_MODE_MANUAL) {//MANUAL
if(g_query_operate==0)
g_query_operate = E_QUERY;
if(g_query_operate == E_QUERY_UP_STOP) {
g_query_operate = 0;
sec_cnt = 0;
psys->adpc_step = 3;
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR,ADPC_OFF);
dpd_log_string_save( "phase 5.MANUAL E_QUERY_SKIP. Will DPD_SUCCESS");
goto DPD_SUCCESS;
}
else if(g_query_operate==E_QUERY_OK_CONTINUE)
{
g_query_operate=0;
psys->dpd_phase=6;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save( "phase 5. MANUAL E_QUERY_OK_CONTINUE. Will enter phase 6");
}
else if(g_query_operate==E_QUERY_ESC_EXIT)
{
g_query_operate=0;
sec_cnt = 0;
phase_in_flag = 1;
psys->adpc_err=DPD_PROC_EXIT;
dpd_log_string_save( "phase 5. MANUAL E_QUERY_ESC_EXIT. Will DPD_END");
goto DPD_END;
}
}
else{//AUTO
g_query_operate=0;
psys->dpd_phase=6;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save( "phase 5. auto, Will enter phase 6");
}
}
break;
case 6:
//check wpp then skip to next
if(g_prompt_skip_wpp==1) {
s_ms200_cnt++;
if(s_ms200_cnt >= 5) {
s_ms200_cnt = 0;
if(g_skip_next_dly)
g_skip_next_dly--;
}
if(g_skip_next_dly) {
break;
}
else{
if(atsc_para.wj_para.ctl_dpd==E_DPD_NSAVE_NFLITER)//no save
{
g_prompt_skip_wpp=0;
g_query_save_flg = PHASE6_SET_SAVE;
g_query_save = E_QUERY_CANCEL;
log_printf(LOG_DEBUG, I_USER_CFG, "sta-6.wpp no save, no fliter\n");
dpd_log_string_save( "phase 6.Checked WPP ,exit and no save");
goto DPD_SAVE_PROC;
}
else if(atsc_para.wj_para.ctl_dpd==E_DPD_SAVE_NFLITER)
{
g_prompt_skip_wpp=0;
g_query_save_flg = PHASE6_SET_SAVE;
g_query_save = E_QUERY_CONFIRM;
log_printf(LOG_DEBUG, I_USER_CFG, "sta-6.wpp save, no fliter\n");
dpd_log_string_save( "phase 6.Checked WPP ,exit and save");
goto DPD_SAVE_PROC;
}
else if(atsc_para.wj_para.ctl_dpd==E_DPD_NSAVE_FLITER ||atsc_para.wj_para.ctl_dpd==E_DPD_SAVE_FLITER){
g_prompt_skip_wpp=0;
// 4.skip to phase 7
g_skip_next_dly=0;
g_query_operate=0;
psys->dpd_phase=7;
sec_cnt = 0;
phase_in_flag = 1;
log_printf(LOG_DEBUG, I_USER_CFG, "sta-6.wpp save, fliter\n");
dpd_log_string_save( "phase 6.Checked WPP AUTO E_QUERY_RF_FLITER. Will enter phase 7");
goto DPD_SAVE_PROC;
}
log_printf(LOG_DEBUG, I_USER_CFG, "sta-6. out ctrl\n");
g_prompt_skip_wpp=0;
}
}
////////////////// 6.CRST update
// in
psys->dpd_phase = 6;
if(phase_in_flag) {
phase_in_flag = 0;
dpd_ctl2_reg = (DPD_CTRL2_NONLIN_UPDATE | DPD_CTRL2_SET_NONLIN_UDP_MOD(3) | DPD_CTRL2_AMP_CHK );
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
dpd_ctl3_reg = DPD_CTRL3_DAGC_UPDATE | DPD_CTRL3_DAGC_SLOWDN | DPD_CTRL3_DCRM_UPDATE;
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CFG_STEP, 0);
fpga_byte_write(0x05, 0x25, 0xff);
fpga_byte_write(0x05, 0x26, 0);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 6: in, will do %d mins dpd_mode=%d,ctl_dpd=0x%02X\n",
atsc_para.dpd_para.phase6_minute,
atsc_para.dpd_para.dpd_mode,
atsc_para.wj_para.ctl_dpd);
}
if(sec_cnt == 31) {
fpga_byte_write(0x05, FPGA_ADDR_DPD_CFG_STEP, 1);
fpga_byte_write(0x05, 0x25, 0xff);
fpga_byte_write(0x05, 0x26, 0);
}
dpd_log_read_and_save( psys->dpd_phase);
// out
if((sec_cnt >= atsc_para.dpd_para.phase6_minute*60) || (g_query_skip == E_QUERY_SKIP)) {
#if USE_PHASE_78910
if(g_query_skip == E_QUERY_SKIP) {
g_query_skip = E_QUERY;
sec_cnt = 0xffff;
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 6: out, g_query_skip = E_QUERY_SKIP\n");
}
if(atsc_para.dpd_para.dpd_mode==E_DPD_MODE_MANUAL) {//MANUAL
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 6: out, dpd_mode = E_DPD_MODE_MANUAL,g_query_operate=%d\n",g_query_operate);
if(g_query_operate==0)
g_query_operate=E_QUERY;
if(g_query_operate == E_QUERY_UP_STOP) {
g_query_operate = 0;
sec_cnt = 0;
psys->adpc_step = 3;
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR,ADPC_OFF);
dpd_log_string_save( "phase 6.MANUAL E_QUERY_SKIP. Will DPD_SUCCESS");
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase6: MANUAL E_QUERY_SKIP. Will DPD_SUCCESS\n");
goto DPD_SUCCESS;
}
else if(g_query_operate==E_QUERY_OK_CONTINUE)
{
g_query_operate=0;
psys->dpd_phase=7;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save( "phase 6.MANUAL E_QUERY_OK_CONTINUE. Will enter phase 7");
}
else if(g_query_operate==E_QUERY_ESC_EXIT)
{
g_query_operate=0;
sec_cnt = 0;
phase_in_flag = 1;
psys->adpc_err=DPD_PROC_EXIT;
dpd_log_string_save( "phase 6.MANUAL E_QUERY_ESC_EXIT. Will DPD_END");
goto DPD_END;
}
}
else{//AUTO
#if USE_REMOTE_DPD
//for udp
if(adpc_source_udp){
adpc_source_udp = 0;
g_query_save_flg= 0;
g_query_save = 0;
psys->adpc_step = 3;
atsc_para.system_para.adpc = ADPC_HOLD;//断电失效
c256_bytewrite(EEPROM_DPD_ADDR,ADPC_OFF);
dpd_log_string_save( " adpc_source_udp = 1. set STEP = 3., Will DPD_END");
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 6: adpc_source_udp = 1. set STEP = 3., Will DPD_END\n");
goto DPD_END;
}
//for web and uart
if(adpc_source_web){
g_query_operate = E_QUERY_RF_FLITER;
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 6:---- E_QUERY_RF_FLITER\n");
}
#endif
//normal-exe
if(atsc_para.wj_para.ctl_dpd==E_DPD_NSAVE_NFLITER)
{
g_query_save_flg = PHASE6_SET_SAVE;
g_query_save = E_QUERY_CANCEL;
log_printf(LOG_DEBUG, I_USER_CFG, "sta-6.normal no save, no fliter\n");
}
else if(atsc_para.wj_para.ctl_dpd==E_DPD_SAVE_NFLITER)
{
g_query_save_flg = PHASE6_SET_SAVE;
g_query_save = E_QUERY_CONFIRM;
log_printf(LOG_DEBUG, I_USER_CFG, "sta-6.normal save, no fliter\n");
}
else if(atsc_para.wj_para.ctl_dpd==E_DPD_NSAVE_FLITER||atsc_para.wj_para.ctl_dpd==E_DPD_SAVE_FLITER)
{
if(psys->adpc==ADPC_UPDATE3) {
g_query_operate=0;
//psys->dpd_phase=0;
sec_cnt = 0xFFFF;
phase_in_flag = 0;
g_query_save = E_QUERY_CONFIRM;
g_query_save_flg = PHASE6_SET_SAVE;
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase6: done, will save data..........\n");
dpd_log_string_save( "phase 6.AUTO E_QUERY_RF_FLITER. Will enter save data");
goto DPD_SAVE_PROC;
} else {
g_query_operate=0;
psys->dpd_phase=7;
sec_cnt = 0;
phase_in_flag = 1;
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 7:------Will enter phase 7 \n");
if(atsc_para.wj_para.ctl_dpd==E_DPD_SAVE_FLITER)
log_printf(LOG_DEBUG, I_USER_CFG, "sta-6.normal save, fliter\n");
else if(atsc_para.wj_para.ctl_dpd==E_DPD_NSAVE_FLITER)
log_printf(LOG_DEBUG, I_USER_CFG, "sta-6.normal no save, fliter\n");
dpd_log_string_save( "phase 6.AUTO E_QUERY_RF_FLITER. Will enter phase 7");
}
}
else{
if(g_query_operate == 0){//query fliter
g_query_operate = E_QUERY2;
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase6: E_QUERY2\n");
}
else if(g_query_operate == E_QUERY_ESC_SAVE) {//query save
g_query_save_flg = PHASE6_SET_SAVE;// p6
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase6: E_QUERY_ESC_SAVE PHASE6_SET_SAVE\n");
dpd_log_string_save( "phase 6.AUTO E_QUERY_ESC_SAVE ,PHASE6_SET_SAVE ");
}
else if(g_query_operate==E_QUERY_RF_FLITER) {
if(psys->adpc==ADPC_UPDATE3) {
g_query_operate=0;
psys->dpd_phase=0;
sec_cnt = 0;
phase_in_flag = 0;
g_query_save =E_QUERY_CONFIRM;
g_query_save_flg = PHASE6_SET_SAVE;
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase6: done, will save data.\n");
dpd_log_string_save( "phase 6.AUTO E_QUERY_RF_FLITER. Will enter save data");
goto DPD_SAVE_PROC;
}else{
g_query_operate=0;
psys->dpd_phase=7;
sec_cnt = 0;
phase_in_flag = 1;
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase6: AUTO E_QUERY_RF_FLITER. Will enter phase 7\n");
dpd_log_string_save( "phase 6.AUTO E_QUERY_RF_FLITER. Will enter phase 7");
}
}
}
}
#endif
}
break;
case 7:
////////////// 7-2-AGC
// in
psys->dpd_phase=7;
if(phase_in_flag) //进入phase时执行一次的初始化操作
{
dpd_log_string_save( "phase 7. in :");
dpd_log_read_and_save( psys->dpd_phase);
phase_in_flag = 0;
dpd_log_string_save( "dpd rf sel: after");
dpd_ctl2_reg = 0;
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
dpd_ctl3_reg = (DPD_CTRL3_SYNC_RESTART | DPD_CTRL3_FAGC_UPDATE | DPD_CTRL3_DAGC_UPDATE | DPD_CTRL3_DCRM_UPDATE );
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.dpd_bt.iqb_upd =0;
u_dpdctl_r23.dpd_bt.sync_mode=1;
u_dpdctl_r23.dpd_bt.rf_sel =0;
fpga_byte_write(5,FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 7: 0x%x\n", u_dpdctl_r23.u8val);
s_fagc_locked = 0;
}
// 前半段跑完, 锁死射频AGC, 后半段只留数字AGC收敛(见 FAGC_LOCK_SEC 注释)
if(!s_fagc_locked && sec_cnt >= FAGC_LOCK_SEC)
{
s_fagc_locked = 1;
// 只清 FAGC_UPDATE(bit0), SYNC_RESTART 必须继续保持到相8才放开
dpd_ctl3_reg = (DPD_CTRL3_SYNC_RESTART | DPD_CTRL3_DAGC_UPDATE | DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(5, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 7: FAGC locked at %ds, CTRL3=0x%02x\n",
sec_cnt, dpd_ctl3_reg);
dpd_log_string_save("phase 7. FAGC locked, DAGC only");
}
dpd_log_read_and_save( psys->dpd_phase);
// out
if(sec_cnt >= 20 || g_query_skip == E_QUERY_SKIP){ // 计时超过20秒离开phase7
if(g_query_skip == E_QUERY_SKIP)
g_query_skip=E_QUERY;
g_pow_state_check = 1;
psys->dpd_phase=8; // 离开前进行的操作
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save("phase 7. E_QUERY_SKIP will enter phase 8");
}
break;
case 8:
////////////// 8-3-TX RX SYNC
// in
psys->dpd_phase=8;
if(phase_in_flag) //进入phase时执行一次的初始化操作
{
dpd_log_string_save( "phase 8. in :");
dpd_log_read_and_save( psys->dpd_phase);
phase_in_flag = 0;
dpd_ctl2_reg = 0;
dpd_ctl3_reg = (DPD_CTRL3_SYNC_UPDATE | DPD_CTRL3_DCRM_UPDATE);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
}
dpd_log_read_and_save( psys->dpd_phase);
//out
if(rd_reg & MASK_DPD_TRX_SYNC_OK || g_query_skip == E_QUERY_SKIP) // 读取到dpd_trx_sync_ok状态为1时进入下一阶段
{
if(g_query_skip == E_QUERY_SKIP)
g_query_skip = E_QUERY;
// set fix delay
psys->dpd_phase=9;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save( "Phase 8. out , Will enter phase 9");
}
else if(sec_cnt >= 80)// 超过80秒未读到sync ok, 同步失败,退出校正
{
log_printf(LOG_DEBUG, I_USER_CFG, "[update] TX RX sync failed\r\n");
dpd_log_string_save( "Phase 8. TX RX sync failed, Will DPD_END");
psys->adpc_err = DPD_SYNC_TIMEOUT;
goto DPD_END;
}
break;
case 9:
////////////// 9-4-ROT
// in
psys->dpd_phase=9;
if(phase_in_flag) {
dpd_log_string_save( "phase 9. in :");
dpd_log_read_and_save( psys->dpd_phase);
phase_in_flag = 0;
dpd_ctl2_reg = 0;
dpd_ctl3_reg = ((DPD_CTRL3_DAGC_UPDATE|DPD_CTRL3_DAGC_SLOWDN) | (DPD_CTRL3_ROT_UPDATE));
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.dpd_bt.iqb_upd =1;
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 9 --- 0x%x\n", u_dpdctl_r23.u8val);
fpga_byte_write(5,FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
}
dpd_log_read_and_save( psys->dpd_phase);
// out
if(sec_cnt >= 30 || g_query_skip == E_QUERY_SKIP) // 计时到15秒进入下一阶段
{
if(g_query_skip == E_QUERY_SKIP){g_query_skip=E_QUERY;sec_cnt=15;}
if(atsc_para.dpd_para.dpd_mode==E_DPD_MODE_MANUAL)
{//MANUAL
if(g_query_operate==0)g_query_operate=E_QUERY;
if(g_query_operate == E_QUERY_UP_STOP)
{
g_query_operate = 0;
sec_cnt = 0;
psys->adpc_step = 3;
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR,ADPC_OFF);
dpd_log_string_save( "Phase 9. MANUAL E_QUERY_SKIP, Will DPD_SUCCESS");
goto DPD_SUCCESS;
}
else if(g_query_operate==E_QUERY_OK_CONTINUE)
{
g_query_operate=0;
psys->dpd_phase=10;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save( "Phase 9.MANUAL E_QUERY_OK_CONTINUE, Will enter phase 10");
}
else if(g_query_operate==E_QUERY_ESC_EXIT)
{
g_query_operate=0;
sec_cnt = 0;
phase_in_flag = 1;
psys->adpc_err=DPD_PROC_EXIT;
dpd_log_string_save( "Phase 9.MANUAL E_QUERY_ESC_EXIT, Will DPD_END");
goto DPD_END;
}
}
else{//AUTO
g_query_operate=0;
psys->dpd_phase=10;
sec_cnt = 0;
phase_in_flag = 1;
dpd_log_string_save( "Phase 9.auto Will enter phase 10");
}
}
break;
case 10:
////////////// 10-4-Linear update
// in
psys->dpd_phase = 10;
if(phase_in_flag) {
log_printf(LOG_DEBUG, I_USER_CFG, "ph10_time = %d min\n",atsc_para.wj_para.ph10_time);
dpd_log_string_save( "Phase 10 in");
dpd_log_read_and_save( psys->dpd_phase);
fpga_byte_write(5,FPGA_ADDR_DPD_CFG_STEP, 0);
fpga_byte_write(5,0x25, 0xff);
fpga_byte_write(5,0x26, 0x04);
phase_in_flag = 0;
dpd_ctl2_reg = (DPD_CTRL2_PRL_UPDATE|DPD_CTRL2_AMP_CHK);
dpd_ctl3_reg = 0; // oneshu remove dags
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, dpd_ctl2_reg);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg);
u_dpdctl_r23.dpd_bt.iqb_upd = 0;
fpga_byte_write(5,FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] phase 10 --- 0x%x\n", u_dpdctl_r23.u8val);
}
dpd_log_read_and_save( psys->dpd_phase);
// out
if(sec_cnt >= atsc_para.wj_para.ph10_time*60 || g_query_skip == E_QUERY_SKIP) // 300
{
//note web set first
if(atsc_para.wj_para.ctl_dpd==E_DPD_SAVE_FLITER){
g_query_save =E_QUERY_CONFIRM;
log_printf(LOG_DEBUG, I_USER_CFG, "sta-10.save, fliter\n");
}
else if(atsc_para.wj_para.ctl_dpd==E_DPD_NSAVE_FLITER){
g_query_save =E_QUERY_CANCEL;
log_printf(LOG_DEBUG, I_USER_CFG, "sta-10.no save, no fliter\n");
}
else{
g_query_save =E_QUERY_CANCEL;
}
#if USE_REMOTE_DPD
//for web and uart
if(adpc_source_web){
adpc_source_web = 0;
g_query_save =E_QUERY_CONFIRM;
}
#endif
if(g_query_skip == E_QUERY_SKIP) {
g_query_skip=E_QUERY;
sec_cnt=0xffff;
}
//printf("\r\n step finished, finish the dpd process? >> ");
g_query_save_flg = PHASE10_SET_SAVE;// p10
dpd_log_string_save( "Phase 10 out, PHASE10_SET_SAVE");
}
break;
default:
break;
}
#if 1
DPD_SAVE_PROC:
if(g_query_save_flg != 0) {
/*if(g_query_save == 0)
g_query_save = E_QUERY;*/
if(g_query_save==E_QUERY_CONFIRM) {
if(g_query_save_flg == PHASE6_SET_SAVE)
g_query_operate = 0;
g_query_save_flg = 0;
g_query_save = 0;
//初始化配置,所有的 “控制”寄存器全部置0, 在ctrl123均配置0时,顺序应为2 1 3.
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL2, 0);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL1, 0);
fpga_byte_write(0x05, FPGA_ADDR_DPD_CTRL3, 0);
u_dpdctl_r23.u8val = 0;
fpga_byte_write(0x05, FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] save data --- 0x%x\n", u_dpdctl_r23.u8val);
fpga_byte_write(0x05, FPGA_ADDR_WPP_EN_CLR, 0);
fpga_byte_write(0x05, FPGA_ADDR_WPP_EN_CLR, MASK_WPP_CLR);
fpga_byte_write(0x05, FPGA_ADDR_WPP_EN_CLR, 0);
dpd_curve_proc(E_LOAD_TO_MCU);
if(dpd_ck_status==CK_OK){
psys->adpc_step = 3;
atsc_para.system_para.adpc = ADPC_HOLD;//断电保持
c256_bytewrite(EEPROM_DPD_ADDR, ADPC_HOLD);
c256_bytewrite(EEPROM_DPD_FLASH_VALID, 1);
log_printf(LOG_DEBUG, I_USER_CFG, "dpd load to mcu ok\n");
dpd_log_string_save("g_query_save E_QUERY_CONFIRM CK_OK, will DPD_SUCCESS");
goto DPD_SUCCESS;
}
else{
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR, ADPC_OFF);
psys->adpc_err = DPD_READ_CKECK_ERR;
log_printf(LOG_DEBUG, I_USER_CFG, "dpd load to mcu err\n");
dpd_log_string_save("g_query_save E_QUERY_CONFIRM !CK_OK, will DPD_END");
goto DPD_END;
}
}
else if(g_query_save==E_QUERY_CANCEL)
{
if(g_query_save_flg==PHASE6_SET_SAVE)
g_query_operate=0;
g_query_save_flg=0;
g_query_save=0;
psys->adpc_step = 3;
atsc_para.system_para.adpc = ADPC_HOLD;//断电失效
c256_bytewrite(EEPROM_DPD_ADDR,ADPC_OFF);
dpd_log_string_save("g_query_save E_QUERY_CANCEL , will DPD_SUCCESS");
goto DPD_SUCCESS;
}
}
#endif
gettimeofday(&now_tv, NULL);
now_sec = (uint32)now_tv.tv_sec;
if(last_sec_tick == 0) {
last_sec_tick = now_sec;
}
else if(now_sec != last_sec_tick) {
sec_cnt += now_sec - last_sec_tick;
last_sec_tick = now_sec;
}
break;
}
//--------------------------------------------------------------------
DPD_SUCCESS:
// DPD成功后停止校正过程,注意这里不含曲线的存储,即“Save to mcu”过程, 需弹出询问和添加save过程
if(psys->adpc_step==3){
// 顺序应为 2 - 1 - 3
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL2, 0);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL1, 0);
fpga_byte_write(5,FPGA_ADDR_DPD_CTRL3, 0);
u_dpdctl_r23.u8val = 0;
fpga_byte_write(5,FPGA_ADDR_DPD_IQB_UPD, u_dpdctl_r23.u8val);
log_printf(LOG_DEBUG, I_USER_CFG, "[update] success --- u_dpdctl_r23=0x%x\n", u_dpdctl_r23.u8val);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, 0);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, MASK_WPP_CLR);
fpga_byte_write(5,FPGA_ADDR_WPP_EN_CLR, 0);
// if(g_trigger_up_tsnr_flg == 0) {
// g_trigger_up_tsnr_flg = 1;
// g_trigger_up_start_flg = 1;
// printf("Do phase 78910 in background progress ~~\n");
// }
S_SYS_TIME bak_time = {0xff,};//本地时间
S_SYS_TIME now_time = {0,};
int ret = 0;
uint8 reset_up = 1;
uint8 uuu_phase = 0;
uint8 old_phase = 0;
char show_perc[5] = {0};
psys->final_stage = 3;
lcd_write_string(LINE_1,0," WAIT A MOMENT .... ");
lcd_write_string(LINE_2,0," FINAL STAGE ");
lcd_write_cache();
while(1)
{
get_sys_time(&now_time);
if(bak_time.sec != now_time.sec) {
pthread_mutex_lock(&mtx_phase78910_again);
ret = update_tsnr_uimd_limd(reset_up,&uuu_phase);
if(reset_up)
reset_up = 0;
if(uuu_phase!=old_phase){
psys->final_stage = 10-uuu_phase;
old_phase = uuu_phase;
memset(show_perc, 0, sizeof(show_perc));
sprintf(show_perc, "%d ", 10-uuu_phase);
lcd_write_string(LINE_2, 15, show_perc);
lcd_write_cache();
}
if(ret == 1) {
pthread_mutex_unlock(&mtx_phase78910_again);
break;
}
pthread_mutex_unlock(&mtx_phase78910_again);
get_sys_time(&bak_time);
}
usleep(20000);// 20ms
}
reset_dpd_to_normal_state();
psys->final_stage = 0xff;
//finished
atsc_para.system_para.adpc_step = 0x21;
atsc_para.system_para.dpd_phase = 0;
atsc_para.system_para.adpc_err = 0;
//for auto check dpd
update_flag = 0;
if(( TRUE == auto_update ) &&(s_check_signal.adpc_flag) ){
update_adpc_para_flag.flag=TRUE;
update_adpc_para_flag.sec = 60;
s_check_signal.adpc_flag = FALSE;
}
ret_father_menu();
dpd_log_file_close( "DPD Success, and Step=3");
}
DPD_END:
// 异常状态下的退出处理
if(psys->adpc_err&&(psys->adpc_err!=DPD_STATUS_UPDATING)&&psys->adpc_step!=0){
dpd_log_read_and_save_end("DPD process abort");
light_on_forever();
if(psys->adpc_err==DPD_CHECK_WPP_ERR_EXIT_HOLD){
psys->adpc = ADPC_HOLD;
dpd_log_read_and_save_end("check wpp DPD process esc and hold");
reset_dpd_to_normal_state();
}
else
{
psys->adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR, ADPC_OFF);
dpd_set_clr();
dpd_exit();
log_printf(LOG_DEBUG,I_NOUSED,"\b DPD process abort\r\n");
dpd_log_file_close( "DPD process abort due to ADPC_OFF. DPD_END");
//dpd_boot_run_init();
reset_dpd_to_normal_state();
}
//ret_father_menu();
if(psys->adpc_err != DPD_PROC_EXIT)
psys->adpc_step = 0;
}
if(psys->adpc_err && (psys->adpc_err != DPD_STATUS_UPDATING)) {
dpd_disp_step = psys->adpc_err;
if(g_query_save != 0)
g_query_save = 0;
if(g_query_operate != 0)
g_query_operate = 0;
}
else if(g_query_operate==E_QUERY)
dpd_disp_step = 0x88;
else if(g_query_operate==E_QUERY2)
dpd_disp_step = 0x77;
else if(g_query_save==E_QUERY)
dpd_disp_step = 0x66;
else if(g_query_wpp_to_save==E_QUERY)
dpd_disp_step = 0x55;
else if(g_prompt_skip_wpp==1)
dpd_disp_step = 0x44;
else
dpd_disp_step = psys->adpc_step;
switch(dpd_disp_step) {
case 0:
switch(disp_sec%3)
{
case 0:
sprintf(out_str, "WAIT A MOMENT. PREPARE UPDATING");
break;
case 1:
sprintf(out_str, "WAIT A MOMENT.. PREPARE UPDATING");
break;
case 2:
sprintf(out_str, "WAIT A MOMENT... PREPARE UPDATING");
break;
}
lcd_write_string(0,0," ");
lcd_write_string(0,0,out_str);
lcd_write_string(1,0," *CANCEL (ADPC OFF) ");
//dpd_log_file_close(p_dpd_log_fp, out_str);
break;
case 2: //校正中
switch(disp_sec%3)
{
case 0://dpd_sat_flg
sprintf(out_str, "WAITING(%02d). SNR MAXP ",psys->dpd_phase);//"WAIT A MOMENT(%02d). TSNR TXP WPP "
break;
case 1:
sprintf(out_str, "WAITING(%02d).. SNR MAXP ",psys->dpd_phase);//"WAIT A MOMENT(%02d).. TSNR TXP WPP "
break;
case 2:
sprintf(out_str, "WAITING(%02d)... SNR MAXP ",psys->dpd_phase);//"WAIT A MOMENT(%02d)... TSNR TXP WPP "
break;
}
lcd_write_string(0,0,out_str);
lcd_write_string(1,0, "[Esc]Exit [->]Next ");//"[Esc]Exit [->]Next "
psys->tsnr = u16_tsnr;
psys->maxp = wpp_max;
sprintf(out_str,"%02d.%01d",u16_tsnr/100,(u16_tsnr%100)/10);
lcd_write_string(1,19,out_str);
sprintf(out_str,"%d",wpp_max);
lcd_write_string(1,26,out_str);// 25
if(dpd_sat_flg==1){
lcd_write_string(LINE_2,39,"s");
}
else{
lcd_write_string(LINE_2,39," ");
}
break;
case DPD_STATE_ERR:
//lcd_write_string(0,0, " POWER RISE TOO MUCH ERROR! ");
lcd_write_string(0,0, " ADPC stoped - PA protection! [1]");
lcd_write_string(1,0, " Press Any key to ESC ");
break;
case DPD_STATE_POWER_HIGH:
//lcd_write_string(0,0, " FEEDBACK POWER IS HIGH! ");
lcd_write_string(0,0, " ADPC failed - Feedback high! [2]");
lcd_write_string(1,0, " Press Any key to ESC ");
break;
case DPD_STATE_POWER_LOW:
//lcd_write_string(0,0, " FEEDBACK POWER IS SMALL! ");
lcd_write_string(0,0, " ADPC failed - Feedback low! [3]");
lcd_write_string(1,0, " Press Any key to ESC ");
break;
case DPD_STATE_POWER_TOO_HIGH:
//lcd_write_string(0,0, " DAGC INPUT HIGH! ");
lcd_write_string(0,0, " ADPC failed - Feedback high! [4]");
lcd_write_string(1,0, " Press Any key to ESC ");
break;
case DPD_STATE_POWER_TOO_LOW:
//lcd_write_string(0,0, " DAGC INPUT SMALL! ");
lcd_write_string(0,0, " ADPC failed - Feedback low! [5]");
lcd_write_string(1,0, " Press Any key to ESC ");
break;
case DPD_STATE_ERR_OVER_RANGE:
//lcd_write_string(0,0, " ERROR IS TOO LARGE! ");
if(psys->dpd_phase>=1 && psys->dpd_phase<=6){
lcd_write_string(0,0, " ADPC stoped - Over distortion! [6]");
lcd_write_string(1,0, " Press Any key to ESC ");
}
else if(psys->dpd_phase){
lcd_write_string(0,0, " ADPC stoped - Check RF filter! [6]");
lcd_write_string(1,0, " Press Any key to ESC ");
}
break;
case DPD_READ_CKECK_ERR:
//lcd_write_string(0,0, " DPD READ FPGA CHECK ERROR! ");
lcd_write_string(0,0, " ADPC data save error! [8]");
lcd_write_string(1,0, " Press Any key to ESC ");
break;
case DPD_SYNC_TIMEOUT:
lcd_write_string(0,0, " ADPC failed - Sync time out! [10]");
lcd_write_string(1,0, " Press Any key to ESC ");
break;
case 0x99:
ret_father_menu();
sec_cnt = 0;
psys->adpc_step = 0;
psys->adpc_err = 0;
psys->dpd_phase = 0;
break;
//g_prompt_skip_wpp
case 0x44:
if(atsc_para.wj_para.ctl_dpd==E_DPD_SAVE_FLITER||atsc_para.wj_para.ctl_dpd==E_DPD_NSAVE_FLITER){
sprintf(out_str," Enter Next Phase [%02d] WPPMAX ",g_skip_next_dly);
}
else{
sprintf(out_str," Check WPP, Esc Now[%02d] WPPMAX ",g_skip_next_dly);
}
lcd_write_string(0,0, out_str);
lcd_write_string(1,0, " ");
memset(out_str,0,sizeof(out_str));
sprintf(out_str,"%d",g_wpp_max);//g_wpp_max
lcd_write_string(1,33,out_str);
break;
case 0x55:case DPD_CHECK_WPP_ERR_EXIT_HOLD:
//lcd_write_string(0,0, " Checked Pulse Power Over,Process Abort ");
//lcd_write_string(1,0, " [OK] Yes ");
lcd_write_string(0,0, " ADPC stoped - PA protection! [7]");
lcd_write_string(1,0, " [OK] Yes ");
break;
case 0x66:
lcd_write_string(0,0, " Save ADPC ? ");
lcd_write_string(1,0, " [OK] Yes [ESC] Exit ");
break;
case 0x77:
lcd_write_string(0,0, " START LINEAR ADPC ? ");
lcd_write_string(1,0, " [OK] Yes [ESC] Skip&Save ");
break;
case 0x88:
sprintf(out_str, " Continue to step %d ",psys->dpd_phase+1);
lcd_write_string(0,0, out_str);
//lcd_write_string(1,0, "[OK]Continue [->]Skip [^]Stop [ESC]Exit");//" [OK] Continue [->] Skip [ESC] Exit "
lcd_write_string(1,0, " [OK]Continue [^]Stop [ESC]Exit ");
break;
default:break;
}
DPD_FORCE_STOP:
if(atsc_adpc_force_stop_flag==TRUE)
{
uint8 stop_target = atsc_para.system_para.adpc;
atsc_adpc_force_stop_flag = FALSE;
atsc_para.system_para.adpc_step = 0;
atsc_para.system_para.adpc_err = 0;
atsc_para.system_para.dpd_phase = 0;
if(1){//强制退出处理
dpd_set_clr();
dpd_exit();
log_printf(LOG_DEBUG, I_USER_CFG, "\b DPD process abort\r\n");
dpd_log_file_close( "DPD force stop");
}
if(stop_target == ADPC_HOLD && c256_byteread(EEPROM_DPD_FLASH_VALID)) {
if(dpd_curve_proc(E_LOAD_TO_FPGA) == 0) {
atsc_para.system_para.adpc = ADPC_HOLD;
c256_bytewrite(EEPROM_DPD_ADDR, ADPC_HOLD);
}
else {
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR, ADPC_OFF);
}
}
else {
atsc_para.system_para.adpc = ADPC_OFF;
c256_bytewrite(EEPROM_DPD_ADDR, ADPC_OFF);
}
//dpd_boot_run_init();
reset_dpd_to_normal_state();
ret_father_menu();
}
}