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:
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, ®p) < 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, ®p) < 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, ®p);
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