문제

임베디드 리눅스 애플리케이션에서 프레임 버퍼 위의 사각형을 매우 빠르게 움직이고 싶습니다. 나는 그 기능을 발견했다 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;

코드가 더 휴대가 가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top