Ver Fonte

merge carback for luyuan

daozhongwan há 3 anos atrás
pai
commit
6acb0876f5

+ 45 - 28
linux/drivers/soc/arkmicro/carback/ark1668e_carback.c

@@ -45,6 +45,7 @@ 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
@@ -52,14 +53,15 @@ static int delay_show_track = 0;
 int first_draw_track = 1;
 
 #endif
+//#define TRACK_TEST
 
 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);	
@@ -135,7 +137,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++;
@@ -153,7 +155,7 @@ static void carback_signal_detect(void)
             context->carback_count = 0;
 			carback_detect_count = 0;
         }
-    }
+    }
 }
 
 #ifdef CONFIG_REVERSING_TRACK
@@ -245,7 +247,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);
 
@@ -264,41 +266,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)
@@ -349,6 +351,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:
@@ -364,7 +369,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;
 			}
 		}
@@ -374,7 +379,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;
 			}			
 		}
@@ -652,6 +657,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;
@@ -779,6 +794,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.buffer_num = TRACK_FRAME_NUM;
@@ -811,7 +827,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;
@@ -905,7 +922,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
 
@@ -954,4 +971,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;

+ 26 - 0
linux/drivers/soc/arkmicro/carback/ark_mcu.c

@@ -13,6 +13,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;
 
 static u8 get_rx_crc(u8 *buf, u8 len)
 {
@@ -55,12 +56,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){
 		

+ 238 - 12
linux/drivers/soc/arkmicro/carback/ark_track.c

@@ -230,6 +230,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",\
@@ -460,6 +469,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;
@@ -610,6 +666,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++){
@@ -823,6 +903,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){
@@ -853,6 +939,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){
@@ -884,6 +976,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){
@@ -1030,6 +1128,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;
@@ -1138,6 +1248,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;
@@ -1372,11 +1566,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);
@@ -1415,6 +1634,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; 
@@ -1438,11 +1659,13 @@ 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);
 		if(ph->car_total)
 			subjoin_car_pic(dest);
@@ -1457,7 +1680,8 @@ unsigned int track_paint_fill(void *dest, unsigned int width, unsigned int heigh
 	
 	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;
 	 }
@@ -1467,7 +1691,9 @@ 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 )
@@ -1487,14 +1713,14 @@ unsigned int track_paint_fill(void *dest, unsigned int width, unsigned int heigh
 			}
 		}
 	}
-	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 g_carback_context->track_display_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);