DirectFB简介以及移植[一]

***************************************************************************************************************************

作者:EasyWave                                       时间:2014.09.13

类别:开源GUI系统-DirectFB简介         声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:DirectFB简介

DirectFB是一个轻量级的提供硬件图形加速,输入设备处理和抽象的图形库,它集成了支持半透明的视窗系统以及在LinuxFramebuffer驱动之上的多层显示。它是一个用软件封装当前硬件无法支持的图形算法来完成硬件加速的层。DirectFB是为嵌入式系统而设计。它是以最小的资源开销来实现最高的硬件加速性能。

DirectFB是图形API存在于Frame Buffer层之上与高级图形管理层如GTK+等之下的。它可以以很小的系统资源占用来提供图形硬件加速功能,提供类如多路a通道渲染模型等高级图像操作。它不修改Linux内核,除了标准C库没有其他库的依赖。应用在了基于Linux系统的DTV显示系统的研发和其他有关Linux显示界面的项目上。支持市面上绝大多数显示卡,支持键盘、鼠标、遥控器、游戏手柄、触摸屏等输入设备。支持JPEG、PNG、GIF、mpeg1/2、AVI、MOV、Flash、Video4Linux、DirectFB bitmap font和TrueType等音视频文件和字体。

二:DirectFB在系统的位置

从GUI整个系统架构来讲,对于一般的MMP,DTV和STB来说,下面图中是比较经典的结构。 DirectFB都处于QT,GTK+这样的高级GUI框架的下面,Linux系统驱动的上面。如下图所示:

从功能上面来讲,下面图中比较形象的说明了DirectFB的主要作用:图形,文字的处理(DirectFB把TS经过Decoder处理之后的码流,再加上图形和文字,一起传给视频的芯片),如下图所示:

三:DirectFB GUI的架构

对于上层的GUI高级框架来说,DirectFB是透明的,下图是一个更加细化的DirectFB的结构图:

对于底层的驱动来说,DirectFB里面负责和硬件打交道的显卡的驱动(gfxdriver)和显示系统(system),这里面gfxdriver是和各个硬件平台相关的,有可能需要自己写。 为了更易于理解DirectFB,需要先介绍几个DirectFB里面的概念:

  • Layers:代表互相独立的图形缓存。大多数嵌入式设备都有多个layer。多个layer根据对应的alpha值混合 在一起,从而显示出来。  
  • Surface:代表一块预留的内存,来保存像素数据。DirectFB中的Drawing,Bilitting操作就是基于 surface的。Surface的内存根据设定,可以从系统中分配,也可以从显卡的内存中分配。
  • Primary Surface:代表一个特殊layer的特殊surface。如果primary surface是单缓冲的,任何对于 primary surface的操作都会直接反应到显示屏上。
  • Subsurface:是一个surfac的子集,但是自身并不占有任何内存。
  • Window/Windowstack:控制一个layer中的surface该显示什么。Window属于某个背景可以设定的layer。 每个window有自己的surface,window用这个surface来组合图像。  

比如说下图中有三个Layer,最下面的Layer是一幅背景图,中间的Layer是一个透明的带有一个“igel”的Layer,最上面是一个透明的带有subtitle的Layer,最后我们在显示器中看到的就是各个Layer的混合。

再比如说下面这幅图,Lower Layer是一个全屏模式的Layer,它的背景图片渲染在自己的SurFace上面。Video area是一个SurFace,用来显示video。Upper Layer通过window stack/window 来显示应用程序的内容,而且Upper Layer是一个透明的Layer,这样混合之后,可以透过上面的Layer看到下面的video。

四:DirectFB的移植

如果要移植DirectFB需要用到以下的第三方库,如下图所示:

DirectFB需要用到第三方库简介:

  • fontconfig-2.10.92:管理系统安装的字体,根据应用程序的字体配置,match(匹配)一种字体,填充match字体的各种属性。
  • freetype-2.5.0:FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。
  • jpeg-8d:jpeg开源库
  • libpng-1.5.8:PNG 库是用来创立和操作PNG 格式的图像文件,PNG 格式是设计来替代GIF,他对于更小范围的TIFF(标记图象文件格式)来说,有了非常多的进步和拓展并且减少了关于专利权的麻烦。
  • libsigc++-2.2.8:libsigc++是实现类型安全回调的一个C++模板库。libsigc++提供了信号(signal)和槽(slot)的概念,实现了信号机制。slot对应一个回调函数,信号(signal)与槽(slot)相关联(attach),当一个信号被发射(emit)时,相对应的槽被调用。
  • libxml2-2.6.28:包含了对 XPath 表达式使用的支持来检索匹配一个指定准则的结点集。libxml2软件包提供允许用户操控XML文件的函数库,包含有读、修改和写XML和HTML文件支持。

