直接访问linux framebuffer - copyarea

Posted

技术标签:

【中文标题】直接访问linux framebuffer - copyarea【英文标题】:Direct access to linux framebuffer - copyarea 【发布时间】:2009-09-12 21:19:17 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这里是初始化和关闭 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);


;

【讨论】:

谢谢你的回答。但这不是我要求的。我不想自己在 nmaped 内存中移动像素 - 我想为此使用内核函数 cfb_copyarea。 我喜欢这个答案。我在这里创建了一个基于此的测试程序:gist.github.com/1482697 @RafalRusin,很高兴,它帮助了你。 @RafalRusin:感谢分享程序。这对我会有很大帮助。 :)【参考方案2】:

请注意,这段代码并不完全正确,尽管它可以在许多 linux 设备上运行,但在某些设备上却不能。要计算帧缓冲区大小,请不要这样做:

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;

相反,这样做:

iFrameBufferSize = m_FixInfo.smem_len;

而且您的代码将更加便携。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于直接访问linux framebuffer - copyarea的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 基本的linux framebuffer图形设置

linux下framebuffer显示图形的基本思想是啥

linux驱动之framebuffer

Linux驱动框架之framebuffer驱动框架

Linux framebuffer显示bmp图片

提取bmp图片的颜色信息,可直接framebuffer显示