안녕하세요~
아래 프로그램은 kelp의 holelee 님의 프레임 버퍼 강좌입니다.
저의 환경에 맞게 LCD에 24Bit컬러로 사용할려고 하는데...
아래에 16으로 된 부분만 24로 바꾸었는데 에러가 발생합니다.
리눅스 상에서 프로임 버퍼로 쓸려고 하는데 어떤부분이 잘못된 건지요?
고수님들의 조언을 부탁드립니다.
/*
* fbbmp.c : bmp drawing on frame buffer example
*
* Copyright(C) 2002 holelee
*
*/
#include <stdio.h>
#include <stdlib.h> /* for exit */
#include <unistd.h> /* for open/close .. */
#include <fcntl.h> /* for O_RDONLY */
#include <sys/ioctl.h> /* for ioctl */
#include <sys/mman.h> /* for mmap */
#include <linux/fb.h> /* for fb_var_screeninfo, FBIOGET_VSCREENINFO */
#include "bmplib.h"
#define MIN(x, y) ((x) > (y) ? (y) : (x))
#define FBDEVFILE "/dev/fb"
typedef unsigned char ubyte;
static unsigned short makepixel(struct fb_var_screeninfo *pfbvar, ubyte r, ubyte g, ubyte b)
{
unsigned short rnew, gnew, bnew;
rnew = r >> (8-pfbvar->red.length);
gnew = g >> (8-pfbvar->green.length);
bnew = b >> (8-pfbvar->blue.length);
return (unsigned short) ((rnew << pfbvar->red.offset)
| (gnew << pfbvar->green.offset)
| (bnew << pfbvar->blue.offset));
}
int main(int argc, char *argv[])
{
int fbfd;
unsigned short *pfbmap;
struct fb_var_screeninfo fbvar;
int i, j;
struct bgrpixel pixel;
bmphandle_t bh;
if(argc != 2)
{
fprintf(stderr, "Usage:%s bmpfilen", argv[0]);
exit(1);
}
bh = bmp_open(argv[1]);
if(bh == NULL)
{
fprintf(stderr, "Cannot open bmp file(%s)n", argv[1]);
fprintf(stderr, "File may be not bmp. Or file may be not supported by this programn");
exit(0);
}
fbfd = open(FBDEVFILE, O_RDWR);
if(fbfd < 0)
{
perror("fbdev open");
exit(1);
}
if(ioctl(fbfd, FBIOGET_VSCREENINFO, &fbvar) < 0)
{
perror("fbdev ioctl");
exit(1);
}
if(fbvar.bits_per_pixel != 16)
{
fprintf(stderr, "bpp is not 16n");
exit(1);
}
pfbmap = (unsigned short *)
mmap(0, fbvar.xres*fbvar.yres*24/8,
PROT_READ|PROT_WRITE, MAP_SHARED, fbfd, 0);
if((unsigned)pfbmap == (unsigned)-1)
{
perror("fbdev mmap");
exit(1);
}
/* main loop */
for(i = 0; i < MIN(bmp_height(bh), fbvar.yres); i++)
{
for(j = 0; j < MIN(bmp_width(bh), fbvar.xres); j++)
{
pixel = bmp_getpixel(bh, j, i);
*(pfbmap+i*fbvar.xres+j) = makepixel(&fbvar, pixel.r, pixel.g, pixel.b);
}
}
/* clean up */
bmp_close(bh);
munmap(pfbmap, fbvar.xres*fbvar.yres*24/8);
close(fbfd);
exit(0);
return 0;
}
해서 그 부분에 알맞게 app를 사용하셔야 합니다.
16bpp로 고정하는 이유는 성능때문입니다. 24bpp면 로드가 많이
걸리거든요.