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

📄 docapture3.c

📁 一个摄像头Framebuffer应用程序在ARM平台上的移植
💻 C
字号:
/* * MX21 OV9640 Application * * 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 * * Copyright (C) 2004 Motorola Semiconductors Hong Kong. * */#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#include <stdio.h>#include <sys/ioctl.h>#include <fcntl.h>#include <linux/fb.h>#include <asm/mman.h>#include <sys/mman.h>#include <string.h>#include <unistd.h>#include "csi.h"#include "csilib.h"#include "ov9640.h"#include "ov9640lib.h"#include "camera.h"typedef struct{	int width;	int height;	int format;	int bytes_per_pixel;} IMG_SPEC;//local functionstatic void rgb_rotate(unsigned int BufIn, unsigned int BufOut, int imgH, int imgV, int dir, int out_stride);void ov9640_get_config(OV9640_CFG * _cfg, FILE * _fp);//16-bit rotation//1=clockwise, -1=anticlockwise, 0=no rotstatic void rgb_rotate(unsigned int BufIn, unsigned int BufOut, int imgH, int imgV, int dir, int out_stride){	int v, h, k;	unsigned short * _dataIn = (unsigned short *)BufIn;	unsigned short * _dataOut = (unsigned short *)BufOut;	switch(dir)	{		case 1:		{			k = 0;			for(h = 0; h < imgH; h ++)			{				for(v = imgV - 1; v >= 0; v --)				{					_dataOut[k] = _dataIn[v * imgH + h];					k ++;				}			}			break;		}		case -1:		{			k = 0;			for(h = imgH - 1; h >= 0; h --)			{				for(v = 0; v < imgV; v ++)				{					_dataOut[k] = _dataIn[v * imgH + h];					k ++;				}				_dataOut += (out_stride - imgV);			}			break;		}		case 0:		{		//provide the effect of line stride			for(v = 0; v < imgV; v ++)			{				memcpy(_dataOut, _dataIn, imgH * 2);				_dataIn += imgH;				_dataOut += out_stride;			}			break;		}	}		return;}/*//read sensor control file//modify according to control filevoid ov9640_get_config(OV9640_CFG * _cfg, FILE * _fp){	char buf[200];	memset(_cfg, 0, sizeof(OV9640_CFG));	if(_fp)	{		fgets(buf, sizeof(buf), _fp);		if(!strncmp(buf, "ov9640", 6))		{			printf("ov9640: reading control file\n");						fgets(buf, sizeof(buf), _fp);			_cfg->color_format = strtoul(buf, NULL, 0);						fgets(buf, sizeof(buf), _fp);			_cfg->vert_mirror = strtoul(buf, NULL, 0);						fgets(buf, sizeof(buf), _fp);			_cfg->hori_mirror = strtoul(buf, NULL, 0);						fgets(buf, sizeof(buf), _fp);			_cfg->out_width = strtoul(buf, NULL, 0);						fgets(buf, sizeof(buf), _fp);			_cfg->out_height = strtoul(buf, NULL, 0);					fgets(buf, sizeof(buf), _fp);			_cfg->test_pattern_enable = strtoul(buf, NULL, 0);						fgets(buf, sizeof(buf), _fp);			_cfg->gamma = strtoul(buf, NULL, 0);					fgets(buf, sizeof(buf), _fp);			_cfg->sharpening = strtoul(buf, NULL, 0);					fgets(buf, sizeof(buf), _fp);			_cfg->colorsat = strtoul(buf, NULL, 0);					fgets(buf, sizeof(buf), _fp);			_cfg->awb_left = strtoul(buf, NULL, 0);					fgets(buf, sizeof(buf), _fp);			_cfg->awb_right = strtoul(buf, NULL, 0);					fgets(buf, sizeof(buf), _fp);			_cfg->awb_top = strtoul(buf, NULL, 0);					fgets(buf, sizeof(buf), _fp);			_cfg->awb_bottom = strtoul(buf, NULL, 0);					fgets(buf, sizeof(buf), _fp);			_cfg->fps = strtoul(buf, NULL, 0);			fgets(buf, sizeof(buf), _fp);			_cfg->afc_freq = strtoul(buf, NULL, 0);			fgets(buf, sizeof(buf), _fp);			_cfg->capture_width = strtoul(buf, NULL, 0);			fgets(buf, sizeof(buf), _fp);			_cfg->capture_height = strtoul(buf, NULL, 0);		}	}	printf("\nOV9640 CONFIGURATION\n\n");		printf("color_format = %d\n", _cfg->color_format);	printf("vert_mirror = %d\n", _cfg->vert_mirror);	printf("hori_mirror = %d\n", _cfg->hori_mirror);	printf("out_width = %d\n", _cfg->out_width);	printf("out_height = %d\n", _cfg->out_height);	printf("test_pattern_enable = %d\n", _cfg->test_pattern_enable);	printf("gain_green1 = %f\n", (double)_cfg->gain_green1 / SCALEFAC);	printf("gain_blue = %f\n", (double)_cfg->gain_blue / SCALEFAC);	printf("gain_red = %f\n", (double)_cfg->gain_red / SCALEFAC);	printf("gain_green2 = %f\n", (double)_cfg->gain_green2 / SCALEFAC);	printf("gain_global = %f\n", (double)_cfg->gain_global / SCALEFAC);	printf("gamma = %f\n", (double)_cfg->gamma / SCALEFAC);	printf("sharpening = %d%%\n", _cfg->sharpening);	printf("colorsat = %d%%\n", _cfg->colorsat);	printf("awb_left = %d\n", _cfg->awb_left);	printf("awb_right = %d\n", _cfg->awb_right);	printf("awb_top = %d\n", _cfg->awb_top);	printf("awb_bottom = %d\n", _cfg->awb_bottom);	printf("fps = %d\n", _cfg->fps);	printf("afc_freq = %d\n", _cfg->afc_freq);	printf("capture_width = %d\n", _cfg->capture_width);	printf("capture_height = %d\n", _cfg->capture_height);	printf("\n");		return;}*///camera main func//handles polling, dma & prpint main(int argc, char *argv[]){#define LCD_WIDTH	240#define ROTATION	-1#define READ_MODE_PRP	0#define READ_MODE_POLL	1	char _tbuf[640*480*2];	int g_fd_csi = 0;	IMG_SPEC img_spec;	OV9640_CFG ov9640_cfg;	CSI_CFG csi_cfg;	FILE * _fp_ov9640_cfg;	char * _file_name_sensor;	int read_mode;		int fb;	struct fb_var_screeninfo vinfo;	int screensize;	//unsigned int *_tbuf, *_fbuf;	int fr = 0;	if(argc != 3)	{		printf( "Camera application for OV9640 version 0.1\n"			"usage: doCapture3 [read mode] [sensor control file]\n"			"  - read mode          : p=prp, o=poll\n"			"  - sensor control file: contains sensor config\n");		return 0;	}	else	{		if(strcmp(argv[1], "p") == 0)			read_mode = READ_MODE_PRP;		else if(strcmp(argv[1], "o") == 0)			read_mode = READ_MODE_POLL;		_file_name_sensor = argv[2];	}printf("%s: %d\n",__FUNCTION__,__LINE__);//csi config	csi_open();printf("%s: %d\n",__FUNCTION__,__LINE__);	switch(read_mode)	{		case READ_MODE_PRP:				csi_select_config(TIMING_IMAGIC_RGB_PRP, &csi_cfg);			break;		case READ_MODE_POLL:			csi_select_config(TIMING_IMAGIC_RGB_POLL, &csi_cfg);			break;	}	printf("%s: %d\n",__FUNCTION__,__LINE__);        csi_open();	csi_config(&csi_cfg);printf("%s: %d\n",__FUNCTION__,__LINE__);	csi_dump_config();printf("%s: %d\n",__FUNCTION__,__LINE__);//sensor config	ov9640_open();printf("%s: %d\n",__FUNCTION__,__LINE__);	ov9640_i2c_test();printf("%s: %d\n",__FUNCTION__,__LINE__);	ov9640_select_config(OV9640_RGB_QVGA, &ov9640_cfg);printf("%s: %d\n",__FUNCTION__,__LINE__);	_fp_ov9640_cfg = fopen(_file_name_sensor, "r");printf("%s: %d\n",__FUNCTION__,__LINE__);	ov9640_get_config(&ov9640_cfg, _fp_ov9640_cfg);printf("%s: %d\n",__FUNCTION__,__LINE__);	fclose(_fp_ov9640_cfg);printf("%s: %d\n",__FUNCTION__,__LINE__);	ov9640_config(&ov9640_cfg);printf("%s: %d\n",__FUNCTION__,__LINE__);		img_spec.width = ov9640_cfg.out_width;	img_spec.height = ov9640_cfg.out_height;	img_spec.bytes_per_pixel = 2;	printf("%s: %d\n",__FUNCTION__,__LINE__);printf("csi_cfg.prp_if_en=%d\n",csi_cfg.prp_if_en);	if(csi_cfg.prp_if_en == 0)	{	//csi-prp link	//nothing to do	}//	else if(csi_cfg.dma_en)//	{//	//support dma here//	//most of time prp is used instead, dma is not useful and not implemented//	}	else	{	//polling	//write data to frame buffer//		if ((fb = open("/dev/fb0", O_RDWR)) < 0)		if ((fb = open("/tmp/fb", O_RDWR|O_CREAT)) < 0)		{			printf("doCapture3: cannot open fb file!\n");			exit(-1);		}		/*if( ioctl(fb,FBIOGET_VSCREENINFO,&vinfo) )		{			printf("Error reading variable information\n");			exit(2);		}*/printf("%s: %d\n",__FUNCTION__,__LINE__);		screensize = vinfo.xres*vinfo.yres*vinfo.bits_per_pixel / 8;		//_fbuf = (unsigned int *)mmap(NULL, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);		//_tbuf = (unsigned int *)malloc(img_spec.width * img_spec.height * img_spec.bytes_per_pixel);	printf("%s: %d\n",__FUNCTION__,__LINE__);//		while(1)//		{//			csi_read(_tbuf, img_spec.width * img_spec.height * img_spec.bytes_per_pixel);//			rgb_rotate((unsigned int)_tbuf, (unsigned int)_fbuf, img_spec.width, img_spec.height, ROTATION, LCD_WIDTH);printf("%s: %d\n",__FUNCTION__,__LINE__);			//csi_read(_tbuf, img_spec.width * img_spec.height * img_spec.bytes_per_pixel);		        read(g_fd_csi, _tbuf, img_spec.width * img_spec.height * img_spec.bytes_per_pixel);			write(fb, _tbuf, img_spec.width * img_spec.height * img_spec.bytes_per_pixel);			//perror("csi read");			//fr ++;			//if(!(fr % 100))				//printf("fr %d\n", fr);//		}	         printf("%s: %d\n",__FUNCTION__,__LINE__);			}	close(fb);	ov9640_close();	csi_close();	printf("doCapture3 completed\n");		return 0;}

⌨️ 快捷键说明

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