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과 같은 표준 인터페이스 함수를 통해 이용할 수 있는 구조로 구성되었다.
▲프레임 버퍼 드라이버의 동작 모습을 사용자의 응용 프로그램 관점에서 보여준다.
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
45 | mmap() 함수, munmap() 함수 | pjk | 2014.02.05 | 16741 |
44 | 6. Makefile 작성의 가이드라인 | pjk | 2014.02.05 | 2978 |
43 | 5. make 중요 옵션 정리 | pjk | 2014.02.05 | 3096 |
42 | 4. Makefile를 작성할 때 알면 좋은 것들 | pjk | 2014.02.05 | 3720 |
41 | 3. 매크로(Macro) 와 확장자(Suffix) 규칙 | pjk | 2014.02.05 | 3216 |
40 | 2. 간단한 Makefile | pjk | 2014.02.05 | 3158 |
39 | 1. make | pjk | 2014.02.05 | 2754 |
38 | 키패드 드라이버 | pjk | 2014.02.12 | 7227 |
37 | ioctl() 함수 | makersweb | 2014.02.27 | 15202 |
36 | file_operations | makersweb | 2014.02.27 | 3905 |
35 | 리눅스 디렉터리 구조 | makersweb | 2014.02.28 | 3871 |
34 | read() 함수, write() 함수 | makersweb | 2014.03.04 | 12057 |
33 | 리눅스 커널 소스코드 구성도 | makersweb | 2014.03.04 | 6162 |
32 | 디바이스 드라이버에 대해서 | makersweb | 2014.04.19 | 4816 |
31 | 리눅스 데스크탑 환경 종류 | pjk | 2015.02.11 | 5277 |
» | 리눅스 프레임버퍼(Linux Frame Buffer) | makersweb | 2015.02.15 | 8400 |
29 | [IPC]D-Bus 소개 | makersweb | 2015.02.28 | 30505 |
28 | Build Qt 4.7.0 for Embedded Linux | makersweb | 2015.05.25 | 6080 |
27 | UVC 장치를 사용할때 v4l2: select timeout 에러 발생 | makersweb | 2017.12.27 | 3084 |
26 | Ubuntu16.04에서 weston구동 | makersweb | 2017.12.28 | 1725 |