文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Framebuffer简单测试程序

Framebuffer简单测试程序

时间:2007-03-17  来源:kf701

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <string.h>
     4  #include <stdint.h>
     5  #include <unistd.h>
     6  #include <fcntl.h>
     7  #include <sys/ioctl.h>
     8  #include <sys/mman.h>
     9  #include <asm/page.h>
    10  #include <linux/fb.h>
    11
    12  #define TRUE    1
    13  #define FALSE   2
    14
    15  //a framebuffer device structure;
    16  typedef struct fbdev{
    17      int fb;
    18      unsigned long fb_mem_offset;
    19      unsigned long fb_mem;
    20      struct fb_fix_screeninfo fb_fix;
    21      struct fb_var_screeninfo fb_var;
    22      char dev[20];
    23  } FBDEV, *PFBDEV;
    24
    25  int fb_open(PFBDEV pFbdev)
    26  {
    27      pFbdev->fb = open(pFbdev->dev, O_RDWR);
    28      if(pFbdev->fb < 0)
    29      {
    30          printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
    31          return FALSE;
    32      }
    33      if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
    34      {
    35          printf("ioctl FBIOGET_VSCREENINFO\n");
    36          return FALSE;
    37      }
    38      if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
    39      {
    40          printf("ioctl FBIOGET_FSCREENINFO\n");
    41          return FALSE;
    42      }
    43
    44      //map physics address to virtual address
    45      pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
    46      pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len +
    47              pFbdev->fb_mem_offset,
    48              PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
    49      if (-1L == (long) pFbdev->fb_mem)
    50      {
    51          printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
    52                  pFbdev->fb_mem_offset);
    53          return FALSE;
    54      }
    55
    56      return TRUE;
    57  }
    58
    59  void fb_close(PFBDEV pFbdev)
    60  {
    61      close(pFbdev->fb);
    62      pFbdev->fb=-1;
    63  }
    64
    65  void fb_memset (void *addr, int c, size_t len)
    66  {
    67      memset(addr, c, len);
    68  }
    69
    70  void draw_dot (PFBDEV pFbdev, uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b)
    71  {
    72      unsigned int offset;
    73      if (-1L == (long) pFbdev->fb_mem)
    74      {
    75          printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
    76                  pFbdev->fb_mem_offset);
    77          return;
    78      }
    79      offset = y*pFbdev->fb_fix.line_length+4*x;
    80      fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset), b, 1);
    81      fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 1), g, 1);
    82      fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 2), r, 1);
    83      fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 3), 0x00, 1);
    84  }
    85
    86
    87  int main(void)
    88  {
    89      FBDEV fb;
    90      memset(&fb, 0, sizeof(FBDEV));
    91      strcpy(fb.dev, "/dev/fb0");
    92      if(fb_open(&fb)==FALSE)
    93      {
    94          printf("open frame buffer error\n");
    95          return 0;
    96      }
    97
    98      printf("depth(bits per pixel) =  %d\n",fb.fb_var.bits_per_pixel);
    99      printf("smemlen = %d\n",fb.fb_fix.smem_len);
   100      printf("fix_line(in byte) = %d\n",fb.fb_fix.line_length);
   101
   102      int i,j;
   103      for(i=100; i<300; ++i)
   104              for(j = 80;j<100;++j)
   105              {
   106                      draw_dot(&fb,i,j,0xff,0x00,0x0);
   107              }
   108
   109      fb_close(&fb);
   110      return 0;
   111  }
相关阅读 更多 +
排行榜 更多 +
兵人放置战争

兵人放置战争

音乐节奏 下载
新豪足球

新豪足球

浏览阅读 下载
会玩

会玩

游戏工具 下载