vdc_init.c
来自「mini gui 1.6.8 lib and source」· C语言 代码 · 共 299 行
C
299 行
/*** $Id: vdc_init.c,v 1.3 2005/04/22 03:33:36 weiym Exp $** ** Copyright (C) 2004 Feynman Software.*//*** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/#include <stdio.h>#include <stdlib.h>#include <time.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>#include <sys/mman.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <string.h>#include <strings.h>#include "vdc_init.h"static int fd = -1;static int mmap_len = 0;static struct fr400vdc_config cfg;static unsigned char *mmap_area = NULL;extern unsigned char *VRAM_addr; /* point to display memory of VDC */static void* mmap_fd(int fd);/* VDC regs * PHTC RHDC RHFP RHSC RHBP * RVTC RVDC RVFP RVSC RVBP * RHIP RVIP RCK */static int prms_lcd[13] = { 323, 320, 1, 1, 1, 302, 242, 27, 6, 27, 0, 0, 8 };static int prms_rgb[13] = { 858, 640,11, 67, 60, 1, 480, 2, 4, 16, 0, 0, 2 };static int prms_ntsc[13]= { 858, 720, 16, 120 ,2, 262, 240, 2, 19, 1, 0, 0, 1 };static int prms_pal[13] = { 864, 720, 16, 120, 8, 312, 288, 1, 22, 1, 0, 0, 1 }; static void* vdc_init(int mode){ int i; unsigned short *addr; /* open VDC device */ if((fd = open("/dev/fr400cc_vdc", O_RDWR | O_NONBLOCK)) < 0) { fprintf (stderr, "MB93493 NEWGAL Engine: Failed to open device - /dev/fr400cc_vdc!\n"); return 0; } /* get VDC config */ if(ioctl(fd, VDCIOCGCFG, &cfg) != 0) { fprintf (stderr, "MB93493 NEWGAL Engine: Failed to call ioctl (VDCIOCGCFG)!\n"); close(fd); return 0; } /* init VDC's config parameters */ switch(mode) { case MODE_LCD: /* for LCD */ cfg.pix_x = 320; cfg.pix_y = 242; cfg.hls = 0; cfg.cscv = 2; cfg.vsop = 1; cfg.enop = 1; cfg.dsm = 1; cfg.dbls = 0; cfg.r601 = 0; cfg.die = 1; cfg.dpf = 1; bcopy(prms_lcd, cfg.prm, 4*13); break; case MODE_NTSC: /* for TV */ cfg.pix_x = 720; cfg.pix_y = 480; cfg.hls = 1; cfg.cscv = 0; cfg.dbls = 1; cfg.r601 = 1; cfg.tfop = 0; cfg.dsm = 1; cfg.die = 1; cfg.dsr = 1; cfg.dpf = 3; bcopy(prms_ntsc, cfg.prm, 4*13); break; case MODE_PAL: cfg.pix_x = 720; cfg.pix_y = 576; cfg.hls = 1; cfg.cscv = 0; cfg.dbls = 1; cfg.r601 = 1; cfg.tfop = 0; cfg.dsm = 1; cfg.die = 1; cfg.dsr = 1; cfg.dpf = 3; cfg.pal = 1; bcopy(prms_pal, cfg.prm, 4*13); break; case MODE_VGA: /* VGA for monitor */ cfg.pix_x = 640; cfg.pix_y = 480; cfg.hls = 0; cfg.cscv = 2; cfg.vsop = 1; cfg.enop = 1; cfg.dsm = 1; cfg.dbls = 0; cfg.r601 = 0; cfg.die = 1; cfg.dpf = 1; bcopy(prms_rgb, cfg.prm, 4*13); break; default: fprintf(stderr, "MB93493 NEWGAL Engine: bad display mode!\n"); return 0; } cfg.skipbf = 1; /* skip bottom field */ cfg.buf_num = 2; cfg.buf_unit_sz = cfg.pix_x * cfg.pix_y * 2; mmap_len = cfg.buf_unit_sz * cfg.buf_num; if((void *)(mmap_area = (unsigned char *)mmap_fd(fd)) == (void*)-1) { fprintf(stderr, "MB93493 NEWGAL Engine: VDC mmap error!\n"); close(fd); return 0; } addr = (unsigned short *)mmap_area; for(i = 0 ; i < cfg.pix_x * cfg.pix_y * cfg.buf_num; i++) *addr++ = 0x0000; cfg.rddl = 1; /* for underrun */ /* set config parameters */ if(ioctl(fd, VDCIOCSCFG, &cfg) != 0) { fprintf(stderr, "MB93493 NEWGAL Engine: VDC ioctl set cfg err!\n"); munmap(mmap_area, mmap_len); close(fd); return 0; } /* get config parameters */ if(ioctl(fd, VDCIOCGCFG, &cfg) != 0) { fprintf(stderr, "MB93493 NEWGAL Engine: VDC ioctl get cfg err!\n"); munmap(mmap_area, mmap_len); close(fd); return 0; } return mmap_area;}static int vdc_start(int still){ int i; if (!still) { for(i = 0; i < cfg.buf_num; i++) { if(ioctl(fd, VDCIOCSDAT, i) < 0) { fprintf(stderr, "MB93493 NEWGAL Engine: ioctl: VDCIOCSDAT error!\n"); munmap(mmap_area, mmap_len); close(fd); return -1; } } } else { if(ioctl(fd,VDCIOCSDAT, 0) < 0) { fprintf(stderr, "MB93493 NEWGAL Engine: ioctl: VDCIOCSDAT error!\n"); munmap(mmap_area, mmap_len); close(fd); return -1; } } if(ioctl(fd, VDCIOCSTART, 0) != 0) { fprintf(stderr, "MB93493 NEWGAL Engine: VDC ioctl start err\n"); munmap(mmap_area, mmap_len); close(fd); return -1; } return 0;}void vdc_set_data(int idx){ while(-1 == ioctl(fd, VDCIOCSDAT, idx));}static void * mmap_fd(int fd){ void *pt; void *start; int length, prot, flags, offset; start = NULL; length = cfg.buf_unit_sz * cfg.buf_num; prot = PROT_READ | PROT_WRITE; flags = MAP_SHARED; offset = 0;#if 0 printf("pix_x = %d\n", cfg.pix_x); printf("pix_y = %d\n", cfg.pix_y); printf("pix_sz = %d\n", cfg.pix_sz); printf("skipbf = %d\n", cfg.skipbf); printf("prm[%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d]\n", cfg.prm[0], cfg.prm[1], cfg.prm[2], cfg.prm[3], cfg.prm[4], cfg.prm[5], cfg.prm[6], cfg.prm[7], cfg.prm[8], cfg.prm[9], cfg.prm[10], cfg.prm[11], cfg.prm[12]); printf("rddl = %d\n", cfg.rddl); printf("hls = %d\n", cfg.hls); printf("pal = %d\n", cfg.pal); printf("cscv = %d\n", cfg.cscv); printf("dbls = %d\n", cfg.dbls); printf("r601 = %d\n", cfg.r601); printf("tfop = %d\n", cfg.tfop); printf("dsm = %d\n", cfg.dsm); printf("dfp = %d\n", cfg.dfp); printf("die = %d\n", cfg.die); printf("enop = %d\n", cfg.enop); printf("vsop = %d\n", cfg.vsop); printf("hsop = %d\n", cfg.hsop); printf("dsr = %d\n", cfg.dsr); printf("csron = %d\n", cfg.csron); printf("dpf = %d\n", cfg.dpf); printf("dms = %d\n", cfg.dms); printf("dma_mode = %d\n", cfg.dma_mode); printf("dma_ats = %d\n", cfg.dma_ats); printf("dma_rs = %d\n", cfg.dma_rs); printf("Enter mmap_fd(%d): start = %p, length = %d, prot = %x, flags = %x, fd = %d, offset = %d[%x]\n", fd, start, length, prot, flags, fd, offset, offset);#endif pt = mmap(start, length, prot, flags, fd, offset); if (((void*)-1) == pt) { int er = errno; } return pt;}int open_vdc_device(int mode){ /* get display memory of LCD */ VRAM_addr = (unsigned char*)vdc_init (mode); if (VRAM_addr == 0) { return -1; } /* start VDC(LCD) */ if (vdc_start(1) < 0) { return -1; } return 0;}void close_vdc_device (void){ munmap (mmap_area, mmap_len); ioctl (fd, VDCIOCSTOP, 0); close (fd);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?