linux - 直接访问 linux framebuffer - copyarea

标签 linux embedded kernel framebuffer

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

最佳答案

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

};

关于linux - 直接访问 linux framebuffer - copyarea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1416166/

相关文章:

c++ - linux mq_open 忽略 mq_msgsize 属性

linux - 使用 ifconfig 更改网络接口(interface)的 MAC 地址如何影响未处于混杂模式的 NIC?

linux - 在 Linux 中通过移位查找给定虚拟地址的页表条目

linux - 从 CloudFormation::Init 命令重新启动

linux - Linux文件系统的父子关系

c++ - C++ 11-修改结构 vector 中的结构成员

c++ - 优化C++中的成员变量顺序

c - 用于设置和清除位的宏

我们可以在内核中打开文件之前检查文件的读写权限吗

c - 在 C 中使用 "volatile"有害吗?