#include <stdio.h>
#include<stdlib.h>
#include<string.h>
//#include "acs_entry.S"
//#include "timing.c"
//#include <asm/arch/acs.h>
//#include <asm/arch/timing.h>
//#include "timing.c"
typedef struct training_delay_set_ps{
	unsigned	char	ac_trace_delay[10];
	unsigned	char	ac_trace_delay_rev[2];
	unsigned	char	read_dqs_delay[16];
	unsigned	char	read_dq_bit_delay[72];
	unsigned	short	write_dqs_delay[16];

	unsigned	short	write_dq_bit_delay[72];
	unsigned	short	read_dqs_gate_delay[16];
	unsigned	char	soc_bit_vref[36];
	unsigned	char	dram_bit_vref[32];

	unsigned	char	rever1;//read_dqs  read_dq,write_dqs, write_dq
	unsigned	char	dfi_mrl;
	unsigned	char	dfi_hwtmrl;
	unsigned	char	ARdPtrInitVal;
	unsigned	short csr_vrefinglobal;
	unsigned short    csr_dqsrcvcntrl[4];
	unsigned short     csr_pptdqscntinvtrntg0[4];
	unsigned short     csr_pptdqscntinvtrntg1[4];
	unsigned short     csr_seq0bgpr[9];
	unsigned short     csr_dllgainctl;
	unsigned short     csr_dlllockpara;
//	unsigned short     rever2;
}__attribute__ ((packed)) training_delay_set_ps_t;

