framebuff操作程序

/*
 * 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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值