heyi0201 发表于 2008-4-11 12:27:36

求助,framebuffer问题

小弟初学framebuffer,想要画直线,找了网上一段程序,只能画出横线,其他线显示的都是一堆点,分析了好久都找不出问题,拜托各位帮助!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/page.h>
#include <linux/fb.h>
#define TRUE    1
#define FALSE   0
#define MIN(x,y)      ((x)>(y)?(y):(x))
#define MAX(x,y)      ((x)>(y)?(x):(y))
typedef struct fbdev{
      int fb;
      unsigned long fb_mem_offset;
      unsigned long fb_mem;
      struct fb_fix_screeninfo fb_fix;
      struct fb_var_screeninfo fb_var;
      char dev;
} FBDEV, *PFBDEV;
typedef struct point{
      int x;
      int y;
      int z;
} POINT, *PPOINT;

void draw_dot (PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g, uint8_t b);
void draw_line(PFBDEV pFbdev, POINT p1, POINT p2, uint8_t r, uint8_t g, uint8_t b);

int fb_open(PFBDEV pFbdev)
{
      pFbdev->fb = open(pFbdev->dev, O_RDWR);
      if(pFbdev->fb < 0)
      {
                printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
                return FALSE;
      }
      if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
      {
                printf("ioctl FBIOGET_VSCREENINFO\n");
                return FALSE;
      }
      if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
      {
                printf("ioctl FBIOGET_FSCREENINFO\n");
                return FALSE;
      }
      pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
      pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len +
                        pFbdev->fb_mem_offset,
                        PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
      if (-1L == (long) pFbdev->fb_mem)
      {
                printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
                              pFbdev->fb_mem_offset);
                return FALSE;
      }
/*
      printf("depth(bits per pixel) =%d\n",fb.fb_var.bits_per_pixel);
      printf("smemlen = %d\n",fb.fb_fix.smem_len);
      printf("fix_line(in byte) = %d\n",fb.fb_fix.line_length);
*/
      return TRUE;
}
void fb_close(PFBDEV pFbdev)
{
      close(pFbdev->fb);
      pFbdev->fb=-1;
}
void fb_memcpy(void *addr, void *color, size_t len)
{
      memcpy(addr, color, len);
}
void draw_dot (PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g, uint8_t b)
{
      uint32_t offset;
      uint8_t color;
      color = b;
      color = g;
      color = r;
      color = 0x0;
      offset = p.y*pFbdev->fb_fix.line_length+4*p.x;
      fb_memcpy((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset), color, 4);
}
void draw_line(PFBDEV pFbdev, POINT p1, POINT p2, uint8_t r, uint8_t g, uint8_t b)
{
      POINT p;
      int x,y;
      for( x=MIN(p1.x,p2.x); x<=MAX(p1.x,p2.x); x++ )
      {
                y = (p2.y-p1.y)*(x-p1.x)/(p2.x-p1.x) + p1.y;
                p.x = x;
                p.y = y;
                draw_dot(pFbdev, p, r, g, b);
      }
}

int main(void)
{
      FBDEV fb;
      memset(&fb, 0, sizeof(FBDEV));
      strcpy(fb.dev, "/dev/fb0");
      if(fb_open(&fb)==FALSE)
      {
                printf("open frame buffer error\n");
                return 0;
      }
      POINT p1, p2;
      p1.x = 300;
      p1.y = 450;
      p2.x = 600;
      p2.y = 450;
      draw_line( &fb, p1, p2, 0xff, 0x0, 0x0 );
      
      fb_close(&fb);
      return 0;
}

heyi0201 发表于 2008-4-11 15:54:14

求求各位老大了,帮帮忙!

heyi0201 发表于 2008-4-17 11:29:29

分辨率问题......
页: [1]
查看完整版本: 求助,framebuffer问题