typedef struct ddr_phy_common_extra_set{
	unsigned short    csr_pllctrl3;
	unsigned short    csr_pptctlstatic[4];
	unsigned short    csr_trainingincdecdtsmen[4];
	unsigned short      csr_tsmbyte0[4];
	unsigned short     csr_hwtcamode;
	unsigned short     csr_hwtlpcsena;
	unsigned short     csr_hwtlpcsenb;
	unsigned short     csr_acsmctrl13;
	unsigned short     csr_acsmctrl23;
	unsigned char     csr_soc_vref_dac1_dfe[36];
}__attribute__ ((packed)) ddr_phy_common_extra_set_t;
#define DWC_AC_PINMUX_TOTAL						28
#define DWC_DFI_PINMUX_TOTAL					26
typedef struct ddr_set{
	unsigned	int		magic;
	unsigned	char	fast_boot[4];// 0   fastboot enable  1 window test margin  2 auto offset after window test 3 auto window test
	//unsigned	int		rsv_int0;
	unsigned	int		ddr_func;
	unsigned	char	board_id;
	//board id reserve,,do not modify
	unsigned	char	version;
	// firmware reserve version,,do not modify
	unsigned	char	DramType;
	//support DramType should confirm with amlogic
	//#define CONFIG_DDR_TYPE_DDR3				0
	//#define CONFIG_DDR_TYPE_DDR4				1
	//#define CONFIG_DDR_TYPE_LPDDR4				2
	//#define CONFIG_DDR_TYPE_LPDDR3				3
	//#define CONFIG_DDR_TYPE_LPDDR2				4
	unsigned	char	DisabledDbyte;
	//use for dram bus 16bit or 32bit,if use 16bit mode ,should disable bit 2,3
	//bit 0 ---use byte 0 ,1 disable byte 0,
	//bit 1 ---use byte 1 ,1 disable byte 1,
	//bit 2 ---use byte 2 ,1 disable byte 2,
	//bit 3 ---use byte 3 ,1 disable byte 3,
	unsigned	char	Is2Ttiming;
	//ddr3/ddr3 use 2t timing,now only support 2t timming
	unsigned	char	HdtCtrl;
	//training information control,do not modify
	unsigned	char	dram_rank_config;
	//support Dram connection type should confirm with amlogic
	//#define CONFIG_DDR0_16BIT_CH0				0x1  //dram total bus width 16bit only use cs0
	//#define CONFIG_DDR0_16BIT_RANK01_CH0		0x4  //dram total bus width 16bit  use cs0 cs1
	//#define CONFIG_DDR0_32BIT_RANK0_CH0			0x2  //dram total bus width 32bit  use cs0
	//#define CONFIG_DDR0_32BIT_RANK01_CH01		0x3    //only for lpddr4,dram total bus width 32bit  use chanel a cs0 cs1 chanel b cs0 cs1
	//#define CONFIG_DDR0_32BIT_16BIT_RANK0_CH0		0x5    //dram total bus width 32bit only use cs0,but high address use 16bit mode
	//#define CONFIG_DDR0_32BIT_16BIT_RANK01_CH0	0x6   //dram total bus width 32bit  use cs0 cs1,but cs1 use 16bit mode ,current phy not support reserve
	//#define CONFIG_DDR0_32BIT_RANK01_CH0		0x7       //dram total bus width 32bit  use cs0 cs1
	//#define CONFIG_DDR0_32BIT_RANK0_CH01		0x8     //only for lpddr4,dram total bus width 32bit  use chanel a cs0  chanel b cs0

	/* rsv_char0. update for diagnose type define */
	unsigned	char	diagnose;

	unsigned	short	soc_data_drv_ohm_ps1;
	unsigned	short	dram_data_drv_ohm_ps1;
	unsigned	short	soc_data_odt_ohm_ps1;
	unsigned	short	dram_data_odt_ohm_ps1;
	unsigned	short	dram_data_wr_odt_ohm_ps1;
	#if 0
	/* imem/dmem define */
	unsigned	int		imem_load_addr;
	//system reserve,do not modify
	unsigned	int		dmem_load_addr;
	//system reserve,do not modify
	unsigned	short	imem_load_size;
	#endif
	//system reserve,do not modify
	unsigned	short	dmem_load_size;
	//system reserve,do not modify
	unsigned	int		ddr_base_addr;
	//system reserve,do not modify
	unsigned	int		ddr_start_offset;
	//system reserve,do not modify

	unsigned	short	dram_cs0_size_MB;
	//config cs0 dram size ,like 1G DRAM ,setting 1024
	unsigned	short	dram_cs1_size_MB;
	//config cs1 dram size,like 512M DRAM ,setting 512
	/* align8 */

	unsigned	short	training_SequenceCtrl[2];
	//system reserve,do not modify
	unsigned	char	phy_odt_config_rank[2];
	//unsigned	char	 rever1;
	//unsigned	char	 rever2;
	unsigned	short	rank1_ca_vref_permil;
	//training odt config ,only use for training
	// [0]Odt pattern for accesses targeting rank 0. [3:0] is used for write ODT [7:4] is used for read ODT
	// [1]Odt pattern for accesses targeting rank 1. [3:0] is used for write ODT [7:4] is used for read ODT
	unsigned	int		dfi_odt_config;
	//normal go status od config,use for normal status
	//bit 12.  rank1 ODT default. default vulue for ODT[1] pins if theres no read/write activity.
	//bit 11.  rank1 ODT write sel.  enable ODT[1] if there's write occur in rank1.
	//bit 10.  rank1 ODT write nsel. enable ODT[1] if theres's write occur in rank0.
	//bit 9.   rank1 odt read sel.   enable ODT[1] if there's read occur in rank1.
	//bit 8.   rank1 odt read nsel.  enable ODT[1] if there's read occure in rank0.
	//bit 4.   rank0 ODT default.    default vulue for ODT[0] pins if theres no read/write activity.
	//bit 3.   rank0 ODT write sel.  enable ODT[0] if there's write occur in rank0.
	//bit 2.   rank0 ODT write nsel. enable ODT[0] if theres's write occur in rank1.
	//bit 1.   rank0 odt read sel.   enable ODT[0] if there's read occur in rank0.
	//bit 0.   rank0 odt read nsel.  enable ODT[0] if there's read occure in rank1.
	unsigned	short	DRAMFreq[4];
	//config dram frequency,use DRAMFreq[0],ohter reserve
	unsigned	char	PllBypassEn;
	//system reserve,do not modify
	unsigned	char	ddr_rdbi_wr_enable;
	//system reserve,do not modify
	unsigned	char	ddr_rfc_type;
	//config dram rfc type,according dram type,also can use same dram type max config
	//#define DDR_RFC_TYPE_DDR3_512Mbx1				0
	//#define DDR_RFC_TYPE_DDR3_512Mbx2				1
	//#define DDR_RFC_TYPE_DDR3_512Mbx4				2
	//#define DDR_RFC_TYPE_DDR3_512Mbx8				3
	//#define DDR_RFC_TYPE_DDR3_512Mbx16				4
	//#define DDR_RFC_TYPE_DDR4_2Gbx1					5
	//#define DDR_RFC_TYPE_DDR4_2Gbx2					6
	//#define DDR_RFC_TYPE_DDR4_2Gbx4					7
	//#define DDR_RFC_TYPE_DDR4_2Gbx8					8
	//#define DDR_RFC_TYPE_LPDDR4_2Gbx1				9
	//#define DDR_RFC_TYPE_LPDDR4_3Gbx1				10
	//#define DDR_RFC_TYPE_LPDDR4_4Gbx1				11
	unsigned	char	enable_lpddr4x_mode;
	//system reserve,do not modify
	/* align8 */

	unsigned	int		pll_ssc_mode;
	//
	/* pll ssc config:
	 *
	 *   pll_ssc_mode = (1<<20) | (1<<8) | ([strength] << 4) | [mode],
	 *      ppm = strength * 500
	 *      mode: 0=center, 1=up, 2=down
	 *
	 *   eg:
	 *     1. config 1000ppm center ss. then mode=0, strength=2
	 *        .pll_ssc_mode = (1<<20) | (1<<8) | (2 << 4) | 0,
	 *     2. config 3000ppm down ss. then mode=2, strength=6
	 *        .pll_ssc_mode = (1<<20) | (1<<8) | (6 << 4) | 2,
	 */
	unsigned	short	clk_drv_ohm;
	//config soc clk pin signal driver stength ,select 20,30,40,60ohm
	unsigned	short	cs_drv_ohm;
	//config soc cs0 cs1 pin signal driver stength ,select 20,30,40,60ohm
	unsigned	short	ac_drv_ohm;
	//config soc  normal address command pin driver stength ,select 20,30,40,60ohm
	unsigned	short	soc_data_drv_ohm_p;
	//config soc data pin pull up driver stength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
	unsigned	short	soc_data_drv_ohm_n;
	//config soc data pin pull down driver stength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
	unsigned	short	soc_data_odt_ohm_p;
	//config soc data pin odt pull up stength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
	unsigned	short	soc_data_odt_ohm_n;
	//config soc data pin odt pull down stength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
	unsigned	short	dram_data_drv_ohm;
	//config dram data pin pull up pull down driver stength,ddr3 select 34,40ohm,ddr4 select 34,48ohm,lpddr4 select 40,48,60,80,120,240ohm
	unsigned	short	dram_data_odt_ohm;
	//config dram data pin odt pull up down stength,ddr3 select 40,60,120ohm,ddr4 select 34,40,48,60,120,240ohm,lpddr4 select 40,48,60,80,120,240ohm
	unsigned	short	dram_ac_odt_ohm;
	//config dram ac pin odt pull up down stength,use for lpddr4, select 40,48,60,80,120,240ohm
	unsigned	short	soc_clk_slew_rate;
	//system reserve,do not modify
	unsigned	short	soc_cs_slew_rate;
	//system reserve,do not modify
	unsigned	short	soc_ac_slew_rate;
	//system reserve,do not modify
	unsigned	short	soc_data_slew_rate;
	//system reserve,do not modify
	unsigned	short	vref_output_permil; //phy
	//setting same with vref_dram_permil
	unsigned	short	vref_receiver_permil; //soc
	//soc init SOC receiver vref ,config like 500 means 0.5VDDQ,take care ,please follow SI
	unsigned	short	vref_dram_permil;
	//soc init DRAM receiver vref ,config like 500 means 0.5VDDQ,take care ,please follow SI
	unsigned	short	max_core_timmming_frequency;
	//use for limited ddr speed core timmming parameter,for some old dram maybe have no over speed register
	/* align8 */

	unsigned	char	ac_trace_delay[10];
	unsigned	char	lpddr4_dram_vout_voltage_1_3_2_5_setting;
	unsigned	char	lpddr4_x8_mode;
	unsigned	char	slt_test_function[2];  //[0] slt test function enable,bit 0 enable 4 frequency scan,bit 1 enable force delay line offset ,bit 7 enable skip training function
	//[1],slt test parameter ,use for force delay line offset
	//system reserve,do not modify
	unsigned	short	tdqs2dq;
	unsigned	char	dram_data_wr_odt_ohm;
	unsigned	char	bitTimeControl_2d;
	//system reserve,do not modify
	/* align8 */
    unsigned	char    char_rev1;
	unsigned	char    char_rev2;
	unsigned	int		ddr_dmc_remap[5];
	unsigned	int		dram_rtt_nom_wr_park[2];
	//system reserve,do not modify
	/* align8 */
	unsigned char		ddr_lpddr34_ca_remap[4];
	////use for lpddr3 /lpddr4 ca training data byte lane remap
	unsigned	char	ddr_lpddr34_dq_remap[32];
	////use for lpddr3 /lpddr4 ca pinmux remap
	unsigned	char	ac_pinmux[DWC_AC_PINMUX_TOTAL];
	//use for lpddr3 /lpddr4 ca pinmux remap
	unsigned	char	dfi_pinmux[DWC_DFI_PINMUX_TOTAL];
	unsigned	char    char_rev3;
	unsigned	char    char_rev4;
	ddr_phy_common_extra_set_t cfg_ddr_phy_common_extra_set_t;
	training_delay_set_ps_t	cfg_ddr_training_delay_ps[2];

} __attribute__ ((packed)) ddr_set_t;
typedef struct acs_setting{
		char				acs_magic[5];	//acs setting magic word, make sure this piece of data was right.
		unsigned char		chip_type;		//chip type
		unsigned short		version;		//version of acs_setting struct, for PC tool use.
		unsigned long		acs_set_length;	//length of current struct.

				//ddr setting part, 16 bytes
		char				ddr_magic[5];		//magic word to indicate that following 12 bytes was ddr setting.
		unsigned char		ddr_set_version;	//struct version, for PC tool use.
		unsigned short		ddr_set_length;		//length of ddr struct.
		unsigned long		ddr_set_addr;		//address of ddr setting.

		char				ddr_reg_magic[5];
		unsigned char		ddr_reg_version;
		unsigned short		ddr_reg_length;
		unsigned long		ddr_reg_addr;

		char				pll_magic[5];
		unsigned char		pll_set_version;
		unsigned short		pll_set_length;
		unsigned long		pll_set_addr;

		char				sto_magic[5];
		unsigned char		sto_set_version;
		unsigned short		sto_set_length;
		unsigned long		sto_set_addr;

		char				bl2_regs_magic[5];
		unsigned char		bl2_regs_version;
		unsigned short		bl2_regs_length;
		unsigned long		bl2_regs_addr;

		char				rsv_magic[5];
		unsigned char		rsv_set_version;
		unsigned short		rsv_set_length;
		unsigned long		rsv_set_addr;

		char				board_id[12];
		unsigned short				ddr_struct_size[12];
		unsigned long	ddr_struct_org_size;


}__attribute__ ((packed)) acs_set_t;
typedef struct pll_set{
	unsigned short    cpu_clk;
	unsigned short    pxp;
	unsigned int      spi_ctrl;
	unsigned short    vddee;
	unsigned short    vcck;
	unsigned char     szPad[4];

	unsigned long     lCustomerID;
	unsigned short    debug_mode;
	unsigned char    rsv1;
	unsigned char    ddr_timming_save_mode;

	/* align 8Byte */

	unsigned int      sys_pll_cntl[8];
	unsigned int      ddr_pll_cntl[8];
	unsigned int      fix_pll_cntl[8];

}__attribute__ ((packed)) pll_set_t;

