From: Denys Dmytriyenko <denys@ti.com>
To: Eric Ruei <e-ruei1@ti.com>
Cc: meta-arago@arago-project.org
Subject: Re: [PATCH] dual-camera-demo: Enhance to support both AM4 and AM5
Date: Tue, 22 Mar 2016 18:09:08 -0400 [thread overview]
Message-ID: <20160322220908.GU3298@edge> (raw)
In-Reply-To: <20160322202227.GO3298@edge>
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
next prev parent reply other threads:[~2016-03-22 22:09 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
2016-03-22 22:20 ` Ruei, Eric
2016-03-22 22:24 ` Denys Dmytriyenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160322220908.GU3298@edge \
--to=denys@ti.com \
--cc=e-ruei1@ti.com \
--cc=meta-arago@arago-project.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.