周报--Qt通过cvbs接口显示

暱称:cmj<span style="font-family:Times New Roman;">      </span>日期:<span style="font-family:Times New Roman;">2014</span>年<span style="font-family:Times New Roman;">10</span>月<span style="font-family:Times New Roman;">18</span>日—<span style="font-family:Times New Roman;">2014</span>年<span style="font-family:Times New Roman;">10</span>月<span style="font-family:Times New Roman;">24</span>

本周完成任务:解决Qt通过显示cvbs接口显示,编写需求中的界面,红外遥控可控制界面,根据界面需求留出功能调用接口;

关键技术点说明:Qt如何通过cvbs接口显示,以及Framebuffer的设置。

1、义视频输出设备属性结构体VO_PUB_ATTR_S stPubAttr;其属性设置如下:

stPubAttr.u32BgColor = 0x000000ff;  //设备背景色 RGB表示
stPubAttr.enIntfType = VO_INTF_CVBS;	//Vo接口类型。设定输出接口为cvbs
stPubAttr.enIntfSync = VO_OUTPUT_PAL; //Vo接口时序类型。接口为cvbs时,输出接口时序只能是PAL和NTSC
stPubAttr.bDoubleFrame = HI_FALSE; //是否需要倍帧,否

2、初始化 MPP 视频缓存池、初始化MPP 系统。

此调用海思俩个API函数:

HI_MPI_VB_Init(); //初始化 MPP 视频缓存池。
HI_MPI_SYS_Init(); //初始化MPP 系统。

由于没有视频输入,且Qt显示与Framebuffer有关,所以对输入设备,视频缓冲池的,系统的初始化无需额外设置。

3、启用视频输出设备,视频层的设置,使能视频层。

SAMPLE_COMM_VO_StartDevLayer(VoDev, &stVoPubAttr, gs_u32ViFrmRate);
参数: VoDev:输出设备号;我们是cvbs输出,所以设备号为2;
stVoPubAttr:输出设备属性结构体
gs_u32ViFrmRate:显示帧率

下面是用到的API:

HI_MPI_VO_SetPubAttr(VoDev, pstPubAttr); //配置视频输出设备的公共属性。
HI_MPI_VO_Enable(VoDev);//启用视频输出设备。
SAMPLE_COMM_VO_GetWH(pstPubAttr->enIntfSync, &u32Width, &u32Height, &u32Frm);//720:576:25
功能:根据输出时序类型获得输出图像的大小,
VO_VIDEO_LAYER_ATTR_S stLayerAttr;//定义视频层属性。
stLayerAttr.enPixFormat = SAMPLE_PIXEL_FORMAT;//视频层使用的像素格式 SAMPLE_PIXEL_FORMAT:YUV420图像格式
stLayerAttr.u32DispFrmRt = u32SrcFrmRate;//显示帧率 25
stLayerAttr.stDispRect.s32X       = 0;//显示分辨率大小,起始点横座标
stLayerAttr.stDispRect.s32Y       = 0; //起始点纵座标
stLayerAttr.stDispRect.u32Width   = u32Width;//矩形的宽
stLayerAttr.stDispRect.u32Height  = u32Height;//矩形的高
stLayerAttr.stImageSize.u32Width  = u32Width;//视频层画布大小,
stLayerAttr.stImageSize.u32Height = u32Height;
HI_MPI_VO_SetVideoLayerAttr(VoDev, &stLayerAttr);//设置视频层属性api
HI_MPI_VO_EnableVideoLayer(VoDev);//使能视频层。

4、Framebuffer的设置

s32Fd = open("/dev/fb2", O_RDWR); //打开
对于/Hi3520D/Hi3515C 芯片,HiFB 最多可以管理4 个叠加图形层:叠加图
形层0~叠加图形层3(G3 为鼠标层),对应的设备文件分别为/dev/fb0~/dev/fb3。
而这里必须是打开fb2才能正常通过cvbs显示,原因在于:

FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。

 

bCompress = HI_FALSE ;
ioctl(s32Fd, FBIOPUT_COMPRESSION_HIFB, &bCompress)//设置图层启用压缩功能。否

HIFB_ALPHA_S stAlpha;//Alpha 结构体。
stAlpha.bAlphaChannel = HI_FALSE; //Alpha 叠加使能,否
stAlpha.bAlphaEnable = HI_FALSE; //Alpha 通道使能,否
if (ioctl(s32Fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0)//设置叠加层的Alpha。

 

帧缓冲设备最重要的数据结构体
struct fb_fix_screeninfo stFixInfo; //可变参数
struct fb_var_screeninfo stVarInfo; //固定参数
struct fb_bitfield stR32 = {10, 5, 0}; //fb_bitfield结构体描述每一像素显示缓冲区的组织方式,包含位域长度和MSB指示。
struct fb_bitfield stG32 = {5, 5, 0};
struct fb_bitfield stB32 = {0, 5, 0};
struct fb_bitfield stA32 = {15, 1, 0};


ioctl(s32Fd, FBIOGET_VSCREENINFO, &stVarInfo) //获取屏幕的可变信息。

stVarInfo.xres_virtual	 	= SCREEN_WIDTH;  //定义了framebuffer内存中一帧的尺寸。xres_virtual yres_virtual必定大于或者等于xres yres,
stVarInfo.yres_virtual		= SCREEN_HEIGHT;
stVarInfo.xres      		= SCREEN_WIDTH; //可视区间大小,对应着LCD的显示尺寸。
stVarInfo.yres      		= SCREEN_HEIGHT;
stVarInfo.activate  		= FB_ACTIVATE_NOW; //
stVarInfo.bits_per_pixel	= 16;
stVarInfo.xoffset = 0;
stVarInfo.yoffset = 0;
stVarInfo.red   = stR32;
stVarInfo.green = stG32;
stVarInfo.blue  = stB32;
stVarInfo.transp = stA32;

ioctl(s32Fd, FBIOPUT_VSCREENINFO, &stVarInfo)//设置Framebuffer 的屏幕分辨率和像素格式等。
ioctl(s32Fd, FBIOGET_FSCREENINFO, &stFixInfo) //获取Framebuffer 的固定信息。


 

u32Size 	= stFixInfo.smem_len;//内存大小
u32PhyAddr  = stFixInfo.smem_start;//内存起始
pu8Screen   = mmap(NULL, u32Size, PROT_READ|PROT_WRITE, MAP_SHARED, s32Fd, 0);//mmap将一个文件映射进内存。
memset(pu8Screen, 0x00, stFixInfo.smem_len);将pu8Screen所指向的某一块内存中的前stFixInfo.smem_len个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。

5、设置环境变狼,在/etc/profile中添加:

export QWS_DISPLAY="LinuxFB:/dev/fb2"

至此,运行Qt程序则界面可通过cvbs接口显示在液晶屏上。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章