4.1: jpeg-8d的编译配置

jpeg-8d的build.sh的脚本配置如下所示:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

mkdir -p $INSTALL_PATH

#autoreconf -ivf
if [ -f config.log ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH             --host=arm-none-linux-gnueabi             --target=arm-none-linux-gnueabi 	    --build=i486-linux-gnu 	    --disable-option-checking 	    --disable-silent-rules 	    --disable-dependency-tracking 	    --enable-maintainer-mode 	    --enable-ld-version-script 	    --enable-shared=yes 	    --enable-static=no 	    --enable-fast-install=yes 	    --disable-libtool-lock             --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.2:libpng-1.5.8的编译和配置

libpng-1.5.8的build.sh的脚本配置如下所示:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

mkdir -p $INSTALL_PATH

#autoreconf -ivf
if [ -f config.log ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH             --host=arm-none-linux-gnueabi             --target=arm-none-linux-gnueabi 	    --build=i486-linux-gnu 	    --disable-option-checking 	    --disable-dependency-tracking 	    --enable-maintainer-mode 	    --disable-arm-neon 	    --enable-shared=yes 	    --enable-static=no 	    --enable-fast-install=yes 	    --disable-libtool-lock             --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.3:libxml2-2.6.28的编译和配置

libxml2-2.6.28的build.sh的脚本配置如下所示:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

mkdir -p $INSTALL_PATH

#autoreconf -ivf
if [ -f config.log ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH             --host=arm-none-linux-gnueabi 	    --build=i486-linux-gnu 	    --disable-option-checking 	    --disable-dependency-tracking 	    --enable-maintainer-mode 	    --disable-silent-rules 	    --enable-shared=yes 	    --enable-static=no 	    --enable-fast-install=yes 	    --disable-libtool-lock 	    --disable-documentation 	    --enable-warnings=min             --with-sax1=yes             --with-catalog=yes             --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.4:freetype-2.5.0的编译和配置

freetype-2.5.0的build.sh的脚本配置如下所示:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

mkdir -p $INSTALL_PATH

#autoreconf -ivf
if [ -f config.log ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH             --host=arm-none-linux-gnueabi 	    --build=i486-linux-gnu 	    --disable-option-checking 	    --disable-dependency-tracking 	    --enable-biarch-config 	    --disable-mmap 	    --enable-shared=yes 	    --enable-static=no 	    --enable-fast-install=yes 	    --disable-libtool-lock             --without-bzip2             --without-zlib             --without-png             --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.5:fontconfig-2.10.92的编译和配置

fontconfig-2.10.92的build.sh的脚本配置如下所示:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

mkdir -p $INSTALL_PATH

export LDFLAGS="-L$INSTALL_PATH/lib"
export CFLAGS="-I$INSTALL_PATH/include"
export PKG_CONFIG_PATH="$INSTALL_PATH/lib/pkgconfig"
export LIBS="-ldl -lpthread -lpng"

if [ -f config.log ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH             --host=arm-none-linux-gnueabi 	    --build=i486-linux-gnu 	    --disable-option-checking 	    --disable-dependency-tracking 	    --disable-silent-rules             --disable-largefile 	    --enable-shared=yes 	    --enable-static=no 	    --enable-fast-install=yes 	    --disable-libtool-lock 	    --enable-libxml2 	    --disable-iconv             --with-gnu-ld             FREETYPE_CFLAGS="-I$INSTALL_PATH/include/freetype2"             FREETYPE_LIBS="-L$INSTALL_PATH/lib -lfreetype"             LIBXML2_CFLAGS="-I$INSTALL_PATH/include/libxml2"             LIBXML2_LIBS="-L$INSTALL_PATH/lib -lxml2"

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.6:libsigc++-2.2.8的编译和配置

libsigc++-2.2.8的build.sh的脚本配置如下所示:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

mkdir -p $INSTALL_PATH

#autoreconf -ivf
if [ -f config.log ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH             --host=arm-none-linux-gnueabi 	    --build=i486-linux-gnu 	    --disable-option-checking 	    --disable-dependency-tracking 	    --enable-maintainer-mode 	    --enable-shared=yes 	    --enable-static=no 	    --enable-fast-install=yes 	    --disable-libtool-lock 	    --enable-ipv6=no             --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

五:移植总结

DirectFB的移植留到下一篇来详细介绍,这一篇只详细的介绍DirectFB所需要的第三方库的编译和配置。

时间: 2024-10-17 07:17:55

DirectFB简介以及移植[一]的相关文章

uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤

1.参考博客:https://blog.csdn.net/wang328452854/article/details/78486458 2.uCOS(也有人叫uC/OS)由美国人 Jean Labrosse在1992年编写的一个实时操作系统 3.uCOS特点: ①.可剪裁:有一个专门用来裁剪系统的配置文件,通过各种宏的来打开或者关闭那些不需要用到系统服务 ②.可移植: uCOS-II基本全部是用C语言写的,只有和微处理器相关的那部分是用汇编写的,便于移植到各种微处理器 ③.抢占式:系统总是运行多

Qt在各平台上的搭建qt-everywhere

Qt for windows7-64bit 在电脑上安装mingw(搜索mingw for windows),将C:\MinGW\bin添加进环境变量,打开命令行输入gcc --version和g++ --version和mingw32-make --version验证安装成功 解压qt-everywhere-opensource-src-4.8.1.tar.gz并进入目录 configure -debug-and-release -opensource -platform win32-g++

Linux内核调试的方式以及工具集锦

CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供收录, 鄙人在此谢谢啦 "调试难度本来就是写代码的两倍. 因此, 如果你写代码的时候聪明用尽, 根据定义, 你就没有能耐去调试它了.&qu

基于Zynq平台的EtherCAT主站方案实现

作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在工业自动化领域有着广泛的应用.Zynq-7000 是赛灵思公司(Xilinx)推出的行业第一个全可编程 SoC 产品, 它将双核 ARM Cortex-A9 处理器,低功耗可编程逻辑以及常用的外设紧密集成在一起.ZedBoard 是基于 XC7Z020 器件的低成本开发板,此板可以运行基于 Linu

嵌入式 Linux根文件系统移植(一)——Linux文件系统简介

嵌入式 Linux根文件系统移植(一)--Linux文件系统简介 本文对文件系统分析的代码来源于linux 2.6.35.7版本. 一.文件系统的体系结构 文件系统是对存储设备上的数据和元数据进行组织的机制,便于用户和操作系统的交互.Linux支持多种文件系统,文件系统接口实现为分层的体系结构,将用户接口层.文件系统实现和操作存储设备的驱动程序分隔开.Linux文件系统的体系结构如下: 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C库(glibc),为文件系统调用(打开.读取.

嵌入式Linux下MP4视频录制库MP4V2移植和简介

*************************************************************************************************************************** 作者:EasyWave                                                                             时间:2014.10.31 类别:Linux应用-MP4视频录制库MP4V2

嵌入式 Linux根文件系统移植(二)——根文件系统简介

嵌入式 Linux根文件系统移植(二)--根文件系统简介 根文件系统是内核启动时挂载的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行. 一.嵌入式设备文件系统 在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tm

嵌入式 Linux开发Kernel移植(一)——kernel内核简介

嵌入式 Linux开发Kernel移植(一)--kernel内核简介 一.Linux Kernel 1.linux kernel简介 Linux kernel是芬兰黑客 Linus Torvalds 1991年在英特尔x86架构上用C语言开发的自由免费的符合POSIX标准的类Unix操作系统. Linux kernel是一个一体化内核(monolithic kernel)系统,提供硬件抽象层.磁盘及文件系统控制.多任务等功能的系统软件,不是一套完整的操作系统. 内核空间与用户空间是程序执行的两种

嵌入式linux开发uboot移植(一)——uboot项目简介

嵌入式linux开发uboot移植(一)--uboot项目简介 一.uboot简介 U-Boot,全称 Universal Boot Loader,是遵循GPL条款的从FADSROM.8xxROM.PPCBOOT逐步发展演化而来的开放源码项目. 在操作系统方面,U-Boot不仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统.目前支持的目标操作系统是OpenBSD, NetBSD, Fre