Linux Framebuffer - Copyarea에 직접 액세스 할 수 있습니다
-
06-07-2019 - |
문제
임베디드 리눅스 애플리케이션에서 프레임 버퍼 위의 사각형을 매우 빠르게 움직이고 싶습니다. 나는 그 기능을 발견했다 cfb_copyarea
유용 할 수 있습니다. 그러나 /dev /fb 장치에서 IOCTL을 찾을 수는 없습니다. 아니면이 기능을 직접 호출 할 수 있습니까?
해결책 3
며칠간의 연구 후에 아는 한,이 기능을 호출 할 IOCTL은 없습니다. 커널 모듈에 내 자신의 시스템 호출을 선호하는 것을 써야합니다. 또는 알고리즘을 Kernel 소스에서 복사하여 Nmaped 메모리를 통해 사용자 공간에서 사용하십시오.
다른 팁
다음은 프레임 버퍼를 초기화하고 닫는 코드입니다
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;
코드가 더 휴대가 가능합니다.
제휴하지 않습니다 StackOverflow