/* * 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 unsigned short *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 = (unsigned char *)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 = (unsigned short *)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 = (unsigned short *)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"); }
|