한국어
Linux Programming
 

리눅스 프레임버퍼(Linux Frame Buffer)

makersweb 2015.02.15 21:23 조회 수 : 7430

Frame buffer는 임베디드 리눅스에서 그래픽을 표현하는 역할을 한다. 커널에서 확보되는 비디오 메모리내의 Framebuffer로 전달될 메모리 공간이다. 일반 PC에서는 Graphic Card라는 장치가 그래픽을 표현해주는 것과는 조금 다르다고 할 수 있다.

 

일반  PC -> Graphic Card

ARM등의 임베디드 장비 -> LCD Controller

 

Frame buffer 디바이스 드라이버는 하드웨어를 user level application에서 제어할 수 있도록 만들어진 디바이스드라이버이다. 화면 출력장치의 종류가 많고 환경도 다양하기 때문에 디바이스 드라이버로써 이식성을높이고 표준화된 인터페이스를 제공하기 위해 필요하다. Frame Buffer의 이용시 임베디드 장비에서 여러 장비에 대한 이식성이 향상되는 장점이 있다고 할 수 있다.

 

다음 소스는 프레임 버퍼 드라이버를 직접 오픈 하여 프레임 버퍼에 대한 핸들을 얻어내고, 프레임 버퍼에 대한 포인터를 얻어 내어 검정색으로 화면을 초기화하는 예제이다.

 

clearfb.c

#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <stdlib.h>

struct fb_var_screeninfo vinfo;

int
main(int argc, char *argv[])
{
    int fbfd, fbsize, i;
    unsigned char *fbbuf;

    /* 프레임버퍼 드라이버 열기 */
    if ((fbfd = open("/dev/fb0", O_RDWR)) < 0) {
        exit(1);
    }

    /* 디스플레이 정보 얻기 */
    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
        printf("Bad vscreeninfo ioctl\n");
        exit(2);
    }

    /* 프레임버퍼크기 =
       (X-resolution * Y-resolution * bytes per pixel) */
    fbsize = vinfo.xres*vinfo.yres*(vinfo.bits_per_pixel/8);

    /* 매모리맵핑 */
    if ((fbbuf = mmap(0, fbsize, PROT_READ|PROT_WRITE,
                      MAP_SHARED, fbfd, 0)) == (void *) -1){
        exit(3);
    }

    /* 화면 초기화 */
    for (i=0; i<fbsize; i++) {
        *(fbbuf+i) = 0x0;
    }
    munmap(fbbuf, fbsize);

    close(fbfd);
}


"/dev/fb*" 형태로 프레임 버퍼 드라이버를 오픈 하여 mmap() 함수를 사용하여 프레임 버퍼에 대한 직접적인 제어를 통해 LCD를 제어할 수 있도록 하고 있다.


프레임 버퍼 드라이버는 리눅스 시스템에서 사용자 레벨의 응용 프로그램에서 제어할 수 있도록 만들어진 디바이스 드라이버이다. 또한 위의 예제에서 볼 수 있듯이 open, mmap과 같은 표준 인터페이스 함수를 통해 이용할 수 있는 구조로 구성되었다.

 

K-20150215-766713.png

 

▲프레임 버퍼 드라이버의 동작 모습을 사용자의 응용 프로그램 관점에서 보여준다.

번호 제목 글쓴이 날짜 조회 수
24 Wayland에 대한 간단한 소개 file makersweb 2017.12.29 3384
23 NFS를 통해 파일시스템 공유 makersweb 2018.03.05 1135
22 Ubuntu Linux에서 dbus-c++바인딩 D-Bus 테스트 file makersweb 2018.03.07 7075
21 tslib 크로스 컴파일과 터치스크린 보정 makersweb 2018.08.02 2183
20 libblkid - USB Storage의 정보 가져오기 makersweb 2018.10.18 676
19 리눅스 컴파일러 최신으로 업데이트 linux 2018.12.26 1900
18 PATH에 새로운 경로 추가 makersweb 2019.09.19 401
17 플랫폼 디바이스 드라이버 개발 시 많이 사용되는 커널 API 및 매크로 makersweb 2020.01.28 4753
16 initramfs (initial ram file system: 초기 램 파일 시스템) makersweb 2020.02.25 2109
15 64비트 리눅스에서 32비트 응용프로그램을 실행하려면 makersweb 2020.02.29 1820
14 Weston 의 설명 및 관련 컴포넌트 makersweb 2020.06.03 2540
13 Wayland 의 주요 객체들 makersweb 2020.06.04 940
12 Wayland 의 Client Application 프로그래밍 기본 루틴 makersweb 2020.06.04 1704
11 wayland-scanner 를 통해 Wayland 프로토콜 코드생성 makersweb 2020.06.08 968
10 리눅스 오디오 스택과 아키텍처 file makersweb 2020.09.02 2929
9 dbus-broker를 기본 DBus 구현으로 설정 makersweb 2021.01.20 1244
8 SocketCAN 유틸 사용방법 file makersweb 2022.02.05 7261
7 ifconfig 는 대부분 ip 명령으로 대체 makersweb 2022.02.12 1650
6 D-Bus ObjectManager file makersweb 2022.02.12 669
5 리눅스에서 네트워크 구성 makersweb 2022.06.11 2929