Procházet zdrojové kódy

merge carback for luyuan

daozhongwan před 3 roky
rodič
revize
7c9df451b2

+ 55 - 40
linux/drivers/soc/arkmicro/carback/ark1668e_carback.c

@@ -37,11 +37,12 @@ extern int dvr_detect_carback_signal(void);
 extern int dvr_get_layer_status(void);
 extern int ark_disp_set_layer_en(int layer_id, int enable);
 #endif
-
-extern int get_bootanimation_status(void);
+
+extern int get_bootanimation_status(void);
 
 struct carback_context* g_carback_context = NULL;
 static int delay_show_track = 0;
+int track_switch_id = 0;
 
 #ifdef CONFIG_REVERSING_TRACK
 #define ARK_DISP_OSD_PIXFMT_RGBA888    6
@@ -51,7 +52,6 @@ int first_show_track = 1;
 int vbox_track_paint = 0; 
 
 #endif
-
 //#define TRACK_TEST
 
 static void carback_filter_timer_irq(struct timer_list *t)
@@ -59,8 +59,8 @@ static void carback_filter_timer_irq(struct timer_list *t)
 	queue_work(g_carback_context->carback_queue, &g_carback_context->carback_work);
 }
 
-void carback_int_work(struct work_struct *work)
-{
+void carback_int_work(struct work_struct *work)
+{
 	struct carback_context *context = container_of(work, struct carback_context, carback_work);
 	struct ark_carback *carback = container_of(context, struct ark_carback, context);
 	int status = !gpiod_get_value(context->detect);	
@@ -99,8 +99,9 @@ void carback_int_work(struct work_struct *work)
 				}
 				context->app_enter_done = 0;
 			} else ark_disp_set_layer_en(3, 0);
-			if(!get_bootanimation_status())
-				ark_disp_set_layer_en(0, 0);   //close bootanmation
+
+			if(!get_bootanimation_status())
+				ark_disp_set_layer_en(0, 0);   //close bootanmation
 			context->track_data_status = 0;
 			dvr_enter_carback();
 #ifdef CONFIG_REVERSING_TRACK
@@ -120,8 +121,9 @@ void carback_int_work(struct work_struct *work)
 				}
 				context->app_exit_done = 0;
 			} else ark_disp_set_layer_en(3, 1);	
-			if(!get_bootanimation_status())
-				ark_disp_set_layer_en(0, 1);   //open bootanmation
+
+			if(!get_bootanimation_status())
+				ark_disp_set_layer_en(0, 1);   //open bootanmation
 			
 #ifdef CONFIG_REVERSING_TRACK	
 			context->track_data_status = 1;
@@ -137,7 +139,7 @@ static void carback_signal_detect(void)
 	struct carback_context *context = g_carback_context;
 	int status = !gpiod_get_value(context->detect);	
 	int temp_signal;
-    if(status){
+    if(status){
         temp_signal = dvr_detect_carback_signal();
         if(temp_signal == 0){
 			carback_detect_count++;
@@ -155,7 +157,7 @@ static void carback_signal_detect(void)
             context->carback_count = 0;
 			carback_detect_count = 0;
         }
-    }
+    }
 }
 
 #ifdef CONFIG_REVERSING_TRACK
@@ -305,7 +307,6 @@ void track_change_test(void)
 }
 #endif
 
-
 void track_paint_work(struct work_struct *work)
 {
 	struct carback_context *context = container_of(work, struct carback_context, track_work);
@@ -314,9 +315,8 @@ void track_paint_work(struct work_struct *work)
 
 	carback_signal_detect();
 	context->layer_status = dvr_get_layer_status();
-		
 	if(context->carback_signal == 0 )
-		set_disp_signal_id(SIGNAL_NORMAL_STATUS_ID);
+			set_disp_signal_id(SIGNAL_NORMAL_STATUS_ID);
 
 	if(context->carback_signal == 1){
 		if(context->layer_status)
@@ -398,7 +398,7 @@ static int ark_carback_dev_init(struct carback_context *context)
 static int ark_carback_dev_uninit(struct carback_context *context)
 {
 	del_timer(&context->carback_filter_timer);
-
+
 	if(context->carback_queue)
 		destroy_workqueue(context->carback_queue);
 
@@ -417,41 +417,41 @@ irqreturn_t ark_carback_intr_handler(int irq, void *dev_id)
 }
 
 static ssize_t ark_carback_read(struct file *filp, char __user *user, size_t size,loff_t *ppos)
-{
+{
         struct ark_carback *carback = (struct ark_carback *)filp->private_data;
         unsigned long flags;
 
-        if (size != 1)
-                return -EINVAL;
-
-        // if backcar changed ,will enter ark_backcar_intr_handler, set carback_changed
+        if (size != 1)
+                return -EINVAL;
+
+        // if backcar changed ,will enter ark_backcar_intr_handler, set carback_changed
         wait_event_interruptible(carback->context.carback_waiq, carback->context.carback_changed);
         if (copy_to_user(user, &carback->context.carback_status, 1)) {
                 printk("%s %d: copy_to_user error\n",__FUNCTION__, __LINE__);
                 return -EFAULT;
         }
         spin_lock_irqsave(&carback->context.spin_lock, flags);
-        /* clear backcar_changed*/
+        /* clear backcar_changed*/
         carback->context.carback_changed = 0;
         spin_unlock_irqrestore(&carback->context.spin_lock, flags);
-
-        return 1;
+
+        return 1;
 }
 
 static unsigned int ark_carback_poll(struct file *filp, poll_table *wait)
-{
+{
 	struct ark_carback *carback = (struct ark_carback *)filp->private_data;
-	unsigned int mask = 0;
-
+	unsigned int mask = 0;
+
 	poll_wait(filp, &carback->context.carback_waiq, wait);
-
-	// if backcar changed ,will enter ark_backcar_intr_handler, set carback_changed
+
+	// if backcar changed ,will enter ark_backcar_intr_handler, set carback_changed
 	if(carback->context.carback_changed)
-	{
-		mask |= POLLIN | POLLRDNORM;
-	}
-
-	return mask;
+	{
+		mask |= POLLIN | POLLRDNORM;
+	}
+
+	return mask;
 }
 
 static int ark_carback_open(struct inode *inode, struct file *filp)
@@ -503,6 +503,9 @@ static long ark_carback_ioctl(struct file *filp,
     switch (cmd)
     {
     case CARBACK_IOCTL_SET_APP_READY:
+		context->track_append_setting = 0;
+		set_disp_append1_id(IMAGE_ID_NONE);
+		set_disp_append2_id(IMAGE_ID_NONE);
 		context->app_ready = 1;
 		break;
 	case CARBACK_IOCTL_APP_ENTER_DONE:
@@ -518,7 +521,7 @@ static long ark_carback_ioctl(struct file *filp,
 			int status = context->carback_status;
 			if (copy_to_user((void*)arg, &status, sizeof(status))) {
                 printk("cmd CARBACK_IOCTL_GET_STATUS %s %d: copy_to_user error\n",
-                    __FUNCTION__, __LINE__);
+                    __FUNCTION__, __LINE__);
                 return -EFAULT;
 			}
 		}
@@ -528,7 +531,7 @@ static long ark_carback_ioctl(struct file *filp,
 			int signal = dvr_detect_carback_signal();
 			if (copy_to_user((void*)arg, &signal, sizeof(signal))) {
                 printk("cmd CARBACK_IOCTL_DETECT_SIGNAL %s %d: copy_to_user error\n",
-                    __FUNCTION__, __LINE__);
+                    __FUNCTION__, __LINE__);
                 return -EFAULT;
 			}			
 		}
@@ -809,6 +812,16 @@ static const struct of_device_id ark_carback_of_match[] = {
 	{ .compatible = "arkmicro,ark1668e-carback", },
 		{ /* sentinel */ }
 };
+
+static int __init trackid_setup(char *str)
+{
+	int trak_id = 0;
+	trak_id = simple_strtoul(str,NULL,10);
+	track_switch_id = trak_id;
+	return 0;
+}
+__setup("trackid=", trackid_setup);
+
 static int  ark_carback_probe(struct platform_device *pdev)
 {
     struct ark_carback *carback;
@@ -925,6 +938,7 @@ static int  ark_carback_probe(struct platform_device *pdev)
     carback->context.track_frame_delay = 100;//100ms
     carback->context.track_data_status = 1;
 	carback->context.carback_signal = 1;
+    carback->context.track_append_setting = 1;
 	carback->context.track_setting = 1;
 	carback->context.layer_status= 0;
 	carback->context.layer_status= 0;
@@ -957,7 +971,8 @@ static int  ark_carback_probe(struct platform_device *pdev)
 				printk(KERN_ALERT "%s %d: ,alloc track display buffer failed.\n",__FUNCTION__, __LINE__);  
 			} else {   
 				timer_setup(&carback->context.track_timer, track_timer_handler, 0);
-				
+
+				
 				for(i = 0; i < carback->context.buffer_num; i++){
 					carback->context.tdisplay_virtaddr[i] = carback->context.track_display_virtaddr + carback->context.screen_width * carback->context.screen_height * 4*i;
 					carback->context.tdisplay_phyaddr[i] = carback->context.track_display_phyaddr + carback->context.screen_width * carback->context.screen_height * 4*i;
@@ -967,8 +982,8 @@ static int  ark_carback_probe(struct platform_device *pdev)
 	ark_carback_dev_init(&carback->context);
 	if (!gpiod_get_value(carback->context.detect)) {
 		dvr_enter_carback();
-		if(!get_bootanimation_status())
-			ark_disp_set_layer_en(0, 0);   //close bootanmation
+		if(!get_bootanimation_status())
+			ark_disp_set_layer_en(0, 0);   //close bootanmation
 		ark_disp_set_layer_en(3, 0);
 		carback->context.carback_status = 1;
 		//if(carback->context && carback->context.send_mcu_carback)
@@ -1049,7 +1064,7 @@ static int ark_carback_remove(struct platform_device *pdev)
 	}
     carback->context.track_data_status = 1;
 	carback->context.carback_signal = 1;
-
+
 
 #ifdef CONFIG_REVERSING_TRACK
 	//del_timer(&carback->context.uartx_timer);
@@ -1098,4 +1113,4 @@ static int __init ark_carback_init(void)
 
     return ret;
 }
-late_initcall_sync(ark_carback_init);
+late_initcall_sync(ark_carback_init);

+ 1 - 1
linux/drivers/soc/arkmicro/carback/ark1668e_carback.h

@@ -15,7 +15,6 @@
 #define SCREEN_HEIGHT	480
 
 #define TRACK_FRAME_NUM		2
-
 struct carback_context {
 		int gpio_id;
         struct device *dev;
@@ -32,6 +31,7 @@ struct carback_context {
 		int carback_signal;
 		int carback_count;
 		int track_setting;
+        int track_append_setting;
 		int track_data_status;
 		int track_frame_delay;
         wait_queue_head_t carback_waiq;

+ 27 - 1
linux/drivers/soc/arkmicro/carback/ark_mcu.c

@@ -17,6 +17,7 @@ extern unsigned int track_pic_id;
 extern unsigned int radar_pic_id;
 extern unsigned int car_pic_id;
 extern unsigned int track2_pic_id;//small track for vbox
+extern int track_switch_id;
 
 extern int vbox_track_paint;
 
@@ -35,7 +36,7 @@ static void get_mcu_carback_data(unsigned char ch)
 	if(!g_carback_context->carback_status || vbox_track_paint) return;
 
 	//for uatr test
-	set_disp_track_id(ch);
+	//set_disp_track_id(ch);
 #if 0
 	if(g_carback_context && g_carback_context->get_wheel_angle)
 		g_carback_context->get_wheel_angle(ch);
@@ -63,12 +64,37 @@ void demo_parse_mcu_data(unsigned char *buf,unsigned char size)
 		wheel_anglesign = data[1];
 		wheel_angle     = data[2];
 
+	if(track_switch_id == 0){
+ 		set_disp_track_id(TRACK_STRAIGHT_FORWARD_ID);
+
 		if(wheel_anglesign == 0)
 			track_pic_id = TRACK_STRAIGHT_FORWARD_ID + wheel_angle;
 		else
 			track_pic_id = TRACK_STRAIGHT_FORWARD_ID - wheel_angle;
 		
 		set_disp_track_id(track_pic_id);
+
+	}else if(track_switch_id == 1){
+ 		set_disp_track2_id(TRACK2_STRAIGHT_FORWARD_ID);
+
+		if(wheel_anglesign == 0)
+			track2_pic_id = TRACK2_STRAIGHT_FORWARD_ID + wheel_angle;
+		else
+			track2_pic_id = TRACK2_STRAIGHT_FORWARD_ID - wheel_angle;
+		
+		set_disp_track2_id(track2_pic_id);
+
+    }else{ 
+ 		set_disp_track_id(TRACK_STRAIGHT_FORWARD_ID);
+
+		if(wheel_anglesign == 0)
+			track_pic_id = TRACK_STRAIGHT_FORWARD_ID + wheel_angle;
+		else
+			track_pic_id = TRACK_STRAIGHT_FORWARD_ID - wheel_angle;
+		
+		set_disp_track_id(track_pic_id);
+        
+        }
 	}
 	else if(cmd == 0x03){
 		

+ 263 - 29
linux/drivers/soc/arkmicro/carback/ark_track.c

@@ -231,6 +231,7 @@ unsigned int car_pic_id;
 unsigned int track2_pic_id;//small track for vbox
 extern struct carback_context* g_carback_context;
 extern int first_draw_track;
+extern int track_switch_id;
 
 static user2_header* g_pheader2_buf;
 track_context2 *g_ptrack_context2 = NULL;
@@ -254,8 +255,8 @@ static void show_header_info(void)
 		return;
 	}
 
-	ARKTRACK_DBGPRTK("header_buf ===>identity=0x%0x track_total=%d car_total=%d  signal_total= %d radar_total=%d file_type=0x%0x file_size=0x%0x\n",\
-								p->identity,p->track_total,p->car_total,p->signal_total,p->radar_total,p->file_type,p->file_size);
+	ARKTRACK_DBGPRTK("header_buf ===>identity=0x%0x track_total=%d car_total=%d  signal_total= %d append1 = %d append2 = %d radar_total=%d file_type=0x%0x file_size=0x%0x\n",\
+								p->identity,p->track_total,p->car_total,p->signal_total,p->append1_total,p->append2_total,p->radar_total,p->file_type,p->file_size);
 
 	ARKTRACK_DBGPRTK("track rect ===> pos_x=%d  pos_y=%d  width=%d  height=%d\n",p->track_rect.pos_x,\
 								p->track_rect.pos_y,p->track_rect.width,p->track_rect.height);
@@ -263,6 +264,10 @@ static void show_header_info(void)
 								p->car_rect.pos_y,p->car_rect.width,p->car_rect.height);
 	ARKTRACK_DBGPRTK("signal rect   ===> pos_x=%d  pos_y=%d  width=%d  height=%d\n",p->signal_rect.pos_x,\
 								p->signal_rect.pos_y,p->signal_rect.width,p->signal_rect.height);
+	ARKTRACK_DBGPRTK("append1 rect   ===> pos_x=%d  pos_y=%d  width=%d  height=%d\n",p->append1_rect.pos_x,\
+								p->append1_rect.pos_y,p->append1_rect.width,p->append1_rect.height);
+	ARKTRACK_DBGPRTK("append2 rect   ===> pos_x=%d  pos_y=%d  width=%d  height=%d\n",p->append2_rect.pos_x,\
+								p->append2_rect.pos_y,p->append2_rect.width,p->append2_rect.height);
 	ARKTRACK_DBGPRTK("radar0 rect===> pos_x=%d  pos_y=%d  width=%d  height=%d\n",p->radar_rect[0].pos_x,\
 								p->radar_rect[0].pos_y,p->radar_rect[0].width,p->radar_rect[0].height);
 	ARKTRACK_DBGPRTK("radar1 rect===> pos_x=%d  pos_y=%d  width=%d  height=%d\n",p->radar_rect[1].pos_x,\
@@ -280,6 +285,10 @@ static void show_header_info(void)
 								p->car[0].image_type,p->car[0].image_store_id,p->car[0].image_id,p->car[0].image_offset,p->car[0].image_size);
 	ARKTRACK_DBGPRTK("signal[0]   image===> image_type=%d  image_store_id=%d  image_id=0x%0x  image_offset=0x%0x image_size=0x%0x\n",\
 								p->signal[0].image_type,p->signal[0].image_store_id,p->signal[0].image_id,p->signal[0].image_offset,p->signal[0].image_size);
+	ARKTRACK_DBGPRTK("append1[0]   image===> image_type=%d  image_store_id=%d  image_id=0x%0x  image_offset=0x%0x image_size=0x%0x\n",\
+								p->append1[0].image_type,p->append1[0].image_store_id,p->append1[0].image_id,p->append1[0].image_offset,p->append1[0].image_size);
+	ARKTRACK_DBGPRTK("append2[0]   image===> image_type=%d  image_store_id=%d  image_id=0x%0x  image_offset=0x%0x image_size=0x%0x\n",\
+								p->append2[0].image_type,p->append2[0].image_store_id,p->append2[0].image_id,p->append2[0].image_offset,p->append2[0].image_size);
  	ARKTRACK_DBGPRTK("radar[1] image===> image_type=%d  image_store_id=%d  image_id=0x%0x  image_offset=0x%0x image_size=0x%0x\n",\
 								p->radar[1].image_type,p->radar[1].image_store_id,p->radar[1].image_id,p->radar[1].image_offset,p->radar[1].image_size);
 	ARKTRACK_DBGPRTK("track2[0]image===> image_type=%d  image_store_id=%d  image_id=0x%0x  image_offset=0x%0x image_size=0x%0x\n",\
@@ -505,6 +514,53 @@ int set_disp_signal_id(unsigned int disp_signal_id)
 	//printk(KERN_ALERT "++++++p->disp_signal_id = %d\n" ,p->disp_signal_id);
 	return 0;
 }
+
+int set_disp_append1_id(unsigned int disp_append1_id)
+{
+	static unsigned int pre_id = IMAGE_ID_NONE;
+	track_context *p = g_ptrack_context;
+
+	if(p == NULL){
+		printk(KERN_ALERT "%s: g_ptrack_context NULL, error!\n", __FUNCTION__);
+		return -1;
+	}
+
+	if(disp_append1_id >= APPEND1_MAX && disp_append1_id < IMAGE_ID_NONE){
+		printk(KERN_ERR "set_disp_append1_id image id error!\n" );
+		return -1;
+	}
+	
+	if(pre_id != disp_append1_id || IMAGE_ID_NONE == disp_append1_id){
+		p->disp_append1_id = disp_append1_id;
+		pre_id = disp_append1_id;
+	}
+	//printk(KERN_ALERT "++++++p->disp_append1_id = %d\n" ,p->disp_append1_id);
+	return 0;
+}
+
+int set_disp_append2_id(unsigned int disp_append2_id)
+{
+	static unsigned int pre_id = IMAGE_ID_NONE;
+	track_context *p = g_ptrack_context;
+
+	if(p == NULL){
+		printk(KERN_ALERT "%s: g_ptrack_context NULL, error!\n", __FUNCTION__);
+		return -1;
+	}
+
+	if(disp_append2_id >= APPEND2_MAX && disp_append2_id < IMAGE_ID_NONE){
+		printk(KERN_ERR "set_disp_append2_id image id error!\n" );
+		return -1;
+	}
+	
+	if(pre_id != disp_append2_id || IMAGE_ID_NONE == disp_append2_id){
+		p->disp_append2_id = disp_append2_id;
+		pre_id = disp_append2_id;
+	}
+	//printk(KERN_ALERT "++++++p->disp_append2_id = %d\n" ,p->disp_append2_id);
+	return 0;
+}
+
 int set_disp_track2_id(unsigned int track2_id)
 {
 	static unsigned int pre_id = IMAGE_ID_NONE;
@@ -604,7 +660,7 @@ static int init_track_context(unsigned int addr)
 
 	show_header_info();
 
-	if(check_header_info < 0){
+	if(check_header_info() < 0){
 
 		printk(KERN_ERR "identity info error!\n");
 		return ret;
@@ -655,6 +711,30 @@ static int init_track_context(unsigned int addr)
 		g_ptrack_context->disp_signal_size= size;
 	}
 
+	if(g_pheader_buf->append1_total> 0){
+		size = 4* g_pheader_buf->append1_rect.width * g_pheader_buf->append1_rect.height;
+		p = vzalloc(size);
+		if (p == NULL) {
+			printk(KERN_ERR "%s %d: failed to allocate car\n",__FUNCTION__, __LINE__);
+			ret = -ENOMEM;
+			goto err_car;
+		}
+		g_ptrack_context->disp_append1_buf = p;
+		g_ptrack_context->disp_append1_size= size;
+	}
+
+	if(g_pheader_buf->append2_total> 0){
+		size = 4* g_pheader_buf->append2_rect.width * g_pheader_buf->append2_rect.height;
+		p = vzalloc(size);
+		if (p == NULL) {
+			printk(KERN_ERR "%s %d: failed to allocate car\n",__FUNCTION__, __LINE__);
+			ret = -ENOMEM;
+			goto err_car;
+		}
+		g_ptrack_context->disp_append2_buf = p;
+		g_ptrack_context->disp_append2_size= size;
+	}
+
 	if(g_pheader_buf->radar_total > 0){
 		size = 4* g_pheader_buf->radar_rect[0].width * g_pheader_buf->radar_rect[0].height;
 		for(i = 0; i < 4;i++){
@@ -868,6 +948,12 @@ static unsigned int get_picture_addr(enum image_type type, unsigned int id)
 	else if(type == IMAGE_TYPE_SIGNAL){
 		offset = g_pheader_buf->signal[id].image_offset;
 	}
+	else if(type == IMAGE_TYPE_APPEND1){
+		offset = g_pheader_buf->append1[id].image_offset;
+	}
+	else if(type == IMAGE_TYPE_APPEND2){
+		offset = g_pheader_buf->append2[id].image_offset;
+	}
 	else if(type == IMAGE_TYPE_RADAR){
 		for(i = 0; i < RADAR_MAX;i++){
 			if(g_pheader_buf->radar[i].image_id == id){
@@ -898,6 +984,12 @@ static unsigned int get_picture_offset(enum image_type type, unsigned int id)
 	else if(type == IMAGE_TYPE_SIGNAL){
 		offset = g_pheader_buf->signal[id].image_offset;
 	}
+	else if(type == IMAGE_TYPE_APPEND1){
+		offset = g_pheader_buf->append1[id].image_offset;
+	}
+	else if(type == IMAGE_TYPE_APPEND2){
+		offset = g_pheader_buf->append2[id].image_offset;
+	}
 	else if(type == IMAGE_TYPE_RADAR){
 		for(i = 0; i < RADAR_MAX;i++){
 			if(g_pheader_buf->radar[i].image_id == id){
@@ -929,6 +1021,12 @@ static unsigned int get_picture_size(enum image_type type, unsigned int id)
 	else if(type == IMAGE_TYPE_SIGNAL){
 		image_size = g_pheader_buf->signal[id].image_size;
 	}
+	else if(type == IMAGE_TYPE_APPEND1){
+		image_size = g_pheader_buf->append1[id].image_size;
+	}
+	else if(type == IMAGE_TYPE_APPEND2){
+		image_size = g_pheader_buf->append2[id].image_size;
+	}
 	else if(type == IMAGE_TYPE_RADAR){
 		for(i = 0; i < RADAR_MAX;i++){
 			if(g_pheader_buf->radar[i].image_id == id){
@@ -1096,6 +1194,18 @@ static int copy_pic_data(void *dest,void *src,enum image_type type,unsigned int
 		pos_x = p->signal_rect.pos_x;
 		pos_y = p->signal_rect.pos_y;	
 	}
+	else if(type == IMAGE_TYPE_APPEND1){
+		width = p->append1_rect.width;
+		height= p->append1_rect.height;
+		pos_x = p->append1_rect.pos_x;
+		pos_y = p->append1_rect.pos_y;	
+	}
+	else if(type == IMAGE_TYPE_APPEND2){
+		width = p->append2_rect.width;
+		height= p->append2_rect.height;
+		pos_x = p->append2_rect.pos_x;
+		pos_y = p->append2_rect.pos_y;	
+	}
 	else if(type == IMAGE_TYPE_TRACK2){
 		
 		width = p->track2_rect.width;
@@ -1204,6 +1314,90 @@ static unsigned int subjoin_signal_pic(void *dest)
 	return fill_size;
 }
 
+static unsigned int subjoin_append1_pic(void *dest)
+{	
+	static unsigned int last_id = IMAGE_ID_NONE;
+	track_context *p = g_ptrack_context;
+	void *dest_append1 = p->disp_append1_buf;
+	unsigned int dest_size  = p->disp_append1_size;
+	unsigned int fill_size = 0;
+	unsigned int source_size;
+	unsigned int source_offset;
+	void *source;
+ 
+	if(p->disp_append1_id  > APPEND1_MAX)
+		return 0;
+	
+	if(first_draw_track) 
+		last_id = IMAGE_ID_NONE;
+		
+	source_offset = get_picture_offset(IMAGE_TYPE_APPEND1,p->disp_append1_id);
+	source_size   = get_picture_size(IMAGE_TYPE_APPEND1,p->disp_append1_id);
+	
+	//printk(KERN_ALERT "++++++ subjoin_append1_pic source_offset=%0x ,source_size=%0x\n",source_offset,source_size );
+	
+	if(source_size == 0 || source_offset < sizeof(user_header)){
+		printk(KERN_ERR "subjoin append1 pic source error, disp_append1_id=0x%0x.\n",p->disp_append1_id);
+		return 0;
+	}
+
+	if(last_id == IMAGE_ID_NONE || last_id != p->disp_append1_id){
+		source = (void*)get_picture_addr(IMAGE_TYPE_APPEND1,p->disp_append1_id);
+		fill_size = zlib_uncompress_block(dest_append1, dest_size, source, source_size);
+		if(fill_size != dest_size){
+			printk(KERN_ERR " zlib uncompress append1 error!\n");
+			return fill_size;
+		}
+	}
+	
+	copy_pic_data(dest,dest_append1,IMAGE_TYPE_APPEND1,p->disp_append1_id,SRC_COVER_DST);
+	last_id = p->disp_append1_id; 
+
+	return fill_size;
+}
+
+static unsigned int subjoin_append2_pic(void *dest)
+{	
+	static unsigned int last_id = IMAGE_ID_NONE;
+	track_context *p = g_ptrack_context;
+	void *dest_append2 = p->disp_append2_buf;
+	unsigned int dest_size  = p->disp_append2_size;
+	unsigned int fill_size = 0;
+	unsigned int source_size;
+	unsigned int source_offset;
+	void *source;
+ 
+	if(p->disp_append2_id  > APPEND2_MAX)
+		return 0;
+	
+	if(first_draw_track) 
+		last_id = IMAGE_ID_NONE;
+		
+	source_offset = get_picture_offset(IMAGE_TYPE_APPEND2,p->disp_append2_id);
+	source_size   = get_picture_size(IMAGE_TYPE_APPEND2,p->disp_append2_id);
+	
+	//printk(KERN_ALERT "++++++ subjoin_append2_pic source_offset=%0x ,source_size=%0x\n",source_offset,source_size );
+	
+	if(source_size == 0 || source_offset < sizeof(user_header)){
+		printk(KERN_ERR "subjoin append2 pic source error, disp_append2_id=0x%0x.\n",p->disp_append2_id);
+		return 0;
+	}
+
+	if(last_id == IMAGE_ID_NONE || last_id != p->disp_append2_id){
+		source = (void*)get_picture_addr(IMAGE_TYPE_APPEND2,p->disp_append2_id);
+		fill_size = zlib_uncompress_block(dest_append2, dest_size, source, source_size);
+		if(fill_size != dest_size){
+			printk(KERN_ERR " zlib uncompress append2 error!\n");
+			return fill_size;
+		}
+	}
+	
+	copy_pic_data(dest,dest_append2,IMAGE_TYPE_APPEND2,p->disp_append2_id,SRC_COVER_DST);
+	last_id = p->disp_append2_id; 
+
+	return fill_size;
+}
+
 static unsigned int subjoin_track_pic(void *dest)
 {	
 	static unsigned int last_id = IMAGE_ID_NONE;
@@ -1442,11 +1636,36 @@ int track_paint_init(void)
 		if(g_ptrack_context2)
 			g_carback_context->pmradar_param = &g_ptrack_context2->mradar_param;
 		
+
+	printk(KERN_ALERT "++++++track_switch_id = %d",track_switch_id);
+	if(track_switch_id == 0){
 		set_disp_track_id(TRACK_STRAIGHT_FORWARD_ID);
 		set_disp_car_id(CAR_NORMAL_STATUS_ID);
 		set_disp_radar_id(RADAR_NORMAL_STATUS_ID);
+		set_disp_track2_id(IMAGE_ID_NONE);
+		set_disp_signal_id(IMAGE_ID_NONE);
+		set_disp_append1_id(APPEND1_NORMAL_STATUS_ID);
+		set_disp_append2_id(APPEND2_NORMAL_STATUS_ID);
+
+	}else if(track_switch_id == 1){
+		set_disp_track_id(IMAGE_ID_NONE);
+		set_disp_car_id(CAR_NORMAL_STATUS_ID);
+		set_disp_radar_id(RADAR_NORMAL_STATUS_ID);
 		set_disp_track2_id(TRACK2_STRAIGHT_FORWARD_ID);
 		set_disp_signal_id(IMAGE_ID_NONE);
+		set_disp_append1_id(APPEND1_NORMAL_STATUS_ID);
+		set_disp_append2_id(APPEND2_NORMAL_STATUS_ID);
+
+    }else{
+		set_disp_track_id(TRACK_STRAIGHT_FORWARD_ID);
+		set_disp_car_id(CAR_NORMAL_STATUS_ID);
+		set_disp_radar_id(RADAR_NORMAL_STATUS_ID);
+		set_disp_track2_id(IMAGE_ID_NONE);
+		set_disp_signal_id(IMAGE_ID_NONE);
+		set_disp_append1_id(APPEND1_NORMAL_STATUS_ID);
+		set_disp_append2_id(APPEND2_NORMAL_STATUS_ID);
+
+    }
 		
 		printk("track_paint init width=%d, height=%d,xpos=%d,ypos=%d.\n",g_carback_context->track_disp_width,\
 			g_carback_context->track_disp_height,g_carback_context->track_disp_xpos,g_carback_context->track_disp_ypos);
@@ -1490,6 +1709,8 @@ unsigned int track_paint_fill(void *dest, unsigned int width, unsigned int heigh
 	static unsigned int last_car_id   = 0;
 	static unsigned int last_radar_id = 0;
 	static unsigned int last_signal_id = -1;
+	static unsigned int last_append1_id = -1;
+	static unsigned int last_append2_id = -1;
 	static unsigned int last_track2_id= 0;
 	track_context *p = g_ptrack_context;
 	user_header* ph = g_pheader_buf;
@@ -1514,18 +1735,21 @@ unsigned int track_paint_fill(void *dest, unsigned int width, unsigned int heigh
 		last_car_id   = 0;
 		last_radar_id = 0;
 		last_signal_id = -1;
+		last_append1_id = -1;
+		last_append2_id = -1;
 		last_track2_id= 0;
 		return g_carback_context->track_display_size;
 	}
 
-	if (p->disp_track_id == IMAGE_ID_NONE){
+	if (p->disp_track_id == IMAGE_ID_NONE && p->disp_track2_id == IMAGE_ID_NONE){
 		memset(dest,0,p->disp_track_size);
 		return p->disp_track_size;
 	}
 	
 	if( g_carback_context->carback_signal ){
 		if(last_track_id == p->disp_track_id && last_car_id == p->disp_car_id   &&
-	   last_radar_id == p->disp_radar_id &&last_track2_id == p->disp_track2_id && last_signal_id == p->disp_signal_id ){
+	   last_radar_id == p->disp_radar_id &&last_track2_id == p->disp_track2_id && last_signal_id == p->disp_signal_id 
+	   && last_append1_id == p->disp_append1_id && last_append2_id == p->disp_append2_id){
 		if(g_ptrack_context2 == NULL || !g_ptrack_context2->disp_mradar_id_change)
 	        return 0;
 	 }
@@ -1535,34 +1759,44 @@ unsigned int track_paint_fill(void *dest, unsigned int width, unsigned int heigh
 		if(last_signal_id != p->disp_signal_id)
 			memset(dest,0,g_carback_context->track_display_size);
 		if(ph->signal_total)    
-		subjoin_signal_pic(dest);
+			subjoin_signal_pic(dest);
+		if(ph->append2_total)  
+			subjoin_append2_pic(dest);
 	}else{
-		if(g_carback_context->layer_status){
-			if(ph->track_total )
-				subjoin_track_pic(dest);
-		 
-			if(ph->car_total)
-				subjoin_car_pic(dest);
-
-			if(ph->radar_total)  
-				subjoin_radar_pic(dest);
-		 
-			if(ph->track2_total) 
-				subjoin_track2_pic(dest);
-			
-			if(g_ptrack_context2 && vbox_track_paint) {
-				subjoin_mradar_pic(dest);
-			}
+		if(!g_carback_context->track_append_setting){
+            memset(dest,0,g_carback_context->track_display_size);
+            g_carback_context->track_append_setting = 1;
+		}
+		if(ph->track_total )
+			subjoin_track_pic(dest);
+	 
+		if(ph->car_total)
+			subjoin_car_pic(dest);
+
+		if(ph->radar_total)  
+			subjoin_radar_pic(dest);
+
+		if(ph->append1_total)  
+			subjoin_append1_pic(dest);
+
+		if(ph->append2_total)  
+			subjoin_append2_pic(dest);
+	 
+		if(ph->track2_total) 
+			subjoin_track2_pic(dest);
+		
+		if(g_ptrack_context2 && vbox_track_paint) {
+			subjoin_mradar_pic(dest);
 		}
 	}
-	if(g_carback_context->layer_status){
-		last_track_id = p->disp_track_id;
-		last_car_id   = p->disp_car_id;
-		last_radar_id = p->disp_radar_id;
-		last_track2_id= p->disp_track2_id; 
-	}
-	
+
+	last_track_id = p->disp_track_id;
+	last_car_id   = p->disp_car_id;
+	last_radar_id = p->disp_radar_id;
 	last_signal_id = p->disp_signal_id;
+	last_append1_id = p->disp_append1_id;
+	last_append2_id = p->disp_append2_id;
+	last_track2_id= p->disp_track2_id; 
  
 	return fill_size; 
 }

+ 24 - 2
linux/drivers/soc/arkmicro/carback/ark_track.h

@@ -5,6 +5,8 @@
 #define CAR_MAX      10
 #define RADAR_MAX    200
 #define SIGNAL_MAX   10
+#define APPEND1_MAX   10
+#define APPEND2_MAX   10
  
 //#define ARK_TRACK_DBG
 
@@ -229,17 +231,21 @@
 #define RADAR_CHANNEL_RL  	2
 #define RADAR_CHANNEL_RR  	3
 
-#define TRACK_STRAIGHT_FORWARD_ID   40
+#define TRACK_STRAIGHT_FORWARD_ID   37
 #define CAR_NORMAL_STATUS_ID		0
 #define SIGNAL_NORMAL_STATUS_ID		0
+#define APPEND1_NORMAL_STATUS_ID		0
+#define APPEND2_NORMAL_STATUS_ID		0
 #define RADAR_NORMAL_STATUS_ID		0x23322332		
-#define TRACK2_STRAIGHT_FORWARD_ID  35
+#define TRACK2_STRAIGHT_FORWARD_ID  37
 
 enum image_type{
 	IMAGE_TYPE_TRACK = 1,
 	IMAGE_TYPE_CAR,
 	IMAGE_TYPE_RADAR,
 	IMAGE_TYPE_SIGNAL,
+	IMAGE_TYPE_APPEND1,
+	IMAGE_TYPE_APPEND2,
 	IMAGE_TYPE_TRACK2,
 	IMAGE_TYPE_MRADAR
 };
@@ -273,18 +279,24 @@ typedef struct {
 	unsigned int car_total;
 	unsigned int radar_total;
 	unsigned int signal_total;
+	unsigned int append1_total;
+	unsigned int append2_total;
 	unsigned int track2_total;
 
 	rect_info track_rect;
 	rect_info car_rect;
 	rect_info radar_rect[4];
 	rect_info signal_rect;
+	rect_info append1_rect;
+	rect_info append2_rect;
 	rect_info track2_rect;
 
 	item_info track[TRACK_MAX];
 	item_info car[CAR_MAX];
 	item_info radar[RADAR_MAX];
 	item_info signal[SIGNAL_MAX];
+	item_info append1[APPEND1_MAX];
+	item_info append2[APPEND2_MAX];
 	item_info track2[TRACK_MAX];
 
 }user_header;
@@ -318,6 +330,8 @@ typedef struct {
 	rect_info car_rect;
 	rect_info radar_rect[4];
 	rect_info signal_rect;
+	rect_info append1_rect;
+	rect_info append2_rect;
 	rect_info track2_rect;
 	//rect_info mradar_rect[MRADAR_MAX];
 
@@ -338,18 +352,24 @@ typedef struct {
 	unsigned int disp_car_id;
 	unsigned int disp_radar_id;
 	unsigned int disp_signal_id;
+	unsigned int disp_append1_id;
+	unsigned int disp_append2_id;
 	unsigned int disp_track2_id;
 
 	unsigned char* disp_track_buf;
 	unsigned char* disp_car_buf;
 	unsigned char* disp_radar_buf[4];
 	unsigned char* disp_signal_buf;
+	unsigned char* disp_append1_buf;
+	unsigned char* disp_append2_buf;
 	unsigned char* disp_track2_buf;
 
 	unsigned int disp_track_size;
 	unsigned int disp_car_size;
 	unsigned int disp_radar_size;
 	unsigned int disp_signal_size;
+	unsigned int disp_append1_size;
+	unsigned int disp_append2_size;
 	unsigned int disp_track2_size;
 
 	track_param_context track_param;
@@ -379,6 +399,8 @@ extern int set_disp_track_id(unsigned int image_id);
 extern int set_disp_car_id(unsigned int image_id);
 extern int set_disp_radar_id(unsigned int image_id);
 extern int set_disp_signal_id(unsigned int image_id);
+extern int set_disp_append1_id(unsigned int image_id);
+extern int set_disp_append2_id(unsigned int image_id);
 extern int set_disp_track2_id(unsigned int image_id);
 extern int set_disp_mradar_id(unsigned char *pimage_id);