Parcourir la source

更新CPU工程驱动代码逻辑
1、更新倒车显示代码逻辑,一致采用非直通、缩放模式进行倒车显示。
2、优化itu驱动中代码的格式问题。

helen il y a 11 heures
Parent
commit
e6a7d2b62b

+ 4 - 0
amt630hv160-freertos-beta/ArkmicroFiles/libboard-amt630hv160/include/board.h

@@ -165,6 +165,10 @@
 #if VIN_WIDTH * VIN_HEIGHT > 0x96000
 #define VIN_SMALL_MEM
 #endif
+
+#define ITU_OUT_WIDTH		((LCD_WIDTH + 7) & (~0x7))	//需8字节对齐
+#define ITU_OUT_HEIGHT		LCD_HEIGHT
+
 /*******************************************/
 
 /************ carback configuration ********/

+ 8 - 40
amt630hv160-freertos-beta/ArkmicroFiles/libboard-amt630hv160/source/carback.c

@@ -64,7 +64,6 @@ static void carback_thread(void *param)
 	csi_init();
 #endif
 
-
 	for (;;) {
 		xTaskNotifyWait( 0x00, /* Don't clear any notification bits on entry. */
 			0xffffffff, /* Reset the notification value to 0 on exit. */
@@ -78,47 +77,16 @@ static void carback_thread(void *param)
 			para.itu601 = ITU_601;//ITU_601
 			para.out_format = ITU_Y_UV420;//ITU_Y_UV422;//ITU_Y_UV420;
 			//para.yuv_type = ITU_Y_UV;
-#if VIN_WIDTH != LCD_WIDTH || VIN_HEIGHT != LCD_HEIGHT
-			para.scale_bypass = 0;//0:scale enable 1:scale bypass
-#else
-			para.scale_bypass = 1;
-#endif
-
-			if(para.scale_bypass == 0)
-			{
-						
-				para.in_width = VIN_WIDTH;//VIN_WIDTH;
-				para.in_height = VIN_HEIGHT;//VIN_HEIGHT;
-#ifdef REVERSE_TRACK
-				para.out_width = 704;
-				para.out_height = 440;
-#else
-				para.out_width = LCD_WIDTH;
-				para.out_height = LCD_HEIGHT;
-#endif
-				para.scale_out_width = LCD_WIDTH;//LCD_WIDTH;
-				para.scale_out_height = LCD_HEIGHT;//LCD_HEIGHT;
-			}
-			else if(para.scale_bypass == 1)
-			{
-				para.in_width = VIN_WIDTH;//VIN_WIDTH;
-				para.in_height = VIN_HEIGHT;//VIN_HEIGHT;						
-
-#ifdef REVERSE_TRACK
-				para.out_width = 704;
-				para.out_height = 440;
-#else
-				para.out_width = VIN_WIDTH;//LCD_WIDTH;
-				para.out_height = VIN_HEIGHT;//LCD_HEIGHT;
-#endif
-				para.scale_out_width = VIN_WIDTH;//LCD_WIDTH;
-				para.scale_out_height = VIN_HEIGHT;//LCD_HEIGHT;
-			
-			}
-
+			para.scale_bypass = 0;
+			para.in_width = VIN_WIDTH;//VIN_WIDTH;
+			para.in_height = VIN_HEIGHT;//VIN_HEIGHT;
+			para.out_width = ITU_OUT_WIDTH;
+			para.out_height = ITU_OUT_HEIGHT;
+			para.scale_out_width = ITU_OUT_WIDTH;//LCD_WIDTH;
+			para.scale_out_height = ITU_OUT_HEIGHT;//LCD_HEIGHT;
 			para.Input_DataMode = ITU_ITU656_601;//ITU_MIPI;
 			para.hmirror = 0;//0:normal 1:horizontal mirror
-			para.vflip = 0;//0:normal 1:vertical filp			
+			para.vflip = 0;//0:normal 1:vertical filp
 
 			itu_config(&para);
 			itu_start();

+ 229 - 251
amt630hv160-freertos-beta/ArkmicroFiles/libcpu-amt630hv160/source/itu.c

@@ -2,10 +2,6 @@
 #include "board.h"
 #include "chip.h"
 
-#ifdef REVERSE_TRACK
-#include "vg_driver.h"
-#endif
-
 
 #define ITU_CTL                				(0x00)
 #define ITU_IMAGE_WIDTH             		(0x04)
@@ -62,11 +58,10 @@
 #define ITU_INT_STATUS						(0xDC)
 
 
-#define ITU656IN_BUF_NUM		4
-
+#define ITU656IN_BUF_NUM					4
 
-#define ITUFRAME_MAX_WIDTH		VIN_WIDTH
-#define ITUFRAME_MAX_HEIGHT		VIN_HEIGHT
+#define ITUFRAME_MAX_WIDTH					VIN_WIDTH
+#define ITUFRAME_MAX_HEIGHT					VIN_HEIGHT
 
 typedef struct {
 	uint32_t yaddr;
@@ -75,7 +70,6 @@ typedef struct {
 } ItuBufInfo;
 
 static uint32_t itubase = REGS_ITU_BASE;
-//static ItuBufInfo itubuf_info[ITU656IN_BUF_NUM] = {0};
 static ItuConfigPara itu_para;
 static TaskHandle_t itu_task;
 static SemaphoreHandle_t itu_mutex = NULL;
@@ -86,11 +80,11 @@ static int itu_take_video = 0;
 
 static unsigned int itu_get_frame_yadde(unsigned int itu_id)
 {
-	if(itu_id == 0)
-		return readl(itubase + ITU_YFRAM0_ADDR_START);		
-	else if(itu_id == 1)
-		return readl(itubase + ITU_YFRAM1_ADDR_START);	
-	else if(itu_id == 2)
+	if (itu_id == 0)
+		return readl(itubase + ITU_YFRAM0_ADDR_START);
+	else if (itu_id == 1)
+		return readl(itubase + ITU_YFRAM1_ADDR_START);
+	else if (itu_id == 2)
 		return readl(itubase + ITU_YFRAM2_ADDR_START);
 	else
 		return readl(itubase + ITU_YFRAM3_ADDR_START);
@@ -98,11 +92,11 @@ static unsigned int itu_get_frame_yadde(unsigned int itu_id)
 
 static unsigned int itu_get_frame_uvadde(unsigned int itu_id)
 {
-	if(itu_id == 0)
+	if (itu_id == 0)
 		return readl(itubase + ITU_CFRAM0_ADDR_START);
-	else if(itu_id == 1)
+	else if (itu_id == 1)
 		return readl(itubase + ITU_CFRAM1_ADDR_START);
-	else if(itu_id == 2)
+	else if (itu_id == 2)
 		return readl(itubase + ITU_CFRAM2_ADDR_START);
 	else
 		return readl(itubase + ITU_CFRAM3_ADDR_START);
@@ -111,37 +105,36 @@ static unsigned int itu_get_frame_uvadde(unsigned int itu_id)
 static void itu_interupt_handler(void *param)
 {
 	unsigned int status = readl(itubase + ITU_INT_STATUS);
-	unsigned int height = 0,wide = 0;
-	unsigned int totheight = 0,totwide = 0;
-	unsigned int curr_handle_frame_id=0;
+	unsigned int height = 0, wide = 0;
+	unsigned int totheight = 0, totwide = 0;
+	unsigned int curr_handle_frame_id = 0;
+
+	mdelay(2);
 
 	//clear inter
 	writel(status & 0xf0, itubase + ITU_INT_STATUS);
 
-	if(status >>4 & 0x1)
-	{
+	if ((status >> 4) & 0x1) {
 		unsigned int val;
 		val = readl(itubase + ITU_DET_REG3) ;
-		height = (val>>12)&0xFFF;
-		wide = val&0xFFF;
+		height = (val >> 12) & 0xFFF;
+		wide = val & 0xFFF;
 
-		val = readl(itubase + ITU_DET_REG2) ;		
-		totheight = (val>>12)&0xFFF;
-		totwide = val&0xFFF;
-		printf(">>>>height = %d,wide= %d,totheight = %d,totwide= %d\n",height ,wide,totheight ,totwide);
+		val = readl(itubase + ITU_DET_REG2) ;
+		totheight = (val >> 12) & 0xFFF;
+		totwide = val & 0xFFF;
+		printf(">>>>height = %d, wide= %d, totheight = %d, totwide= %d\n", height, wide, totheight, totwide);
 	}
-	if(status >> 6 & 0x1)
-	{
+
+	if ((status >> 6) & 0x1) {
 		unsigned int itu_dis_id = 1;
-		curr_handle_frame_id = readl(itubase + ITU_WR_STATUS) &0x3;
-		if(curr_handle_frame_id != 0)
+
+		curr_handle_frame_id = readl(itubase + ITU_WR_STATUS) & 0x3;
+		if (curr_handle_frame_id != 0)
 			itu_dis_id = curr_handle_frame_id - 1;
 		else
 			itu_dis_id = 3;
 
-	//	if (last_frame_id == itu_dis_id)
-	//		printf("itu_dis_id:%d \n", itu_dis_id);
-	//	last_frame_id = itu_dis_id;
 		xTaskNotifyFromISR(itu_task, itu_dis_id, eSetValueWithOverwrite, 0);
 	}
 }
@@ -150,27 +143,25 @@ void itu_clear_addr_for_hwuse(void)
 {
 	unsigned int regval = 0;
 	unsigned int current_id = readl(itubase + ITU_WR_STATUS);
-	if(current_id == ITU656IN_BUF_NUM - 1)
+	if (current_id == ITU656IN_BUF_NUM - 1)
 		regval = 1;
 	else
-	   regval = 1<<(current_id + 1);
+	   regval = 1 << (current_id + 1);
 	writel(regval, itubase + ITU_INT_STATUS);
 }
 
 void itu_clk_cofig(void)
 {
-  //select mfc clk 250M/5
-	unsigned int  reg = readl(REGS_SYSCTL_BASE + 0x7c);
-	reg &=~(0x1<<8);
-	reg |=(0x1<<8);
-	writel(reg , REGS_SYSCTL_BASE + 0x7c);
-  
+	//select mfc clk 250M/5
+	unsigned int reg = readl(REGS_SYSCTL_BASE + 0x7c);
+	reg &= ~(0x1 << 8);
+	reg |= (0x1 << 8);
+	writel(reg, REGS_SYSCTL_BASE + 0x7c);
+
 	reg = readl(itubase + ITU_SCAL_CLK_RST);
-	reg &=~(0x3f<<20);
-	//reg |=(0x5<<20);
-	reg |=(0x7<<20);
-	writel(reg , itubase + ITU_SCAL_CLK_RST);  
-       
+	reg &= ~(0x3f << 20);
+	reg |= (0x2 << 20);
+	writel(reg, itubase + ITU_SCAL_CLK_RST);
 }
 
 
@@ -181,10 +172,21 @@ int itu_config(ItuConfigPara *para)
 	int i;
 	unsigned int Total_line_num = 0;//585;
 	//thl  (输入clk/2)/(总行数*总点数) = (scaler_clk)/(thlen*总点数)
-	unsigned int Total_pixs_num = 2400;//2224(50M);//2661;//3333;//3232;//1716;//4608;	
-
-	configASSERT(para->in_width <= ITUFRAME_MAX_WIDTH &&
-		para->in_height <= ITUFRAME_MAX_HEIGHT);
+	unsigned int Total_pixs_num = 2400;//2224(50M);//2661;//3333;//3232;//1716;//4608;
+
+	configASSERT(para->in_width <= ITUFRAME_MAX_WIDTH && para->in_height <= ITUFRAME_MAX_HEIGHT);
+
+	/* 当前SCALE系数值是基于360MhzMFCPLL、ITU时钟2分频下得出。不同分辨率对应不同SCALE系数。ITU时钟变更、SCALE分辨率变更都需适配新的SCALE系数 */
+	if (para->scale_out_width == 1024 && para->scale_out_height == 600)
+		Total_pixs_num = 0x1E08;
+	else if (para->scale_out_width == 1920 && para->scale_out_height == 720)
+		Total_pixs_num = 0x1900;
+	else if (para->scale_out_width == 1280 && para->scale_out_height == 720)
+		Total_pixs_num = 0x1900;
+	else if (para->scale_out_width == 800 && para->scale_out_height == 480)
+		Total_pixs_num = 0x2568;
+	else
+		Total_pixs_num = 0x3ea0;
 
 	xSemaphoreTake(itu_mutex, portMAX_DELAY);
 	para->win_hst = 0;
@@ -208,197 +210,190 @@ int itu_config(ItuConfigPara *para)
 	para->vsyn_stop = para->vsyn_start + 3;
 
 	para->hgate_start = para->hsyn_stop + 20;
-	para->hgate_stop  = para->hgate_start +para->scale_out_width;
-	if(para->Input_DataMode == ITU_MIPI)
+	para->hgate_stop  = para->hgate_start + para->scale_out_width;
+
+	if (para->Input_DataMode == ITU_MIPI)
 		para->vgate_start = para->vsyn_stop + 0;
 	else
 	  	para->vgate_start = para->vsyn_stop + 18;
-	
+
 	para->vgate_stop  = para->vgate_start + para->scale_out_height;
-	para->vgate_start1= para->vgate_start;
+	para->vgate_start1 = para->vgate_start;
 	para->vgate_stop1 = para->vgate_stop + 0x10 ;
 
 	Total_line_num = para->vgate_stop + 50;
 
 	itu_clk_cofig();
-	writel((uint32_t)itu_buf, itubase + ITU_YFRAM0_ADDR_START);	
+	writel((uint32_t)itu_buf, itubase + ITU_YFRAM0_ADDR_START);
 	writel((uint32_t)itu_buf + para->out_width*para->out_height, itubase + ITU_CFRAM0_ADDR_START);
-	writel((uint32_t)itu_buf + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM0_ADDR_FLIP);	
-	if(para->out_format == ITU_Y_UV420)
-		writel(readl(itubase + ITU_CFRAM0_ADDR_START) + ((para->out_height/2 -1)*para->out_width), itubase + ITU_CFRAM0_ADDR_FLIP);
-	else if(para->out_format == ITU_Y_UV422)
-		writel(readl(itubase + ITU_CFRAM0_ADDR_START) + ((para->out_height -1)*para->out_width), itubase + ITU_CFRAM0_ADDR_FLIP);	
+	writel((uint32_t)itu_buf + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM0_ADDR_FLIP);
 
+	if (para->out_format == ITU_Y_UV420)
+		writel(readl(itubase + ITU_CFRAM0_ADDR_START) + ((para->out_height/2 -1) * para->out_width), itubase + ITU_CFRAM0_ADDR_FLIP);
+	else if (para->out_format == ITU_Y_UV422)
+		writel(readl(itubase + ITU_CFRAM0_ADDR_START) + ((para->out_height -1) * para->out_width), itubase + ITU_CFRAM0_ADDR_FLIP);
 
-	writel((uint32_t)itu_buf + para->out_width*para->out_height*2, itubase + ITU_YFRAM1_ADDR_START);
-	writel(readl(itubase + ITU_YFRAM1_ADDR_START) + para->out_width*para->out_height, itubase + ITU_CFRAM1_ADDR_START);
+	writel((uint32_t)itu_buf + para->out_width * para->out_height * 2, itubase + ITU_YFRAM1_ADDR_START);
+	writel(readl(itubase + ITU_YFRAM1_ADDR_START) + para->out_width * para->out_height, itubase + ITU_CFRAM1_ADDR_START);
 	writel(readl(itubase + ITU_YFRAM1_ADDR_START) + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM1_ADDR_FLIP)	;
-	if(para->out_format == ITU_Y_UV420)
-		writel(readl(itubase + ITU_CFRAM1_ADDR_START) + ((para->out_height/2 -1)*para->out_width), itubase + ITU_CFRAM1_ADDR_FLIP);	
-	else if(para->out_format == ITU_Y_UV422)
-		writel(readl(itubase + ITU_CFRAM1_ADDR_START) + ((para->out_height -1)*para->out_width), itubase + ITU_CFRAM1_ADDR_FLIP);	
-
-
-	writel((uint32_t)itu_buf + para->out_width*para->out_height*4, itubase + ITU_YFRAM2_ADDR_START);
-	writel(readl(itubase + ITU_YFRAM2_ADDR_START) + para->out_width*para->out_height, itubase + ITU_CFRAM2_ADDR_START);
-	writel(readl(itubase + ITU_YFRAM2_ADDR_START) + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM2_ADDR_FLIP);
-	if(para->out_format == ITU_Y_UV420)
-		writel(readl(itubase + ITU_CFRAM2_ADDR_START)+ ((para->out_height/2 -1)*para->out_width), itubase + ITU_CFRAM2_ADDR_FLIP);	
-	else if(para->out_format == ITU_Y_UV422)
-		writel(readl(itubase + ITU_CFRAM2_ADDR_START) + ((para->out_height -1)*para->out_width), itubase + ITU_CFRAM2_ADDR_FLIP);	
-
-
-	writel((uint32_t)itu_buf + para->out_width*para->out_height*6, itubase + ITU_YFRAM3_ADDR_START);	
-	writel(readl(itubase + ITU_YFRAM3_ADDR_START) + para->out_width*para->out_height, itubase + ITU_CFRAM3_ADDR_START);
-	writel(readl(itubase + ITU_YFRAM3_ADDR_START) + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM3_ADDR_FLIP);	
-	if(para->out_format == ITU_Y_UV420)
-	   writel(readl(itubase + ITU_CFRAM3_ADDR_START) + ((para->out_height/2 -1)*para->out_width), itubase + ITU_CFRAM3_ADDR_FLIP);
-	else if(para->out_format == ITU_Y_UV422)
-		writel(readl(itubase + ITU_CFRAM3_ADDR_START) + ((para->out_height -1)*para->out_width), itubase + ITU_CFRAM3_ADDR_FLIP);
-
-		writel(para->rec_hsp << 12  | para->rec_hst << 0, itubase + ITU_REC_HST_REC_HSP);
-		writel(para->rec_vsp << 12	| para->rec_vst << 0, itubase + ITU_REC_VST_REC_VSP);
-		writel(para->win_hsp << 12  | para->win_hst << 0, itubase + ITU_WIN_HST_WIN_HSP);
-		writel(para->win_vsp << 12  | para->win_hst << 0, itubase + ITU_WIN_VST_WIN_VSP);
-
-		writel(para->vgate_stop1 << 16	| para->vgate_start1<< 0, itubase + ITU_VGATE_START1_STOP1);
-		writel(para->hgate_stop  << 16  | para->hgate_start << 0, itubase + ITU_HGATE_START_STOP);
-		writel(para->hsyn_stop   << 16  | para->hsyn_start  << 0, itubase + ITU_HSYN_START_STOP);
-		writel(para->vsyn_stop   << 16	| para->vsyn_start  << 0, itubase + ITU_VSYN_START_STOP);
-		writel(para->vgate_stop  << 16  | para->vgate_start << 0, itubase + ITU_VGATE_START_STOP);
-
-		writel(para->itu_hstop << 12	| para->itu_hstart << 0, itubase + ITU_ITU_HSTART_HSTOP);
-		writel(para->itu_vstop << 12	| para->itu_vstart << 0, itubase + ITU_ITU_VSTART_VSTOP);		
-	
-		writel(2 | 0xc <<24 , itubase + ITU_SCALE_CTRL_REG);
-		writel((para->in_width * 1024 / (para->scale_out_width +  0x17/*para.left_cut_num*/))<<16, itubase + ITU_VSYN_DEL_HFZ);		
-		writel((para->in_height * 1024)/(para->scale_out_height + para->up_black_num) | Total_pixs_num<<16, itubase + ITU_VFZ_RHLEN_REG);		
-		writel( 0x14 << 8, itubase + ITU_DOWN_BLACK_NUM_HV_DELAY_COS_l);		
-		writel((Total_line_num & 0xff)<<24, itubase + ITU_COS_H_VXMOD_ODDF_INI_TVLEN_l);		
-		writel(0x0<<16 | 0x1<<11 | (Total_line_num>>8 & 0xff), itubase + ITU_TVLEN_H_SCAL_CTL);		
-		writel(0, itubase + ITU_VFILT_COEF0_3);		
-		writel(4<<24, itubase + ITU_VFILT_COEF4_6_VFILT_CTL);	
-	
-		writel(para->in_width | para->in_height<< 16, itubase + ITU_SRC_WIDE_HIGHT);
-		writel(para->in_width, itubase + ITU_SRC_WIDE_FILTER);		
-		writel(para->out_width |  para->out_width <<16, itubase + ITU_IMAGE_WIDTH);		
-		writel(para->in_height << 12 | para->in_width, itubase + ITU_DET_REG1);		
-
-	
-		writel(1<<9 | 1<<8 |3<<2 | 1<<1, itubase + ITU_EN_REG);
-		writel(readl(itubase + ITU_CTL)|(1<<6), itubase + ITU_CTL);//bit[3:2]fnum_sel/bit6 mode_en/bit7 yuv420
-		writel(readl(itubase + ITU_CTL)|2<<2 | 1<<1, itubase + ITU_CTL);//bit17 cbcr_inv bit5 hmirror bit4 vflip
-
-	
-		if(para->out_format == ITU_Y_UV420)
-		{
-			val = readl(itubase + ITU_CTL);
-			val &=~(1<<26 | 1<<7);
-			val |=  0<<26 | 1<<7 ;
-			writel(val,itubase + ITU_CTL);
-		}
-		else if(para->out_format == ITU_Y_UV422)
-		{
-			val = readl(itubase + ITU_CTL);
-			val &=~(1<<26 | 1<<7);
-			writel(val,itubase + ITU_CTL);
-	
-		}
-		else if(para->out_format == ITU_RGB_MODE)
-		{
-			val = readl(itubase + ITU_CTL);
-			val &=~(1<<26);
-			val |=(1<<26);
-			writel(val, itubase + ITU_CTL);
-		}
 
-		if(para->itu601 == ITU_601)
-		{
-			val = readl(itubase + ITU_EN_REG);
-			val &=~(3<<4);
-			val |= 2 << 4 ;
-			writel(val,itubase + ITU_EN_REG);
-		}
-		if(para->scale_bypass == 0)
-		{
-			val =readl(itubase +  ITU_CTL);
-			val &=~(1<<19);
-			//ITU_CTL  = val;//19bit scaler open
-			writel(val, itubase + ITU_CTL);
-			
-			val =readl(itubase + ITU_TVLEN_H_SCAL_CTL);
-			val |=(1<<8);
-			writel(val, itubase + ITU_TVLEN_H_SCAL_CTL);
-		}
-		else
-			writel(readl(itubase + ITU_CTL) | 1<<19 , itubase + ITU_CTL);	
+	if (para->out_format == ITU_Y_UV420)
+		writel(readl(itubase + ITU_CFRAM1_ADDR_START) + ((para->out_height / 2 -1) * para->out_width), itubase + ITU_CFRAM1_ADDR_FLIP);
+	else if (para->out_format == ITU_Y_UV422)
+		writel(readl(itubase + ITU_CFRAM1_ADDR_START) + ((para->out_height -1) * para->out_width), itubase + ITU_CFRAM1_ADDR_FLIP);
+
+
+	writel((uint32_t)itu_buf + para->out_width * para->out_height * 4, itubase + ITU_YFRAM2_ADDR_START);
+	writel(readl(itubase + ITU_YFRAM2_ADDR_START) + para->out_width * para->out_height, itubase + ITU_CFRAM2_ADDR_START);
+	writel(readl(itubase + ITU_YFRAM2_ADDR_START) + (para->out_height -1) * para->out_width, itubase + ITU_YFRAM2_ADDR_FLIP);
+
+	if (para->out_format == ITU_Y_UV420)
+		writel(readl(itubase + ITU_CFRAM2_ADDR_START)+ ((para->out_height / 2 - 1) * para->out_width), itubase + ITU_CFRAM2_ADDR_FLIP);
+	else if (para->out_format == ITU_Y_UV422)
+		writel(readl(itubase + ITU_CFRAM2_ADDR_START) + ((para->out_height - 1) * para->out_width), itubase + ITU_CFRAM2_ADDR_FLIP);
+
+
+	writel((uint32_t)itu_buf + para->out_width * para->out_height * 6, itubase + ITU_YFRAM3_ADDR_START);
+	writel(readl(itubase + ITU_YFRAM3_ADDR_START) + para->out_width * para->out_height, itubase + ITU_CFRAM3_ADDR_START);
+	writel(readl(itubase + ITU_YFRAM3_ADDR_START) + (para->out_height - 1) * para->out_width, itubase + ITU_YFRAM3_ADDR_FLIP);
+
+	if (para->out_format == ITU_Y_UV420)
+	   writel(readl(itubase + ITU_CFRAM3_ADDR_START) + ((para->out_height / 2 - 1) * para->out_width), itubase + ITU_CFRAM3_ADDR_FLIP);
+	else if (para->out_format == ITU_Y_UV422)
+		writel(readl(itubase + ITU_CFRAM3_ADDR_START) + ((para->out_height - 1) * para->out_width), itubase + ITU_CFRAM3_ADDR_FLIP);
+
+	writel(para->rec_hsp << 12 | para->rec_hst << 0, itubase + ITU_REC_HST_REC_HSP);
+	writel(para->rec_vsp << 12 | para->rec_vst << 0, itubase + ITU_REC_VST_REC_VSP);
+	writel(para->win_hsp << 12 | para->win_hst << 0, itubase + ITU_WIN_HST_WIN_HSP);
+	writel(para->win_vsp << 12 | para->win_hst << 0, itubase + ITU_WIN_VST_WIN_VSP);
+
+	writel(para->vgate_stop1 << 16 | para->vgate_start1<< 0, itubase + ITU_VGATE_START1_STOP1);
+	writel(para->hgate_stop << 16 | para->hgate_start << 0, itubase + ITU_HGATE_START_STOP);
+	writel(para->hsyn_stop << 16 | para->hsyn_start << 0, itubase + ITU_HSYN_START_STOP);
+	writel(para->vsyn_stop << 16 | para->vsyn_start << 0, itubase + ITU_VSYN_START_STOP);
+	writel(para->vgate_stop << 16 | para->vgate_start << 0, itubase + ITU_VGATE_START_STOP);
+
+	writel(para->itu_hstop << 12 | para->itu_hstart << 0, itubase + ITU_ITU_HSTART_HSTOP);
+	writel(para->itu_vstop << 12 | para->itu_vstart << 0, itubase + ITU_ITU_VSTART_VSTOP);
+
+	writel(2 | 0xc << 24 , itubase + ITU_SCALE_CTRL_REG);
+	writel((para->in_width * 1024 / (para->scale_out_width + 0x17/*para.left_cut_num*/)) << 16, itubase + ITU_VSYN_DEL_HFZ);
+	writel((para->in_height * 1024) / (para->scale_out_height + para->up_black_num) | Total_pixs_num << 16, itubase + ITU_VFZ_RHLEN_REG);
+	writel(0x14 << 8, itubase + ITU_DOWN_BLACK_NUM_HV_DELAY_COS_l);
+	writel((Total_line_num & 0xff) << 24, itubase + ITU_COS_H_VXMOD_ODDF_INI_TVLEN_l);
+	writel(0x0 << 16 | 0x1 << 11 | (Total_line_num >> 8 & 0xff), itubase + ITU_TVLEN_H_SCAL_CTL);
+	writel(0, itubase + ITU_VFILT_COEF0_3);
+	writel(4 << 24, itubase + ITU_VFILT_COEF4_6_VFILT_CTL);
+
+	writel(para->in_width | para->in_height << 16, itubase + ITU_SRC_WIDE_HIGHT);
+	writel(para->in_width, itubase + ITU_SRC_WIDE_FILTER);
+	writel(para->out_width | para->out_width << 16, itubase + ITU_IMAGE_WIDTH);
+	writel(para->in_height << 12 | para->in_width, itubase + ITU_DET_REG1);
+
+
+	writel(1 << 9 | 1 << 8 | 3 << 2 | 1 << 1, itubase + ITU_EN_REG);
+	writel(readl(itubase + ITU_CTL) | (1 << 6), itubase + ITU_CTL);//bit[3:2]fnum_sel/bit6 mode_en/bit7 yuv420
+	writel(readl(itubase + ITU_CTL) | 2 << 2 | 1 << 1, itubase + ITU_CTL);//bit17 cbcr_inv bit5 hmirror bit4 vflip
+
+	if (para->out_format == ITU_Y_UV420) {
+		val = readl(itubase + ITU_CTL);
+		val &= ~(1 << 26 | 1 << 7);
+		val |=  0 << 26 | 1 << 7 ;
+		writel(val, itubase + ITU_CTL);
+	} else if (para->out_format == ITU_Y_UV422) {
+		val = readl(itubase + ITU_CTL);
+		val &= ~(1 << 26 | 1 << 7);
+		writel(val, itubase + ITU_CTL);
+
+	} else if (para->out_format == ITU_RGB_MODE) {
+		val = readl(itubase + ITU_CTL);
+		val &= ~(1 << 26);
+		val |= (1 << 26);
+		writel(val, itubase + ITU_CTL);
+	}
+
+	if (para->itu601 == ITU_601) {
+		val = readl(itubase + ITU_EN_REG);
+		val &= ~(3 << 4);
+		val |= 2 << 4 ;
+		writel(val, itubase + ITU_EN_REG);
+	}
+
+	if (para->scale_bypass == 0) {
+		val = readl(itubase +  ITU_CTL);
+		val &= ~(1 << 19);
+		//ITU_CTL  = val;//19bit scaler open
+		writel(val, itubase + ITU_CTL);
+
+		val = readl(itubase + ITU_TVLEN_H_SCAL_CTL);
+		val |= (1 << 8);
+		writel(val, itubase + ITU_TVLEN_H_SCAL_CTL);
+	} else
+		writel(readl(itubase + ITU_CTL) | 1 << 19, itubase + ITU_CTL);
+
 	//open mirror
-		if(para->hmirror == 1)
-		{
-			val =readl(itubase + ITU_CTL);
-			val &=~(1<<5 | 0x3ff<<8);
-			val |=(1<<5)| ((para->out_width/8)-1) << 8;
-			writel(val,itubase + ITU_CTL);
-	
-			val = readl(itubase + ITU_EN_REG);
-			val &=~(1<<1);
-			writel(val,itubase + ITU_EN_REG);
-		}
+	if (para->hmirror == 1) {
+		val = readl(itubase + ITU_CTL);
+		val &= ~(1 << 5 | 0x3ff << 8);
+		val |= (1 << 5) | ((para->out_width / 8) - 1) << 8;
+		writel(val, itubase + ITU_CTL);
+
+		val = readl(itubase + ITU_EN_REG);
+		val &= ~(1 << 1);
+		writel(val, itubase + ITU_EN_REG);
+	}
+
 	//open flip
-		if(para->vflip== 1)
-		{
-			val = readl(itubase + ITU_CTL);
-			val &=~(1<<4);
-			val |= (1<<4);
-			writel(val,itubase + ITU_CTL);
-		}
+	if (para->vflip == 1) {
+		val = readl(itubase + ITU_CTL);
+		val &= ~(1 << 4);
+		val |= (1 << 4);
+		writel(val, itubase + ITU_CTL);
+	}
 
 
-		if(para->Input_DataMode == ITU_MIPI)
-		{
-			val = readl(itubase + ITU_CTL);
-			val &=~((1<<24));
-			val |=((1<<24));
-			writel(val, itubase + ITU_CTL);
-
-			val = readl(itubase + ITU_SCAL_CLK_RST);
-			val &=~((1<<11));
-			val |=((1<<11));
-			writel(val, itubase + ITU_SCAL_CLK_RST); 
-
-			val = readl(itubase + ITU_CTL);
-			val &=~((1<<22)|(1<<1));
-			writel(val, itubase + ITU_CTL);			
-			
-			val = readl(itubase + ITU_SCALE_CTRL_REG);
-			val &=~((1<<30));
-			val |=((1<<30));
-			writel(val, itubase + ITU_SCALE_CTRL_REG); 			
-		}		
-		else if(para->Input_DataMode == ITU_ITU656_601)
-		{
-			val = readl(itubase + ITU_CTL);
-			val &=~((1<<24));
-			writel(val, itubase + ITU_CTL); 				
-		}
-		if(para->in_height == 1080)
-		{
-			val = readl(itubase + ITU_EN_REG);
-			val &=~((1<<1) | (1<<2));
-			writel(val, itubase + ITU_EN_REG); 			
-		}
-		
+	if (para->Input_DataMode == ITU_MIPI) {
 		val = readl(itubase + ITU_CTL);
-		val &=~((1<<28) | (1<<29) | (1<<0));
-		writel(val, itubase + ITU_CTL); 	
-
-		val = readl(itubase + ITU_DET_REG0);
-		val &=~((7<<0));
-		val |=((7<<0));
-		writel(val, itubase + ITU_DET_REG0); 
-		
-//		writel(0x05380400, itubase + ITU_VFZ_RHLEN_REG);
-		memcpy(&itu_para, para, sizeof(itu_para));
+		val &= ~((1 << 24));
+		val |= ((1 << 24));
+		writel(val, itubase + ITU_CTL);
+
+		val = readl(itubase + ITU_SCAL_CLK_RST);
+		val &= ~((1 << 11));
+		val |= ((1 << 11));
+		writel(val, itubase + ITU_SCAL_CLK_RST);
+
+		val = readl(itubase + ITU_CTL);
+		val &= ~((1 << 22) | (1 << 1));
+		writel(val, itubase + ITU_CTL);
+
+		val = readl(itubase + ITU_SCALE_CTRL_REG);
+		val &= ~((1 << 30));
+		val |= ((1 << 30));
+		writel(val, itubase + ITU_SCALE_CTRL_REG);
+	} else if (para->Input_DataMode == ITU_ITU656_601) {
+		val = readl(itubase + ITU_CTL);
+		val &= ~((1 << 24));
+		writel(val, itubase + ITU_CTL);
+	}
+
+	if (para->in_height == 1080) {
+		val = readl(itubase + ITU_EN_REG);
+		val &= ~((1 << 1) | (1 << 2));
+		writel(val, itubase + ITU_EN_REG);
+	}
+
+	val = readl(itubase + ITU_CTL);
+	val &= ~((1 << 28) | (1 << 29) | (1 << 0));
+	writel(val, itubase + ITU_CTL);
+
+	val = readl(itubase + ITU_DET_REG0);
+	val &= ~((7 << 0));
+	val |= ((7 << 0));
+	writel(val, itubase + ITU_DET_REG0);
+
+//	writel(0x05380400, itubase + ITU_VFZ_RHLEN_REG);
+	memcpy(&itu_para, para, sizeof(itu_para));
 end:
 	xSemaphoreGive(itu_mutex);
 
@@ -413,12 +408,12 @@ void itu_start(void)
 	xSemaphoreTake(itu_mutex, portMAX_DELAY);
 
 	val = readl(itubase + ITU_EN_REG);
-	val |= (1<<0);
+	val |= (1 << 0);
 	writel(val, itubase + ITU_EN_REG);
 	val = readl(itubase + ITU_CTL);
-	val |= (1<<0);
+	val |= (1 << 0);
 	writel(val, itubase + ITU_CTL);
-	
+
 	itu_enable = 1;
 	xSemaphoreGive(itu_mutex);
 }
@@ -431,19 +426,14 @@ void itu_stop(void)
 	xSemaphoreTake(itu_mutex, portMAX_DELAY);
 
 	val = readl(itubase + ITU_EN_REG);
-	val &=~(1<<0);
+	val &= ~(1 << 0);
 	writel(val, itubase + ITU_EN_REG);
 	val = readl(itubase + ITU_CTL);
-	val &=~(1<<0);
+	val &= ~(1 << 0);
 	writel(val, itubase + ITU_CTL);
 
 	itu_enable = 0;
-#ifndef REVERSE_UI
-	ark_lcd_osd_enable(LCD_VIDEO_LAYER, 0);
-	ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
-	ark_lcd_osd_enable(LCD_OSD1, 1);
-	ark_lcd_set_osd_sync(LCD_OSD1);
-#endif
+
 	xTaskNotify(itu_task, 0, eSetValueWithOverwrite);
 	xSemaphoreGive(itu_mutex);
 }
@@ -458,7 +448,6 @@ void itu_display_thread(void *param)
 			0xffffffff, /* Reset the notification value to 0 on exit. */
 			&ulNotifiedValue, /* Notified value pass out in ulNotifiedValue. */
 			portMAX_DELAY);
-//		printf("received address id 0x%x.\n", ulNotifiedValue);
 
 		xSemaphoreTake(itu_mutex, portMAX_DELAY);
 		if (!itu_enable) {
@@ -486,17 +475,9 @@ void itu_display_thread(void *param)
 		   花屏等问题 */
 		dstaddr = ulVideoDisplayBufGet();
 
-		yaddr = itu_get_frame_yadde(ulNotifiedValue);//ulNotifiedValue;
-		uvaddr = itu_get_frame_uvadde(ulNotifiedValue);//yaddr + itu_para.in_width * itu_para.in_height;
-
-#ifdef REVERSE_TRACK
-		extern int get_reverse_track_index(void);
-		static int index = 58;
-		index = get_reverse_track_index();
-		xm_vg_set_gpu_fb_addr(dstaddr);
-		xm_vg_draw_prepare(&index);
-		xm_vg_draw_start();
-#endif
+		yaddr = itu_get_frame_yadde(ulNotifiedValue);
+		uvaddr = itu_get_frame_uvadde(ulNotifiedValue);
+
 		LcdOsdInfo info = {0};
 		info.x = itu_para.out_x;
 		info.y = itu_para.out_y;
@@ -514,10 +495,7 @@ void itu_display_thread(void *param)
 		ark_lcd_set_osd_info_atomic(LCD_VIDEO_LAYER, &info);
 		ark_lcd_osd_enable(LCD_VIDEO_LAYER, 1);
 		ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
-#ifndef REVERSE_UI
-		ark_lcd_osd_enable(LCD_OSD1, 0);
-		ark_lcd_set_osd_sync(LCD_OSD1);
-#endif
+
 		itu_clear_addr_for_hwuse();
 		vVideoDisplayBufRender(dstaddr);
 		xSemaphoreGive(itu_mutex);