Преглед на файлове

添加avin和视频解码互斥锁

huangliang преди 2 години
родител
ревизия
0a9318a1c3

+ 0 - 0
buildroot-2021.02.2/dl/memtester/.lock


BIN
buildroot-2021.02.2/dl/memtester/memtester-4.5.0.tar.gz


+ 10 - 0
buildroot-external/package/libarkapi/software/include/ark_api.h

@@ -509,6 +509,16 @@ int arkapi_n141_scalar_unlock(void);
 #define LIBARKAPI_ARKN141	1
 #define LIBARKAPI_ARK1668E	2
 
+#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)
+
 /*----------------------------------------END------------------------------------------*/
 
 #ifdef __cplusplus

+ 32 - 1
buildroot-external/package/libarkapi/software/src/ark_video.c

@@ -24,6 +24,10 @@
 struct display_data *pdd = NULL;
 
 //#define DECODE_SCALE_PARALLEL
+#define VIDEO_USE_LOCK
+#if LIBARKAPI_PLATFORM == LIBARKAPI_ARK1668E && defined(VIDEO_USE_LOCK)
+static int vin_fd;
+#endif
 
 static int get_shared_display_data(void)
 {
@@ -362,7 +366,7 @@ video_handle *arkapi_video_init(int stream_type)
 	int ret;
 
 	ark_dbg("%s: stream_type=%d.\n", __func__, stream_type);
-	printf("arkapi video init -20220531\n");
+	printf("++++++arkapi video init -20230308\n");
 
 	if(stream_type < RAW_STRM_TYPE_H264 || (stream_type > RAW_STRM_TYPE_MP4_CUSTOM && \
 	                                       stream_type != RAW_STRM_TYPE_H264_NOREORDER)){
@@ -411,6 +415,15 @@ video_handle *arkapi_video_init(int stream_type)
 		goto err2;
 	}
 
+#if LIBARKAPI_PLATFORM == LIBARKAPI_ARK1668E && defined(VIDEO_USE_LOCK)
+	vin_fd = open("/dev/video0",O_RDWR);
+	if( vin_fd < 0 )
+	{
+		printf("++++++open error.\n");
+		goto err2;
+	}
+#endif
+
 	if (sem_init(&handle->sem_lock, 1, 1) < 0) {
 		printf("%s sem_init fail\n", __func__);
 		goto err2;
@@ -632,6 +645,10 @@ void arkapi_video_release(video_handle *handle)
 	sem_destroy(&handle->sem_lock);
 	free(handle);
 
+#if LIBARKAPI_PLATFORM == LIBARKAPI_ARK1668E && defined(VIDEO_USE_LOCK)
+	close(vin_fd);
+#endif
+
 	ark_dbg("%s: <---sucess.\n", __func__);
 
 	return;
@@ -670,7 +687,21 @@ 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;
+
+#if LIBARKAPI_PLATFORM == LIBARKAPI_ARK1668E && defined(VIDEO_USE_LOCK)
+	ret = ioctl(vin_fd, VIN_IOCTL_DOWN_IDLE, 0);
+	if(ret < 0)
+		printf("VIN_IOCTL_DOWN_IDLE error\n");
+#endif
+
 	ret = mfc_decode(handle->handle_mfc, &handle->in_buffer, &handle->out_buffer);
+
+#if LIBARKAPI_PLATFORM == LIBARKAPI_ARK1668E && defined(VIDEO_USE_LOCK)
+	ret = ioctl(vin_fd, VIN_IOCTL_UP_IDLE, 0);
+	if(ret < 0)
+		printf("VIN_IOCTL_UP_IDLE error\n");
+#endif
+
 	if (ret) {
 		printf("mfc_decode fail, ret=%d.\n", ret);
 		arkapi_video_unlock(handle);

+ 1 - 0
linux/arch/arm/configs/ark1668e_devb_defconfig

@@ -204,6 +204,7 @@ CONFIG_MEDIA_CONTROLLER=y
 CONFIG_VIDEO_V4L2_SUBDEV_API=y
 CONFIG_V4L_PLATFORM_DRIVERS=y
 CONFIG_VIDEO_ARK1668E_VIN=y
+CONFIG_VIDEO_USE_LOCK=y
 # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
 CONFIG_VIDEO_ARK7116=y
 CONFIG_MALI400=y

+ 1 - 0
linux/arch/arm/configs/ark1668e_devb_emmc_defconfig

@@ -200,6 +200,7 @@ CONFIG_MEDIA_CONTROLLER=y
 CONFIG_VIDEO_V4L2_SUBDEV_API=y
 CONFIG_V4L_PLATFORM_DRIVERS=y
 CONFIG_VIDEO_ARK1668E_VIN=y
+CONFIG_VIDEO_USE_LOCK=y
 # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
 CONFIG_VIDEO_ARK7116=y
 CONFIG_MALI400=y

+ 4 - 0
linux/drivers/media/platform/arkmicro/Kconfig

@@ -6,3 +6,7 @@ config VIDEO_ARK1668E_VIN
 	select V4L2_FWNODE
 	help
 	   This is the camera driver for arkmicro
+
+config VIDEO_USE_LOCK
+       tristate "set use lock for video"
+       depends on ARK1668E_CARBACK

+ 28 - 1
linux/drivers/media/platform/arkmicro/ark1668e_vin.c

@@ -490,7 +490,23 @@ static long vin_ioctl_default(struct file *file, void *priv,
 			vin_aux_config(para);
 			break;
 		}
-		
+
+#ifdef CONFIG_VIDEO_USE_LOCK
+		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;
+		}
+#endif
+
 		default:
 			printk("%s: error cmd 0x%x\n", __func__, cmd);
 			error = -EFAULT;
@@ -766,6 +782,10 @@ int dvr_exit_carback(void)
 	ark_vin_disable();
 	spin_unlock(&vin->dvr_dev->spin_lock);
 
+#ifdef CONFIG_VIDEO_USE_LOCK
+	up(&vin->dvr_dev->vin_sem);
+#endif
+
 	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){
@@ -1318,6 +1338,9 @@ static int vin_start(struct dvr_dev *dvr_dev)
 	int ret = 0;
 	vin = g_ark1668e_vin;
 	if(!dvr_dev->work_status){
+#ifdef CONFIG_VIDEO_USE_LOCK
+		down_interruptible(&dvr_dev->vin_sem);
+#endif
 		dvr_dev->work_status = 1;
 		dvr_dev->discard_frame = START_DISCARD_FRAME;
 		dvr_dev->cur_frame = 0;
@@ -1872,6 +1895,10 @@ static int ark1668e_vin_probe(struct platform_device *pdev)
 	    __FUNCTION__, __LINE__, ark_vin->dvr_dev->context.deinterlace_irq, ret);
 	}
 
+#ifdef CONFIG_VIDEO_USE_LOCK
+	sema_init(&ark_vin->dvr_dev->vin_sem, 1);
+#endif
+
 	timer_setup(&ark_vin->dvr_dev->timer, dither_timeout_timer, 0);
 	timer_setup(&ark_vin->dvr_dev->signal_timer, vin_get_signal_time, 0);
 

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

@@ -173,6 +173,9 @@ struct dvr_dev{
 	int vin_buffer_status;
 	int first_show_flag;
 	int dev_major, dev_minor;
+#ifdef CONFIG_VIDEO_USE_LOCK
+	struct semaphore vin_sem;
+#endif
     spinlock_t spin_lock;
 	struct work_struct scale_work;
 	struct workqueue_struct *scale_queue;
@@ -257,6 +260,10 @@ 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)
+#ifdef CONFIG_VIDEO_USE_LOCK
+#define VIN_IOCTL_DOWN_IDLE            _IO(ARK_DVR_IOC_MAGIC, 55)
+#define VIN_IOCTL_UP_IDLE                              _IO(ARK_DVR_IOC_MAGIC, 56)
+#endif
 
 #endif