소스 검색

fixed issue: Scale busy, patch from ArkMicro

lixh 2 년 전
부모
커밋
b3d29b4095

+ 30 - 0
buildroot-external/package/libarkapi/software/src/ark_video.c

@@ -21,11 +21,22 @@
 #include "ark_2d.h"
 #endif
 
+#define ARK_DVR_IOC_MAGIC			'n'
+
+#define VIN_UPDATE_WINDOW		_IOWR(ARK_DVR_IOC_MAGIC, 50, struct vin_screen)
+#define VIN_START				_IO(ARK_DVR_IOC_MAGIC, 51)
+#define VIN_STOP				_IO(ARK_DVR_IOC_MAGIC, 52)
+#define VIN_SWITCH_CHANNEL		_IOWR(ARK_DVR_IOC_MAGIC, 53, int)
+#define VIN_CONFIG				_IOWR(ARK_DVR_IOC_MAGIC, 54, int)
+#define VIN_IOCTL_DOWN_IDLE		_IO(ARK_DVR_IOC_MAGIC, 55)
+#define VIN_IOCTL_UP_IDLE				_IO(ARK_DVR_IOC_MAGIC, 56)
+
 struct display_data *pdd = NULL;
 
 //#define DECODE_SCALE_PARALLEL
 
 static int mirror_w = 0, mirror_h = 0;
+static int vin_fd;
 
 static int get_shared_display_data(void)
 {
@@ -418,6 +429,13 @@ video_handle *arkapi_video_init(int stream_type)
 		goto err2;
 	}
 
+	vin_fd = open("/dev/video0",O_RDWR);
+	if( vin_fd < 0 )
+	{
+		printf("++++++open error.\n");
+		goto err2;
+	}
+
 	if (sem_init(&handle->sem_lock, 1, 1) < 0) {
 		printf("%s sem_init fail\n", __func__);
 		goto err2;
@@ -642,6 +660,8 @@ void arkapi_video_release(video_handle *handle)
 	sem_destroy(&handle->sem_lock);
 	free(handle);
 
+	close(vin_fd);
+
 	ark_dbg("%s: <---sucess.\n", __func__);
 
 	return;
@@ -679,7 +699,17 @@ int arkapi_video_play(video_handle *handle, const void *src_addr, int len, int f
 		len = MAX_STREAM_BUFFER_SIZE;
 	handle->in_buffer.size = len;
 	handle->out_buffer.num = 0;
+
+	ret = ioctl(vin_fd, VIN_IOCTL_DOWN_IDLE, 0);
+	if(ret < 0)
+		printf("VIN_IOCTL_DOWN_IDLE error\n");
+
 	ret = mfc_decode(handle->handle_mfc, &handle->in_buffer, &handle->out_buffer);
+
+	ret = ioctl(vin_fd, VIN_IOCTL_UP_IDLE, 0);
+	if(ret < 0)
+		printf("VIN_IOCTL_UP_IDLE error\n");
+
 	if (ret) {
 		printf("mfc_decode fail, ret=%d.\n", ret);
 		arkapi_video_unlock(handle);

+ 21 - 2
linux/drivers/media/platform/arkmicro/ark1668e_vin.c

@@ -490,7 +490,21 @@ static long vin_ioctl_default(struct file *file, void *priv,
 			vin_aux_config(para);
 			break;
 		}
-		
+
+		case VIN_IOCTL_DOWN_IDLE:
+		{
+			//printk(KERN_ALERT "++++++VIN_IOCTL_DOWN_IDLE++++++\n");
+			down_interruptible(&dvr_dev->vin_sem);
+			break;
+		}
+
+		case VIN_IOCTL_UP_IDLE:
+		{
+			//printk(KERN_ALERT "++++++VIN_IOCTL_DOWN_IDLE++++++\n");
+			up(&dvr_dev->vin_sem);
+			break;
+		}
+
 		default:
 			printk("%s: error cmd 0x%x\n", __func__, cmd);
 			error = -EFAULT;
@@ -766,6 +780,8 @@ int dvr_exit_carback(void)
 	ark_vin_disable();
 	spin_unlock(&vin->dvr_dev->spin_lock);
 
+	up(&vin->dvr_dev->vin_sem);
+
 	if(vin->dvr_dev->chip_info == TYPE_RN6752){
 		ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_EXIT_CARBACK,0);
 		if(ret < 0){
@@ -1310,11 +1326,12 @@ static void dither_timeout_timer(struct timer_list *t)
 }
 
 static int vin_start(struct dvr_dev *dvr_dev)
-{ 
+{
 	struct ark1668e_vin_device* vin = NULL;
 	int ret = 0;
 	vin = g_ark1668e_vin;
 	if(!dvr_dev->work_status){
+		down_interruptible(&dvr_dev->vin_sem);
 		dvr_dev->work_status = 1;
 		dvr_dev->discard_frame = START_DISCARD_FRAME;
 		dvr_dev->cur_frame = 0;
@@ -1861,6 +1878,8 @@ static int ark1668e_vin_probe(struct platform_device *pdev)
 	    __FUNCTION__, __LINE__, ark_vin->dvr_dev->context.deinterlace_irq, ret);
 	}
 
+	sema_init(&ark_vin->dvr_dev->vin_sem, 1);
+
 	timer_setup(&ark_vin->dvr_dev->timer, dither_timeout_timer, 0);
 	timer_setup(&ark_vin->dvr_dev->signal_timer, vin_get_signal_time, 0);
 

+ 3 - 0
linux/drivers/media/platform/arkmicro/ark1668e_vin.h

@@ -172,6 +172,7 @@ struct dvr_dev{
 	int first_show_flag;
 	int dev_major, dev_minor;
     spinlock_t spin_lock;
+	struct semaphore vin_sem;
 	struct work_struct scale_work;
 	struct workqueue_struct *scale_queue;
 	struct work_struct detect_work;
@@ -255,6 +256,8 @@ struct vin_screen {
 #define VIN_STOP				_IO(ARK_DVR_IOC_MAGIC, 52)
 #define VIN_SWITCH_CHANNEL		_IOWR(ARK_DVR_IOC_MAGIC, 53, int)
 #define VIN_CONFIG				_IOWR(ARK_DVR_IOC_MAGIC, 54, struct vin_para)
+#define VIN_IOCTL_DOWN_IDLE            _IO(ARK_DVR_IOC_MAGIC, 55)
+#define VIN_IOCTL_UP_IDLE                              _IO(ARK_DVR_IOC_MAGIC, 56)
 
 #endif