2009-09-12 18 views
6

組み込みLinuxアプリケーションで、フレームバッファ上で非常に速く矩形を移動したいと考えています。私は、関数cfb_copyareaが役に立つかもしれないことを発見しました。しかし、関数を呼び出すために/ dev/fbデバイス上にioctlを見つけることはできません。または、この関数を直接呼び出すことはできますか?ここでlinuxフレームバッファへの直接アクセス - コピーエリア

答えて

1

である限り、私は研究の数日後に知っているように、この関数を呼び出すためのioctlはありません。私は自分のシステムコールを優先的にカーネルモジュールに書く必要があります。あるいは、カーネルソースからアルゴリズムをコピーし、nmapされたメモリを介してユーザ空間で使用します。

7

はinitと近いフレームバッファへのコード

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

+2

私はこの答えが好きです。私はここに基づいてテストプログラムを作成しました:https://gist.github.com/1482697 –

+0

@RafalRusin、喜んで、それはあなたを助けました。 – SunnyShah

2

このコードは、多くのLinuxデバイスでは動作しますが、まったく正しいわけではないことに注意してください。 、代わりに

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres; 

この操作を行います:フレームバッファのサイズを計算するには、これをしない

iFrameBufferSize = m_FixInfo.smem_len; 

をそして、あなたのコードの移植になります。

関連する問題