keropoの備忘録

しらべたことをメモるブログ

DirectFBでARM環境をグラフィカル表示~その②

サンプルプログラム

DirectFBでARM環境をグラフィカル表示~その① - keropoの備忘録の続き。
ARMクロスコンパイルしたDirectFBのライブラリ群が完成したので、それを利用してqemuで動かす為のサンプルプログラムを作成する。
作成したのは赤・緑・青のタスキ表示するプログラム(main.c)。

#include <stdio.h>
#include <unistd.h>
#include <directfb.h>

#define DFBCHECK(x...)                                         \
  {                                                            \
    DFBResult err = x;                                         \
                                                               \
    if (err != DFB_OK)                                         \
      {                                                        \
        fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
        DirectFBErrorFatal( #x, err );                         \
      }                                                        \
  }


int main(int argc, char **argv) {
        IDirectFB *dfb = NULL;
        IDirectFBSurface *primary = NULL;
        int width = 0;
        int height = 0;
        int i = 0;

        DFBSurfaceDescription dsc;
        /*init directfb*/
        DFBCHECK(DirectFBInit(&argc, &argv));
        /*create interface*/
        DFBCHECK(DirectFBCreate(&dfb));

        /*フルスクリーン表示設定*/
        DFBCHECK(dfb->SetCooperativeLevel(dfb, DFSCL_FULLSCREEN));

        /*サーフェスの内容を設定*/
        dsc.flags = DSDESC_CAPS;
        dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;

        /*サーフェスの作成*/
        DFBCHECK(dfb->CreateSurface(dfb, &dsc, &primary));

        /*画面サイズを取得*/
        DFBCHECK(primary->GetSize(primary, &width, &height));

        /*赤・緑・青を表示*/
        primary->SetColor(primary, 0xff, 0, 0, 0x7f);
        DFBCHECK(primary->FillRectangle(primary, 0, 0, 215, height));
        primary->SetColor(primary, 0, 0xff, 0, 0x7f);
        DFBCHECK(primary->FillRectangle(primary, 216, 0, 430, height));
        primary->SetColor(primary, 0, 0, 0xff, 0x7f);
        DFBCHECK(primary->FillRectangle(primary, 431, 0, width, height));
        DFBCHECK(primary->Flip(primary, NULL, 0));

        sleep(10);

        primary->Release(primary);
        dfb->Release(dfb);

        return 0;
}

作成したサンプルプログラムをコンパイル

export TARGET=arm-unknown-linux-gnueabi
export CROSS=${クロスコンパイラのルートパス}
export SYSROOT=$CROSS/$TARGET/sysroot
export PATH=$PATH:$CROSS/bin

arm-unknown-linux-gnueabi-gcc -o samplefb main.c \
  -I${SYSROOT}/usr/include/directfb \
  -I${SYSROOT}/usr/include/directfb-internal \
  -L${SYSROOT}/usr/lib -lpthread -ldirect -ldirectfb -lfusion

qemu実行環境の作成

作成したサンプルプログラムをqemuで実行する為、qemu実行用のルートファイルシステムイメージにDirectFD用のライブラリをコピーする。
ただ、DirectFBのライブラリだけコピーするのはめんどくさいので、DirectFBでARM環境をグラフィカル表示~その① - keropoの備忘録でクロスコンパイラのライブラリフォルダにDirectFBのライブラリも出力されているので、全てのライブラリをルートファイルシステムイメージにコピーしてしまう。

 $cp -Rp ${SYSROOT}/lib/*.so* ${ルートイメージ}/lib
 $cp -Rp $CROSS/$TARGE/lib/*.so* ${ルートイメージ}/lib
 $cp -Rp ${SYSROOT}/usr/lib/*.so* ${ルートイメージ}/usr/lib
 $cp -Rp ${SYSROOT}/usr/lib/directfb-1.4-0 ${ルートイメージ}/usr/lib

そして、ルートにdirectfbの設定ファイルを作成する。

  $vi ${ルートイメージ}/.directfbrc
  system=fbdev
  module-dir=/usr/lib/directfb-1.4-0/
  fbdev=/dev/fb0
  mode=640x480
  depth=16

最後にルートに作成したサンプルプログラムをコピー

  $cp samplefb ${ルートイメージ}

実行

実行した結果は以下のような感じ。

いろいろ出来るみたいなので、もう少しdirectFBで遊んでみる予定。