2014-04-07 2 views
0

나는 안드로이드 4.2.2와 뿌리깊은 전화를했습니다. 부트 로더 코드에 minui API (소스 here)를 사용하여 화면에 내용을 그려 보겠습니다. minui는 기본 OpenGL보다 훨씬 간단하며 OpenGL에서 제공하는 복잡한 기능을 필요로하지 않습니다.안드로이드에서 직접 프레임 버퍼에 쓰기

문제는 내가 직접 fb0 기기에 내용을 쓸 수 없다는 것입니다. FBIOPUT_VSCREENINFO 알 수없는 이유로 실패합니다.

어떻게 안드로이드에서 fb0으로 직접 그릴 수 있습니까? 아니면 minui을 부트 로더 모드 외부에서 사용할 수 있습니까?

답변

1

장치 노드 :는/dev/그래픽/FB0

당신이 안드로이드 나무로 만들거나 팔 - 리눅스 GCC를 사용할 수 있습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <linux/fb.h> 
#include <sys/mman.h> 
struct fb_fix_screeninfo FixedInfo; 
struct fb_var_screeninfo OrigVarInfo; 
static int FrameBufferFD = -1; 
void *FrameBuffer = (void *) -1; 

#ifndef __ANDROID__ 
#define FRAMEBUFFER "/dev/fb0" 
#else 
#define FRAMEBUFFER "/dev/graphics/fb0" 
#endif //__ANDROID__ 

void openFBDEV(void) 
{ 
    /* open the framebuffer device */ 
    FrameBufferFD = open(FRAMEBUFFER, O_RDWR); 
    if (FrameBufferFD < 0) 
    { 
     fprintf(stderr, "Error opening %s\n", FRAMEBUFFER); 
     exit(1); 
    } 
    /* Get the fixed screen info */ 
    if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo)) 
    { 
     fprintf(stderr, "error: ioctl(FBIOGET_FSCREENINFO) failed\n"); 
     exit(1); 
    } 
    /* get the variable screen info */ 
    if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &OrigVarInfo)) 
    { 
     fprintf(stderr, "error: ioctl(FBIOGET_VSCREENINFO) failed\n"); 
     exit(1); 
    } 

    if (FixedInfo.visual != FB_VISUAL_TRUECOLOR 
      && FixedInfo.visual != FB_VISUAL_DIRECTCOLOR) 
    { 
     fprintf(stderr, 
       "non-TRUE/DIRECT-COLOR visuals (0x%x) not supported by this demo.\n", 
       FixedInfo.visual); 
     exit(1); 
    } 
    /* 
    * fbdev says the frame buffer is at offset zero, and the mmio region 
    * is immediately after. 
    */ 
    /* mmap the framebuffer into our address space */ 
    FrameBuffer = (void *) mmap(0, /* start */ 
    FixedInfo.smem_len, /* bytes */ 
    PROT_READ | PROT_WRITE, /* prot */ 
    MAP_SHARED, /* flags */ 
    FrameBufferFD, /* fd */ 
    0 /* offset */); 
    if (FrameBuffer == (void *) -1) 
    { 
     fprintf(stderr, "error: unable to mmap framebuffer\n"); 
     exit(1); 
    } 
} 
void closeFBDEV(void) 
{ 
    munmap(FrameBuffer, FixedInfo.smem_len); 
    close(FrameBufferFD); 
} 
int main() 
{ 
    openFBDEV(); 
    fprintf(stderr, "openFBDEV finish\n"); 
    memset(FrameBuffer, 128, FixedInfo.smem_len); 
    sleep(5); 
    closeFBDEV(); 
    fprintf(stderr, "closeFBDEV finish\n"); 
    return 0; 
} 
:
arm-linux-gcc -D__ANDROID__ fb-test.c -static 

는 일반 임베디드 리눅스를 좋아하는, 샘플이
관련 문제