免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1290 | 回复: 0
打印 上一主题 下一主题

[学习] linux下framebuffer刷屏怎么只能刷半截? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-30 11:29 |只看该作者 |倒序浏览
实际取得的数据如下:
varinfo.xres=640 varinfo.yres=480 varinfo.bits_per_pixel=16 fixinfo.line_length=1280 dwScreensize=614400
但是只能刷掉半解屏幕

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1)

struct fb_dev{
int fd; /*file descriptor*/
struct fb_fix_screeninfo fixinfo;
struct fb_var_screeninfo varinfo;
char *addr; /*map address*/
int fb_size; /*frame buffer size*/
char *buffer; /*buffer,equals to framebufer's size*/
};
struct fb_dev* gui_open(const char *device,int mode);
int gui_flush_buffer(struct fb_dev *pdev);
int gui_fill_color(struct fb_dev*pdev,int color);
int gui_draw_line(struct fb_dev *pdev,int whichline,int startpos,int endpos,int color);
int gui_close(struct fb_dev *pdev);
struct fb_dev* gui_open(const char *device,int mode){
struct fb_dev *dev=(struct fb_dev*)malloc(sizeof(struct fb_dev));
if(!dev){
  return NULL;
}
if(!device){
  free(dev);
  return NULL;
}
if((dev->fd=open(device,mode))<0){
  printf("open %s failed./n",device);
  free(dev);
  return NULL;
}  
if(ioctl(dev->fd,FBIOGET_FSCREENINFO,&dev->fixinfo)==-1){
  printf("ioctl failed./n");
  free(dev);
  return NULL;
}
if(ioctl(dev->fd,FBIOGET_VSCREENINFO,&dev->varinfo)==-1){
  printf("ioctl failed./n");
  free(dev);
  return NULL;
}
//frame buffer size
dev->fb_size = dev->varinfo.xres * dev->varinfo.yres * dev->varinfo.bits_per_pixel / 8;

//map physical address to process virtual address
dev->addr=mmap(NULL,dev->fb_size,PROT_READ|PROT_WRITE,MAP_SHARED,dev->fd,0);
if(!dev->addr){
  printf("mmap failed./n");
  free(dev);
  return NULL;
}
//allocate the same size buffer
dev->buffer=(char*)malloc(dev->fb_size);
if(!dev->buffer){
  printf("malloc failed./n");
  free(dev);
  return NULL;
}
memset(dev->buffer,0,dev->fb_size);
return dev;
}
int gui_fill_color(struct fb_dev*pdev,int color){
if(!pdev){
  return -1;
}
memset(pdev->buffer,color,pdev->fb_size);
gui_flush_buffer(pdev);
return 0;
}
int gui_close(struct fb_dev*pdev){
free(pdev->buffer);
free(pdev);  
}
int gui_flush_buffer(struct fb_dev *pdev){
char *src,*dst;
if(!pdev){
  return -1;
}
src=pdev->buffer;
dst=pdev->addr;

memcpy(dst,src,pdev->fb_size);

return 0;
}
int gui_draw_hline(struct fb_dev*pdev,int whichline,int startpos,int endpos,int color){
int i;
char *buf;
if(!pdev){
  return -1;
}
if(startpos<0 || startpos>pdev->varinfo.xres)
  startpos=0;
if(endpos<0 || endpos>pdev->varinfo.xres)
  endpos=pdev->varinfo.xres;
if(whichline<0 || whichline>pdev->varinfo.yres)
  whichline=0;
buf=pdev->buffer+whichline*pdev->varinfo.xres;
for(i=startpos;i<endpos;i++)
  *buf++=color;
gui_flush_buffer(pdev);
return 0;
}
int main(int argc,char **argv){
struct fb_dev *dev;
dev=gui_open("/dev/fb0",O_RDWR);
int dwWidth=dev->varinfo.xres;
int dwHeight=dev->varinfo.yres;
int dwScreensize =  dev->fb_size;
printf("varinfo.xres=%d varinfo.yres=%d varinfo.bits_per_pixel=%d fixinfo.line_length=%d dwScreensize=%d\r\n",
        dev->varinfo.xres,
        dev->varinfo.yres,
        dev->varinfo.bits_per_pixel,
        dev->fixinfo.line_length,
        dwScreensize
        );


gui_fill_color(dev,0x0);
gui_draw_hline(dev,dev->varinfo.yres-1,0,300,0xFF0000);
gui_draw_hline(dev,dev->varinfo.yres-3,0,400,0x00FF00);
gui_draw_hline(dev,dev->varinfo.yres-5,0,500,0x0000FF);
gui_close(dev);
return 0;
}


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP