哪吒板上用display显示yuv格式数据直接蓝屏
-
在哪吒板上,将摄像头数据用display显示,LCD屏只有蓝屏,大家有遇到过没,求高手指点
-
具体是怎么操作的呢?
-
@tigger 目标是把CVBS摄像头采集的数据通过DE显示
1、内核配置部分:TVD
然后display的配置也勾选上了
目的想通过DE显示摄像头采集的数据。
2、应用程序部分-
打开摄像头
dev_video = "/dev/video4";
video_fd = open(dev_video, O_RDWR /* required */ | O_NONBLOCK, 0); -
初始化display
if((dispfd = open("/dev/disp",O_RDWR)) == -1)
{
printf("open display device fail!\n");
return -1;
}
下面是常规流程:
-
查询摄像头能力并设置格式,摄像头是用的800*480的
ioctl(video_fd, VIDIOC_S_FMT, &video_format) -
向驱动申请缓冲区,申请了4个buffer
ioctl(video_fd, VIDIOC_REQBUFS, &video_requestbuffers) -
内核地址映射到应用层地址
先ioctl(video_fd, VIDIOC_QUERYBUF, &video_buffer),然后再mmap -
将缓冲区放入到采集队列
ioctl(video_fd, VIDIOC_QBUF, &video_buffer) -
启动摄像头采集
ioctl(video_fd, VIDIOC_STREAMON, &opt_type) -
while循环反复出队列入队列
-
最后是disp_set_addr函数
最后直接整个屏幕全蓝,啥都没有,之前已经做过尝试,把yuv的数据存成文件,图像是对的,手动转rgb,通过fb0显示,图像也是对的,但是只要通过display显示就不对了。
-
-
@honey130602 可以用package/utils/yuview来测试显示一张yuv图片。另外蓝屏的时候可以执行cat /sys/class/disp/disp/attr/sys看看图层信息哪里有异常。
-
@anruliu 感谢,已经尝试了,用yuview没问题,可以显示之前摄像头捕获的一帧数据存成的yuv文件,然后后面用cat /sys/class/disp/disp/attr/sys显示的信息如下,但是不晓得怎么看这个有没有异常:
下面是执行应用程序前的:
root@TinaLinux:/# cat /sys/class/disp/disp/attr/sys
screen 0:
de_rate 300000000 hz, ref_fps:60
mgr0: 800x480 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false] iommu[1]
dmabuf: cache[0] cache max[0] umap skip[0] overflow[0]
lcd output backlight( 50) fps:60.2 800x 480
err:0 skip:221 irq:44264 vsync:0 vsync_skip:0
BUF enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[ 0] fb[ 800, 480; 800, 480; 800, 480] crop[ 0, 0, 800, 480] frame[ 0, 0, 800, 480] addr[ffe00000, 0, 0] flags[0x 0] trd[0,0] depth[ 0]下面是执行应用程序捕获摄像头数据后的:
root@TinaLinux:/mnt/exUDISK# cat /sys/class/disp/disp/attr/sys
screen 0:
de_rate 300000000 hz, ref_fps:60
mgr0: 800x480 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false] iommu[1]
dmabuf: cache[0] cache max[0] umap skip[0] overflow[0]
lcd output backlight( 50) fps:60.2 800x 480
err:317 skip:347 irq:48078 vsync:0 vsync_skip:0
BUF enable ch[0] lyr[0] z[1] prem[N] a[globl 255] fmt[ 76] fb[ 800, 480; 400, 240; 0, 0] crop[ 0, 0, 800, 480] frame[ 0, 0, 800, 480] addr[42600000,4265dc00, 0] flags[0x 0] trd[0,0] depth[ 0] BUF enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[ 0] fb[ 800, 480; 800, 480; 800, 480] crop[ 0, 0, 800, 480] frame[ 0, 0, 800, 480] addr[ffe00000, 0, 0] flags[0x 0] trd[0,0] depth[ 0] -
我现在有点怀疑,是不是我的摄像头不是mplane导致的,内核代码中,貌似如果不是mplane,很多都直接返回了,所以是否这样导致地址异常。。。
-
嗯,终于出来了,强制将驱动包括tvd和v4l2层的改为支持mplane,但是只用一个plane,在应用程序中分配地址,并传递userptr给DE,显示参考yuview的,显示效果不错,很流畅,CPU占用率不到3%
-
@honey130602 6666
-
不错参考yuview里面的示例程序,在F1c200s上实现了直接读取AHD解码芯片出来1920*1080的NV21数据并在LCD上实时显示。
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号