现在的位置: 首页 > 综合 > 正文

framebuff操作程序

2013年01月02日 ⁄ 综合 ⁄ 共 3735字 ⁄ 字号 评论关闭

/*
 * Usage:
 *
 */

#include
<
unistd.h>
#include
<
sys/mman.h>
#include
<
stdio.h>
#include
<
stdlib.h>
#include
<
string.h>
#include
<
fcntl.h>
#include
<
sys/types.h>
#include
<
sys/stat.h>
#include
"s1d13521ioctl.h"

#include
<
linux/fb.h>
#define WF_MODE_INIT 0
#define WF_MODE_DU 1
#define WF_MODE_GC16 2
#define WF_MODE_GC4 3
int main(int argc,char*argv[])
{
 int fbdev, i, j;
 static unsignedshort
*vram;
 unsigned short*pdata;
 unsigned short*pdata1;
 unsigned char clr;
 int choose = 0;
 int fd;
 int WIDTH = 600;
 int HEIGHT = 800;
 int PIC_WIDTH = 600;
 int PIC_HEIGHT= 800;
 unsigned char*data;
 struct stat sb;
 int xindex;
 int yindex;
 int retVal;
 int update_mode = 0;
 unsigned short mode;
 unsigned short cmd[10];
 struct fb_var_screeninfo info;

 choose = atoi(argv[1]);
 update_mode = atoi(argv[2]);
 printf("choose = %d, update_mode = %d\n", choose, update_mode);
 
 /*read a grayscale file from external*/
 fd = open(argv[3], O_RDONLY);
 
 if (fd
<
0){
  printf("Failed to open:%s\n", argv[3]);
  exit(-1);
 }
 if (fstat(fd,&sb)
==
-
1){
  printf("stat test_fb error!\n");
  return -1;
     }
 
 printf("file size = %d!\n", sb.st_size);
 data = (unsignedchar
*)malloc(sb.st_size+1);
 if (data
=
= NULL){
  printf("Failed to malloc\n");
  exit(-1);
 }
 retVal = read(fd, data, sb.st_size);
     if (retVal< sb.st_size){
         printf("read32read32: retVal < N, fd = %d ,retVal = %d\n", fd, retVal);
         return -1;
     }
 fbdev = open("/dev/graphics/fb0", O_RDWR);
 if ( fbdev< 0)
 {
  printf("Failed to open:fb");
  exit(-1);
 }
 if (ioctl(fbdev, FBIOGET_VSCREENINFO,&info)
==
-
1){
  printf("FBIOGET_VSCREENINFO error\n");
  exit(-1);
 }
 printf("yres = %d\n", info.yres);
 printf("xres = %d\n", info.xres);
 printf("yres_virtual = %d\n", info.yres_virtual);
 printf("xres_virtual = %d\n", info.xres_virtual);
 /* RGB16 */
 vram = (unsignedshort
*)mmap(NULL, info.xres_virtual*
info.yres_virtual* 2,
   PROT_READ | PROT_WRITE, MAP_SHARED, fbdev,0);
 if(vram
=
= MAP_FAILED){
  printf("mmap OVERLAY2 error!\n");
  goto out;
 }

 /*Clear the framebuffer, nor the screen*/
 for(i
=
0; i < info.yres_virtual; i++){
  for(j
=
0; j < info.xres_virtual; j++){
   vram[i*info.xres_virtual+ j]
= 0xFFFF;
  }
 }
 pdata = (unsignedshort
*)data;
 xindex = 0;
 yindex = 0;
 
 for(i
=
0; i < info.yres; i++){
  xindex = 0;
  for(j
=
0; j < info.xres; j++){
   vram[i*info.xres+j]
= pdata[i*info.xres+ j];
   xindex++;
   if(xindex>= PIC_WIDTH)
    break;
  }
  yindex++;
  if (yindex>= PIC_HEIGHT)
   break;
 }
 info.yoffset = 0;
 info.activate = FB_ACTIVATE_VBL;
 ioctl(fbdev,FBIOPUT_VSCREENINFO,&info);/*control
the first frame buffer*/

 bzero(cmd,sizeof(cmd));
 
 switch (choose){
   case 1:
    cmd[0]
=
WF_MODE_DU;
    break;
    
   case 2:
    cmd[0]
=
WF_MODE_GC16;
    break;
    
   case 3:
    cmd[0]
=
WF_MODE_GC4;
    break;
    
   default:
     printf("%s:input mode error! choose = %d\n",__func__,
choose);
  }
 cmd[1]
=
0;
 cmd[2]
=
0;
 
 switch (update_mode){
  case 1:
//UPD_FULL

   ioctl(fbdev,S1D13521_UPD_FULL, cmd);
   break;
  case 2://UPD_PART

   ioctl(fbdev,S1D13521_UPD_PART, cmd);
   break;
  case 3://UPD_FULL_AREA

   cmd[3]
=
20; /*x*/
   cmd[4]
=
20; /*y*/
   cmd[5]
=
200;/*width*/
   cmd[6]
=
200;/*height*/
   ioctl(fbdev,S1D13521_UPD_FULL_AREA, cmd);
   break;
   
  case 4:
   cmd[3]
=
100;/*x*/
   cmd[4]
=
300;/*y*/
   cmd[5]
=
400;/*width*/
   cmd[6]
=
100;/*height*/
   ioctl(fbdev,S1D13521_UPD_PART_AREA, cmd);
   break;
   
  case 5:
   for (i
=
0; i < 600; i++){
    cmd[3]
=
i + 50;
    cmd[4]
=
300;
    cmd[5]
=
10;
    cmd[6]
=
10;
    usleep(1000* 10);
    ioctl(fbdev,S1D13521_UPD_PART_AREA, cmd);
   }
   
   break;
   
  default:
   
   for(i
=
0; i < info.yres_virtual; i++){
    for(j
=
0; j < info.xres_virtual; j++){
     vram[i*info.xres_virtual+ j]
= 0xFFFF;
    }
   }
   cmd[0]
=
WF_MODE_GC16;
   cmd[1]
=
0;
   cmd[2]
=
0;
   ioctl(fbdev,S1D13521_UPD_FULL, cmd);
   printf("%s: input update_mode error! clear screen !\n",__func__);
 }
void showbar(char*cmd)
{
 int i = 0;
 for (i
=
0; i < 600; i++){
  cmd[3]
=
i + 10;
  cmd[4]
=
300;
  cmd[5]
=
10;
  cmd[6]
=
10;
  usleep(1000* 10);
  
 }
}
out:
 munmap(vram, info.xres_virtual* info.yres_virtual*
2);
 close(fbdev);
 close(fd);
 free(data);
 printf("end\n");
}

抱歉!评论已关闭.