我想在嵌入式 linux 应用程序的帧缓冲区上快速移动一个矩形。我发现该功能cfb_copyarea
可能很有用。但是我在 /dev/fb 设备上找不到任何 ioctl 来调用该函数。或者可以直接调用这个函数吗?
问问题
8402 次
3 回答
9
这是初始化和关闭 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);
}
};
于 2009-09-13T11:24:59.463 回答
3
请注意,此代码并不完全正确,尽管它可以在许多 linux 设备上运行,但在某些设备上则不能。要计算帧缓冲区大小,请不要这样做:
iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;
相反,请执行以下操作:
iFrameBufferSize = m_FixInfo.smem_len;
而且您的代码将更具可移植性。
于 2010-12-28T19:52:44.887 回答
1
据我经过几天的研究知道,没有 ioctl 可以调用这个函数。我必须最好在内核模块中编写自己的系统调用。或者从内核源代码复制算法并通过 nmaped 内存在用户空间中使用它。
于 2009-09-15T10:31:49.507 回答