//main acs struct
acs_set_t __acs_set={0};
acs_set_t  *acs_set_p;
acs_set_t  *acs_set_p_f;
pll_set_t __pll_set_t={0};
pll_set_t  *pll_set_p;
pll_set_t  *pll_set_p_f;

ddr_set_t __ddr_set_t={0};
ddr_set_t *ddr_set_p;
ddr_set_t *ddr_set_p_f;

int main(int argc, char **argv)
{
	ddr_set_p_f=&__ddr_set_t;
	pll_set_p_f=&__pll_set_t;
	acs_set_p_f=&__acs_set;
	int i=0;
	int temp1=0;
	int length_f=0;
	for (i = 0; i < argc; i++)
	{
		fprintf(stderr, "\narc[%d]=%s", i,argv[i]);
	}
	FILE *file;
	FILE *file_f;
	char *buffer = NULL;
	char *buffer_f = NULL;
	int finial_size=4096;

	buffer_f=(char *)malloc(finial_size+1);
	if (!buffer_f)
	{
		fprintf(stderr, "buffer_f Memory error!");
		exit(1);
	}
	memset(buffer_f, 0, (finial_size+1));
	unsigned long fileLen;
	char *file_path;
	char file_path_f[256];
	FILE *file_o;
	char file_path_o[256];
	char temp_value=0;

	if (argc>1)
		file_path=	argv[1];
	else
		file_path="acs.bin";

	file = fopen(file_path, "rb");
	if (!file)
	{
		fprintf(stderr, "can't open file %s", "acs.bin");
		free(buffer_f);
		exit(1);
	}

	//printf("\nfile_path==%s",file_path);
	sprintf(file_path_f, "%s_new", file_path);
	sprintf(file_path_o, "%s_old", file_path);
	//printf("\nfile_path_f==%s",file_path_f);
	file_f = fopen(file_path_f, "wb+");
	if (!file_f)
	{
		fprintf(stderr, "can't open file %s", "acs_new.bin");
		fclose(file);
		free(buffer_f);
		exit(1);
	}
	file_o= fopen(file_path_o, "wb+");
	if (!file_f)
	{
		fprintf(stderr, "can't open file %s", "acs_new.bin");
		fclose(file);
		fclose(file_f);
		free(buffer_f);
		exit(1);
	}

	fseek(file, 0, SEEK_END);
	fileLen=ftell(file);
	fseek(file, 0, SEEK_SET);
	printf("\nfileLen==%ld\n", fileLen);

	buffer=(char *)malloc(fileLen+1);
	if (!buffer)
	{
		fprintf(stderr, "Memory error!");
		fclose(file);
		fclose(file_f);
		fclose(file_o);
		free(buffer_f);
		exit(1);
	}

	fread(buffer, 1, fileLen+1, file);
	#if 0
	for (i = 0; i < fileLen; i++)
	{
		temp_value=(char)(buffer[i]);
		printf("%02x ",temp_value&0xff);
		if (i%16 == 15)
			printf("\n");
		// if(i%4==3)printf("  ");
	}
	#endif

	fwrite(buffer , sizeof(char), fileLen, file_o);
	fclose(file_o);

	unsigned int value_p = *((unsigned int *)(buffer + 4));
	unsigned int ddr_setting_addr = *(unsigned int *)(buffer + 12);
	unsigned int link_add = (*((unsigned int *)(buffer + 12)) & 0xfffff000);

	acs_set_p=(acs_set_t  *)((buffer)+(((unsigned long)(value_p))-link_add));
	pll_set_p=(pll_set_t  *)((buffer)+(((unsigned long)(acs_set_p->pll_set_addr))-link_add));
	ddr_set_p=(ddr_set_t  *)((buffer)+(((unsigned long)(acs_set_p->ddr_set_addr))-link_add));
	unsigned int ddr_timming_array=(acs_set_p->ddr_set_length/acs_set_p->ddr_struct_org_size);

	if (ddr_setting_addr != (unsigned int)(acs_set_p->ddr_set_addr))
	{
		fprintf(stderr, "link_add not right or exceed 4K! __ddr_setting: 0x%08x, __acs_set: 0x%08x",
			ddr_setting_addr, value_p);
		fclose(file);
		fclose(file_f);
		free(buffer);
		free(buffer_f);
		exit(1);
	}

	#if 1
	printf("\nvalue_p=0x%08x ", value_p);
	printf("\nacs_set_p->ddr_struct_org_size==0x%08x ",(unsigned int )acs_set_p->ddr_struct_org_size);
	printf("\nacs_set_p->ddr_set_addr==0x%08x ",(unsigned int )acs_set_p->ddr_set_addr);
	printf("\nacs_set_p->ddr_set_length==0x%08x ",(unsigned int )acs_set_p->ddr_set_length);
	printf("\nacs_set_p->ddr_array==0x%08x ", ddr_timming_array);

	printf("\nacs_set_p->pll_set_addr==0x%08x ",(unsigned int )acs_set_p->pll_set_addr);
	printf("\n");
	#endif
	if (0 == pll_set_p->ddr_timming_save_mode)
	{
		printf("\nstart reduce timing for mode %d", pll_set_p->ddr_timming_save_mode);

		for (i = 0; i < ((acs_set_p->ddr_set_addr) - link_add); i++)
		{
			buffer_f[i]=((buffer[i])&0xff);
			//printf("\n 0x%0x  ,buffer[i] %02x, buffer_f[i] %02x",i,((buffer[i])&0xff),(buffer_f[i]&0xff));
		}
		#if 0
		for (i = 0; i < finial_size; i++)
		{
			temp_value=(char)(buffer_f[i]);
			printf("%02x ",temp_value&0xff);
			if (i%16 == 15) printf("\n");
			// if(i%4==3)printf("  ");
		}
		#endif

		unsigned int ddr_set_addr_offset=0;
		ddr_set_addr_offset = ((acs_set_p->ddr_set_addr)-link_add);
		printf("\nlink_add=0x%08x", (unsigned int)(unsigned long)(link_add));
	#ifndef NO_DDR_SETTINGS_LAYOUT_OPTIMIZATION
		if (ddr_setting_addr > value_p)
		{
			acs_set_p = (acs_set_t *)((unsigned long)(buffer_f) + \
				(*(unsigned int *)(buffer_f + 4) - link_add));
			printf("\nupdate acs_set_p for layout optimized!");
		}
	#endif

		for (i = 0; i < ddr_timming_array; i++)
		{
			printf("\nconfig %d  (ddr_set_p->board_id)=0x%08x",i,(unsigned int )(unsigned long )((ddr_set_p->board_id)));
			if (ddr_set_p->board_id)
			{
				for (temp1 = (acs_set_p->ddr_struct_org_size); temp1 > 0; temp1--)
				{
					if ((buffer[i*(acs_set_p->ddr_struct_org_size)+ddr_set_addr_offset+temp1-1]) & 0xff)
					{
						acs_set_p->board_id[i]=(ddr_set_p->board_id);
						acs_set_p->ddr_struct_size[i]=((temp1+3)/4)*4;
						printf("\nacs_set_p->ddr_struct_size[i]=0x%08x",
								(unsigned int )(unsigned long )(acs_set_p->ddr_struct_size[i]));
						break;
					}
				}
			}
			else
			{
				acs_set_p->board_id[i]=0;
				acs_set_p->ddr_struct_size[i]=0;

			}
			ddr_set_p=ddr_set_p+1;
		}

		printf("\ncopy ddr timming ddr_set_p=0x%08x\n",(unsigned int )(unsigned long )(ddr_set_p));
		unsigned int ddr_set_addr_offset_f=0;
		ddr_set_addr_offset_f=((acs_set_p->ddr_set_addr)-link_add);
		for (i = 0; i < ddr_timming_array; i++)
		{
			if ((acs_set_p->board_id[i]) & 0xff)
			{
				if (i)
					ddr_set_addr_offset_f=ddr_set_addr_offset_f+acs_set_p->ddr_struct_size[i-1];
				for (temp1=0; temp1 < acs_set_p->ddr_struct_size[i]; temp1++)
				{
					(buffer_f[ddr_set_addr_offset_f+temp1])=(buffer[i*(acs_set_p->ddr_struct_org_size)+ddr_set_addr_offset+temp1])&0xff;
				}
			}
		}
		ddr_set_addr_offset_f=ddr_set_addr_offset_f+acs_set_p->ddr_struct_size[ddr_timming_array-1];
		unsigned int ddr_set_reduce_offset=ddr_timming_array*(acs_set_p->ddr_struct_org_size)+ddr_set_addr_offset-ddr_set_addr_offset_f;

	#ifdef NO_DDR_SETTINGS_LAYOUT_OPTIMIZATION
		if ((ddr_set_reduce_offset/4)%2)  //align byte 8  for other data
		{
			ddr_set_reduce_offset=ddr_set_reduce_offset-4;
			buffer_f[ddr_set_addr_offset_f+0]=0;
			buffer_f[ddr_set_addr_offset_f+1]=0;
			buffer_f[ddr_set_addr_offset_f+2]=0;
			buffer_f[ddr_set_addr_offset_f+3]=0;

			acs_set_p->ddr_struct_size[ddr_timming_array-1] += 4;
			ddr_set_addr_offset_f=ddr_set_addr_offset_f+4;
		}
	#endif

		if (fileLen - ddr_timming_array*(acs_set_p->ddr_struct_org_size) - ddr_set_addr_offset)
		{
			printf("\nError: __ddr_setting is not at end of acs firmware,no layout refine!\n");

	#ifdef NO_DDR_SETTINGS_LAYOUT_OPTIMIZATION
			for (i = 0;i < (fileLen-ddr_timming_array*(acs_set_p->ddr_struct_org_size)-ddr_set_addr_offset); i++)
			{
				buffer_f[ddr_set_addr_offset_f+i]=(buffer[i+ddr_timming_array*(acs_set_p->ddr_struct_org_size)+ddr_set_addr_offset])&0xff;
			}

			*((unsigned int *)((buffer_f)+4)) = *((unsigned int *)((buffer_f)+4)) - ddr_set_reduce_offset;
	#endif
		}

		printf("\nddr_set_reduce_offset=0x%08x",(unsigned int )(unsigned long )(ddr_set_reduce_offset));
		acs_set_p_f = (acs_set_t *)((unsigned long)(buffer_f) + \
				(((unsigned int)(*((unsigned int *)((unsigned long)(buffer_f)+4))))-link_add));
		printf("\n(buffer_f)=0x%0x,acs_set_p_f=0x%0x,acs_set_p_f_offset=0x%0x \n",
				(unsigned int)(unsigned long)(buffer_f), (unsigned int)(unsigned long)acs_set_p_f,
				(unsigned int)(*((unsigned int *)((unsigned long)(buffer_f)+4))) - link_add);

	#ifdef NO_DDR_SETTINGS_LAYOUT_OPTIMIZATION
		printf("\nacs_set_p->ddr_reg_addr=0x%08x\n",(unsigned int )(unsigned long )(acs_set_p->ddr_reg_addr));
		printf("\nacs_set_p_f->ddr_reg_addr=0x%08x\n",(unsigned int )(unsigned long )(acs_set_p_f->ddr_reg_addr));
		acs_set_p_f->ddr_reg_addr=acs_set_p->ddr_reg_addr-ddr_set_reduce_offset;
		//printf("\nwrite back 002  \n");
		acs_set_p_f->pll_set_addr=acs_set_p->pll_set_addr-ddr_set_reduce_offset;
		//printf("\nwrite back 003  \n");
		acs_set_p_f->bl2_regs_addr=acs_set_p->bl2_regs_addr-ddr_set_reduce_offset;
		//printf("\nwrite back 004  \n");
		acs_set_p_f->sto_set_addr=acs_set_p->sto_set_addr-ddr_set_reduce_offset;
		acs_set_p_f->rsv_set_addr=acs_set_p->rsv_set_addr-ddr_set_reduce_offset;
		acs_set_p_f->ddr_set_addr=acs_set_p->ddr_set_addr;//-ddr_set_reduce_offset;
		//unsigned long		sto_set_addr;
	#endif

		acs_set_p_f->ddr_set_length=acs_set_p->ddr_set_length-ddr_set_reduce_offset;
		length_f = fileLen - ddr_set_reduce_offset;

	#if 1
		printf("\nwrite back  \n");
		for (i = 0; i < length_f; i++)
		{
			temp_value=(char)(buffer_f[i]);
			printf("%02x ",temp_value&0xff);
			if (i%16 == 15)	printf("\n");
			// if(i%4==3)printf("  ");
		}
	#endif

	}
	else
	{
		length_f=fileLen;
		for (i = 0; i < (fileLen); i++)
		{
			buffer_f[i] = ((buffer[i]) & 0xff);
			//printf("\n 0x%0x  ,buffer[i] %02x, buffer_f[i] %02x",i,((buffer[i])&0xff),(buffer_f[i]&0xff));
		}
	}

	printf("\nfinal timing size:%dbytes, while original size:%dbytes\n", length_f, (unsigned int)fileLen);
	if (length_f > 4096)
		printf("\nwarning timming size over limmit");

	fwrite(buffer_f , sizeof(char), length_f, file_f);
	fclose(file_f);
	fclose(file);
	free(buffer);

	file = fopen(file_path, "wb+");
	if (!file)
	{
		fprintf(stderr, "can't open file %s", file_path);
		free(buffer_f);
		exit(1);
	}
	fwrite(buffer_f , sizeof(char), length_f, file);
	fclose(file);
	free(buffer_f);
}
