Я хочу очень быстро переместить прямоугольник по кадровому буферу во встроенном приложении Linux. Я обнаружил, что функция cfb_copyarea
может быть полезной. Но я не могу найти какой-либо ioctl через устройство /dev/fb для вызова функции. Или эту функцию можно вызвать напрямую?
Прямой доступ к фреймбуферу linux — copyarea
Ответы (3)
Вот код для инициализации и закрытия 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);
}
};
person
SunnyShah
schedule
13.09.2009
Чем вам за ваш ответ. Но это не то, о чем я просил. Я не хочу сам перемещать пиксели в nmaped памяти — я хочу использовать для этого функцию ядра cfb_copyarea.
- person danatel; 13.09.2009
Мне нравится этот ответ. Я создал тестовую программу на основе этого здесь: gist.github.com/1482697
- person Rafal Rusin; 16.12.2011
@RafalRusin, рад, что это помогло вам.
- person SunnyShah; 18.12.2011
@RafalRusin: Спасибо, что поделились программой. Мне это очень поможет. :)
- person Anoop K. Prabhu; 29.04.2012
Обратите внимание, что этот код не совсем правильный, хотя он будет работать на многих Linux-устройствах, на некоторых — нет. Чтобы вычислить размер фреймбуфера, не делайте этого:
iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;
Вместо этого сделайте следующее:
iFrameBufferSize = m_FixInfo.smem_len;
И ваш код будет более переносимым.
person
ACT
schedule
28.12.2010
Насколько я знаю после нескольких дней исследований, нет ioctl для вызова этой функции. Я должен написать свой собственный системный вызов предпочтительно в модуле ядра. Или скопируйте алгоритм из исходников ядра и используйте его в пользовательском пространстве через память nmaped.
person
danatel
schedule
15.09.2009