週報--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接口顯示在液晶屏上。



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