代码之家  ›  专栏  ›  技术社区  ›  danatel

直接访问Linux帧缓冲区-复制区

  •  6
  • danatel  · 技术社区  · 16 年前

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

    3 回复  |  直到 8 年前
        1
  •  7
  •   Tim Cooper    8 年前

    下面是初始化和关闭帧缓冲区的代码

    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);
    }
    
    };
    
        2
  •  2
  •   sth    15 年前

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

    iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;
    

    相反,请执行以下操作:

    iFrameBufferSize = m_FixInfo.smem_len;
    

    您的代码将更易于移植。

        3
  •  1
  •   danatel    16 年前

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