From: <chr...@ph...> - 2001-10-29 12:42:15
|
Hello, Your driver uses PSEUDOCOLOR, so it uses a palette. You have to store the colors (red, green, blue) in your palette (usually palette contains 256 colors=2^8 ) and then to store the color number (a byte) in the framebuffer memory. For using a such palette, look at fbtest.c below (written by James Simmons AFAIK) Hope it will help you... Cut here: ------------------------------------ /* * fbtest.c * * build: gcc fbtest.c -o fbtest */ #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <linux/fb.h> #include <sys/ioctl.h> #include <sys/mman.h> int init(void); void clear(void); int setrgb(int, int, int, int); unsigned char *vmem; int fd = -1; int buffer_size; static u_int16_t red[256], blue[256], green[256], transp[256]; static struct fb_cmap pal; int init(void) { struct fb_var_screeninfo info; if ((fd = open("/dev/fb0", O_RDWR)) == -1) { fprintf(stderr, "cannot open framebuffer device (%s)\n", strerror(errno)); return -1; } if (ioctl(fd, FBIOGET_VSCREENINFO, &info)) { fprintf(stderr, "ioctl failed on framebuffer device (%s)\n", strerror(errno)); close(fd); return -1; } /* we're only going to try 8-bit pixels: */ if (info.bits_per_pixel == 8) buffer_size = info.xres * info.yres; else { fprintf(stderr, "we don't do % bits per pixel mode\n", info.bits_per_pixel); close(fd); return -1; } if ((vmem = mmap(NULL, buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) { fprintf(stderr, "cannot mmap() framebuffer device (%s)\n", strerror(errno)); close(fd); return -1; } pal.start = 0; pal.len = 256; pal.red = red; pal.green = green; pal.blue = blue; pal.transp = transp; if (ioctl(fd, FBIOGETCMAP, &pal)) { fprintf(stderr, "couldn't get cmap\n"); close(fd); return -1; } return 0; } void clear(void) { memset(vmem, 0, buffer_size); } int setrgb(int n, int r, int g, int b) { pal.red[n] = r << 8; pal.green[n] = g << 8; pal.blue[n] = b << 8; pal.transp[n] = 0; return ioctl(fd, FBIOPUTCMAP, &pal); } int main(int argc, char **argv) { if (!init()) { setrgb(0, 255, 0, 0); clear(); } return 0; } ------------------------------------------ hi i'm new to framebuffer development. i want to write a small library for my embedded system(MPC823L) with a lcd(SHARP LQ64D341). i use the framebufferdriver(lcd823.c) from the denx.de kernel tree. my problem now is to get control over the colors. i use this to open the framebuffer: int fbfd = 0; long int screensize = 0; unsigned char *fbp = 0; struct fb_fix_screeninfo finfo; struct fb_var_screeninfo vinfo; ... fbfd = open("/dev/fb", O_RDWR); if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; fbp = (unsigned char*)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); to set a pixel i use something like this: setPixel(int x, int y, int color){ long int location; location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y+vinfo.yoffset) * finfo.line_length; *(fbp + location) = color; } } but what is the structure of the var color(should the type be unsigned char?)? what is red, green and blue? i know that the driver uses pseudocolor and 8bit per pixel. thanks for helping stefan |