I've been chasing my tail on this issue for a couple months now...I'm wondering if the issue resides somewhere in the display portion of the EZSDK firmare.
On our boards, we're driving /dev/fb1 to a VGA monitor on DVO2, at 1280x1024 (60Hz). We see that periodically (once or twice within 1 minute), the display image "glitches" -- it's as if a display frame buffer is momentarily off by some number of row/columns. We are also driving the HDMI (/dev/fb0) and SD (/dev/fb2) simultaneously, but see no issues on those displays. Aside from the recurring "glitch," the video out DVO2 looks great.
It *seems* like this glitch only occurs while the OpenMax video pipeline is running... I don't seem to see "glitches" on the GUI if the OpenMax application isn't running.
I've looked at the HS and VS signals on an oscilloscope and saw no anomalies, which makes me thing somethings getting corrupted in memory, either on the ARM side or on the M3 buffers. (i.e. that it's not a board or hardware level issue.)
Any chance someone else has observed this or that someone from TI could look into this? (I do not have access to the EZSDK VPSS M3 source code to investigate this further from my side, unfortunately.)
Currently, we're using EZSDK 5.05.00.02, with Qt 4.8.4 for displaying a user interface overlay on top of live video. /dev/fb1 uses R=0, G=0, B=0x255 for color-keyed transparency. An OpenMax program (using the OpenMax IL API) paints a scaled 480x480 video in the center of the display, which is show in the "transparent" region of the GUI.
---
Below are some sysfs items denoting the configuration of display1:
# cat /sys/devices/platform/vpss/display1/clksrc
aclk
# cat /sys/devices/platform/vpss/display1/mode
1280x1024@60
# cat /sys/devices/platform/vpss/display1/source
dvo2
cat /sys/devices/platform/vpss/display1/timings
108000,1280/48/248/112,1024/1/38/3,1
cat /sys/devices/platform/vpss/display1/output
triplediscrete,rgb888,0/0/0/0
# cat /sys/devices/platform/vpss/display1/order
0,0
Below is some information about how the /dev/fb1 is configured:
Fixed Info:
----------------
line_len=5120
smem_start=0xB2000000
buf_len=0x01000000
Screen Info:
----------------
res_x=1280
res_y=1024
virt_res_x=1280
virt_res_y=1024
non_std=0
bits_per_pixel=32
blue_len=8, msb=0, offset=0
red_len=8, msb=0, offset=16
green_len=8, msb=0, offset=8
trans_len=8, msb=0, offset=24
Region Info:
----------------
region=0
pos_x=0
pos_y=0
priority=1
first=1
last=1
scalar_enabled=0
stenciling_enabled=0
tranparency_enabled=1
transparency_type=0
key_color=0x0000FF00
blend=0
alpha=0
bb_en=0
alpha=0
Scaler Info:
----------------
in_width=0
in_height=0
out_width=0
out_height=0
coeff=0
Below is my /proc/cmdline, to show how my memory is configured:
rootwait rw earlyprintk console=ttyO0,115200n8 rw rootwait=1 ubi.mtd=5,2048 rootfstype=ubifs root=ubi0:rootfs2 noatime mem=364M@0x80000000 mem=320M@0x9FC00000 vmalloc=500M notifyk.vpssm3_sva=0xBF900000 vram=50M
Here's how we're loading display drivers:
modprobe vpss sbufaddr=0xBFB00000 mode=hdmi:720p-60 i2c_mode=0 debug=0
modprobe ti81xxfb vram=0:24M,1:16M,2:6M
modprobe ti81xxhdmi
Below are some snippets showing display setup from the OMX side of things, which should reiterate the configuration I described in the problem statement. I can provide additional info here as needed.
...
OMX_INIT_PARAM(&mode_cfg);
mode_cfg.width = 480;
mode_cfg.height = 480;
mode_cfg.scanFormat = OMX_SF_PROGRESSIVE;
mode_cfg.pixelClock = 108000;
mode_cfg.hFrontPorch = 48;
mode_cfg.hBackPorch = 248;
mode_cfg.vFrontPorch = 1;
mode_cfg.vBackPorch = 38;
mode_cfg.hSyncLen = 112;
mode_cfg.vSyncLen = 3;
ret = OMX_SetParameter(d->common.handle,
OMX_TI_IndexParamVFDCCustomModeInfo,
&mode_cfg);
...
ret = OMX_SetParameter(d->handle_ctrl,
OMX_TI_IndexParamVFDCCustomModeInfo,
&mode_cfg);
...
OMX_INIT_PARAM(&layout);
layout.sMosaicWinFmt[0].winStartX = (1280 - 480) / 2;
layout.sMosaicWinFmt[0].winStartY = (1024 - 480) / 2;
layout.sMosaicWinFmt[0].winWidth = 480;
layout.sMosaicWinFmt[0].winHeight = 480;
layout.sMosaicWinFmt[0].pitch[VFDC_YUV_INT_ADDR_IDX] = 480 * 2;
layout.sMosaicWinFmt[0].dataFormat = VFDC_DF_YUV422I_YUYV;
layout.sMosaicWinFmt[0].bpp = VFDC_BPP_BITS16;
layout.sMosaicWinFmt[0].priority = 0;
layout.nDisChannelNum = 0;
layout.nNumWindows = 1;
ret = OMX_SetParameter(d->common.handle,
OMX_TI_IndexParamVFDCCreateMosaicLayout, &layout);