我想在embedded式linux应用程序中通过framebuffer快速移动一个矩形。 我发现函数cfb_copyarea
可能是有用的。 但是我无法通过/ dev / fb设备find任何调用该函数的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设备上运行,有些则不会。 要计算帧缓冲区大小,请不要这样做:
iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;
相反,这样做:
iFrameBufferSize = m_FixInfo.smem_len;
而你的代码将更加便携。
据我所知,经过几天的调查研究,没有调用这个函数的ioctl。 我必须在内核模块中编写我自己的系统调用。 或者从内核源文件复制算法,并通过nmaped内存在用户空间中使用它。