* [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.