2009-09-12 96 views
6

我想在嵌入式linux應用程序中通過framebuffer快速移動一個矩形。我發現功能cfb_copyarea可能會有用。但是我無法通過/ dev/fb設備找到任何調用該函數的ioctl。或者可以直接調用這個函數?直接訪問linux framebuffer - copyarea

回答

1

據我知道後研究了幾天,有一個調用這個函數沒有ioctl。我必須在內核模塊中編寫我自己的系統調用。或者從內核源複製算法,並通過nmaped內存在用戶空間中使用它。

7

這裏是初始化代碼並關閉幀緩衝

class CFrameBuffer 
{ 

void* m_FrameBuffer; 
struct fb_fix_screeninfo m_FixInfo; 
struct fb_var_screeninfo m_VarInfo; 
int  m_FBFD; 

int InitFB() 
{ 
    int iFrameBufferSize; 
    /* Open the framebuffer device in read write */ 
    m_FBFD = open(FB_NAME, O_RDWR); 
    if (m_FBFD < 0) { 
     printf("Unable to open %s.\n", FB_NAME); 
     return 1; 
    } 
    /* Do Ioctl. Retrieve fixed screen info. */ 
    if (ioctl(m_FBFD, FBIOGET_FSCREENINFO, &m_FixInfo) < 0) { 
     printf("get fixed screen info failed: %s\n", 
       strerror(errno)); 
     close(m_FBFD); 
     return 1; 
    } 
    /* Do Ioctl. Get the variable screen info. */ 
    if (ioctl(m_FBFD, FBIOGET_VSCREENINFO, &m_VarInfo) < 0) { 
     printf("Unable to retrieve variable screen info: %s\n", 
       strerror(errno)); 
     close(m_FBFD); 
     return 1; 
    } 

    /* Calculate the size to mmap */ 
    iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres; 
    printf("Line length %d\n", m_FixInfo.line_length); 
    /* Now mmap the framebuffer. */ 
    m_FrameBuffer = mmap(NULL, iFrameBufferSize, PROT_READ | PROT_WRITE, 
        MAP_SHARED, m_FBFD,0); 
    if (m_FrameBuffer == NULL) { 
     printf("mmap failed:\n"); 
     close(m_FBFD); 
     return 1; 
    } 
    return 0; 
} 

void CloseFB() 
{ 
    munmap(m_FrameBuffer,0); 
    close(m_FBFD); 
} 

}; 
+0

比你的答案。但這不是我要求的。我不想將像素自己移動到nmaped內存中 - 我想爲此使用內核函數cfb_copyarea。 – danatel 2009-09-13 15:02:36

+2

我喜歡這個答案。我在這裏創建了一個基於此的測試程序:https://gist.github.com/1482697 – 2011-12-15 20:23:30

+0

@RafalRusin,很高興,它幫助你。 – SunnyShah 2011-12-18 08:09:22

2

請注意,這段代碼並不完全正確,雖然它可以在許多Linux設備上工作,有些則不會。爲了計算幀緩衝區的大小,不這樣做:

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres; 

相反,這樣做:

iFrameBufferSize = m_FixInfo.smem_len; 

而且你的代碼會更加便攜。