zoukankan      html  css  js  c++  java
  • (二)DirectFB 入门

    2.1 DirectFB的整体框架

    DirectFB必须通过Linux下Framebuffer驱动来访问硬件设备,它在Framebuffer的基础上提供了图形设备的加速、输入设备处理提取、透明窗口和多重显示层的功能。另外DirectFB设计之初就充分考虑了嵌入式系统的固有特性,体积小巧,资源消耗低,图1是DirectFB的整体框架。

     

     

    2.2  DirectFB 开发环境搭建

    环境:unbunu10.04  DirectFB 1.6  flux1.4.3  root 用户身份登陆

     

    2.2.1 开启Framebuffer

    要使用DirectFB,操作系统必须开启Framebuffer ,

     

    1.获取硬件支持的framebuffer模式,同时设置引导参数

     

    $ hwinfo --framebuffer

      Mode 0x0317: 1024x768 (+2048), 16 bits

    我这里挑选了一个比较常见的mode,然后追加到kernel的引导参数当中去。

    $ vim /etc/default/grub

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=0x0317"

     

    2.在initrd当中添加对应模块的支持

    $ vim /etc/modprobe.d/blacklist-framebuffer.conf

     

    注释这一行

    #blacklist vesafb

     

    然后往initrd当中添加对应模块

    $ vim /etc/initramfs-tools/modules

     

    加入如下内容

    fbcon

    vesafb

    vga16fb

     

    3.最后更新grub2和initrd,重新引导即可

    $ update-grub2

    $ update-initramfs -u

     

    2.2.2 编译安装flux1.4.3 

    解压源码包 按顺序执行以下命令

    $ ./autogen.sh     生成configure

    $ ./configure --prefix=/usr      生成makefile 文件

    $ make

    $ make install

     

    2.2.3 安装DirectFB 

    解压源码包 按顺序执行以下命令

    $ ./autogen.sh     

    $ ./configure --prefix=/usr  --enable-x11=yes

    $ make

    $ make install

     

    ./configure  该步骤可能出错 原因是没有安装libtool ,PNG ,JPEG FreeType2 之类的。

    $ apt-get install libtool 

    $ apt-get install libpng12-dev

    $ apt-get install libjpeg62-dev

    $ apt-get install  libfreetype6-dev

    $ ./configure --prefix=/usr  --enable-x11=yes  

    由于DirectFB默认是关闭X11的,所以在这一步./configure的时候要将x11开启

     

    2.2.4 其它

    如果DirectFB 需要多处理器支持,还必须安装 linux-fusion 9.0.1,安装方法如安装flux。

     

    2.3 一个例子

     

    编译源码

    g++ -I/usr/include/directfb -ldirectfb -lpthread -ldl -lz test.cpp -o test

    提示可能不成功

    原因是没用安装 x11开发包。

    $ apt-get install  xorg-dev

    然后重新编译,并且运行./test 成功,屏幕中出现一条横线。

    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
    #include <directfb.h>
      
    //这是最上层的接口,所有的函数入口均由它(IDirectFB)而来
    static IDirectFB *dfb = NULL;
      
    //主平面也就是“屏幕”了。在交互层使用DFSCL_FULLSCREEN,它是主层平面。
    static IDirectFBSurface *primary = NULL;  
    //这里存储主平面的高和宽,从而为其它的操作提供支持
    static int screen_width  = 0;
    static int screen_height = 0;
    static IDirectFBFont * font = NULL;
    
    //用以检测错误的宏定义,用来检测大部分的函数的返回值是否正常。只适合用在小的测试程序
    #define DFBCHECK(x...)  
    {                
           DFBResult err = x;   
            
             if (err != DFB_OK)  
             {  
                    fprintf( stderr, "%s <%d>:nt", __FILE__, __LINE__ ); 
                   DirectFBErrorFatal( #x, err );  
            } 
    }
    int main (int argc, char **argv)
    {
        //为了创建一个平面,需要定义一个平面描述子(surface description)
        DFBSurfaceDescription dsc;
        DFBFontDescription font_dsc;
         
        //初始化
         DFBCHECK (DirectFBInit (&argc, &argv));
         DFBCHECK (DirectFBCreate (&dfb));
         DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
      
       //设定dsc的一些属性,现在可以不用关心
         dsc.flags = DSDESC_CAPS;
          dsc.caps  = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
     
           //使用我们设定的dsc创建主平面(primary)
           DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));
           //得到主平面的宽与高
           DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
     
            //设置字体的高度是固定的
            font_dsc.flags = DFDESC_HEIGHT;
            font_dsc.height = screen_height/16;
     
        //set Font 第二个参数是字体的路径,测试的话可以去下载一个放到指定目录下,然后修改参数二即可
        dfb->CreateFont( dfb, "/home/jia/DirectFB-examples-1.6.0/data/decker.ttf", &font_dsc, &font );
        primary->SetFont(primary, font);
             
        //通过画一个和主平面同等大小的矩形来清空主平面;默认颜色为黑色
        primary->FillRectangle (primary, 1, 1, screen_width, screen_height);
        //为了能显示画出来的线,先设置一下线的颜色,线的位置在屏幕的中间
        primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff);
        primary->DrawLine (primary,0, screen_height / 2,screen_width - 1, screen_height / 2);
        //写hello 在屏幕上   
         primary->DrawString(primary, "hello world", -1,0,font_dsc.height*1,  DSTF_LEFT);
     
         DFBCHECK (primary->Flip (primary, NULL, 0));  //去刷新屏幕
         sleep (5);  //等待5秒后,程序自动退出
         primary->Release( primary );
           dfb->Release( dfb );
           return 0;
    }
  • 相关阅读:
    关于GitHub推送时发生Permission denied (publickey)的问题
    线性模型——机器学习(西瓜书)读书笔记
    梯度下降算法的简单理解
    PRML学习笔记第一章
    python函数学习之装饰器
    机器学习 概论
    Mybatis
    Nginx 常用配置清单
    接口,抽象类
    IntelliJ IDEA打war包
  • 原文地址:https://www.cnblogs.com/wolfrickwang/p/3516950.html
Copyright © 2011-2022 走看看