Key Pad 를 이용해 image file 을 읽어 화면에 출력 하거나 그림을 그리고 글자를 출력한다. 한글을 사용하기 위해서는 UTF-8로 작성되어야 한다.
TODO : Touch screen
Source Code
#include <stdio.h> #include <stdint.h> #include <string.h> /* for memset */ #include <unistd.h> /* for open/close .. */ #include <fcntl.h> /* for O_RDWR */ #include <sys/ioctl.h> /* for ioctl */ #include <sys/mman.h> /* for mmap */ #include <linux/fb.h> /* for fb_var_screeninfo, FBIOGET_VSCREENINFO */ #include <linux/input.h> #include <poll.h> #include "directfb.h" /* DirectFB support still image type jpg png gif */ /* Application Action Key : Test Action F1 : Display VI_logo_320_240_R90.jpg F2 : Display VI_logo_320_240_R270.jpg F3 : Draw Blue Box F4 : Clear Screen F5 : Display String.. ENTER : Exit App */ #define DEV_LCD_BACKLIGHT "/sys/class/backlight/backlight/brightness" #define TEST_IMAGE_FILE_1 "VI_logo_320_240_R90.jpg" #define TEST_IMAGE_FILE_2 "VI_logo_320_240_R270.jpg" #define TEST_FONT_FILE "D2Coding.ttf" #define TEST_DISPLAY_STRING "밸류이노베이션" //"VI" /* 0: No key input or Parameter Error 1: Key is inputed */ int directfb_key_is_inputed(IDirectFBEventBuffer *pEventBuffer, uint32_t MiliSecondWaitTimeout) { if ( pEventBuffer == (IDirectFBEventBuffer *)0 ) { return 0; } if ( pEventBuffer->WaitForEventWithTimeout( pEventBuffer, 0, MiliSecondWaitTimeout ) == DFB_TIMEOUT ) { return 0; } return 1; } /* #define DEBUG_LOW_LEVEL_KEY_INPUT_INFO */ /* 0: OK -1: Error */ int directfb_key_get_code(IDirectFBEventBuffer *pEventBuffer, uint32_t *pKeyCode, uint32_t *pIsReleased) { DFBInputEvent InputEvent; if ( ( pEventBuffer != (IDirectFBEventBuffer *)0 ) && ( pKeyCode != (uint32_t *)0 ) ) { if ( pEventBuffer->GetEvent ( pEventBuffer, DFB_EVENT( &InputEvent ) ) == DFB_OK ) { #ifdef DEBUG_LOW_LEVEL_KEY_INPUT_INFO printf("Input Event : Type = %d, Key ID = %d\n", InputEvent.type, InputEvent.key_id); printf(" clazz = %d clazz of event\n", InputEvent.clazz); switch (InputEvent.clazz) { case DFEC_NONE: printf(" none of these\n"); break; case DFEC_INPUT: printf(" raw input event\n"); break; case DFEC_WINDOW: printf(" windowing event\n"); break; case DFEC_USER: printf(" custom event for the user of this library\n"); break; case DFEC_UNIVERSAL: printf(" universal event for custom usage with variable size\n"); break; case DFEC_VIDEOPROVIDER: printf(" video provider event\n"); break; case DFEC_SURFACE: printf(" surface event\n"); break; default: printf(" unknown\n"); break; } printf(" type = %d type of event\n", InputEvent.type); switch (InputEvent.type) { case DIET_UNKNOWN: printf(" unknown event\n"); break; case DIET_KEYPRESS: printf(" a key is been pressed\n"); break; case DIET_KEYRELEASE: printf(" a key is been released\n"); break; case DIET_BUTTONPRESS: printf(" a (mouse) button is been pressed\n"); break; case DIET_BUTTONRELEASE: printf(" a (mouse) button is been released\n"); break; case DIET_AXISMOTION: printf(" mouse/joystick movement\n"); break; default: printf(" unknown\n"); break; } printf(" device_id = %d source of event\n", InputEvent.device_id); printf(" flags = %d which optional fields are valid\n", InputEvent.flags); if ( InputEvent.flags == DIEF_NONE) { printf(" no additional fields\n"); } if ( (InputEvent.flags & DIEF_TIMESTAMP) == DIEF_TIMESTAMP) { printf(" timestamp is valid\n"); } if ( (InputEvent.flags & DIEF_AXISABS) == DIEF_AXISABS) { printf(" axis and axisabs are valid\n"); } if ( (InputEvent.flags & DIEF_AXISREL) == DIEF_AXISREL) { printf(" axis and axisrel are valid\n"); } if ( (InputEvent.flags & DIEF_KEYCODE) == DIEF_KEYCODE) { printf(" DIEF_KEYCODE used internally by the input core, always set at application level\n"); } if ( (InputEvent.flags & DIEF_KEYID) == DIEF_KEYID) { printf(" DIEF_KEYID used internally by the input core, always set at application level\n"); } if ( (InputEvent.flags & DIEF_KEYSYMBOL) == DIEF_KEYSYMBOL) { printf(" DIEF_KEYSYMBOL used internally by the input core, always set at application level\n"); } if ( (InputEvent.flags & DIEF_MODIFIERS) == DIEF_MODIFIERS) { printf(" DIEF_MODIFIERS used internally by the input core, always set at application level\n"); } if ( (InputEvent.flags & DIEF_LOCKS) == DIEF_LOCKS) { printf(" DIEF_LOCKS used internally by the input core, always set at application level\n"); } if ( (InputEvent.flags & DIEF_BUTTONS) == DIEF_BUTTONS) { printf(" DIEF_BUTTONS used internally by the input core, always set at application level\n"); } if ( (InputEvent.flags & DIEF_GLOBAL) == DIEF_GLOBAL) { printf(" Only for event buffers creates by IDirectFB::CreateInputEventBuffer() with global events enabled\n"); /* Indicates that the event would have been filtered if the buffer hadn't been global. */ } if ( (InputEvent.flags & DIEF_REPEAT) == DIEF_REPEAT) { printf(" repeated event, e.g. key or button press\n"); } if ( (InputEvent.flags & DIEF_FOLLOW) == DIEF_FOLLOW) { printf(" another event will follow immediately, e.g. x/y axis\n"); } if ( (InputEvent.flags & DIEF_MIN) == DIEF_MIN) { printf(" minimum value is set, e.g. for absolute axis motion\n"); } if ( (InputEvent.flags & DIEF_MAX) == DIEF_MAX) { printf(" maximum value is set, e.g. for absolute axis motion\n"); } printf(" additionally (check flags)\n"); // struct timeval timestamp; /* time of event creation */ printf(" DIET_KEYPRESS, DIET_KEYRELEASE\n"); printf(" key_code = %d hardware keycode, no mapping, -1 if device doesn't differentiate between several keys\n", InputEvent.key_code); // DFBInputDeviceKeyIdentifier key_id; /* basic mapping, modifier independent */ // DFBInputDeviceKeySymbol key_symbol; /* advanced mapping, unicode compatible, modifier dependent */ printf(" additionally (check flags)\n"); printf(" modifiers = 0x%X pressed modifiers (optional)\n", InputEvent.modifiers); #if 0 DIMM_SHIFT = (1 << DIMKI_SHIFT), /* Shift key is pressed */ DIMM_CONTROL = (1 << DIMKI_CONTROL), /* Control key is pressed */ DIMM_ALT = (1 << DIMKI_ALT), /* Alt key is pressed */ DIMM_ALTGR = (1 << DIMKI_ALTGR), /* AltGr key is pressed */ DIMM_META = (1 << DIMKI_META), /* Meta key is pressed */ DIMM_SUPER = (1 << DIMKI_SUPER), /* Super key is pressed */ DIMM_HYPER = (1 << DIMKI_HYPER) /* Hyper key is pressed */ #endif // DFBInputDeviceLockState locks; /* active locks (optional) */ printf(" DIET_BUTTONPRESS, DIET_BUTTONRELEASE\n"); printf(" button = %d in case of a button event Left=0, Right=1, Middle=2\n", InputEvent.button); printf(" buttons = %d mask of currently pressed buttons Left=1, Right=2, Middle=4\n", InputEvent.buttons); printf(" DIET_AXISMOTION\n"); printf(" axis = %d in case of an axis event X=0, Y=1, Z=2\n", InputEvent.axis); printf(" one of these two (check flags) : mouse/joystick\n"); printf(" axisabs = %d absolute mouse/joystick coordinate\n", InputEvent.axisabs); printf(" axisrel = %d relative mouse/joystick movement\n", InputEvent.axisrel); printf(" general information\n"); printf(" min = %d\n", InputEvent.min); printf(" max = %d\n", InputEvent.max); #endif if ( (InputEvent.flags & DIEF_KEYCODE) == DIEF_KEYCODE ) { if ( ( InputEvent.type == DIET_KEYPRESS ) || ( InputEvent.type == DIET_KEYRELEASE ) ) { *pKeyCode = InputEvent.key_code; if ( InputEvent.type == DIET_KEYPRESS ) { *pIsReleased = 0; } else /*if ( InputEvent.type == DIET_KEYRELEASE )*/ { *pIsReleased = 1; } return 0; } } } } return -1; } int bright_set(const uint8_t Brightness) { FILE * pDeviceFile; char pString[10] = {0}; int StringLength; pDeviceFile = fopen(DEV_LCD_BACKLIGHT, "w+"); if ( pDeviceFile == (FILE *)0 ) { printf("failed to open back light device : %s\n", DEV_LCD_BACKLIGHT); return -1; } sprintf(pString, "%d", Brightness); StringLength = (int)strlen(pString); if ( fwrite(pString, StringLength, 1, pDeviceFile) < 0 ) { printf("write error(%d) : %s\n", StringLength, strerror(errno) ); return -1; } fclose(pDeviceFile); return 0; } int bright_get(uint8_t *pBrightness) { FILE * pDeviceFile; char pCommand[128] = {0}; char pString[10] = {0}; char buf[10] = {0}; int level = 0; if ( pBrightness == (uint8_t *)0 ) { printf("bright_get : Input Parameter error\n"); return -1; } sprintf(pCommand, "cat %s", DEV_LCD_BACKLIGHT); pDeviceFile = popen(pCommand, "r"); if ( pDeviceFile == (FILE *)0 ) { printf("failed to popen %s - %s\n", pCommand, strerror(errno) ); return -1; } while( fgets(pString, 10, pDeviceFile) ); *pBrightness = (uint8_t)strtoul(pString, NULL, 10); fclose(pDeviceFile); return 0; } int main() { IDirectFB * pDirectFb; IDirectFBInputDevice * pInputDevice; IDirectFBEventBuffer * pEventBuffer; IDirectFBSurface * pPrimarySurface; /* primary surface - Base Screen */ IDirectFBFont * pFont; DFBSurfaceDescription SurfaceDescription; DFBResult Result; int nScreenWidth = 0; int nScreenHeight = 0; int IsInLoop; uint32_t KeyCode; uint32_t IsReleased; uint8_t Brightness; Result = DirectFBInit(0,0); if ( Result != DFB_OK ) { printf( "DirectFBInit Fail!\n"); return -1; } printf( "DirectFBInit OK\n"); /* create super interface. */ Result = DirectFBCreate(&pDirectFb); if ( Result != DFB_OK ) { printf( "DirectFBCreate Fail!\n"); return -1; } printf( "DirectFBCreate OK\n"); Result = pDirectFb->GetInputDevice( pDirectFb, DIDID_KEYBOARD, &pInputDevice ); if ( Result != DFB_OK ) { printf( "GetInputDevice Fail!\n"); pDirectFb->Release( pDirectFb ); return -1; } printf( "GetInputDevice OK\n"); Result = pInputDevice->CreateEventBuffer( pInputDevice, &pEventBuffer ); if ( Result != DFB_OK ) { printf( "GetInputDevice Fail!\n"); pDirectFb->Release( pDirectFb ); pInputDevice->Release( pInputDevice ); return -1; } printf( "GetInputDevice OK\n"); Result = pDirectFb->SetCooperativeLevel(pDirectFb, DFSCL_FULLSCREEN); if ( Result != DFB_OK ) { printf( "SetCooperativeLevel Fail!\n"); pEventBuffer->Release( pEventBuffer ); pInputDevice->Release( pInputDevice ); pDirectFb->Release( pDirectFb ); return -1; } printf( "SetCooperativeLevel OK\n"); /* set flags */ SurfaceDescription.flags = DSDESC_CAPS; SurfaceDescription.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING; /* create surface */ Result = pDirectFb->CreateSurface(pDirectFb, &SurfaceDescription, &pPrimarySurface); if ( Result != DFB_OK ) { printf( "CreateSurface Fail!\n"); pEventBuffer->Release( pEventBuffer ); pInputDevice->Release( pInputDevice ); pDirectFb->Release( pDirectFb ); return -1; } printf( "CreateSurface OK\n"); /* get surface size */ Result = pPrimarySurface->GetSize(pPrimarySurface, &nScreenWidth, &nScreenHeight); if ( Result != DFB_OK ) { printf( "Get Screen Size Fail!\n"); pEventBuffer->Release( pEventBuffer ); pInputDevice->Release( pInputDevice ); pPrimarySurface->Release( pPrimarySurface ); pDirectFb->Release( pDirectFb ); return -1; } printf("Width: %d, Height: %d\n", nScreenWidth, nScreenHeight); /* clear surface */ Result = pPrimarySurface->FillRectangle (pPrimarySurface, 0, 0, nScreenWidth, nScreenHeight); if ( Result != DFB_OK ) { printf( "FillRectangle to clear surface Fail!\n"); pEventBuffer->Release( pEventBuffer ); pInputDevice->Release( pInputDevice ); pPrimarySurface->Release( pPrimarySurface ); pDirectFb->Release( pDirectFb ); return -1; } printf( "FillRectangle to clear surface OK!\n"); if ( bright_get(&Brightness) != 0 ) { printf("Fail to bright_get()\n"); } else { printf("Brightness == %d\n", Brightness); } Brightness = 7; /* */ if( bright_set(Brightness) != 0 ) { printf("Fail to bright_set(0)\n"); } IsInLoop = 1; /* Start event loop */ while (IsInLoop) { if ( directfb_key_is_inputed( pEventBuffer, 100/*100ms MiliSecondWaitTimeout*/) == 0 ) { continue; } while ( directfb_key_get_code(pEventBuffer, &KeyCode, &IsReleased) == 0 ) { switch (KeyCode) { case KEY_ESC: printf("Key Code : KEY_ESC (0x%X)\n", KeyCode); break; case KEY_1: printf("Key code : KEY_1 (0x%X)\n", KeyCode); break; case KEY_2: printf("Key code : KEY_2 (0x%X)\n", KeyCode); break; case KEY_3: printf("Key code : KEY_3 (0x%X)\n", KeyCode); break; case KEY_4: printf("Key code : KEY_4 (0x%X)\n", KeyCode); break; case KEY_5: printf("Key code : KEY_5 (0x%X)\n", KeyCode); break; case KEY_6: printf("Key code : KEY_6 (0x%X)\n", KeyCode); break; case KEY_7: printf("Key code : KEY_7 (0x%X)\n", KeyCode); break; case KEY_8: printf("Key code : KEY_8 (0x%X)\n", KeyCode); break; case KEY_9: printf("Key code : KEY_9 (0x%X)\n", KeyCode); break; case KEY_0: printf("Key code : KEY_0 (0x%X)\n", KeyCode); break; case KEY_BACKSPACE: printf("Key code : KEY_BACKSPACE (0x%X)\n", KeyCode); break; case KEY_ENTER: printf("Key code : KEY_ENTER (0x%X)\n", KeyCode); if ( IsReleased == 1 ) { /* Key Released */ IsInLoop = 0; /* Exit */ } break; case KEY_F1: printf("Key code : KEY_F1 (0x%X)\n", KeyCode); if ( IsReleased == 1 ) { IDirectFBSurface * pImageSurface; /* Image surface */ IDirectFBImageProvider *pImageProvider; /* */ /* Create image provider */ if ( pDirectFb->CreateImageProvider( pDirectFb, TEST_IMAGE_FILE_1, &pImageProvider ) == DFB_OK ) { printf("CreateImageProvider : open %s\n", TEST_IMAGE_FILE_1); pImageProvider->GetSurfaceDescription(pImageProvider, &SurfaceDescription); if ( pDirectFb->CreateSurface(pDirectFb, &SurfaceDescription, &pImageSurface) == DFB_OK ) { printf("CreateSurface : OK to creat Image Surface\n"); if ( pImageProvider->RenderTo(pImageProvider, pImageSurface, NULL) == DFB_OK ) { printf("RenderTo : OK to rander Pmage provider to Image Surface\n"); if ( pPrimarySurface->Blit(pPrimarySurface, pImageSurface, NULL, 0, 0) == DFB_OK ) { printf("Blit : OK to copy Image Surface to Screen Surface\n"); if ( pPrimarySurface->Flip(pPrimarySurface, NULL, 0) == DFB_OK ) { printf("Update Surface OK\n"); } else { printf("Update(Flip) Fail!\n"); } } else { printf("Blit : fail to copy Image Surface to Screen Surface\n"); } } else { printf("RenderTo : fail to rander Pmage provider to Image Surface\n"); } pImageSurface->Release( pImageSurface ); } else { printf("CreateSurface : fail to creat Image Surface\n"); } pImageProvider->Release( pImageProvider ); } else { printf("CreateImageProvider : Faile to open %s\n", TEST_IMAGE_FILE_1); } } break; case KEY_F2: printf("Key code : KEY_F2 (0x%X)\n", KeyCode); if ( IsReleased == 1 ) { IDirectFBSurface * pImageSurface; /* Image surface */ IDirectFBImageProvider *pImageProvider; /* */ /* Create image provider */ if ( pDirectFb->CreateImageProvider( pDirectFb, TEST_IMAGE_FILE_2, &pImageProvider ) == DFB_OK ) { printf("CreateImageProvider : open %s\n", TEST_IMAGE_FILE_2); pImageProvider->GetSurfaceDescription(pImageProvider, &SurfaceDescription); if ( pDirectFb->CreateSurface(pDirectFb, &SurfaceDescription, &pImageSurface) == DFB_OK ) { printf("CreateSurface : OK to creat Image Surface\n"); if ( pImageProvider->RenderTo(pImageProvider, pImageSurface, NULL) == DFB_OK ) { printf("RenderTo : OK to rander Pmage provider to Image Surface\n"); if ( pPrimarySurface->Blit(pPrimarySurface, pImageSurface, NULL, 0, 0) == DFB_OK ) { printf("Blit : OK to copy Image Surface to Screen Surface\n"); if ( pPrimarySurface->Flip(pPrimarySurface, NULL, 0) == DFB_OK ) { printf("Update Surface OK\n"); } else { printf("Update(Flip) Fail!\n"); } } else { printf("Blit : fail to copy Image Surface to Screen Surface\n"); } } else { printf("RenderTo : fail to rander Pmage provider to Image Surface\n"); } pImageSurface->Release( pImageSurface ); } else { printf("CreateSurface : fail to creat Image Surface\n"); } pImageProvider->Release( pImageProvider ); } else { printf("CreateImageProvider : Faile to open %s\n", TEST_IMAGE_FILE_2); } } break; case KEY_F3: printf("Key code : KEY_F3 (0x%X)\n", KeyCode); if ( IsReleased == 1 ) { /* Key Released */ if ( pPrimarySurface->SetColor(pPrimarySurface, 0xFF/*B*/, 0x00/*G*/, 0x00/*R*/, 0xFF/*A*/) == DFB_OK ) { /* set surface color -> Blue */ printf( "SetColor OK!\n"); /* draw rectangle */ printf("Draw Rectangle\n"); if ( pPrimarySurface->FillRectangle (pPrimarySurface, 100/*x*/, 100/*y*/, 40/*w*/, 80/*h*/) == DFB_OK ) { printf( "FillRectangle OK!\n"); /* update surface */ printf("Update Surface\n"); if ( pPrimarySurface->Flip(pPrimarySurface, NULL, 0) == DFB_OK ) { printf("Update Surface OK\n"); } else { printf("Update(Flip) Fail!\n"); } } else { printf( "FillRectangle Fail!\n"); } } else { printf( "SetColor Fail!\n"); } } break; case KEY_F4: printf("Key code : KEY_F4 (0x%X)\n", KeyCode); if ( IsReleased == 1 ) { /* Key Released */ /* clear surface */ if ( pPrimarySurface->SetColor(pPrimarySurface, 0x00/*B*/, 0x00/*G*/, 0x00/*R*/, 0xFF/*A*/) == DFB_OK ) { /* set surface color -> Blue */ printf( "SetColor to clear surface OK!\n"); /* draw rectangle */ printf("Draw Rectangle to clear surface \n"); if ( pPrimarySurface->FillRectangle (pPrimarySurface, 0, 0, nScreenWidth, nScreenHeight) == DFB_OK ) { printf( "FillRectangle to clear surface OK!\n"); /* update surface */ printf("Update Surface to clear surface \n"); if ( pPrimarySurface->Flip(pPrimarySurface, NULL, 0) == DFB_OK ) { printf("Update Surface to clear surface OK\n"); } else { printf("Update(Flip) to clear surface Fail!\n"); } } else { printf("FillRectangle to clear surface Fail!\n"); } } else { printf("SetColor to clear surface Fail!\n"); } } break; case KEY_F5: printf("Key code : KEY_F5 (0x%X)\n", KeyCode); if ( IsReleased == 1 ) { DFBFontDescription FontDescription; int FongHeight; FontDescription.flags = DFDESC_HEIGHT | DFDESC_ATTRIBUTES; FontDescription.height = 22; FontDescription.attributes = DFFA_MONOCHROME; // DFFA_NONE if ( pDirectFb->CreateFont( pDirectFb, TEST_FONT_FILE, &FontDescription, &pFont ) == DFB_OK ) { printf("CreateFont : OK - %s\n", TEST_FONT_FILE); pFont->GetHeight( pFont, &FongHeight ); if ( pPrimarySurface->SetFont( pPrimarySurface, pFont ) == DFB_OK ) { printf("SetFont OK\n"); if ( pPrimarySurface->SetColor( pPrimarySurface, 0xA0, 0xA0, 0xA0, 0xFF ) == DFB_OK ) { printf("SetColor(Font Color) OK\n"); if ( pPrimarySurface->DrawString( pPrimarySurface, TEST_DISPLAY_STRING, -1/*Bytes*/, 100/*X*/, 100/*Y*/, DSTF_CENTER/*Flasg*/ ) == DFB_OK ) /* Flasg DSTF_NONE DSTF_LEFT DSTF_CENTER DSTF_RIGHT DSTF_TOP DSTF_BOTTOM DSTF_OUTLINE DSTF_BLEND_FUNCS DSTF_TOPLEFT DSTF_TOPCENTER DSTF_TOPRIGHT DSTF_BOTTOMLEFT DSTF_BOTTOMCENTER DSTF_BOTTOMRIGHT */ { printf("DrawString OK\n"); /* update surface */ printf("Update Surface to show string \n"); if ( pPrimarySurface->Flip(pPrimarySurface, NULL, 0) == DFB_OK ) { printf("Update Surface to show string OK\n"); } else { printf("Update(Flip) to show string Fail!\n"); } } else { printf("DrawString Fail\n"); } } else { printf("SetColor(Font Color) Fail\n"); } } else { printf("SetFont Fail\n"); } pFont->Release( pFont ); } else { printf("CreateFont Fail!\n"); } } break; case KEY_F6: printf("Key code : KEY_F6 (0x%X)\n", KeyCode); if ( IsReleased == 1 ) { /* Key Released */ if( Brightness != 7 ) { Brightness ++; if( bright_set(Brightness) != 0 ) { printf("Fail to bright_set\n"); } printf("bright -\n"); } } break; case KEY_F7: printf("Key code : KEY_F7 (0x%X)\n", KeyCode); if ( IsReleased == 1 ) { /* Key Released */ if( Brightness != 0 ) { Brightness --; if( bright_set(Brightness) != 0 ) { printf("Fail to bright_set\n"); } printf("bright +\n"); } } break; default: break; } } } /* while (IsInLoop)*/ /* clean up */ pEventBuffer->Release( pEventBuffer ); pInputDevice->Release( pInputDevice ); pPrimarySurface->Release( pPrimarySurface ); pDirectFb->Release( pDirectFb ); return 0; }
make
/home/stephanos/VI/host/bin/arm-linux-gnueabihf-gcc -I/home/stephanos/VI/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/drm -I/home/stephanos/VI/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/directfb -L/home/stephanos/VI/host/arm-buildroot-linux-gnueabihf/sysroot -L/home/stephanos/VI/host/arm-buildroot-linux-gnueabihf/sysroot/lib -L/home/stephanos/VI/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib -o test-directfb test-directfb.c -ldrm -ldirectfb