基于iMX6 Linux系统的设备加入如下功能
1. 开机动画(基于cpu自带的VPU)
2. 夜视功能(基于adv7180/7182)
3. 手机导航推送功能(手机地图资源通过wifi透传给设备应用)
第一个基于官方用例mxc_vpu_test,第二个基于官方用例mxc_v4l2_tvin
这三个功能都是将图像绘制到fb1中,即imx6的Overlay叠加层(fb1为前景,fb0为背景)
ioctl(fd, FBIOBLANK, FB_BLANK_NORMAL);
ioctl(fd, FBIOBLANK, FB_BLANK_UNBLANK);
ioctl(fd, MXCFB_SET_LOC_ALPHA, &loc_alpha);
ioctl(fd, MXCFB_SET_OVERLAY_POS, &pos);
ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo);
这个三个功能不同地方如下
第一个使用官方的解码器播放视频,会直接打开fb1并覆盖在fb0上播放
第二个会设置cvbs输入的格式为uyuv并打开fb1显示
第三个为基于Qt的本地应用,显示的图像为地图数据,按照rgba的格式来显示
这个三个工能合并起来使用的时候会带来各方面的花屏问题
1. 夜视个导航功能互切的时候会花屏,改善方法:在使用前将yuv和rgb格式设置对了再打开FB_BLANK_UNBLANK,同时确保bpp是匹配的,否则会引起色偏
vinfo.bits_per_pixel = 32;
vinfo.activate |= FB_ACTIVATE_FORCE;
vinfo.nonstd = v4l2_fourcc('A', 'B', 'G', 'R');
vinfo.red.offset = 24;
vinfo.red.length = 8;
vinfo.green.offset = 16;
vinfo.green.length = 8;
vinfo.blue.offset = 8;
vinfo.blue.length = 8;
vinfo.transp.offset = 0;
vinfo.transp.length = 8;
------------------------------------------------------------------------------
vinfo.bits_per_pixel = 16;
vinfo.activate |= FB_ACTIVATE_FORCE;
vinfo.nonstd = V4L2_PIX_FMT_RGB565;
vinfo.red.offset = 11;
vinfo.red.length = 5;
vinfo.green.offset = 5;
vinfo.green.length = 6;
vinfo.blue.offset = 0;
vinfo.blue.length = 5;
vinfo.transp.offset = 0;
vinfo.transp.length = 8;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
2. 在改变导航功能的显示区域的时候会出现花屏
原因为当前使用的显示方式为framebuffer,不带窗口系统,所以Qt程序会根据现有的窗口大小创建Qt的窗口(export QT_QPA_EGLFS_FB=/dev/fb1使Qt运行于fb1),Qt窗口大小是根据fb1的区域创建的(MXCFB_SET_OVERLAY_POS/FBIOPUT_VSCREENINFO等),在Qt窗口已经绘制成功后,若修改fb1区域的大小会引起花屏,大概是Qt窗口不会随着fb区域变更导致的
3. 在使用local_alpha和夜视(mxc_v4l2_tvin)结合的时候,硬件上有个16位对齐,所以分辨率宜设置为16的倍数,否则容易出现花屏,在mxc_v4l2_tvin代码中有8像素对齐的代码
4. 在夜视窗口的分辨率过大时会引起屏幕闪屏,目前原因未知,但概率似乎和cpu/gpu负载有正相关