⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcctest.c

📁 linux 嵌入式原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  Sample program for FR400 Companion Chip VCC axLinux driver. *   *  Copyright (C) 2002  AXE,Inc. * */#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <sys/mman.h>#include <fcntl.h>#include <linux/hdreg.h>#include <linux/fs.h>#include <sys/ioctl.h>#include <sys/time.h>#include <unistd.h>#include <errno.h>#include <linux/fr400cc_vcc.h>#define REGIO_TEST	1	/* 2003/Jan/27 */#define CFGCHK		1	/* 2002/Dec/20 */#define C2		1	/* 2002/Oct/22 */#if REGIO_TEST#include <linux/fr400cc_io.h>#endif#define NORMAL		0#define QUARTER		1	/* not yet test */#define QUARTER_ALT	2	/* not yet test */#define USE_SELECT#if C2	/* cut */#else#define SHOW_DEBUG_INFO#endif#if VCC_TIMEREC#undef SHOW_DEBUG_INFO#endif#if VCC_TIMEREC#if 1#define CAPTURE_SIZE	NORMAL#else#define CAPTURE_SIZE	QUARTER#endif#else/*#define CAPTURE_SIZE	NORMAL*/#define CAPTURE_SIZE	QUARTER#endif#if (CAPTURE_SIZE==NORMAL)#define FILESIZE (720 * 480 * 2)#else#define FILESIZE (320 * 240 * 2)#endif/* *   [memory map] *   0x00000000 - 0x01000000	kernel *   0x01000000 - 0x01c00000    vcctest.c *   0x01c00000 - 0x03c00000	(don't use, broken??) *   0x03c00000 - 0x04000000    romdisk */#define TMPBUF_BASE   0x01000000#define TMPBUF_SIZE   0x02c00000#define TMPBUF_LEN   (TMPBUF_SIZE/FILESIZE)unsigned char *tmpbuf=(unsigned char *)TMPBUF_BASE;int tmpbuf_n=0;unsigned char *frame_base;struct fr400cc_vcc_mbuf vcc_mbuf;#ifdef SHOW_DEBUG_INFOstruct fr400cc_vcc_info vcc_info[TMPBUF_LEN];struct fr400cc_vcc_frame_info vcc_frame_info[TMPBUF_LEN];struct fr400cc_vcc_read vcc_read[TMPBUF_LEN];#elsestruct fr400cc_vcc_read vcc_read_dummy;#endif#if CFGCHKstatic int verbose = 0;static voidconfig_show_vcc(struct fr400cc_vcc_config *cfg){	printf("encoding:%d , interlace:%d , skipbf:%d\n",	       cfg->encoding, cfg->interlace, cfg->skipbf);	printf("fw:%d , fh:%d\n", cfg->fw, cfg->fh);	printf("rhtcc:0x%08x , rhcc:0x%08x , rhbc:0x%08x, rvcc:0x%08x\n",	       cfg->rhtcc, cfg->rhcc, cfg->rhbc, cfg->rvcc);	printf("rvbc:0x%08x , rhr:0x%08x , rvr:0x%08x\n",	       cfg->rvbc, cfg->rhr, cfg->rvr);	printf("rssp:0x%08x , rsep:0x%08x\n", cfg->rssp, cfg->rsep);	printf("rcc_fdts:0x%08x , rcc_ifi:0x%08x\n", cfg->rcc_fdts, cfg->rcc_ifi);	printf("rhyf0:0x%08x , rhyf1:0x%08x , rhyf2:0x%08x\n",	       cfg->rhyf0, cfg->rhyf1, cfg->rhyf2);	printf("rhcf0:0x%08x , rhcf1:0x%08x , rhcf2:0x%08x\n",	       cfg->rhcf0, cfg->rhcf1, cfg->rhcf2);	printf("rvf0:0x%08x , rvf1:0x%08x\n", cfg->rvf0, cfg->rvf1);}static intioctl_start_vcc(int fd, int prm){	if(verbose){		struct fr400cc_vcc_config cfg;		if(ioctl(fd, VCCIOCGCFG, &cfg) != 0){			fprintf(stderr, "ioctl vcc get cfg err\n");			return -1;		}		printf("VCC config\n");		config_show_vcc(&cfg);		printf("\n");	}	return ioctl(fd, VCCIOCSTART, prm);}#endif /* CFGCHK */int mode;static void memcpy_4b_align(unsigned *dst, unsigned *src, int len){    int i;    for( i=0; i<len; i+=sizeof(unsigned) )	*dst++=*src++;}static int frame_write_ram(char *addr, int nomsg){    int len;    len = FILESIZE;    if( tmpbuf_n < TMPBUF_LEN ){	if( !nomsg ){	    printf("Use RAM(%d) %08x-%08x (from:%08x)\n",		   tmpbuf_n, tmpbuf+tmpbuf_n*FILESIZE,		   tmpbuf+(tmpbuf_n+1)*FILESIZE, addr);	}#if 0	memcpy(tmpbuf+tmpbuf_n*FILESIZE, addr, FILESIZE);#else	/* memcpy in libc is very slow.  (2002/JUN/11)*/	memcpy_4b_align((unsigned *)(tmpbuf+tmpbuf_n*FILESIZE),			(unsigned *)addr, FILESIZE);#endif	tmpbuf_n++;	return 0;    }else{	if( !nomsg )	    printf("no buffer on RAM\n");	return -1;    }}static void write_file_frame(char *name, char *addr){    int len, fd;    len = FILESIZE;    fd = open(name, O_WRONLY|O_CREAT|O_TRUNC, 0644);    if( fd == -1 ){	printf("error: open %s\n", name);	return;    }    printf("write: name:%s,size:%d ...\n", name, len);    if( write(fd, addr, FILESIZE) != len ){	printf("error: write %s\n", len);	close(fd);	return;    }    close(fd);}static void memcpy_time_check(unsigned char *frame,			      struct fr400cc_vcc_mbuf *mbuf){    struct timeval st, ed;    int msec, usec, i, try;    if( gettimeofday(&st, NULL) == -1 ){	printf("error: gettimeofday()\n");	return;    }    try = 4;    for( i=0; i<try; i++){	frame_write_ram(frame + mbuf->offsets[i%mbuf->frames], 0);    }    if( gettimeofday(&ed, NULL) == -1 ){	printf("error: gettimeofday()\n");	return;    }    msec = ((ed.tv_sec - st.tv_sec) * 1000) +	ed.tv_usec / 1000 - st.tv_usec / 1000;    usec = (int)(ed.tv_usec % 1000 - st.tv_usec % 1000);    if( usec < 0 ){	msec -= 1;	usec += 1000;    }    printf("memory copy: %dbytes * %d frames, %d.%03dmsec",	   FILESIZE, try, msec, usec);    printf("  (1frame, %d.%03dmsec)\n",	   (msec * 1000 + usec) / try / 1000,	   (msec * 1000 + usec) / try % 1000);    tmpbuf_n = 0;}static unsigned tvusec(struct timeval *from, struct timeval *to){    unsigned usec;    usec = (to->tv_sec - from->tv_sec) * 1000000;    usec += to->tv_usec - from->tv_usec;    return usec;}static int setup_vcc(char *devname){    int dev, i, retval;    struct fr400cc_vcc_config vcc_conf;    dev = open(devname, O_RDONLY);    if( dev == -1 ){	printf("error: open %s\n", devname);	return -1;    }#if VCC_TIMEREC    if(ioctl(dev, __VCCIOCTIMEREC, 'S')){	printf("time rec start NG '%s'\n", devname);    }#endif    if (ioctl (dev, VCCIOCGMBUF, &vcc_mbuf)) {	printf("unable to get vcc mbuf '%s'\n", devname);	return -1;    }    if ((frame_base=mmap(0,vcc_mbuf.size,PROT_READ|PROT_WRITE, MAP_SHARED,dev,0)) == (void *)-1) {	printf("mmap error\n");	return -1;    }    if ( (retval = ioctl (dev, VCCIOCGCFG, &vcc_conf)) ) {	printf("unable to get vcc conf '%s' (retval %d, errno %d)\n", devname, retval, errno);	return -1;    }    printf("vcc_conf(default): enc=%d, interlace=%d skipbf=%d frame=(%d,%d)\n"	   "          rhtcc=%d, rhcc=%d, rhbc=%d, rvcc=%d, rvbc=%d\n"	   "          rcc_fdts=%d, rcc_ifi=%d\n",	   vcc_conf.encoding, vcc_conf.interlace, vcc_conf.skipbf,	   vcc_conf.fw, vcc_conf.fh,	   vcc_conf.rhtcc, vcc_conf.rhcc, vcc_conf.rhbc,	   vcc_conf.rvcc, vcc_conf.rvbc,	   vcc_conf.rcc_fdts, vcc_conf.rcc_ifi);    vcc_conf.rcc_fdts = 0;	/* 0 */    vcc_conf.rcc_ifi = 0;	/* 0 */#if (CAPTURE_SIZE == NORMAL)    vcc_conf.fw = 720;	/* 720 */    vcc_conf.fh = 480;	/* 480 */    vcc_conf.skipbf = 0;	/* 0:capture top and bottom field				   1:capture top field onry */    vcc_conf.rhcc = 720;	/* 720 */    vcc_conf.rvcc = 240;	/* 240 */    vcc_conf.rhr = 0x100;	/* 0x100 */    vcc_conf.rvr = 0x100;	/* 0x100 */#endif#if (CAPTURE_SIZE == QUARTER)    vcc_conf.fw = 320;	/* 720 */    vcc_conf.fh = 240;	/* 480 */    vcc_conf.skipbf = 1;	/* 0:capture top and bottom field				   1:capture top field onry */    vcc_conf.rhcc = 720;	/* 720 */    vcc_conf.rvcc = 240;	/* 240 */    vcc_conf.rhr = 0x240;	/* 0x100 */    vcc_conf.rvr = 0x100;	/* 0x100 */#endif#if (CAPTURE_SIZE == QUARTER_ALT)    vcc_conf.fw = 320;	/* 720 */    vcc_conf.fh = 240;	/* 480 */    vcc_conf.skipbf = 0;	/* 0:capture top and bottom field				   1:capture top field onry */    vcc_conf.rhcc = 720;	/* 720 */    vcc_conf.rvcc = 240;	/* 240 */    vcc_conf.rhr = 0x240;	/* 0x100 */    vcc_conf.rvr = 0x200;	/* 0x100 */#endif    printf("vcc_conf: enc=%d, interlace=%d skipbf=%d frame=(%d,%d)\n"	   "          rhtcc=%d, rhcc=%d, rhbc=%d, rvcc=%d, rvbc=%d\n"	   "          rcc_fdts=%d, rcc_ifi=%d\n",	   vcc_conf.encoding, vcc_conf.interlace, vcc_conf.skipbf,	   vcc_conf.fw, vcc_conf.fh,	   vcc_conf.rhtcc, vcc_conf.rhcc, vcc_conf.rhbc,	   vcc_conf.rvcc, vcc_conf.rvbc,	   vcc_conf.rcc_fdts, vcc_conf.rcc_ifi);    if (ioctl (dev, VCCIOCSCFG, &vcc_conf)) {	printf("unable to set vcc conf '%s'\n", devname);	return -1;    }    printf("frame base=0x%08x\n", frame_base);    printf("vcc_mbuf: size=%08x, frames=%d", vcc_mbuf.size, vcc_mbuf.frames);    for (i=0; i<vcc_mbuf.frames; i++)	printf(" [%08x]", vcc_mbuf.offsets[i]);    printf("\n");    return dev;}static intopt_chk(int ac, char **av, char *key){	int i;	for(i=1; i<ac; i++){		if(strcmp(av[i], key) == 0) return i;	}	return 0;}#if REGIO_TESTstatic intopt_chk_str(int ac, char **av, char *key, char **re){	int i;	i = opt_chk(ac, av, key);	if(i!=0 && i+1<ac){		*re = av[i+1];		return 0;	}	return -1;}static ints2val(char *s, unsigned *re){	unsigned v;	int cnt, neg, d;	if(s == NULL) return -2;	if(strncmp(s, "0x", 2) == 0){		if((cnt = sscanf(s, "0x%x", &v)) != 1) return -1;		*re = v;		return 0;	}	neg = 0;	if(s[0] == '-'){		neg = 1;				s++;	}	if((cnt = sscanf(s, "%d", &d)) != 1) return -1;	if(neg) d = -d;	*re = (unsigned)d;	return 0;}static intopt_chk_val(int ac, char **av, char *key, unsigned *re){	char *str;	if(opt_chk_str(ac, av, key, &str) != 0) return -1;	if(s2val(str, re) != 0) return -2;	return 0;}#endif#if VCC_TIMERECstatic intsave(char *name, unsigned char *p, int n){	FILE *fp;	int x;	fp = fopen(name, "w");	if(fp == NULL) return -1;	while(n>0){		x = fwrite(p, 1, n, fp);		if(x < 0){			fprintf(stderr, "fwrite x=%d\n", x);			fclose(fp);			return -1;		}		p += x;		n -= x;	}	fclose(fp);	return 0;}static char *tmo_fn = "tmrec.dat";static voidtime_rec_save(int fd){	int tmcnt, sz, sz2, i, x;#if VCC_TIMEREC_2	Tmrec rec;	FILE *fp;#else	Tmrec *tmrecs;#endif	char *cp;	if(ioctl(fd, __VCCIOCTIMEREC, 'E')){		printf("time rec end NG.\n");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -