All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5
@ 2016-03-22 20:16 Eric Ruei
  2016-03-22 20:22 ` Denys Dmytriyenko
  0 siblings, 1 reply; 5+ messages in thread
From: Eric Ruei @ 2016-03-22 20:16 UTC (permalink / raw)
  To: meta-arago

Signed-off-by: Eric Ruei <e-ruei1@ti.com>
---
 ...mera-demo-Enhance-to-support-both-AM4-AM5.patch | 469 +++++++++++++++++++++
 .../dual-camera-demo/dual_camera_qt5.sh            |   2 +-
 .../dual-camera-demo/dual_camera_qt5_omap-a15.sh   |  13 +
 .../dual-camera-demo/dual-camera-demo_1.0.bb       |   5 +-
 4 files changed, 487 insertions(+), 2 deletions(-)
 create mode 100644 meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
 create mode 100644 meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh

diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
new file mode 100644
index 0000000..347438d
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
@@ -0,0 +1,469 @@
+From 86ed5c9c3f9b8e71cd9980f847623af0caf4c187 Mon Sep 17 00:00:00 2001
+From: Eric Ruei <e-ruei1@ti.com>
+Date: Mon, 21 Mar 2016 16:27:58 -0400
+Subject: [PATCH] dual camera demo: Enhance to support both AM4/AM5
+
+- Initialize and restore DRM plane zorders
+- Add input parameter trans_key_mode (AM4:1;AM5:2)
+- Cleanup the exit sequence to avoid unnecessary operations and warnings
+
+
+Signed-off-by: Eric Ruei <e-ruei1@ti.com>
+---
+ loopback.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------
+ loopback.h |   1 +
+ main.cpp   |  36 ++++++++--
+ 3 files changed, 228 insertions(+), 36 deletions(-)
+
+diff --git a/loopback.c b/loopback.c
+index dda0390..66052b3 100644
+--- a/loopback.c
++++ b/loopback.c
+@@ -34,7 +34,9 @@
+ #define FOURCC_STR(str)    FOURCC(str[0], str[1], str[2], str[3])
+ 
+ #define PAGE_SHIFT 12
+-#define NBUF (3)
++#define NBUF (3)
++#define MAX_DRM_PLANES 5
++
+ 
+ struct control status;
+ 
+@@ -64,14 +66,22 @@ struct drm_device_info
+ {
+ 	int fd;
+ 	int width;
+-	int height;
++	int height;
++	unsigned int num_planes;
+ 	char dev_name[9];
+ 	char name[4];
+ 	unsigned int bo_flags;
+ 	struct dmabuf_buffer **buf[2];
+ 	struct omap_device *dev;
+ 	unsigned int crtc_id;
+-	unsigned plane_id[2];
++	unsigned int plane_id[2];
++	unsigned int prop_id_trans_key_mode;
++	unsigned int prop_id_alpha_blender;
++	unsigned int prop_id_zorder;
++	uint64_t prop_value_trans_key_mode;
++	uint64_t prop_value_alpha_blender;
++	uint32_t prop_value_zorder[MAX_DRM_PLANES];
++	uint32_t drm_plane_id[MAX_DRM_PLANES];
+ 	bool multiplanar;	/* True when Y and U/V are in separate buffers. */
+ } drm_device;
+ 
+@@ -500,6 +510,121 @@ struct dmabuf_buffer *v4l2_dequeue_buffer(struct v4l2_device_info *device)
+ 	}
+ 
+ 	return buf;
++}
++
++/*
++ * Reorder the zorder of DRM planes to the desired order for demo
++ *      VID1: 1
++ *      VID2: 2
++ *      CRTC: 3
++ */
++
++int drm_init_plane_zorder(struct drm_device_info *device)
++{
++	int i,j;
++	drmModePlaneRes *res;
++	drmModePlane *plane;
++	drmModeObjectProperties *props;
++	drmModePropertyRes *props_info;
++	uint32_t zorder=1;
++	int ret = 0;
++
++	// This will explain the planes to include CRTC, but setPlane is not applicable to 
++	// the CRTC plane
++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
++
++	res = drmModeGetPlaneResources(device->fd);
++
++	if(res == NULL){
++		ERROR("plane resources not found\n");
++		ret = -1;
++		goto drm_init_plane_zorder_error;
++	}
++
++	//DBG("drm_init_plane_zorder:no. of planes = %d\n", res->count_planes);
++
++	if (res->count_planes > MAX_DRM_PLANES)
++	{
++
++		ERROR("There are two many DRM planes (%d > %d)\n", res->count_planes, MAX_DRM_PLANES);
++		ret = -1;
++		goto drm_init_plane_zorder_error;
++	}
++
++	device->num_planes = res->count_planes;
++	for (i = 0; i < res->count_planes; i++) {
++		uint32_t plane_id = res->planes[i];
++		bool fCRTC = 0;
++		uint32_t zorder_value = 3;
++
++		drmModePlane *plane = drmModeGetPlane(device->fd, plane_id);
++		if(plane == NULL){
++			ERROR("plane (%d) not found\n", plane_id);
++			continue;
++		}
++
++		// TBD: check for required plane attributes
++		device->drm_plane_id[i] = plane->plane_id;
++
++		props = drmModeObjectGetProperties(device->fd, plane->plane_id, DRM_MODE_OBJECT_PLANE);
++
++		if(props == NULL){
++			ERROR("plane (%d) properties not found\n",  plane->plane_id);
++			continue;
++		}
++
++		for (j = 0; j < props->count_props; j++)
++		{
++			props_info = drmModeGetProperty(device->fd, props->props[j]);
++
++			if(props_info == NULL){
++				ERROR("plane(%d) props[%d] not found\n", plane->plane_id, j);
++				continue;
++			}
++
++			if (strcmp("type", props_info->name) == 0)
++			{
++				fCRTC = (props->prop_values[j] == 1)?1:0;
++			}
++			else if ((strcmp("zorder", props_info->name) == 0))
++			{
++				if (!device->prop_id_zorder)
++				{
++					device->prop_id_zorder = props_info->prop_id;
++				}
++				device->prop_value_zorder[i] = (uint32_t)props->prop_values[j];
++			}
++
++			drmModeFreeProperty(props_info);
++		}
++
++		/* Re-arrange zorder */
++		if (!fCRTC)
++		{
++			zorder_value = zorder++;
++		}
++
++		j = drmModeObjectSetProperty(device->fd, plane->plane_id,
++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
++									(uint64_t)zorder_value);
++
++		if (j < 0) {
++			ERROR("set z-order for plane id %d failed\n", plane->plane_id);
++		}
++
++		drmModeFreeObjectProperties(props);
++		drmModeFreePlane(plane);
++
++	}
++
++	drmModeFreePlaneResources(res);
++
++drm_init_plane_zorder_error:
++
++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
++
++	return(ret);
++
+ }
+ 
+ uint32_t drm_reserve_plane(int fd)
+@@ -508,7 +633,7 @@ uint32_t drm_reserve_plane(int fd)
+ 	drmModePlaneRes *res = drmModeGetPlaneResources(fd);
+ 	if(res == NULL){
+ 		ERROR("plane resources not found\n");
+-	}
++	}
+ 
+ 	for (i = 0; i < res->count_planes; i++) {
+ 		uint32_t plane_id = res->planes[i];
+@@ -520,7 +645,7 @@ uint32_t drm_reserve_plane(int fd)
+ 			continue;
+ 
+ 		drmModePlane *plane = drmModeGetPlane(fd, plane_id);
+-		if(res == NULL){
++		if(plane == NULL){
+ 			ERROR("plane  not found\n");
+ 		}
+ 
+@@ -577,9 +702,45 @@ void drm_crtc_resolution(struct drm_device_info *device)
+ 		device->height = crtc->height;
+ 
+ 		drmModeFreeCrtc(crtc);
+-		drmModeFreeResources(res);
++	}
++
++	drmModeFreeResources(res);
++
++}
++
++/*
++ * DRM restore properties
++ */
++static void drm_restore_props(struct drm_device_info *device)
++{
++	unsigned int i;
++
++	/* restore the original zorder of DRM planes */
++
++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
++
++	for (i = 0; i < device->num_planes; i++) {
++		if (device->drm_plane_id[i])
++		{
++			drmModeObjectSetProperty(device->fd, device->drm_plane_id[i],
++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
++									 (uint64_t)device->prop_value_zorder[i]);
++		}
+ 	}
+-}
++
++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
++
++	if(device->prop_id_trans_key_mode){
++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
++			DRM_MODE_OBJECT_CRTC, device->prop_id_trans_key_mode, device->prop_value_trans_key_mode);
++	}
++
++	if(device->prop_id_alpha_blender){
++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
++			DRM_MODE_OBJECT_CRTC, device->prop_id_alpha_blender, device->prop_value_alpha_blender);
++	}
++}
++
+ /*
+ * drm device init
+ */
+@@ -587,12 +748,14 @@ static int drm_init_device(struct drm_device_info *device)
+ {
+ 	unsigned char j;
+ 
+-	if (!device->fd) {
++	if (!device->fd) {
+ 		device->fd = drmOpen("omapdrm", NULL);
+ 		if (device->fd < 0) {
+ 			ERROR("could not open drm device: %s (%d)", strerror(errno), errno);
+ 			return -1;
+-		}
++		}
++		if (drm_init_plane_zorder(device))
++			return -1;
+ 	}
+ 
+ 	device->dev = omap_device_new(device->fd);
+@@ -600,16 +763,15 @@ static int drm_init_device(struct drm_device_info *device)
+ 	/* Get CRTC id and resolution. As well set the global display width and height */
+ 	drm_crtc_resolution(device);
+ 
+-
+ 	/* Store display resolution so GUI can be configured */
+ 	status.display_xres = device->width;
+-	status.display_yres = device->height;
++	status.display_yres = device->height;
+ 
+ 	/* AM437x has two video planes and one graphics plane.  */
+ 	/* Get one video plane  for each camera                 */
+ 	for (j = 0; j < status.num_cams; j++) {
+ 
+-		device->plane_id[j] = drm_reserve_plane(device->fd);
++		device->plane_id[j] = drm_reserve_plane(device->fd);
+ 	}
+ 
+ 	return 0;
+@@ -619,7 +781,9 @@ static int drm_init_device(struct drm_device_info *device)
+ *Clean resources while exiting drm device 
+ */
+ static void drm_exit_device(struct drm_device_info *device)
+-{
++{
++
++	drm_restore_props(device);
+ 	omap_device_del(device->dev);
+ 	device->dev = NULL;
+ 
+@@ -637,8 +801,6 @@ static int drm_init_dss(void)
+ {
+ 	drmModeObjectProperties *props;
+ 	drmModePropertyRes *propRes;
+-	unsigned int prop_trans_key_mode = 0;
+-	unsigned int prop_alpha_blender = 0;
+ 	unsigned int j;
+ 
+ 	props = drmModeObjectGetProperties(drm_device.fd, drm_device.crtc_id,
+@@ -651,41 +813,43 @@ static int drm_init_dss(void)
+ 			continue;
+ 
+ 		if (strcmp(propRes->name, "trans-key-mode") == 0) {
+-			prop_trans_key_mode = props->props[j];
++			drm_device.prop_id_trans_key_mode = props->props[j];
++			drm_device.prop_value_trans_key_mode = props->prop_values[j];
+ 		}
+ 
+ 		if (strcmp(propRes->name, "alpha_blender") == 0) {
+-			prop_alpha_blender = props->props[j];
++			drm_device.prop_id_alpha_blender = props->props[j];
++			drm_device.prop_value_alpha_blender = props->prop_values[j];
+ 		}
+ 
+-		if(prop_alpha_blender & prop_trans_key_mode){
++		if(drm_device.prop_id_trans_key_mode & drm_device.prop_id_alpha_blender){
+ 			break;
+ 		}
+ 	}
+ 
+-	if(prop_trans_key_mode == 0){
+-		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
++	if(drm_device.prop_id_trans_key_mode == 0){
++		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
+ 		return -1;
+ 	}
+ 
+-	if(prop_alpha_blender == 0){
++	if(drm_device.prop_id_alpha_blender == 0){
+ 		ERROR("ALPHA BLENDER PROPERTY NOT FOUND\n");
+ 		return -1;
+ 	}
+ 
+ 	/* Enable the transparency color key */
+ 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
+-		DRM_MODE_OBJECT_CRTC, prop_trans_key_mode, 1) < 0) {
++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_trans_key_mode, status.trans_key_mode) < 0) {
+ 			ERROR("error setting drm property for transparency key mode\n");
+ 			return -1;
+ 	}
+ 
+-	/* Enable the LCD alpha blender */
++	/* Enable the LCD alpha blender */
+ 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
+-		DRM_MODE_OBJECT_CRTC, prop_alpha_blender, 1) < 0){
++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_alpha_blender, 1) < 0){
+ 			ERROR("error setting drm property for Alpha Blender\n");
+ 			return -1;
+-	}
++	}
+ 	return 0;
+ }
+ 
+@@ -785,7 +949,8 @@ static int capture_frame(struct v4l2_device_info *v4l2_device)
+ */
+ void default_parameters(void)
+ {
+-	/* Main camera display */
++	/* Main camera display */
++	memset(&drm_device, 0, sizeof(drm_device));
+ 	strcpy(drm_device.dev_name,"/dev/drm");
+ 	strcpy(drm_device.name,"drm");
+ 	drm_device.width=0;
+@@ -852,8 +1017,10 @@ void exit_devices(void)
+ */
+ void end_streaming(void)
+ {
+-        v4l2_stream_off(&cap0_device);
+-        v4l2_stream_off(&cap1_device);
++	v4l2_stream_off(&cap0_device);
++	if (status.num_cams==2) {
++		v4l2_stream_off(&cap1_device);
++	}
+ }
+ 
+ /*
+@@ -967,7 +1134,7 @@ Error:
+ * whether a jpeg image needs to be captured.
+ */
+ void process_frame(void) {
+-
++
+ 	/* Display the main camera */
+ 	if (status.main_cam==0)
+ 		display_frame(&cap0_device, &drm_device, 0);
+@@ -980,7 +1147,7 @@ void process_frame(void) {
+ 			display_frame(&cap1_device, &drm_device, 1);
+ 		else
+ 			display_frame(&cap0_device, &drm_device, 1);
+-	}
++	}
+ 
+ 	/* Save jpeg image if triggered */
+ 	if (status.jpeg==true) {
+diff --git a/loopback.h b/loopback.h
+index b20b996..4f468f4 100644
+--- a/loopback.h
++++ b/loopback.h
+@@ -10,6 +10,7 @@ struct control {
+     int num_cams;
+     int num_jpeg;
+     int display_xres, display_yres;
++    int trans_key_mode;
+     bool pip;
+     bool jpeg;
+     bool exit;
+diff --git a/main.cpp b/main.cpp
+index e73b061..c5c6900 100644
+--- a/main.cpp
++++ b/main.cpp
+@@ -1,23 +1,47 @@
+ #include <qglobal.h>
+ #include <QApplication>
+-#include <QLabel>
++#include <QLabel>
++#include <QStringList>
+ 
+ #if QT_VERSION < 0x050000
+ #include <QWSServer>
+ #endif
+-
+-
++
+ #include <QPushButton>
+-#include "mainwindow.h"
++#include "mainwindow.h"
++#include "loopback.h"
++
+ 
+ int main(int argc, char *argv[])
+ {
+     QApplication a(argc, argv);
+-    MainWindow w;
++    QStringList args = a.arguments();
++
++    /*
++     * Extract the trans key mode which is SoC specific and can be
++     * found at the corresponding TRM, for example,
++     * For AM437x: trans_key_mode = 1 GFX Dest Trans
++     *             TransKey applies to GFX overlay, marking which pixels come from VID overlays) 
++     * For AM57xx: trans_key_mode = 2 Source Key.
++     *             Match on Layer4 makes Layer4 transparent (zorder 3)
++     *
++     * The deault mode is 1 for backward compatibility
++     */
++
++    if((args.count() >= 2))
++    {
++        status.trans_key_mode = (args[1].toInt() == 2)?2:1;
++    }
++    else
++    {
++        status.trans_key_mode = 1;
++    }
+ 
+ #if QT_VERSION < 0x050000
+ 	QWSServer::setBackground(QBrush(QColor(0, 0, 0, 0)));
+-#endif
++#endif
++
++    MainWindow w;
+ 
+     w.show();
+     return a.exec();
+-- 
+1.9.1
+
diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
index 4802337..5774a06 100644
--- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
+++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
@@ -5,7 +5,7 @@ sleep 1
 
 echo 0 > /sys/class/graphics/fbcon/cursor_blink
 
-dual_camera -platform linuxfb
+dual_camera 1 -platform linuxfb
 
 echo 1 > /sys/class/graphics/fbcon/cursor_blink
 
diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
new file mode 100644
index 0000000..3d96cde
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+/etc/init.d/weston stop
+sleep 1
+
+echo 0 > /sys/class/graphics/fbcon/cursor_blink
+
+dual_camera 2 -platform linuxfb
+
+echo 1 > /sys/class/graphics/fbcon/cursor_blink
+
+/etc/init.d/weston start
+sleep 1
diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
index 1b1a146..47d8ff3 100644
--- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
+++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
@@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c7ca707704d3354a64feeb4f19f52eb5"
 DEPENDS += "libdrm"
 require recipes-core/matrix/matrix-gui-paths.inc
 
-PR = "r13"
+PR = "r14"
 
 BRANCH = "drm"
 SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
@@ -15,13 +15,16 @@ SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
 SRC_URI = "git://git.ti.com/sitara-linux/dual-camera-demo.git;protocol=git;branch=${BRANCH} \
            file://desc_dual-camera.html \
            file://dual_camera_qt5.sh \
+           file://dual_camera_qt5_omap-a15.sh \
            file://dual_camera_qt4.sh \
            file://dual-camera.desktop \
+           file://0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch \
 "
 
 S = "${WORKDIR}/git"
 
 DEMO_SCRIPT = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5.sh', 'dual_camera_qt4.sh', d)}"
+DEMO_SCRIPT_omap-a15 = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5_omap-a15.sh', 'dual_camera_qt4.sh', d)}"
 
 inherit qt-provider
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5
  2016-03-22 20:16 [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5 Eric Ruei
@ 2016-03-22 20:22 ` Denys Dmytriyenko
  2016-03-22 22:09   ` Denys Dmytriyenko
  0 siblings, 1 reply; 5+ messages in thread
From: Denys Dmytriyenko @ 2016-03-22 20:22 UTC (permalink / raw)
  To: Eric Ruei; +Cc: meta-arago

On Tue, Mar 22, 2016 at 04:16:54PM -0400, Eric Ruei wrote:
> Signed-off-by: Eric Ruei <e-ruei1@ti.com>
> ---
>  ...mera-demo-Enhance-to-support-both-AM4-AM5.patch | 469 +++++++++++++++++++++
>  .../dual-camera-demo/dual_camera_qt5.sh            |   2 +-
>  .../dual-camera-demo/dual_camera_qt5_omap-a15.sh   |  13 +
>  .../dual-camera-demo/dual-camera-demo_1.0.bb       |   5 +-
>  4 files changed, 487 insertions(+), 2 deletions(-)
>  create mode 100644 meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
>  create mode 100644 meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
> 
> diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> new file mode 100644
> index 0000000..347438d
> --- /dev/null
> +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> @@ -0,0 +1,469 @@
> +From 86ed5c9c3f9b8e71cd9980f847623af0caf4c187 Mon Sep 17 00:00:00 2001
> +From: Eric Ruei <e-ruei1@ti.com>
> +Date: Mon, 21 Mar 2016 16:27:58 -0400
> +Subject: [PATCH] dual camera demo: Enhance to support both AM4/AM5
> +
> +- Initialize and restore DRM plane zorders
> +- Add input parameter trans_key_mode (AM4:1;AM5:2)
> +- Cleanup the exit sequence to avoid unnecessary operations and warnings
> +
> +
> +Signed-off-by: Eric Ruei <e-ruei1@ti.com>
> +---
> + loopback.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------
> + loopback.h |   1 +
> + main.cpp   |  36 ++++++++--
> + 3 files changed, 228 insertions(+), 36 deletions(-)
> +
> +diff --git a/loopback.c b/loopback.c
> +index dda0390..66052b3 100644
> +--- a/loopback.c
> ++++ b/loopback.c
> +@@ -34,7 +34,9 @@
> + #define FOURCC_STR(str)    FOURCC(str[0], str[1], str[2], str[3])
> + 
> + #define PAGE_SHIFT 12
> +-#define NBUF (3)
> ++#define NBUF (3)
> ++#define MAX_DRM_PLANES 5
> ++
> + 
> + struct control status;
> + 
> +@@ -64,14 +66,22 @@ struct drm_device_info
> + {
> + 	int fd;
> + 	int width;
> +-	int height;
> ++	int height;
> ++	unsigned int num_planes;
> + 	char dev_name[9];
> + 	char name[4];
> + 	unsigned int bo_flags;
> + 	struct dmabuf_buffer **buf[2];
> + 	struct omap_device *dev;
> + 	unsigned int crtc_id;
> +-	unsigned plane_id[2];
> ++	unsigned int plane_id[2];
> ++	unsigned int prop_id_trans_key_mode;
> ++	unsigned int prop_id_alpha_blender;
> ++	unsigned int prop_id_zorder;
> ++	uint64_t prop_value_trans_key_mode;
> ++	uint64_t prop_value_alpha_blender;
> ++	uint32_t prop_value_zorder[MAX_DRM_PLANES];
> ++	uint32_t drm_plane_id[MAX_DRM_PLANES];
> + 	bool multiplanar;	/* True when Y and U/V are in separate buffers. */
> + } drm_device;
> + 
> +@@ -500,6 +510,121 @@ struct dmabuf_buffer *v4l2_dequeue_buffer(struct v4l2_device_info *device)
> + 	}
> + 
> + 	return buf;
> ++}
> ++
> ++/*
> ++ * Reorder the zorder of DRM planes to the desired order for demo
> ++ *      VID1: 1
> ++ *      VID2: 2
> ++ *      CRTC: 3
> ++ */
> ++
> ++int drm_init_plane_zorder(struct drm_device_info *device)
> ++{
> ++	int i,j;
> ++	drmModePlaneRes *res;
> ++	drmModePlane *plane;
> ++	drmModeObjectProperties *props;
> ++	drmModePropertyRes *props_info;
> ++	uint32_t zorder=1;
> ++	int ret = 0;
> ++
> ++	// This will explain the planes to include CRTC, but setPlane is not applicable to 
> ++	// the CRTC plane
> ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> ++
> ++	res = drmModeGetPlaneResources(device->fd);
> ++
> ++	if(res == NULL){
> ++		ERROR("plane resources not found\n");
> ++		ret = -1;
> ++		goto drm_init_plane_zorder_error;
> ++	}
> ++
> ++	//DBG("drm_init_plane_zorder:no. of planes = %d\n", res->count_planes);
> ++
> ++	if (res->count_planes > MAX_DRM_PLANES)
> ++	{
> ++
> ++		ERROR("There are two many DRM planes (%d > %d)\n", res->count_planes, MAX_DRM_PLANES);
> ++		ret = -1;
> ++		goto drm_init_plane_zorder_error;
> ++	}
> ++
> ++	device->num_planes = res->count_planes;
> ++	for (i = 0; i < res->count_planes; i++) {
> ++		uint32_t plane_id = res->planes[i];
> ++		bool fCRTC = 0;
> ++		uint32_t zorder_value = 3;
> ++
> ++		drmModePlane *plane = drmModeGetPlane(device->fd, plane_id);
> ++		if(plane == NULL){
> ++			ERROR("plane (%d) not found\n", plane_id);
> ++			continue;
> ++		}
> ++
> ++		// TBD: check for required plane attributes
> ++		device->drm_plane_id[i] = plane->plane_id;
> ++
> ++		props = drmModeObjectGetProperties(device->fd, plane->plane_id, DRM_MODE_OBJECT_PLANE);
> ++
> ++		if(props == NULL){
> ++			ERROR("plane (%d) properties not found\n",  plane->plane_id);
> ++			continue;
> ++		}
> ++
> ++		for (j = 0; j < props->count_props; j++)
> ++		{
> ++			props_info = drmModeGetProperty(device->fd, props->props[j]);
> ++
> ++			if(props_info == NULL){
> ++				ERROR("plane(%d) props[%d] not found\n", plane->plane_id, j);
> ++				continue;
> ++			}
> ++
> ++			if (strcmp("type", props_info->name) == 0)
> ++			{
> ++				fCRTC = (props->prop_values[j] == 1)?1:0;
> ++			}
> ++			else if ((strcmp("zorder", props_info->name) == 0))
> ++			{
> ++				if (!device->prop_id_zorder)
> ++				{
> ++					device->prop_id_zorder = props_info->prop_id;
> ++				}
> ++				device->prop_value_zorder[i] = (uint32_t)props->prop_values[j];
> ++			}
> ++
> ++			drmModeFreeProperty(props_info);
> ++		}
> ++
> ++		/* Re-arrange zorder */
> ++		if (!fCRTC)
> ++		{
> ++			zorder_value = zorder++;
> ++		}
> ++
> ++		j = drmModeObjectSetProperty(device->fd, plane->plane_id,
> ++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
> ++									(uint64_t)zorder_value);
> ++
> ++		if (j < 0) {
> ++			ERROR("set z-order for plane id %d failed\n", plane->plane_id);
> ++		}
> ++
> ++		drmModeFreeObjectProperties(props);
> ++		drmModeFreePlane(plane);
> ++
> ++	}
> ++
> ++	drmModeFreePlaneResources(res);
> ++
> ++drm_init_plane_zorder_error:
> ++
> ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> ++
> ++	return(ret);
> ++
> + }
> + 
> + uint32_t drm_reserve_plane(int fd)
> +@@ -508,7 +633,7 @@ uint32_t drm_reserve_plane(int fd)
> + 	drmModePlaneRes *res = drmModeGetPlaneResources(fd);
> + 	if(res == NULL){
> + 		ERROR("plane resources not found\n");
> +-	}
> ++	}
> + 
> + 	for (i = 0; i < res->count_planes; i++) {
> + 		uint32_t plane_id = res->planes[i];
> +@@ -520,7 +645,7 @@ uint32_t drm_reserve_plane(int fd)
> + 			continue;
> + 
> + 		drmModePlane *plane = drmModeGetPlane(fd, plane_id);
> +-		if(res == NULL){
> ++		if(plane == NULL){
> + 			ERROR("plane  not found\n");
> + 		}
> + 
> +@@ -577,9 +702,45 @@ void drm_crtc_resolution(struct drm_device_info *device)
> + 		device->height = crtc->height;
> + 
> + 		drmModeFreeCrtc(crtc);
> +-		drmModeFreeResources(res);
> ++	}
> ++
> ++	drmModeFreeResources(res);
> ++
> ++}
> ++
> ++/*
> ++ * DRM restore properties
> ++ */
> ++static void drm_restore_props(struct drm_device_info *device)
> ++{
> ++	unsigned int i;
> ++
> ++	/* restore the original zorder of DRM planes */
> ++
> ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> ++
> ++	for (i = 0; i < device->num_planes; i++) {
> ++		if (device->drm_plane_id[i])
> ++		{
> ++			drmModeObjectSetProperty(device->fd, device->drm_plane_id[i],
> ++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
> ++									 (uint64_t)device->prop_value_zorder[i]);
> ++		}
> + 	}
> +-}
> ++
> ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> ++
> ++	if(device->prop_id_trans_key_mode){
> ++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
> ++			DRM_MODE_OBJECT_CRTC, device->prop_id_trans_key_mode, device->prop_value_trans_key_mode);
> ++	}
> ++
> ++	if(device->prop_id_alpha_blender){
> ++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
> ++			DRM_MODE_OBJECT_CRTC, device->prop_id_alpha_blender, device->prop_value_alpha_blender);
> ++	}
> ++}
> ++
> + /*
> + * drm device init
> + */
> +@@ -587,12 +748,14 @@ static int drm_init_device(struct drm_device_info *device)
> + {
> + 	unsigned char j;
> + 
> +-	if (!device->fd) {
> ++	if (!device->fd) {
> + 		device->fd = drmOpen("omapdrm", NULL);
> + 		if (device->fd < 0) {
> + 			ERROR("could not open drm device: %s (%d)", strerror(errno), errno);
> + 			return -1;
> +-		}
> ++		}
> ++		if (drm_init_plane_zorder(device))
> ++			return -1;
> + 	}
> + 
> + 	device->dev = omap_device_new(device->fd);
> +@@ -600,16 +763,15 @@ static int drm_init_device(struct drm_device_info *device)
> + 	/* Get CRTC id and resolution. As well set the global display width and height */
> + 	drm_crtc_resolution(device);
> + 
> +-
> + 	/* Store display resolution so GUI can be configured */
> + 	status.display_xres = device->width;
> +-	status.display_yres = device->height;
> ++	status.display_yres = device->height;
> + 
> + 	/* AM437x has two video planes and one graphics plane.  */
> + 	/* Get one video plane  for each camera                 */
> + 	for (j = 0; j < status.num_cams; j++) {
> + 
> +-		device->plane_id[j] = drm_reserve_plane(device->fd);
> ++		device->plane_id[j] = drm_reserve_plane(device->fd);
> + 	}
> + 
> + 	return 0;
> +@@ -619,7 +781,9 @@ static int drm_init_device(struct drm_device_info *device)
> + *Clean resources while exiting drm device 
> + */
> + static void drm_exit_device(struct drm_device_info *device)
> +-{
> ++{
> ++
> ++	drm_restore_props(device);
> + 	omap_device_del(device->dev);
> + 	device->dev = NULL;
> + 
> +@@ -637,8 +801,6 @@ static int drm_init_dss(void)
> + {
> + 	drmModeObjectProperties *props;
> + 	drmModePropertyRes *propRes;
> +-	unsigned int prop_trans_key_mode = 0;
> +-	unsigned int prop_alpha_blender = 0;
> + 	unsigned int j;
> + 
> + 	props = drmModeObjectGetProperties(drm_device.fd, drm_device.crtc_id,
> +@@ -651,41 +813,43 @@ static int drm_init_dss(void)
> + 			continue;
> + 
> + 		if (strcmp(propRes->name, "trans-key-mode") == 0) {
> +-			prop_trans_key_mode = props->props[j];
> ++			drm_device.prop_id_trans_key_mode = props->props[j];
> ++			drm_device.prop_value_trans_key_mode = props->prop_values[j];
> + 		}
> + 
> + 		if (strcmp(propRes->name, "alpha_blender") == 0) {
> +-			prop_alpha_blender = props->props[j];
> ++			drm_device.prop_id_alpha_blender = props->props[j];
> ++			drm_device.prop_value_alpha_blender = props->prop_values[j];
> + 		}
> + 
> +-		if(prop_alpha_blender & prop_trans_key_mode){
> ++		if(drm_device.prop_id_trans_key_mode & drm_device.prop_id_alpha_blender){
> + 			break;
> + 		}
> + 	}
> + 
> +-	if(prop_trans_key_mode == 0){
> +-		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
> ++	if(drm_device.prop_id_trans_key_mode == 0){
> ++		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
> + 		return -1;
> + 	}
> + 
> +-	if(prop_alpha_blender == 0){
> ++	if(drm_device.prop_id_alpha_blender == 0){
> + 		ERROR("ALPHA BLENDER PROPERTY NOT FOUND\n");
> + 		return -1;
> + 	}
> + 
> + 	/* Enable the transparency color key */
> + 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
> +-		DRM_MODE_OBJECT_CRTC, prop_trans_key_mode, 1) < 0) {
> ++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_trans_key_mode, status.trans_key_mode) < 0) {
> + 			ERROR("error setting drm property for transparency key mode\n");
> + 			return -1;
> + 	}
> + 
> +-	/* Enable the LCD alpha blender */
> ++	/* Enable the LCD alpha blender */
> + 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
> +-		DRM_MODE_OBJECT_CRTC, prop_alpha_blender, 1) < 0){
> ++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_alpha_blender, 1) < 0){
> + 			ERROR("error setting drm property for Alpha Blender\n");
> + 			return -1;
> +-	}
> ++	}
> + 	return 0;
> + }
> + 
> +@@ -785,7 +949,8 @@ static int capture_frame(struct v4l2_device_info *v4l2_device)
> + */
> + void default_parameters(void)
> + {
> +-	/* Main camera display */
> ++	/* Main camera display */
> ++	memset(&drm_device, 0, sizeof(drm_device));
> + 	strcpy(drm_device.dev_name,"/dev/drm");
> + 	strcpy(drm_device.name,"drm");
> + 	drm_device.width=0;
> +@@ -852,8 +1017,10 @@ void exit_devices(void)
> + */
> + void end_streaming(void)
> + {
> +-        v4l2_stream_off(&cap0_device);
> +-        v4l2_stream_off(&cap1_device);
> ++	v4l2_stream_off(&cap0_device);
> ++	if (status.num_cams==2) {
> ++		v4l2_stream_off(&cap1_device);
> ++	}
> + }
> + 
> + /*
> +@@ -967,7 +1134,7 @@ Error:
> + * whether a jpeg image needs to be captured.
> + */
> + void process_frame(void) {
> +-
> ++
> + 	/* Display the main camera */
> + 	if (status.main_cam==0)
> + 		display_frame(&cap0_device, &drm_device, 0);
> +@@ -980,7 +1147,7 @@ void process_frame(void) {
> + 			display_frame(&cap1_device, &drm_device, 1);
> + 		else
> + 			display_frame(&cap0_device, &drm_device, 1);
> +-	}
> ++	}
> + 
> + 	/* Save jpeg image if triggered */
> + 	if (status.jpeg==true) {
> +diff --git a/loopback.h b/loopback.h
> +index b20b996..4f468f4 100644
> +--- a/loopback.h
> ++++ b/loopback.h
> +@@ -10,6 +10,7 @@ struct control {
> +     int num_cams;
> +     int num_jpeg;
> +     int display_xres, display_yres;
> ++    int trans_key_mode;
> +     bool pip;
> +     bool jpeg;
> +     bool exit;
> +diff --git a/main.cpp b/main.cpp
> +index e73b061..c5c6900 100644
> +--- a/main.cpp
> ++++ b/main.cpp
> +@@ -1,23 +1,47 @@
> + #include <qglobal.h>
> + #include <QApplication>
> +-#include <QLabel>
> ++#include <QLabel>
> ++#include <QStringList>
> + 
> + #if QT_VERSION < 0x050000
> + #include <QWSServer>
> + #endif
> +-
> +-
> ++
> + #include <QPushButton>
> +-#include "mainwindow.h"
> ++#include "mainwindow.h"
> ++#include "loopback.h"
> ++
> + 
> + int main(int argc, char *argv[])
> + {
> +     QApplication a(argc, argv);
> +-    MainWindow w;
> ++    QStringList args = a.arguments();
> ++
> ++    /*
> ++     * Extract the trans key mode which is SoC specific and can be
> ++     * found at the corresponding TRM, for example,
> ++     * For AM437x: trans_key_mode = 1 GFX Dest Trans
> ++     *             TransKey applies to GFX overlay, marking which pixels come from VID overlays) 
> ++     * For AM57xx: trans_key_mode = 2 Source Key.
> ++     *             Match on Layer4 makes Layer4 transparent (zorder 3)
> ++     *
> ++     * The deault mode is 1 for backward compatibility
> ++     */
> ++
> ++    if((args.count() >= 2))
> ++    {
> ++        status.trans_key_mode = (args[1].toInt() == 2)?2:1;
> ++    }
> ++    else
> ++    {
> ++        status.trans_key_mode = 1;
> ++    }
> + 
> + #if QT_VERSION < 0x050000
> + 	QWSServer::setBackground(QBrush(QColor(0, 0, 0, 0)));
> +-#endif
> ++#endif
> ++
> ++    MainWindow w;
> + 
> +     w.show();
> +     return a.exec();
> +-- 
> +1.9.1
> +
> diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
> index 4802337..5774a06 100644
> --- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
> +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
> @@ -5,7 +5,7 @@ sleep 1
>  
>  echo 0 > /sys/class/graphics/fbcon/cursor_blink
>  
> -dual_camera -platform linuxfb
> +dual_camera 1 -platform linuxfb
>  
>  echo 1 > /sys/class/graphics/fbcon/cursor_blink
>  
> diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
> new file mode 100644
> index 0000000..3d96cde
> --- /dev/null
> +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
> @@ -0,0 +1,13 @@
> +#!/bin/bash
> +
> +/etc/init.d/weston stop
> +sleep 1
> +
> +echo 0 > /sys/class/graphics/fbcon/cursor_blink
> +
> +dual_camera 2 -platform linuxfb
> +
> +echo 1 > /sys/class/graphics/fbcon/cursor_blink
> +
> +/etc/init.d/weston start
> +sleep 1
> diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
> index 1b1a146..47d8ff3 100644
> --- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
> +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
> @@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c7ca707704d3354a64feeb4f19f52eb5"
>  DEPENDS += "libdrm"
>  require recipes-core/matrix/matrix-gui-paths.inc
>  
> -PR = "r13"
> +PR = "r14"
>  
>  BRANCH = "drm"
>  SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
> @@ -15,13 +15,16 @@ SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
>  SRC_URI = "git://git.ti.com/sitara-linux/dual-camera-demo.git;protocol=git;branch=${BRANCH} \
>             file://desc_dual-camera.html \
>             file://dual_camera_qt5.sh \
> +           file://dual_camera_qt5_omap-a15.sh \
>             file://dual_camera_qt4.sh \
>             file://dual-camera.desktop \
> +           file://0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch \
>  "
>  
>  S = "${WORKDIR}/git"
>  
>  DEMO_SCRIPT = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5.sh', 'dual_camera_qt4.sh', d)}"
> +DEMO_SCRIPT_omap-a15 = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5_omap-a15.sh', 'dual_camera_qt4.sh', d)}"

This will try to apply qt4 patch twice...


>  inherit qt-provider
>  
> -- 
> 1.9.1
> 
> _______________________________________________
> meta-arago mailing list
> meta-arago@arago-project.org
> http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5
  2016-03-22 20:22 ` Denys Dmytriyenko
@ 2016-03-22 22:09   ` Denys Dmytriyenko
  2016-03-22 22:20     ` Ruei, Eric
  0 siblings, 1 reply; 5+ messages in thread
From: Denys Dmytriyenko @ 2016-03-22 22:09 UTC (permalink / raw)
  To: Eric Ruei; +Cc: meta-arago

On Tue, Mar 22, 2016 at 04:22:27PM -0400, Denys Dmytriyenko wrote:
> On Tue, Mar 22, 2016 at 04:16:54PM -0400, Eric Ruei wrote:
> > Signed-off-by: Eric Ruei <e-ruei1@ti.com>
> > ---
> >  ...mera-demo-Enhance-to-support-both-AM4-AM5.patch | 469 +++++++++++++++++++++
> >  .../dual-camera-demo/dual_camera_qt5.sh            |   2 +-
> >  .../dual-camera-demo/dual_camera_qt5_omap-a15.sh   |  13 +
> >  .../dual-camera-demo/dual-camera-demo_1.0.bb       |   5 +-
> >  4 files changed, 487 insertions(+), 2 deletions(-)
> >  create mode 100644 meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> >  create mode 100644 meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
> > 
> > diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> > new file mode 100644
> > index 0000000..347438d
> > --- /dev/null
> > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> > @@ -0,0 +1,469 @@
> > +From 86ed5c9c3f9b8e71cd9980f847623af0caf4c187 Mon Sep 17 00:00:00 2001
> > +From: Eric Ruei <e-ruei1@ti.com>
> > +Date: Mon, 21 Mar 2016 16:27:58 -0400
> > +Subject: [PATCH] dual camera demo: Enhance to support both AM4/AM5
> > +
> > +- Initialize and restore DRM plane zorders
> > +- Add input parameter trans_key_mode (AM4:1;AM5:2)
> > +- Cleanup the exit sequence to avoid unnecessary operations and warnings
> > +
> > +
> > +Signed-off-by: Eric Ruei <e-ruei1@ti.com>
> > +---
> > + loopback.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------
> > + loopback.h |   1 +
> > + main.cpp   |  36 ++++++++--
> > + 3 files changed, 228 insertions(+), 36 deletions(-)
> > +
> > +diff --git a/loopback.c b/loopback.c
> > +index dda0390..66052b3 100644
> > +--- a/loopback.c
> > ++++ b/loopback.c
> > +@@ -34,7 +34,9 @@
> > + #define FOURCC_STR(str)    FOURCC(str[0], str[1], str[2], str[3])
> > + 
> > + #define PAGE_SHIFT 12
> > +-#define NBUF (3)
> > ++#define NBUF (3)
> > ++#define MAX_DRM_PLANES 5
> > ++
> > + 
> > + struct control status;
> > + 
> > +@@ -64,14 +66,22 @@ struct drm_device_info
> > + {
> > + 	int fd;
> > + 	int width;
> > +-	int height;
> > ++	int height;
> > ++	unsigned int num_planes;
> > + 	char dev_name[9];
> > + 	char name[4];
> > + 	unsigned int bo_flags;
> > + 	struct dmabuf_buffer **buf[2];
> > + 	struct omap_device *dev;
> > + 	unsigned int crtc_id;
> > +-	unsigned plane_id[2];
> > ++	unsigned int plane_id[2];
> > ++	unsigned int prop_id_trans_key_mode;
> > ++	unsigned int prop_id_alpha_blender;
> > ++	unsigned int prop_id_zorder;
> > ++	uint64_t prop_value_trans_key_mode;
> > ++	uint64_t prop_value_alpha_blender;
> > ++	uint32_t prop_value_zorder[MAX_DRM_PLANES];
> > ++	uint32_t drm_plane_id[MAX_DRM_PLANES];
> > + 	bool multiplanar;	/* True when Y and U/V are in separate buffers. */
> > + } drm_device;
> > + 
> > +@@ -500,6 +510,121 @@ struct dmabuf_buffer *v4l2_dequeue_buffer(struct v4l2_device_info *device)
> > + 	}
> > + 
> > + 	return buf;
> > ++}
> > ++
> > ++/*
> > ++ * Reorder the zorder of DRM planes to the desired order for demo
> > ++ *      VID1: 1
> > ++ *      VID2: 2
> > ++ *      CRTC: 3
> > ++ */
> > ++
> > ++int drm_init_plane_zorder(struct drm_device_info *device)
> > ++{
> > ++	int i,j;
> > ++	drmModePlaneRes *res;
> > ++	drmModePlane *plane;
> > ++	drmModeObjectProperties *props;
> > ++	drmModePropertyRes *props_info;
> > ++	uint32_t zorder=1;
> > ++	int ret = 0;
> > ++
> > ++	// This will explain the planes to include CRTC, but setPlane is not applicable to 
> > ++	// the CRTC plane
> > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> > ++
> > ++	res = drmModeGetPlaneResources(device->fd);
> > ++
> > ++	if(res == NULL){
> > ++		ERROR("plane resources not found\n");
> > ++		ret = -1;
> > ++		goto drm_init_plane_zorder_error;
> > ++	}
> > ++
> > ++	//DBG("drm_init_plane_zorder:no. of planes = %d\n", res->count_planes);
> > ++
> > ++	if (res->count_planes > MAX_DRM_PLANES)
> > ++	{
> > ++
> > ++		ERROR("There are two many DRM planes (%d > %d)\n", res->count_planes, MAX_DRM_PLANES);
> > ++		ret = -1;
> > ++		goto drm_init_plane_zorder_error;
> > ++	}
> > ++
> > ++	device->num_planes = res->count_planes;
> > ++	for (i = 0; i < res->count_planes; i++) {
> > ++		uint32_t plane_id = res->planes[i];
> > ++		bool fCRTC = 0;
> > ++		uint32_t zorder_value = 3;
> > ++
> > ++		drmModePlane *plane = drmModeGetPlane(device->fd, plane_id);
> > ++		if(plane == NULL){
> > ++			ERROR("plane (%d) not found\n", plane_id);
> > ++			continue;
> > ++		}
> > ++
> > ++		// TBD: check for required plane attributes
> > ++		device->drm_plane_id[i] = plane->plane_id;
> > ++
> > ++		props = drmModeObjectGetProperties(device->fd, plane->plane_id, DRM_MODE_OBJECT_PLANE);
> > ++
> > ++		if(props == NULL){
> > ++			ERROR("plane (%d) properties not found\n",  plane->plane_id);
> > ++			continue;
> > ++		}
> > ++
> > ++		for (j = 0; j < props->count_props; j++)
> > ++		{
> > ++			props_info = drmModeGetProperty(device->fd, props->props[j]);
> > ++
> > ++			if(props_info == NULL){
> > ++				ERROR("plane(%d) props[%d] not found\n", plane->plane_id, j);
> > ++				continue;
> > ++			}
> > ++
> > ++			if (strcmp("type", props_info->name) == 0)
> > ++			{
> > ++				fCRTC = (props->prop_values[j] == 1)?1:0;
> > ++			}
> > ++			else if ((strcmp("zorder", props_info->name) == 0))
> > ++			{
> > ++				if (!device->prop_id_zorder)
> > ++				{
> > ++					device->prop_id_zorder = props_info->prop_id;
> > ++				}
> > ++				device->prop_value_zorder[i] = (uint32_t)props->prop_values[j];
> > ++			}
> > ++
> > ++			drmModeFreeProperty(props_info);
> > ++		}
> > ++
> > ++		/* Re-arrange zorder */
> > ++		if (!fCRTC)
> > ++		{
> > ++			zorder_value = zorder++;
> > ++		}
> > ++
> > ++		j = drmModeObjectSetProperty(device->fd, plane->plane_id,
> > ++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
> > ++									(uint64_t)zorder_value);
> > ++
> > ++		if (j < 0) {
> > ++			ERROR("set z-order for plane id %d failed\n", plane->plane_id);
> > ++		}
> > ++
> > ++		drmModeFreeObjectProperties(props);
> > ++		drmModeFreePlane(plane);
> > ++
> > ++	}
> > ++
> > ++	drmModeFreePlaneResources(res);
> > ++
> > ++drm_init_plane_zorder_error:
> > ++
> > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> > ++
> > ++	return(ret);
> > ++
> > + }
> > + 
> > + uint32_t drm_reserve_plane(int fd)
> > +@@ -508,7 +633,7 @@ uint32_t drm_reserve_plane(int fd)
> > + 	drmModePlaneRes *res = drmModeGetPlaneResources(fd);
> > + 	if(res == NULL){
> > + 		ERROR("plane resources not found\n");
> > +-	}
> > ++	}
> > + 
> > + 	for (i = 0; i < res->count_planes; i++) {
> > + 		uint32_t plane_id = res->planes[i];
> > +@@ -520,7 +645,7 @@ uint32_t drm_reserve_plane(int fd)
> > + 			continue;
> > + 
> > + 		drmModePlane *plane = drmModeGetPlane(fd, plane_id);
> > +-		if(res == NULL){
> > ++		if(plane == NULL){
> > + 			ERROR("plane  not found\n");
> > + 		}
> > + 
> > +@@ -577,9 +702,45 @@ void drm_crtc_resolution(struct drm_device_info *device)
> > + 		device->height = crtc->height;
> > + 
> > + 		drmModeFreeCrtc(crtc);
> > +-		drmModeFreeResources(res);
> > ++	}
> > ++
> > ++	drmModeFreeResources(res);
> > ++
> > ++}
> > ++
> > ++/*
> > ++ * DRM restore properties
> > ++ */
> > ++static void drm_restore_props(struct drm_device_info *device)
> > ++{
> > ++	unsigned int i;
> > ++
> > ++	/* restore the original zorder of DRM planes */
> > ++
> > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> > ++
> > ++	for (i = 0; i < device->num_planes; i++) {
> > ++		if (device->drm_plane_id[i])
> > ++		{
> > ++			drmModeObjectSetProperty(device->fd, device->drm_plane_id[i],
> > ++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
> > ++									 (uint64_t)device->prop_value_zorder[i]);
> > ++		}
> > + 	}
> > +-}
> > ++
> > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> > ++
> > ++	if(device->prop_id_trans_key_mode){
> > ++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
> > ++			DRM_MODE_OBJECT_CRTC, device->prop_id_trans_key_mode, device->prop_value_trans_key_mode);
> > ++	}
> > ++
> > ++	if(device->prop_id_alpha_blender){
> > ++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
> > ++			DRM_MODE_OBJECT_CRTC, device->prop_id_alpha_blender, device->prop_value_alpha_blender);
> > ++	}
> > ++}
> > ++
> > + /*
> > + * drm device init
> > + */
> > +@@ -587,12 +748,14 @@ static int drm_init_device(struct drm_device_info *device)
> > + {
> > + 	unsigned char j;
> > + 
> > +-	if (!device->fd) {
> > ++	if (!device->fd) {
> > + 		device->fd = drmOpen("omapdrm", NULL);
> > + 		if (device->fd < 0) {
> > + 			ERROR("could not open drm device: %s (%d)", strerror(errno), errno);
> > + 			return -1;
> > +-		}
> > ++		}
> > ++		if (drm_init_plane_zorder(device))
> > ++			return -1;
> > + 	}
> > + 
> > + 	device->dev = omap_device_new(device->fd);
> > +@@ -600,16 +763,15 @@ static int drm_init_device(struct drm_device_info *device)
> > + 	/* Get CRTC id and resolution. As well set the global display width and height */
> > + 	drm_crtc_resolution(device);
> > + 
> > +-
> > + 	/* Store display resolution so GUI can be configured */
> > + 	status.display_xres = device->width;
> > +-	status.display_yres = device->height;
> > ++	status.display_yres = device->height;
> > + 
> > + 	/* AM437x has two video planes and one graphics plane.  */
> > + 	/* Get one video plane  for each camera                 */
> > + 	for (j = 0; j < status.num_cams; j++) {
> > + 
> > +-		device->plane_id[j] = drm_reserve_plane(device->fd);
> > ++		device->plane_id[j] = drm_reserve_plane(device->fd);
> > + 	}
> > + 
> > + 	return 0;
> > +@@ -619,7 +781,9 @@ static int drm_init_device(struct drm_device_info *device)
> > + *Clean resources while exiting drm device 
> > + */
> > + static void drm_exit_device(struct drm_device_info *device)
> > +-{
> > ++{
> > ++
> > ++	drm_restore_props(device);
> > + 	omap_device_del(device->dev);
> > + 	device->dev = NULL;
> > + 
> > +@@ -637,8 +801,6 @@ static int drm_init_dss(void)
> > + {
> > + 	drmModeObjectProperties *props;
> > + 	drmModePropertyRes *propRes;
> > +-	unsigned int prop_trans_key_mode = 0;
> > +-	unsigned int prop_alpha_blender = 0;
> > + 	unsigned int j;
> > + 
> > + 	props = drmModeObjectGetProperties(drm_device.fd, drm_device.crtc_id,
> > +@@ -651,41 +813,43 @@ static int drm_init_dss(void)
> > + 			continue;
> > + 
> > + 		if (strcmp(propRes->name, "trans-key-mode") == 0) {
> > +-			prop_trans_key_mode = props->props[j];
> > ++			drm_device.prop_id_trans_key_mode = props->props[j];
> > ++			drm_device.prop_value_trans_key_mode = props->prop_values[j];
> > + 		}
> > + 
> > + 		if (strcmp(propRes->name, "alpha_blender") == 0) {
> > +-			prop_alpha_blender = props->props[j];
> > ++			drm_device.prop_id_alpha_blender = props->props[j];
> > ++			drm_device.prop_value_alpha_blender = props->prop_values[j];
> > + 		}
> > + 
> > +-		if(prop_alpha_blender & prop_trans_key_mode){
> > ++		if(drm_device.prop_id_trans_key_mode & drm_device.prop_id_alpha_blender){
> > + 			break;
> > + 		}
> > + 	}
> > + 
> > +-	if(prop_trans_key_mode == 0){
> > +-		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
> > ++	if(drm_device.prop_id_trans_key_mode == 0){
> > ++		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
> > + 		return -1;
> > + 	}
> > + 
> > +-	if(prop_alpha_blender == 0){
> > ++	if(drm_device.prop_id_alpha_blender == 0){
> > + 		ERROR("ALPHA BLENDER PROPERTY NOT FOUND\n");
> > + 		return -1;
> > + 	}
> > + 
> > + 	/* Enable the transparency color key */
> > + 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
> > +-		DRM_MODE_OBJECT_CRTC, prop_trans_key_mode, 1) < 0) {
> > ++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_trans_key_mode, status.trans_key_mode) < 0) {
> > + 			ERROR("error setting drm property for transparency key mode\n");
> > + 			return -1;
> > + 	}
> > + 
> > +-	/* Enable the LCD alpha blender */
> > ++	/* Enable the LCD alpha blender */
> > + 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
> > +-		DRM_MODE_OBJECT_CRTC, prop_alpha_blender, 1) < 0){
> > ++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_alpha_blender, 1) < 0){
> > + 			ERROR("error setting drm property for Alpha Blender\n");
> > + 			return -1;
> > +-	}
> > ++	}
> > + 	return 0;
> > + }
> > + 
> > +@@ -785,7 +949,8 @@ static int capture_frame(struct v4l2_device_info *v4l2_device)
> > + */
> > + void default_parameters(void)
> > + {
> > +-	/* Main camera display */
> > ++	/* Main camera display */
> > ++	memset(&drm_device, 0, sizeof(drm_device));
> > + 	strcpy(drm_device.dev_name,"/dev/drm");
> > + 	strcpy(drm_device.name,"drm");
> > + 	drm_device.width=0;
> > +@@ -852,8 +1017,10 @@ void exit_devices(void)
> > + */
> > + void end_streaming(void)
> > + {
> > +-        v4l2_stream_off(&cap0_device);
> > +-        v4l2_stream_off(&cap1_device);
> > ++	v4l2_stream_off(&cap0_device);
> > ++	if (status.num_cams==2) {
> > ++		v4l2_stream_off(&cap1_device);
> > ++	}
> > + }
> > + 
> > + /*
> > +@@ -967,7 +1134,7 @@ Error:
> > + * whether a jpeg image needs to be captured.
> > + */
> > + void process_frame(void) {
> > +-
> > ++
> > + 	/* Display the main camera */
> > + 	if (status.main_cam==0)
> > + 		display_frame(&cap0_device, &drm_device, 0);
> > +@@ -980,7 +1147,7 @@ void process_frame(void) {
> > + 			display_frame(&cap1_device, &drm_device, 1);
> > + 		else
> > + 			display_frame(&cap0_device, &drm_device, 1);
> > +-	}
> > ++	}
> > + 
> > + 	/* Save jpeg image if triggered */
> > + 	if (status.jpeg==true) {
> > +diff --git a/loopback.h b/loopback.h
> > +index b20b996..4f468f4 100644
> > +--- a/loopback.h
> > ++++ b/loopback.h
> > +@@ -10,6 +10,7 @@ struct control {
> > +     int num_cams;
> > +     int num_jpeg;
> > +     int display_xres, display_yres;
> > ++    int trans_key_mode;
> > +     bool pip;
> > +     bool jpeg;
> > +     bool exit;
> > +diff --git a/main.cpp b/main.cpp
> > +index e73b061..c5c6900 100644
> > +--- a/main.cpp
> > ++++ b/main.cpp
> > +@@ -1,23 +1,47 @@
> > + #include <qglobal.h>
> > + #include <QApplication>
> > +-#include <QLabel>
> > ++#include <QLabel>
> > ++#include <QStringList>
> > + 
> > + #if QT_VERSION < 0x050000
> > + #include <QWSServer>
> > + #endif
> > +-
> > +-
> > ++
> > + #include <QPushButton>
> > +-#include "mainwindow.h"
> > ++#include "mainwindow.h"
> > ++#include "loopback.h"
> > ++
> > + 
> > + int main(int argc, char *argv[])
> > + {
> > +     QApplication a(argc, argv);
> > +-    MainWindow w;
> > ++    QStringList args = a.arguments();
> > ++
> > ++    /*
> > ++     * Extract the trans key mode which is SoC specific and can be
> > ++     * found at the corresponding TRM, for example,
> > ++     * For AM437x: trans_key_mode = 1 GFX Dest Trans
> > ++     *             TransKey applies to GFX overlay, marking which pixels come from VID overlays) 
> > ++     * For AM57xx: trans_key_mode = 2 Source Key.
> > ++     *             Match on Layer4 makes Layer4 transparent (zorder 3)
> > ++     *
> > ++     * The deault mode is 1 for backward compatibility
> > ++     */
> > ++
> > ++    if((args.count() >= 2))
> > ++    {
> > ++        status.trans_key_mode = (args[1].toInt() == 2)?2:1;
> > ++    }
> > ++    else
> > ++    {
> > ++        status.trans_key_mode = 1;
> > ++    }
> > + 
> > + #if QT_VERSION < 0x050000
> > + 	QWSServer::setBackground(QBrush(QColor(0, 0, 0, 0)));
> > +-#endif
> > ++#endif
> > ++
> > ++    MainWindow w;
> > + 
> > +     w.show();
> > +     return a.exec();
> > +-- 
> > +1.9.1
> > +
> > diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
> > index 4802337..5774a06 100644
> > --- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
> > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh
> > @@ -5,7 +5,7 @@ sleep 1
> >  
> >  echo 0 > /sys/class/graphics/fbcon/cursor_blink
> >  
> > -dual_camera -platform linuxfb
> > +dual_camera 1 -platform linuxfb
> >  
> >  echo 1 > /sys/class/graphics/fbcon/cursor_blink
> >  
> > diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
> > new file mode 100644
> > index 0000000..3d96cde
> > --- /dev/null
> > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
> > @@ -0,0 +1,13 @@
> > +#!/bin/bash
> > +
> > +/etc/init.d/weston stop
> > +sleep 1
> > +
> > +echo 0 > /sys/class/graphics/fbcon/cursor_blink
> > +
> > +dual_camera 2 -platform linuxfb
> > +
> > +echo 1 > /sys/class/graphics/fbcon/cursor_blink
> > +
> > +/etc/init.d/weston start
> > +sleep 1
> > diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
> > index 1b1a146..47d8ff3 100644
> > --- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
> > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb
> > @@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c7ca707704d3354a64feeb4f19f52eb5"
> >  DEPENDS += "libdrm"
> >  require recipes-core/matrix/matrix-gui-paths.inc
> >  
> > -PR = "r13"
> > +PR = "r14"
> >  
> >  BRANCH = "drm"
> >  SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
> > @@ -15,13 +15,16 @@ SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
> >  SRC_URI = "git://git.ti.com/sitara-linux/dual-camera-demo.git;protocol=git;branch=${BRANCH} \
> >             file://desc_dual-camera.html \
> >             file://dual_camera_qt5.sh \
> > +           file://dual_camera_qt5_omap-a15.sh \
> >             file://dual_camera_qt4.sh \
> >             file://dual-camera.desktop \
> > +           file://0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch \
> >  "
> >  
> >  S = "${WORKDIR}/git"
> >  
> >  DEMO_SCRIPT = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5.sh', 'dual_camera_qt4.sh', d)}"
> > +DEMO_SCRIPT_omap-a15 = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5_omap-a15.sh', 'dual_camera_qt4.sh', d)}"
> 
> This will try to apply qt4 patch twice...

My bad - this is not append but an override, so should be fine.

-- 
Denys


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5
  2016-03-22 22:09   ` Denys Dmytriyenko
@ 2016-03-22 22:20     ` Ruei, Eric
  2016-03-22 22:24       ` Denys Dmytriyenko
  0 siblings, 1 reply; 5+ messages in thread
From: Ruei, Eric @ 2016-03-22 22:20 UTC (permalink / raw)
  To: Dmytriyenko, Denys; +Cc: meta-arago@arago-project.org


Hi, Denys:

Can you take the first patch? Or should I send the third one?

Best regards,

Eric
 
-----Original Message-----
From: Dmytriyenko, Denys 
Sent: Tuesday, March 22, 2016 6:09 PM
To: Ruei, Eric
Cc: meta-arago@arago-project.org
Subject: Re: [meta-arago] [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5

On Tue, Mar 22, 2016 at 04:22:27PM -0400, Denys Dmytriyenko wrote:
> On Tue, Mar 22, 2016 at 04:16:54PM -0400, Eric Ruei wrote:
> > Signed-off-by: Eric Ruei <e-ruei1@ti.com>
> > ---
> >  ...mera-demo-Enhance-to-support-both-AM4-AM5.patch | 469 +++++++++++++++++++++
> >  .../dual-camera-demo/dual_camera_qt5.sh            |   2 +-
> >  .../dual-camera-demo/dual_camera_qt5_omap-a15.sh   |  13 +
> >  .../dual-camera-demo/dual-camera-demo_1.0.bb       |   5 +-
> >  4 files changed, 487 insertions(+), 2 deletions(-)  create mode 
> > 100644 
> > meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-de
> > mo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> >  create mode 100644 
> > meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-de
> > mo/dual_camera_qt5_omap-a15.sh
> > 
> > diff --git 
> > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch 
> > b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> > new file mode 100644
> > index 0000000..347438d
> > --- /dev/null
> > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-cam
> > +++ era-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.p
> > +++ atch
> > @@ -0,0 +1,469 @@
> > +From 86ed5c9c3f9b8e71cd9980f847623af0caf4c187 Mon Sep 17 00:00:00 
> > +2001
> > +From: Eric Ruei <e-ruei1@ti.com>
> > +Date: Mon, 21 Mar 2016 16:27:58 -0400
> > +Subject: [PATCH] dual camera demo: Enhance to support both AM4/AM5
> > +
> > +- Initialize and restore DRM plane zorders
> > +- Add input parameter trans_key_mode (AM4:1;AM5:2)
> > +- Cleanup the exit sequence to avoid unnecessary operations and 
> > +warnings
> > +
> > +
> > +Signed-off-by: Eric Ruei <e-ruei1@ti.com>
> > +---
> > + loopback.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------
> > + loopback.h |   1 +
> > + main.cpp   |  36 ++++++++--
> > + 3 files changed, 228 insertions(+), 36 deletions(-)
> > +
> > +diff --git a/loopback.c b/loopback.c index dda0390..66052b3 100644
> > +--- a/loopback.c
> > ++++ b/loopback.c
> > +@@ -34,7 +34,9 @@
> > + #define FOURCC_STR(str)    FOURCC(str[0], str[1], str[2], str[3])
> > + 
> > + #define PAGE_SHIFT 12
> > +-#define NBUF (3)
> > ++#define NBUF (3)
> > ++#define MAX_DRM_PLANES 5
> > ++
> > + 
> > + struct control status;
> > + 
> > +@@ -64,14 +66,22 @@ struct drm_device_info  {
> > + 	int fd;
> > + 	int width;
> > +-	int height;
> > ++	int height;
> > ++	unsigned int num_planes;
> > + 	char dev_name[9];
> > + 	char name[4];
> > + 	unsigned int bo_flags;
> > + 	struct dmabuf_buffer **buf[2];
> > + 	struct omap_device *dev;
> > + 	unsigned int crtc_id;
> > +-	unsigned plane_id[2];
> > ++	unsigned int plane_id[2];
> > ++	unsigned int prop_id_trans_key_mode;
> > ++	unsigned int prop_id_alpha_blender;
> > ++	unsigned int prop_id_zorder;
> > ++	uint64_t prop_value_trans_key_mode;
> > ++	uint64_t prop_value_alpha_blender;
> > ++	uint32_t prop_value_zorder[MAX_DRM_PLANES];
> > ++	uint32_t drm_plane_id[MAX_DRM_PLANES];
> > + 	bool multiplanar;	/* True when Y and U/V are in separate buffers. */
> > + } drm_device;
> > + 
> > +@@ -500,6 +510,121 @@ struct dmabuf_buffer *v4l2_dequeue_buffer(struct v4l2_device_info *device)
> > + 	}
> > + 
> > + 	return buf;
> > ++}
> > ++
> > ++/*
> > ++ * Reorder the zorder of DRM planes to the desired order for demo
> > ++ *      VID1: 1
> > ++ *      VID2: 2
> > ++ *      CRTC: 3
> > ++ */
> > ++
> > ++int drm_init_plane_zorder(struct drm_device_info *device) {
> > ++	int i,j;
> > ++	drmModePlaneRes *res;
> > ++	drmModePlane *plane;
> > ++	drmModeObjectProperties *props;
> > ++	drmModePropertyRes *props_info;
> > ++	uint32_t zorder=1;
> > ++	int ret = 0;
> > ++
> > ++	// This will explain the planes to include CRTC, but setPlane is not applicable to 
> > ++	// the CRTC plane
> > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> > ++
> > ++	res = drmModeGetPlaneResources(device->fd);
> > ++
> > ++	if(res == NULL){
> > ++		ERROR("plane resources not found\n");
> > ++		ret = -1;
> > ++		goto drm_init_plane_zorder_error;
> > ++	}
> > ++
> > ++	//DBG("drm_init_plane_zorder:no. of planes = %d\n", 
> > ++res->count_planes);
> > ++
> > ++	if (res->count_planes > MAX_DRM_PLANES)
> > ++	{
> > ++
> > ++		ERROR("There are two many DRM planes (%d > %d)\n", res->count_planes, MAX_DRM_PLANES);
> > ++		ret = -1;
> > ++		goto drm_init_plane_zorder_error;
> > ++	}
> > ++
> > ++	device->num_planes = res->count_planes;
> > ++	for (i = 0; i < res->count_planes; i++) {
> > ++		uint32_t plane_id = res->planes[i];
> > ++		bool fCRTC = 0;
> > ++		uint32_t zorder_value = 3;
> > ++
> > ++		drmModePlane *plane = drmModeGetPlane(device->fd, plane_id);
> > ++		if(plane == NULL){
> > ++			ERROR("plane (%d) not found\n", plane_id);
> > ++			continue;
> > ++		}
> > ++
> > ++		// TBD: check for required plane attributes
> > ++		device->drm_plane_id[i] = plane->plane_id;
> > ++
> > ++		props = drmModeObjectGetProperties(device->fd, plane->plane_id, 
> > ++DRM_MODE_OBJECT_PLANE);
> > ++
> > ++		if(props == NULL){
> > ++			ERROR("plane (%d) properties not found\n",  plane->plane_id);
> > ++			continue;
> > ++		}
> > ++
> > ++		for (j = 0; j < props->count_props; j++)
> > ++		{
> > ++			props_info = drmModeGetProperty(device->fd, props->props[j]);
> > ++
> > ++			if(props_info == NULL){
> > ++				ERROR("plane(%d) props[%d] not found\n", plane->plane_id, j);
> > ++				continue;
> > ++			}
> > ++
> > ++			if (strcmp("type", props_info->name) == 0)
> > ++			{
> > ++				fCRTC = (props->prop_values[j] == 1)?1:0;
> > ++			}
> > ++			else if ((strcmp("zorder", props_info->name) == 0))
> > ++			{
> > ++				if (!device->prop_id_zorder)
> > ++				{
> > ++					device->prop_id_zorder = props_info->prop_id;
> > ++				}
> > ++				device->prop_value_zorder[i] = (uint32_t)props->prop_values[j];
> > ++			}
> > ++
> > ++			drmModeFreeProperty(props_info);
> > ++		}
> > ++
> > ++		/* Re-arrange zorder */
> > ++		if (!fCRTC)
> > ++		{
> > ++			zorder_value = zorder++;
> > ++		}
> > ++
> > ++		j = drmModeObjectSetProperty(device->fd, plane->plane_id,
> > ++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
> > ++									(uint64_t)zorder_value);
> > ++
> > ++		if (j < 0) {
> > ++			ERROR("set z-order for plane id %d failed\n", plane->plane_id);
> > ++		}
> > ++
> > ++		drmModeFreeObjectProperties(props);
> > ++		drmModeFreePlane(plane);
> > ++
> > ++	}
> > ++
> > ++	drmModeFreePlaneResources(res);
> > ++
> > ++drm_init_plane_zorder_error:
> > ++
> > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> > ++
> > ++	return(ret);
> > ++
> > + }
> > + 
> > + uint32_t drm_reserve_plane(int fd) @@ -508,7 +633,7 @@ uint32_t 
> > +drm_reserve_plane(int fd)
> > + 	drmModePlaneRes *res = drmModeGetPlaneResources(fd);
> > + 	if(res == NULL){
> > + 		ERROR("plane resources not found\n");
> > +-	}
> > ++	}
> > + 
> > + 	for (i = 0; i < res->count_planes; i++) {
> > + 		uint32_t plane_id = res->planes[i]; @@ -520,7 +645,7 @@ uint32_t 
> > +drm_reserve_plane(int fd)
> > + 			continue;
> > + 
> > + 		drmModePlane *plane = drmModeGetPlane(fd, plane_id);
> > +-		if(res == NULL){
> > ++		if(plane == NULL){
> > + 			ERROR("plane  not found\n");
> > + 		}
> > + 
> > +@@ -577,9 +702,45 @@ void drm_crtc_resolution(struct drm_device_info *device)
> > + 		device->height = crtc->height;
> > + 
> > + 		drmModeFreeCrtc(crtc);
> > +-		drmModeFreeResources(res);
> > ++	}
> > ++
> > ++	drmModeFreeResources(res);
> > ++
> > ++}
> > ++
> > ++/*
> > ++ * DRM restore properties
> > ++ */
> > ++static void drm_restore_props(struct drm_device_info *device) {
> > ++	unsigned int i;
> > ++
> > ++	/* restore the original zorder of DRM planes */
> > ++
> > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> > ++
> > ++	for (i = 0; i < device->num_planes; i++) {
> > ++		if (device->drm_plane_id[i])
> > ++		{
> > ++			drmModeObjectSetProperty(device->fd, device->drm_plane_id[i],
> > ++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
> > ++									 (uint64_t)device->prop_value_zorder[i]);
> > ++		}
> > + 	}
> > +-}
> > ++
> > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> > ++
> > ++	if(device->prop_id_trans_key_mode){
> > ++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
> > ++			DRM_MODE_OBJECT_CRTC, device->prop_id_trans_key_mode, device->prop_value_trans_key_mode);
> > ++	}
> > ++
> > ++	if(device->prop_id_alpha_blender){
> > ++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
> > ++			DRM_MODE_OBJECT_CRTC, device->prop_id_alpha_blender, device->prop_value_alpha_blender);
> > ++	}
> > ++}
> > ++
> > + /*
> > + * drm device init
> > + */
> > +@@ -587,12 +748,14 @@ static int drm_init_device(struct 
> > +drm_device_info *device)  {
> > + 	unsigned char j;
> > + 
> > +-	if (!device->fd) {
> > ++	if (!device->fd) {
> > + 		device->fd = drmOpen("omapdrm", NULL);
> > + 		if (device->fd < 0) {
> > + 			ERROR("could not open drm device: %s (%d)", strerror(errno), errno);
> > + 			return -1;
> > +-		}
> > ++		}
> > ++		if (drm_init_plane_zorder(device))
> > ++			return -1;
> > + 	}
> > + 
> > + 	device->dev = omap_device_new(device->fd); @@ -600,16 +763,15 @@ 
> > +static int drm_init_device(struct drm_device_info *device)
> > + 	/* Get CRTC id and resolution. As well set the global display width and height */
> > + 	drm_crtc_resolution(device);
> > + 
> > +-
> > + 	/* Store display resolution so GUI can be configured */
> > + 	status.display_xres = device->width;
> > +-	status.display_yres = device->height;
> > ++	status.display_yres = device->height;
> > + 
> > + 	/* AM437x has two video planes and one graphics plane.  */
> > + 	/* Get one video plane  for each camera                 */
> > + 	for (j = 0; j < status.num_cams; j++) {
> > + 
> > +-		device->plane_id[j] = drm_reserve_plane(device->fd);
> > ++		device->plane_id[j] = drm_reserve_plane(device->fd);
> > + 	}
> > + 
> > + 	return 0;
> > +@@ -619,7 +781,9 @@ static int drm_init_device(struct 
> > +drm_device_info *device)  *Clean resources while exiting drm device  
> > +*/  static void drm_exit_device(struct drm_device_info *device) -{
> > ++{
> > ++
> > ++	drm_restore_props(device);
> > + 	omap_device_del(device->dev);
> > + 	device->dev = NULL;
> > + 
> > +@@ -637,8 +801,6 @@ static int drm_init_dss(void)  {
> > + 	drmModeObjectProperties *props;
> > + 	drmModePropertyRes *propRes;
> > +-	unsigned int prop_trans_key_mode = 0;
> > +-	unsigned int prop_alpha_blender = 0;
> > + 	unsigned int j;
> > + 
> > + 	props = drmModeObjectGetProperties(drm_device.fd, 
> > +drm_device.crtc_id, @@ -651,41 +813,43 @@ static int drm_init_dss(void)
> > + 			continue;
> > + 
> > + 		if (strcmp(propRes->name, "trans-key-mode") == 0) {
> > +-			prop_trans_key_mode = props->props[j];
> > ++			drm_device.prop_id_trans_key_mode = props->props[j];
> > ++			drm_device.prop_value_trans_key_mode = props->prop_values[j];
> > + 		}
> > + 
> > + 		if (strcmp(propRes->name, "alpha_blender") == 0) {
> > +-			prop_alpha_blender = props->props[j];
> > ++			drm_device.prop_id_alpha_blender = props->props[j];
> > ++			drm_device.prop_value_alpha_blender = props->prop_values[j];
> > + 		}
> > + 
> > +-		if(prop_alpha_blender & prop_trans_key_mode){
> > ++		if(drm_device.prop_id_trans_key_mode & 
> > ++drm_device.prop_id_alpha_blender){
> > + 			break;
> > + 		}
> > + 	}
> > + 
> > +-	if(prop_trans_key_mode == 0){
> > +-		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
> > ++	if(drm_device.prop_id_trans_key_mode == 0){
> > ++		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
> > + 		return -1;
> > + 	}
> > + 
> > +-	if(prop_alpha_blender == 0){
> > ++	if(drm_device.prop_id_alpha_blender == 0){
> > + 		ERROR("ALPHA BLENDER PROPERTY NOT FOUND\n");
> > + 		return -1;
> > + 	}
> > + 
> > + 	/* Enable the transparency color key */
> > + 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
> > +-		DRM_MODE_OBJECT_CRTC, prop_trans_key_mode, 1) < 0) {
> > ++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_trans_key_mode, 
> > ++status.trans_key_mode) < 0) {
> > + 			ERROR("error setting drm property for transparency key mode\n");
> > + 			return -1;
> > + 	}
> > + 
> > +-	/* Enable the LCD alpha blender */
> > ++	/* Enable the LCD alpha blender */
> > + 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
> > +-		DRM_MODE_OBJECT_CRTC, prop_alpha_blender, 1) < 0){
> > ++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_alpha_blender, 1) < 0){
> > + 			ERROR("error setting drm property for Alpha Blender\n");
> > + 			return -1;
> > +-	}
> > ++	}
> > + 	return 0;
> > + }
> > + 
> > +@@ -785,7 +949,8 @@ static int capture_frame(struct 
> > +v4l2_device_info *v4l2_device)  */  void default_parameters(void)  
> > +{
> > +-	/* Main camera display */
> > ++	/* Main camera display */
> > ++	memset(&drm_device, 0, sizeof(drm_device));
> > + 	strcpy(drm_device.dev_name,"/dev/drm");
> > + 	strcpy(drm_device.name,"drm");
> > + 	drm_device.width=0;
> > +@@ -852,8 +1017,10 @@ void exit_devices(void)  */  void 
> > +end_streaming(void)  {
> > +-        v4l2_stream_off(&cap0_device);
> > +-        v4l2_stream_off(&cap1_device);
> > ++	v4l2_stream_off(&cap0_device);
> > ++	if (status.num_cams==2) {
> > ++		v4l2_stream_off(&cap1_device);
> > ++	}
> > + }
> > + 
> > + /*
> > +@@ -967,7 +1134,7 @@ Error:
> > + * whether a jpeg image needs to be captured.
> > + */
> > + void process_frame(void) {
> > +-
> > ++
> > + 	/* Display the main camera */
> > + 	if (status.main_cam==0)
> > + 		display_frame(&cap0_device, &drm_device, 0); @@ -980,7 +1147,7 
> > +@@ void process_frame(void) {
> > + 			display_frame(&cap1_device, &drm_device, 1);
> > + 		else
> > + 			display_frame(&cap0_device, &drm_device, 1);
> > +-	}
> > ++	}
> > + 
> > + 	/* Save jpeg image if triggered */
> > + 	if (status.jpeg==true) {
> > +diff --git a/loopback.h b/loopback.h index b20b996..4f468f4 100644
> > +--- a/loopback.h
> > ++++ b/loopback.h
> > +@@ -10,6 +10,7 @@ struct control {
> > +     int num_cams;
> > +     int num_jpeg;
> > +     int display_xres, display_yres;
> > ++    int trans_key_mode;
> > +     bool pip;
> > +     bool jpeg;
> > +     bool exit;
> > +diff --git a/main.cpp b/main.cpp
> > +index e73b061..c5c6900 100644
> > +--- a/main.cpp
> > ++++ b/main.cpp
> > +@@ -1,23 +1,47 @@
> > + #include <qglobal.h>
> > + #include <QApplication>
> > +-#include <QLabel>
> > ++#include <QLabel>
> > ++#include <QStringList>
> > + 
> > + #if QT_VERSION < 0x050000
> > + #include <QWSServer>
> > + #endif
> > +-
> > +-
> > ++
> > + #include <QPushButton>
> > +-#include "mainwindow.h"
> > ++#include "mainwindow.h"
> > ++#include "loopback.h"
> > ++
> > + 
> > + int main(int argc, char *argv[])
> > + {
> > +     QApplication a(argc, argv);
> > +-    MainWindow w;
> > ++    QStringList args = a.arguments();
> > ++
> > ++    /*
> > ++     * Extract the trans key mode which is SoC specific and can be
> > ++     * found at the corresponding TRM, for example,
> > ++     * For AM437x: trans_key_mode = 1 GFX Dest Trans
> > ++     *             TransKey applies to GFX overlay, marking which pixels come from VID overlays) 
> > ++     * For AM57xx: trans_key_mode = 2 Source Key.
> > ++     *             Match on Layer4 makes Layer4 transparent (zorder 3)
> > ++     *
> > ++     * The deault mode is 1 for backward compatibility
> > ++     */
> > ++
> > ++    if((args.count() >= 2))
> > ++    {
> > ++        status.trans_key_mode = (args[1].toInt() == 2)?2:1;
> > ++    }
> > ++    else
> > ++    {
> > ++        status.trans_key_mode = 1;
> > ++    }
> > + 
> > + #if QT_VERSION < 0x050000
> > + 	QWSServer::setBackground(QBrush(QColor(0, 0, 0, 0))); -#endif
> > ++#endif
> > ++
> > ++    MainWindow w;
> > + 
> > +     w.show();
> > +     return a.exec();
> > +--
> > +1.9.1
> > +
> > diff --git 
> > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo/dual_camera_qt5.sh 
> > b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo/dual_camera_qt5.sh
> > index 4802337..5774a06 100644
> > --- 
> > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo/dual_camera_qt5.sh
> > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-cam
> > +++ era-demo/dual_camera_qt5.sh
> > @@ -5,7 +5,7 @@ sleep 1
> >  
> >  echo 0 > /sys/class/graphics/fbcon/cursor_blink
> >  
> > -dual_camera -platform linuxfb
> > +dual_camera 1 -platform linuxfb
> >  
> >  echo 1 > /sys/class/graphics/fbcon/cursor_blink
> >  
> > diff --git 
> > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo/dual_camera_qt5_omap-a15.sh 
> > b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo/dual_camera_qt5_omap-a15.sh
> > new file mode 100644
> > index 0000000..3d96cde
> > --- /dev/null
> > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-cam
> > +++ era-demo/dual_camera_qt5_omap-a15.sh
> > @@ -0,0 +1,13 @@
> > +#!/bin/bash
> > +
> > +/etc/init.d/weston stop
> > +sleep 1
> > +
> > +echo 0 > /sys/class/graphics/fbcon/cursor_blink
> > +
> > +dual_camera 2 -platform linuxfb
> > +
> > +echo 1 > /sys/class/graphics/fbcon/cursor_blink
> > +
> > +/etc/init.d/weston start
> > +sleep 1
> > diff --git 
> > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo_1.0.bb 
> > b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo_1.0.bb
> > index 1b1a146..47d8ff3 100644
> > --- 
> > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > demo_1.0.bb
> > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-cam
> > +++ era-demo_1.0.bb
> > @@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c7ca707704d3354a64feeb4f19f52eb5"
> >  DEPENDS += "libdrm"
> >  require recipes-core/matrix/matrix-gui-paths.inc
> >  
> > -PR = "r13"
> > +PR = "r14"
> >  
> >  BRANCH = "drm"
> >  SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
> > @@ -15,13 +15,16 @@ SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
> >  SRC_URI = "git://git.ti.com/sitara-linux/dual-camera-demo.git;protocol=git;branch=${BRANCH} \
> >             file://desc_dual-camera.html \
> >             file://dual_camera_qt5.sh \
> > +           file://dual_camera_qt5_omap-a15.sh \
> >             file://dual_camera_qt4.sh \
> >             file://dual-camera.desktop \
> > +           
> > + file://0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch 
> > + \
> >  "
> >  
> >  S = "${WORKDIR}/git"
> >  
> >  DEMO_SCRIPT = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5.sh', 'dual_camera_qt4.sh', d)}"
> > +DEMO_SCRIPT_omap-a15 = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5_omap-a15.sh', 'dual_camera_qt4.sh', d)}"
> 
> This will try to apply qt4 patch twice...

My bad - this is not append but an override, so should be fine.

--
Denys


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5
  2016-03-22 22:20     ` Ruei, Eric
@ 2016-03-22 22:24       ` Denys Dmytriyenko
  0 siblings, 0 replies; 5+ messages in thread
From: Denys Dmytriyenko @ 2016-03-22 22:24 UTC (permalink / raw)
  To: Ruei, Eric; +Cc: meta-arago@arago-project.org

The first should be fine, no need to resend.

On Tue, Mar 22, 2016 at 06:20:54PM -0400, Ruei, Eric wrote:
> 
> Hi, Denys:
> 
> Can you take the first patch? Or should I send the third one?
> 
> Best regards,
> 
> Eric
>  
> -----Original Message-----
> From: Dmytriyenko, Denys 
> Sent: Tuesday, March 22, 2016 6:09 PM
> To: Ruei, Eric
> Cc: meta-arago@arago-project.org
> Subject: Re: [meta-arago] [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5
> 
> On Tue, Mar 22, 2016 at 04:22:27PM -0400, Denys Dmytriyenko wrote:
> > On Tue, Mar 22, 2016 at 04:16:54PM -0400, Eric Ruei wrote:
> > > Signed-off-by: Eric Ruei <e-ruei1@ti.com>
> > > ---
> > >  ...mera-demo-Enhance-to-support-both-AM4-AM5.patch | 469 +++++++++++++++++++++
> > >  .../dual-camera-demo/dual_camera_qt5.sh            |   2 +-
> > >  .../dual-camera-demo/dual_camera_qt5_omap-a15.sh   |  13 +
> > >  .../dual-camera-demo/dual-camera-demo_1.0.bb       |   5 +-
> > >  4 files changed, 487 insertions(+), 2 deletions(-)  create mode 
> > > 100644 
> > > meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-de
> > > mo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> > >  create mode 100644 
> > > meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-de
> > > mo/dual_camera_qt5_omap-a15.sh
> > > 
> > > diff --git 
> > > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch 
> > > b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch
> > > new file mode 100644
> > > index 0000000..347438d
> > > --- /dev/null
> > > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-cam
> > > +++ era-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.p
> > > +++ atch
> > > @@ -0,0 +1,469 @@
> > > +From 86ed5c9c3f9b8e71cd9980f847623af0caf4c187 Mon Sep 17 00:00:00 
> > > +2001
> > > +From: Eric Ruei <e-ruei1@ti.com>
> > > +Date: Mon, 21 Mar 2016 16:27:58 -0400
> > > +Subject: [PATCH] dual camera demo: Enhance to support both AM4/AM5
> > > +
> > > +- Initialize and restore DRM plane zorders
> > > +- Add input parameter trans_key_mode (AM4:1;AM5:2)
> > > +- Cleanup the exit sequence to avoid unnecessary operations and 
> > > +warnings
> > > +
> > > +
> > > +Signed-off-by: Eric Ruei <e-ruei1@ti.com>
> > > +---
> > > + loopback.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------
> > > + loopback.h |   1 +
> > > + main.cpp   |  36 ++++++++--
> > > + 3 files changed, 228 insertions(+), 36 deletions(-)
> > > +
> > > +diff --git a/loopback.c b/loopback.c index dda0390..66052b3 100644
> > > +--- a/loopback.c
> > > ++++ b/loopback.c
> > > +@@ -34,7 +34,9 @@
> > > + #define FOURCC_STR(str)    FOURCC(str[0], str[1], str[2], str[3])
> > > + 
> > > + #define PAGE_SHIFT 12
> > > +-#define NBUF (3)
> > > ++#define NBUF (3)
> > > ++#define MAX_DRM_PLANES 5
> > > ++
> > > + 
> > > + struct control status;
> > > + 
> > > +@@ -64,14 +66,22 @@ struct drm_device_info  {
> > > + 	int fd;
> > > + 	int width;
> > > +-	int height;
> > > ++	int height;
> > > ++	unsigned int num_planes;
> > > + 	char dev_name[9];
> > > + 	char name[4];
> > > + 	unsigned int bo_flags;
> > > + 	struct dmabuf_buffer **buf[2];
> > > + 	struct omap_device *dev;
> > > + 	unsigned int crtc_id;
> > > +-	unsigned plane_id[2];
> > > ++	unsigned int plane_id[2];
> > > ++	unsigned int prop_id_trans_key_mode;
> > > ++	unsigned int prop_id_alpha_blender;
> > > ++	unsigned int prop_id_zorder;
> > > ++	uint64_t prop_value_trans_key_mode;
> > > ++	uint64_t prop_value_alpha_blender;
> > > ++	uint32_t prop_value_zorder[MAX_DRM_PLANES];
> > > ++	uint32_t drm_plane_id[MAX_DRM_PLANES];
> > > + 	bool multiplanar;	/* True when Y and U/V are in separate buffers. */
> > > + } drm_device;
> > > + 
> > > +@@ -500,6 +510,121 @@ struct dmabuf_buffer *v4l2_dequeue_buffer(struct v4l2_device_info *device)
> > > + 	}
> > > + 
> > > + 	return buf;
> > > ++}
> > > ++
> > > ++/*
> > > ++ * Reorder the zorder of DRM planes to the desired order for demo
> > > ++ *      VID1: 1
> > > ++ *      VID2: 2
> > > ++ *      CRTC: 3
> > > ++ */
> > > ++
> > > ++int drm_init_plane_zorder(struct drm_device_info *device) {
> > > ++	int i,j;
> > > ++	drmModePlaneRes *res;
> > > ++	drmModePlane *plane;
> > > ++	drmModeObjectProperties *props;
> > > ++	drmModePropertyRes *props_info;
> > > ++	uint32_t zorder=1;
> > > ++	int ret = 0;
> > > ++
> > > ++	// This will explain the planes to include CRTC, but setPlane is not applicable to 
> > > ++	// the CRTC plane
> > > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> > > ++
> > > ++	res = drmModeGetPlaneResources(device->fd);
> > > ++
> > > ++	if(res == NULL){
> > > ++		ERROR("plane resources not found\n");
> > > ++		ret = -1;
> > > ++		goto drm_init_plane_zorder_error;
> > > ++	}
> > > ++
> > > ++	//DBG("drm_init_plane_zorder:no. of planes = %d\n", 
> > > ++res->count_planes);
> > > ++
> > > ++	if (res->count_planes > MAX_DRM_PLANES)
> > > ++	{
> > > ++
> > > ++		ERROR("There are two many DRM planes (%d > %d)\n", res->count_planes, MAX_DRM_PLANES);
> > > ++		ret = -1;
> > > ++		goto drm_init_plane_zorder_error;
> > > ++	}
> > > ++
> > > ++	device->num_planes = res->count_planes;
> > > ++	for (i = 0; i < res->count_planes; i++) {
> > > ++		uint32_t plane_id = res->planes[i];
> > > ++		bool fCRTC = 0;
> > > ++		uint32_t zorder_value = 3;
> > > ++
> > > ++		drmModePlane *plane = drmModeGetPlane(device->fd, plane_id);
> > > ++		if(plane == NULL){
> > > ++			ERROR("plane (%d) not found\n", plane_id);
> > > ++			continue;
> > > ++		}
> > > ++
> > > ++		// TBD: check for required plane attributes
> > > ++		device->drm_plane_id[i] = plane->plane_id;
> > > ++
> > > ++		props = drmModeObjectGetProperties(device->fd, plane->plane_id, 
> > > ++DRM_MODE_OBJECT_PLANE);
> > > ++
> > > ++		if(props == NULL){
> > > ++			ERROR("plane (%d) properties not found\n",  plane->plane_id);
> > > ++			continue;
> > > ++		}
> > > ++
> > > ++		for (j = 0; j < props->count_props; j++)
> > > ++		{
> > > ++			props_info = drmModeGetProperty(device->fd, props->props[j]);
> > > ++
> > > ++			if(props_info == NULL){
> > > ++				ERROR("plane(%d) props[%d] not found\n", plane->plane_id, j);
> > > ++				continue;
> > > ++			}
> > > ++
> > > ++			if (strcmp("type", props_info->name) == 0)
> > > ++			{
> > > ++				fCRTC = (props->prop_values[j] == 1)?1:0;
> > > ++			}
> > > ++			else if ((strcmp("zorder", props_info->name) == 0))
> > > ++			{
> > > ++				if (!device->prop_id_zorder)
> > > ++				{
> > > ++					device->prop_id_zorder = props_info->prop_id;
> > > ++				}
> > > ++				device->prop_value_zorder[i] = (uint32_t)props->prop_values[j];
> > > ++			}
> > > ++
> > > ++			drmModeFreeProperty(props_info);
> > > ++		}
> > > ++
> > > ++		/* Re-arrange zorder */
> > > ++		if (!fCRTC)
> > > ++		{
> > > ++			zorder_value = zorder++;
> > > ++		}
> > > ++
> > > ++		j = drmModeObjectSetProperty(device->fd, plane->plane_id,
> > > ++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
> > > ++									(uint64_t)zorder_value);
> > > ++
> > > ++		if (j < 0) {
> > > ++			ERROR("set z-order for plane id %d failed\n", plane->plane_id);
> > > ++		}
> > > ++
> > > ++		drmModeFreeObjectProperties(props);
> > > ++		drmModeFreePlane(plane);
> > > ++
> > > ++	}
> > > ++
> > > ++	drmModeFreePlaneResources(res);
> > > ++
> > > ++drm_init_plane_zorder_error:
> > > ++
> > > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> > > ++
> > > ++	return(ret);
> > > ++
> > > + }
> > > + 
> > > + uint32_t drm_reserve_plane(int fd) @@ -508,7 +633,7 @@ uint32_t 
> > > +drm_reserve_plane(int fd)
> > > + 	drmModePlaneRes *res = drmModeGetPlaneResources(fd);
> > > + 	if(res == NULL){
> > > + 		ERROR("plane resources not found\n");
> > > +-	}
> > > ++	}
> > > + 
> > > + 	for (i = 0; i < res->count_planes; i++) {
> > > + 		uint32_t plane_id = res->planes[i]; @@ -520,7 +645,7 @@ uint32_t 
> > > +drm_reserve_plane(int fd)
> > > + 			continue;
> > > + 
> > > + 		drmModePlane *plane = drmModeGetPlane(fd, plane_id);
> > > +-		if(res == NULL){
> > > ++		if(plane == NULL){
> > > + 			ERROR("plane  not found\n");
> > > + 		}
> > > + 
> > > +@@ -577,9 +702,45 @@ void drm_crtc_resolution(struct drm_device_info *device)
> > > + 		device->height = crtc->height;
> > > + 
> > > + 		drmModeFreeCrtc(crtc);
> > > +-		drmModeFreeResources(res);
> > > ++	}
> > > ++
> > > ++	drmModeFreeResources(res);
> > > ++
> > > ++}
> > > ++
> > > ++/*
> > > ++ * DRM restore properties
> > > ++ */
> > > ++static void drm_restore_props(struct drm_device_info *device) {
> > > ++	unsigned int i;
> > > ++
> > > ++	/* restore the original zorder of DRM planes */
> > > ++
> > > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> > > ++
> > > ++	for (i = 0; i < device->num_planes; i++) {
> > > ++		if (device->drm_plane_id[i])
> > > ++		{
> > > ++			drmModeObjectSetProperty(device->fd, device->drm_plane_id[i],
> > > ++									 DRM_MODE_OBJECT_PLANE, device->prop_id_zorder,
> > > ++									 (uint64_t)device->prop_value_zorder[i]);
> > > ++		}
> > > + 	}
> > > +-}
> > > ++
> > > ++	drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> > > ++
> > > ++	if(device->prop_id_trans_key_mode){
> > > ++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
> > > ++			DRM_MODE_OBJECT_CRTC, device->prop_id_trans_key_mode, device->prop_value_trans_key_mode);
> > > ++	}
> > > ++
> > > ++	if(device->prop_id_alpha_blender){
> > > ++		drmModeObjectSetProperty(device->fd,  device->crtc_id,
> > > ++			DRM_MODE_OBJECT_CRTC, device->prop_id_alpha_blender, device->prop_value_alpha_blender);
> > > ++	}
> > > ++}
> > > ++
> > > + /*
> > > + * drm device init
> > > + */
> > > +@@ -587,12 +748,14 @@ static int drm_init_device(struct 
> > > +drm_device_info *device)  {
> > > + 	unsigned char j;
> > > + 
> > > +-	if (!device->fd) {
> > > ++	if (!device->fd) {
> > > + 		device->fd = drmOpen("omapdrm", NULL);
> > > + 		if (device->fd < 0) {
> > > + 			ERROR("could not open drm device: %s (%d)", strerror(errno), errno);
> > > + 			return -1;
> > > +-		}
> > > ++		}
> > > ++		if (drm_init_plane_zorder(device))
> > > ++			return -1;
> > > + 	}
> > > + 
> > > + 	device->dev = omap_device_new(device->fd); @@ -600,16 +763,15 @@ 
> > > +static int drm_init_device(struct drm_device_info *device)
> > > + 	/* Get CRTC id and resolution. As well set the global display width and height */
> > > + 	drm_crtc_resolution(device);
> > > + 
> > > +-
> > > + 	/* Store display resolution so GUI can be configured */
> > > + 	status.display_xres = device->width;
> > > +-	status.display_yres = device->height;
> > > ++	status.display_yres = device->height;
> > > + 
> > > + 	/* AM437x has two video planes and one graphics plane.  */
> > > + 	/* Get one video plane  for each camera                 */
> > > + 	for (j = 0; j < status.num_cams; j++) {
> > > + 
> > > +-		device->plane_id[j] = drm_reserve_plane(device->fd);
> > > ++		device->plane_id[j] = drm_reserve_plane(device->fd);
> > > + 	}
> > > + 
> > > + 	return 0;
> > > +@@ -619,7 +781,9 @@ static int drm_init_device(struct 
> > > +drm_device_info *device)  *Clean resources while exiting drm device  
> > > +*/  static void drm_exit_device(struct drm_device_info *device) -{
> > > ++{
> > > ++
> > > ++	drm_restore_props(device);
> > > + 	omap_device_del(device->dev);
> > > + 	device->dev = NULL;
> > > + 
> > > +@@ -637,8 +801,6 @@ static int drm_init_dss(void)  {
> > > + 	drmModeObjectProperties *props;
> > > + 	drmModePropertyRes *propRes;
> > > +-	unsigned int prop_trans_key_mode = 0;
> > > +-	unsigned int prop_alpha_blender = 0;
> > > + 	unsigned int j;
> > > + 
> > > + 	props = drmModeObjectGetProperties(drm_device.fd, 
> > > +drm_device.crtc_id, @@ -651,41 +813,43 @@ static int drm_init_dss(void)
> > > + 			continue;
> > > + 
> > > + 		if (strcmp(propRes->name, "trans-key-mode") == 0) {
> > > +-			prop_trans_key_mode = props->props[j];
> > > ++			drm_device.prop_id_trans_key_mode = props->props[j];
> > > ++			drm_device.prop_value_trans_key_mode = props->prop_values[j];
> > > + 		}
> > > + 
> > > + 		if (strcmp(propRes->name, "alpha_blender") == 0) {
> > > +-			prop_alpha_blender = props->props[j];
> > > ++			drm_device.prop_id_alpha_blender = props->props[j];
> > > ++			drm_device.prop_value_alpha_blender = props->prop_values[j];
> > > + 		}
> > > + 
> > > +-		if(prop_alpha_blender & prop_trans_key_mode){
> > > ++		if(drm_device.prop_id_trans_key_mode & 
> > > ++drm_device.prop_id_alpha_blender){
> > > + 			break;
> > > + 		}
> > > + 	}
> > > + 
> > > +-	if(prop_trans_key_mode == 0){
> > > +-		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
> > > ++	if(drm_device.prop_id_trans_key_mode == 0){
> > > ++		ERROR("TRANSPARENCY PROPERTY NOT FOUND\n");
> > > + 		return -1;
> > > + 	}
> > > + 
> > > +-	if(prop_alpha_blender == 0){
> > > ++	if(drm_device.prop_id_alpha_blender == 0){
> > > + 		ERROR("ALPHA BLENDER PROPERTY NOT FOUND\n");
> > > + 		return -1;
> > > + 	}
> > > + 
> > > + 	/* Enable the transparency color key */
> > > + 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
> > > +-		DRM_MODE_OBJECT_CRTC, prop_trans_key_mode, 1) < 0) {
> > > ++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_trans_key_mode, 
> > > ++status.trans_key_mode) < 0) {
> > > + 			ERROR("error setting drm property for transparency key mode\n");
> > > + 			return -1;
> > > + 	}
> > > + 
> > > +-	/* Enable the LCD alpha blender */
> > > ++	/* Enable the LCD alpha blender */
> > > + 	if (drmModeObjectSetProperty(drm_device.fd,  drm_device.crtc_id,
> > > +-		DRM_MODE_OBJECT_CRTC, prop_alpha_blender, 1) < 0){
> > > ++		DRM_MODE_OBJECT_CRTC, drm_device.prop_id_alpha_blender, 1) < 0){
> > > + 			ERROR("error setting drm property for Alpha Blender\n");
> > > + 			return -1;
> > > +-	}
> > > ++	}
> > > + 	return 0;
> > > + }
> > > + 
> > > +@@ -785,7 +949,8 @@ static int capture_frame(struct 
> > > +v4l2_device_info *v4l2_device)  */  void default_parameters(void)  
> > > +{
> > > +-	/* Main camera display */
> > > ++	/* Main camera display */
> > > ++	memset(&drm_device, 0, sizeof(drm_device));
> > > + 	strcpy(drm_device.dev_name,"/dev/drm");
> > > + 	strcpy(drm_device.name,"drm");
> > > + 	drm_device.width=0;
> > > +@@ -852,8 +1017,10 @@ void exit_devices(void)  */  void 
> > > +end_streaming(void)  {
> > > +-        v4l2_stream_off(&cap0_device);
> > > +-        v4l2_stream_off(&cap1_device);
> > > ++	v4l2_stream_off(&cap0_device);
> > > ++	if (status.num_cams==2) {
> > > ++		v4l2_stream_off(&cap1_device);
> > > ++	}
> > > + }
> > > + 
> > > + /*
> > > +@@ -967,7 +1134,7 @@ Error:
> > > + * whether a jpeg image needs to be captured.
> > > + */
> > > + void process_frame(void) {
> > > +-
> > > ++
> > > + 	/* Display the main camera */
> > > + 	if (status.main_cam==0)
> > > + 		display_frame(&cap0_device, &drm_device, 0); @@ -980,7 +1147,7 
> > > +@@ void process_frame(void) {
> > > + 			display_frame(&cap1_device, &drm_device, 1);
> > > + 		else
> > > + 			display_frame(&cap0_device, &drm_device, 1);
> > > +-	}
> > > ++	}
> > > + 
> > > + 	/* Save jpeg image if triggered */
> > > + 	if (status.jpeg==true) {
> > > +diff --git a/loopback.h b/loopback.h index b20b996..4f468f4 100644
> > > +--- a/loopback.h
> > > ++++ b/loopback.h
> > > +@@ -10,6 +10,7 @@ struct control {
> > > +     int num_cams;
> > > +     int num_jpeg;
> > > +     int display_xres, display_yres;
> > > ++    int trans_key_mode;
> > > +     bool pip;
> > > +     bool jpeg;
> > > +     bool exit;
> > > +diff --git a/main.cpp b/main.cpp
> > > +index e73b061..c5c6900 100644
> > > +--- a/main.cpp
> > > ++++ b/main.cpp
> > > +@@ -1,23 +1,47 @@
> > > + #include <qglobal.h>
> > > + #include <QApplication>
> > > +-#include <QLabel>
> > > ++#include <QLabel>
> > > ++#include <QStringList>
> > > + 
> > > + #if QT_VERSION < 0x050000
> > > + #include <QWSServer>
> > > + #endif
> > > +-
> > > +-
> > > ++
> > > + #include <QPushButton>
> > > +-#include "mainwindow.h"
> > > ++#include "mainwindow.h"
> > > ++#include "loopback.h"
> > > ++
> > > + 
> > > + int main(int argc, char *argv[])
> > > + {
> > > +     QApplication a(argc, argv);
> > > +-    MainWindow w;
> > > ++    QStringList args = a.arguments();
> > > ++
> > > ++    /*
> > > ++     * Extract the trans key mode which is SoC specific and can be
> > > ++     * found at the corresponding TRM, for example,
> > > ++     * For AM437x: trans_key_mode = 1 GFX Dest Trans
> > > ++     *             TransKey applies to GFX overlay, marking which pixels come from VID overlays) 
> > > ++     * For AM57xx: trans_key_mode = 2 Source Key.
> > > ++     *             Match on Layer4 makes Layer4 transparent (zorder 3)
> > > ++     *
> > > ++     * The deault mode is 1 for backward compatibility
> > > ++     */
> > > ++
> > > ++    if((args.count() >= 2))
> > > ++    {
> > > ++        status.trans_key_mode = (args[1].toInt() == 2)?2:1;
> > > ++    }
> > > ++    else
> > > ++    {
> > > ++        status.trans_key_mode = 1;
> > > ++    }
> > > + 
> > > + #if QT_VERSION < 0x050000
> > > + 	QWSServer::setBackground(QBrush(QColor(0, 0, 0, 0))); -#endif
> > > ++#endif
> > > ++
> > > ++    MainWindow w;
> > > + 
> > > +     w.show();
> > > +     return a.exec();
> > > +--
> > > +1.9.1
> > > +
> > > diff --git 
> > > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo/dual_camera_qt5.sh 
> > > b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo/dual_camera_qt5.sh
> > > index 4802337..5774a06 100644
> > > --- 
> > > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo/dual_camera_qt5.sh
> > > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-cam
> > > +++ era-demo/dual_camera_qt5.sh
> > > @@ -5,7 +5,7 @@ sleep 1
> > >  
> > >  echo 0 > /sys/class/graphics/fbcon/cursor_blink
> > >  
> > > -dual_camera -platform linuxfb
> > > +dual_camera 1 -platform linuxfb
> > >  
> > >  echo 1 > /sys/class/graphics/fbcon/cursor_blink
> > >  
> > > diff --git 
> > > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo/dual_camera_qt5_omap-a15.sh 
> > > b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo/dual_camera_qt5_omap-a15.sh
> > > new file mode 100644
> > > index 0000000..3d96cde
> > > --- /dev/null
> > > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-cam
> > > +++ era-demo/dual_camera_qt5_omap-a15.sh
> > > @@ -0,0 +1,13 @@
> > > +#!/bin/bash
> > > +
> > > +/etc/init.d/weston stop
> > > +sleep 1
> > > +
> > > +echo 0 > /sys/class/graphics/fbcon/cursor_blink
> > > +
> > > +dual_camera 2 -platform linuxfb
> > > +
> > > +echo 1 > /sys/class/graphics/fbcon/cursor_blink
> > > +
> > > +/etc/init.d/weston start
> > > +sleep 1
> > > diff --git 
> > > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo_1.0.bb 
> > > b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo_1.0.bb
> > > index 1b1a146..47d8ff3 100644
> > > --- 
> > > a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-
> > > demo_1.0.bb
> > > +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-cam
> > > +++ era-demo_1.0.bb
> > > @@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c7ca707704d3354a64feeb4f19f52eb5"
> > >  DEPENDS += "libdrm"
> > >  require recipes-core/matrix/matrix-gui-paths.inc
> > >  
> > > -PR = "r13"
> > > +PR = "r14"
> > >  
> > >  BRANCH = "drm"
> > >  SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
> > > @@ -15,13 +15,16 @@ SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993"
> > >  SRC_URI = "git://git.ti.com/sitara-linux/dual-camera-demo.git;protocol=git;branch=${BRANCH} \
> > >             file://desc_dual-camera.html \
> > >             file://dual_camera_qt5.sh \
> > > +           file://dual_camera_qt5_omap-a15.sh \
> > >             file://dual_camera_qt4.sh \
> > >             file://dual-camera.desktop \
> > > +           
> > > + file://0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch 
> > > + \
> > >  "
> > >  
> > >  S = "${WORKDIR}/git"
> > >  
> > >  DEMO_SCRIPT = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5.sh', 'dual_camera_qt4.sh', d)}"
> > > +DEMO_SCRIPT_omap-a15 = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5_omap-a15.sh', 'dual_camera_qt4.sh', d)}"
> > 
> > This will try to apply qt4 patch twice...
> 
> My bad - this is not append but an override, so should be fine.
> 
> --
> Denys


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-03-22 22:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-22 20:16 [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5 Eric Ruei
2016-03-22 20:22 ` Denys Dmytriyenko
2016-03-22 22:09   ` Denys Dmytriyenko
2016-03-22 22:20     ` Ruei, Eric
2016-03-22 22:24       ` Denys Dmytriyenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.