한국어
Embedded

Embedded Linux Frame Buffer

makersweb 2015.02.15 21:23 조회 수 : 3667

 

Embedded Linux Frame Buffer

 

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

 

일반  PC -> Graphic Card

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

 

Frame buffer 디바이스 드라이버는 하드웨어를 user level application에서 제어할 수 있도록 만들어진 디바이스드라이버이다.

표시장치의 종류가 많고 환경도 다양하기 때문에 디바이스 드라이버로써 이식성을높이고 표준화된 인터페이스를 제공하기 위해

필요하다. Frame Buffer의 이용시 임베디드 장비에서 여러 장비에 대한 이식성이 향상되는 장점이 있다고 할 수 있다.

 

다음 소스는 프레임 버퍼 드라이버를 직접 오픈 하여 프레임 버퍼에 대한 핸들을 얻어내고, 프레임 버퍼에 대한 포인터를 얻어 내어 RGB 이미지 데이터를 직접 출력하는 소스의 일부분이다.

 

 int fbfd;

fbfd = open("/dev/fb0", O_RDWR);
// 플레임 버퍼 드라이버 오픈
pfbmap = (unsigned short *)
mmap(0, COLS*ROWS*2,PROT_READ|PROT_ WRITE, MAP_SHARED, fbfd, 0);

if((unsigned)pfbmap == (unsigned)-1)
{
    perror("fbdev mmap");
    exit(1);
}

//중략

for(j=0;j<rows;j++)
{
    k = j*cols*3;
    for(i=0;i<cols;i++)
    {
        b = *(data + (k + i*3));
        g = *(data + (k + i*3+1));
        r = *(data + (k + i*3+2));
        pixel = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
        bmpdata1[(rows-1-j)+120*0][i+160*0] = pixel;
    }
}


"/dev/fb*" 형태로 프레임 버퍼 드라이버를 오픈 하여 mmap() 함수를 사용하여 프레임 버퍼에 대한 직접적인 제어를 통해 LCD를 제어할 수 있도록 하고 있다.
프레임 버퍼 드라이버는 리눅스 시스템에서 사용자 레벨의 응용 프로그램에서 제어할 수 있도록 만들어진 디바이스 드라이버이다. 또한 위의 예제에서 볼 수 있듯이 open, mmap과 같은 표준 인터페이스 함수를 통해 이용할 수 있는 구조로 구성되었다.

 

K-20150215-766713.png

 

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