直接访问linux framebuffer - copyarea

时间:2009-09-12 21:19:18

标签: linux embedded kernel framebuffer

我想在嵌入式Linux应用程序中快速移动一个矩形到帧缓冲区。我发现函数cfb_copyarea可能很有用。但我无法在/ dev / fb设备上找到任何ioctl来调用该函数。或者可以直接调用此函数吗?

3 个答案:

答案 0 :(得分:7)

这是一个初始化和关闭FrameBuffer

的代码
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);
}

};

答案 1 :(得分:2)

请注意,此代码并不完全正确,但它可以在许多Linux设备上运行,有些则不然。要计算帧缓冲区大小,请不要这样做:

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;

相反,这样做:

iFrameBufferSize = m_FixInfo.smem_len;

您的代码将更加便携。

答案 2 :(得分:1)

据我所知,经过几天的研究,没有ioctl来调用这个函数。我必须在内核模块中编写自己的系统调用。或者从内核源复制算法,并通过nmaped内存在用户空间中使用它。