在ubuntu 12.04上测试framebuffer

在网上找了一段代码,测试framebuffer用,

 #include <stdio.h>
#include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <linux/fb.h>
 #include <sys/mman.h>
 #include <sys/ioctl.h>

 int main()
 {
     int fbfd = 0;
     struct fb_var_screeninfo vinfo;
     struct fb_fix_screeninfo finfo;
     long int screensize = 0;
     char *fbp = 0;
     int x = 0, y = 0;
     long int location = 0;
     int startx=0, starty=0;     
     int width, height;

     // Open the file for reading and writing
     fbfd = open("/dev/fb0", O_RDWR);
     if (fbfd == -1) {
         perror("Error: cannot open framebuffer device");
         exit(1);
     }
     printf("The framebuffer device was opened successfully.\n");

     // Get fixed screen information
     if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {
         perror("Error reading fixed information");
         exit(2);
     }

     // Get variable screen information
     if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
         perror("Error reading variable information");
         exit(3);
     }

     printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);

     // Figure out the size of the screen in bytes
     screensize = vinfo.yres * finfo.line_length;
     printf("screensize %ld\n", screensize);


     // Map the device to memory
     fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
                        fbfd, 0);
     if ((int)fbp == -1) {
         perror("Error: failed to map framebuffer device to memory");
         exit(4);
     }
     printf("The framebuffer device was mapped to memory successfully.\n");

     startx = 0; starty = 0;       // Where we are going to put the pixel
     width = 200;
     height = 100;

     // Figure out where in memory to put the pixel
     for (y = starty; y < height + starty; y++)
         for (x = startx; x < width + startx; x++) {

             location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
                        (y+vinfo.yoffset) * finfo.line_length;
         
             //printf("%ld \n", location);    

             if (vinfo.bits_per_pixel == 32) {
                 *(fbp + location) = 10;        // Some blue
                 *(fbp + location + 1) = 15+(x-startx)/2;     // A little green
                 *(fbp + location + 2) = 200-(y-starty)/5;    // A lot of red
                 *(fbp + location + 3) = 0;      // No transparency
             } else  { //assume 16bpp
                 int b = 10;
                 int g = (x-startx)/6;     // A little green
                 int r = 31-(y-starty)/16;    // A lot of red
                 unsigned short int t = r<<11 | g << 5 | b;
                 *((unsigned short int*)(fbp + location)) = t;
             }

         }
     munmap(fbp, screensize);
     close(fbfd);
     getchar();    
     return 0;
 }

编译之后运行不正常,我想是不是要到文本界面下去运行,因为图形界面下会对framebuffer干扰,


使用命令 sudo /etc/init.d/lightdm stop 关闭图形界面,在进入到文本界面时停在了 checking battery... 处就不动了,
搜索了一下,找到了解决方法,虽然此处hang住了,但仍可以按alt + F1 进入到登录界面,登录之后,运行上面的程序,显示一个色彩渐变的色块。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值