This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DM8168 Video Compositor issue with /dev/fb2

Hi,


I have a QT application that displays the same GUI in the 3 framebuffers: /dev/fb0, /dev/fb1 and /dev/fb2. So, they are configured as following:

/dev/fb0 -> DVO1
/dev/fb1 ->DVO2
/dev/fb2 -> SD
In my QT app, I configured the /dev/fb2 in the following way:

struct ti81xxfb_region_params  regp;
struct ti81xxfb_scparams  scp;
struct fb_fix_screeninfo fixinfo;
struct fb_var_screeninfo varinfo;

/* Open fb2 and apply same settings */
fd = open ("/dev/fb2", O_RDWR);

if (fd == -1) {
   perror("failed to open display device\n");
}

if (ioctl(fd, TIFB_GET_PARAMS, &regp) < 0) {
    perror("TIFB_GET_PARAMS\n");
    close(fd);
    exit(1);
}

/* Set Pixel Alpha Blending */
regp.blendtype = TI81XXFB_BLENDING_PIXEL;
if (ioctl(fd, TIFB_SET_PARAMS, &regp) < 0) {
    perror ("TIFB_SET_PARAMS.\n");
    close(fd);
    exit(1);
}
	
/* Scale Graphics to 720x480 */
scp.inwidth = 1920;
scp.inheight = 1080;

scp.outwidth = 720;
scp.outheight = 480;
scp.coeff = NULL;

ret = ioctl(fd, TIFB_SET_SCINFO, &scp);
if (ret < 0) {
    perror("Can not set coeff.\n");
}
	
/* Enable the scaling */
regp.scalaren = TI81XXFB_FEATURE_ENABLE;
ret = ioctl(fd, TIFB_SET_PARAMS, &regp);

if (ret < 0) {
    printf("failed to set reg params\n");
}

/* Let's close fb2 */
close(fd);

/* Open fb2 and apply size settings */
fd = open ("/dev/fb2", O_RDWR);

if (fd == -1) {
    perror("failed to open display device\n");
}

/* Get fix screen information. */
if (ioctl(fd, FBIOGET_FSCREENINFO, &fixinfo) < 0) {
    perror("TIFB_GET_FSCREENINFO\n");
    close(fd);
    exit(1);
}

/* Get variable screen information. */
if(ioctl(fd, FBIOGET_VSCREENINFO, &varinfo) < 0) {
    perror("TIFB_GET_VSCREENINFO\n");
    close(fd);
    exit(1);
}

varinfo.xres = 1920;
varinfo.yres = 1080;
varinfo.xres_virtual = varinfo.xres;
varinfo.yres_virtual = varinfo.yres;

/* Set the resolution */
if(ioctl(fd, FBIOPUT_VSCREENINFO, &varinfo) < 0) {
    perror("TIFB_PUT_VSCREENINFO\n");
    close(fd);
    exit(1);
}

/* It is better to get fix screen information again because
changing variable screen info may also change fix screen info */
if (ioctl(fd, FBIOGET_FSCREENINFO, &fixinfo) < 0) {
    perror("TIFB_GET_FSCREENINFO\n");
    close(fd);
    exit(1);
}

/* Mmap the driver buffers in application space so that application
   can write on to them. */
mmap(NULL, fixinfo.line_length * varinfo.yres, 0x1 | 0x2, 0x01, fd, 0);

/* Let's close fb2 */
close(fd);


If I run a gstreamer pipeline with the video output of 720x480 resolution, everything works fine and I am able to see the graphics layer and the video layer. But, if I run the pipeline with a video output resolution of 720x360, it stops to display and I get a kernel crash.

I found in the Technical Reference Manual  that the Video Compositor needs all the input layers of the same size, so I thought that the problem could be related with the framebuffer of 720x480 and the video output of 720x360. But if I try the same with the /dev/fb1 and DVO2, it works.


Could it be a hardware limitation in the SD output?


Any help would be appreciated.

Thanks,

Eugenia Guzman