亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pxa_camera-hzh.c

?? Intel PXA270 cpu下攝像頭驅動程序源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*     pxa_camera - main file for camera driver	Copyright (C) 2003, Intel Corporation.    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., 675 Mass Ave, Cambridge, MA 02139, USA.    Code Status:    2004/10/19: Yan Yin <yan.yin@intel.com>        - Ported to 2.6 kernel		- Made camera driver a loadable module*/ #include <linux/config.h>#include <linux/module.h>#include <linux/version.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/vmalloc.h>#include <linux/delay.h>#include <linux/slab.h>#include <linux/proc_fs.h>#include <linux/ctype.h>#include <linux/pagemap.h>#include <linux/interrupt.h>#include <linux/videodev.h>#include <linux/pci.h>#include <linux/pm.h>#include <linux/poll.h>#include <linux/wait.h>#include <linux/cpufreq.h>#include <linux/types.h>#include <asm/mach-types.h>#include <asm/io.h>#include <asm/semaphore.h>#include <asm/hardware.h>#include <asm/dma.h>#include <asm/irq.h>#include <asm/arch/irqs.h>#include <asm/arch/pxa-regs.h>#include "camera.h"#include "ci.h"#ifdef CONFIG_MACH_MAINSTONE#define   ADCM2650#else#define   OV9640#endif#ifdef ADCM2650#include "adcm2650.h"#include "adcm2650_hw.h"#endif#ifdef OV9640#include "ov9640.h"#include "ov9640_hw.h"#endif#define CIBR0_PHY	(0x50000000 + 0x28)#define CIBR1_PHY	(0x50000000 + 0x30)#define CIBR2_PHY	(0x50000000 + 0x38)#ifdef ADCM2650#define MAX_WIDTH	480#define MAX_HEIGHT	640#define MIN_WIDTH	72#define MIN_HEIGHT	72#endif#ifdef OV9640#define MAX_WIDTH	640#define MAX_HEIGHT	480#define MIN_WIDTH	88#define MIN_HEIGHT	72#endif#define WIDTH_DEFT	176#define HEIGHT_DEFT	144#define FRAMERATE_DEFT	0x0#define BUF_SIZE_DEFT	0xE1000#define SINGLE_DESC_TRANS_MAX  	8000#define MAX_DESC_NUM	0x400#define MAX_BLOCK_NUM	20/* * Buffer Size Calculate Formula * Buffer_Size = Page_Align (Max(window_size(VGA), window_size(CIF)*3) * Max(BPP)) * Buffer_Size = Page_Align (Max ((640 * 480), (352 * 288 *3)) * 3) = 0xE1000 */static camera_context_t  *g_camera_context = NULL;struct device *g_camera_device;#ifdef ADCM2650static camera_function_t  adcm2650_func;#endif#ifdef OV9640static camera_function_t  ov9640_func;#endifwait_queue_head_t  camera_wait_q;	/* /dev/videoX registration number */static int 	minor = 0;int		ci_dma_y;int		ci_dma_cb;int		ci_dma_cr;volatile int 	task_waiting = 0;static int 	still_image_mode = 0;static int	still_image_rdy	= 0;static int 	first_video_frame = 0;void pxa_ci_dma_irq_y(int channel, void *data, struct pt_regs *regs);void pxa_ci_dma_irq_cb(int channel, void *data, struct pt_regs *regs);void pxa_ci_dma_irq_cr(int channel, void *data, struct pt_regs *regs);static unsigned long ci_regs_base = 0;   /* for CI registers IOMEM mapping */#define CI_REG(x)             (* (volatile u32*)(x) )#define CI_REG_SIZE             0x40 /* 0x5000_0000 --- 0x5000_0038 * 64K */#define CI_REGS_PHYS            0x50000000  /* Start phyical address of CI registers *//*********************************************************************** * * Declarations * ***********************************************************************/// map of camera image format (camera.h) ==> capture interface format (ci.h)static const CI_IMAGE_FORMAT FORMAT_MAPPINGS[] = {        CI_RAW8,                   //RAW        CI_RAW9,        CI_RAW10,        CI_RGB444,                 //RGB        CI_RGB555,        CI_RGB565,        CI_RGB666_PACKED,          //RGB Packed         CI_RGB666,        CI_RGB888_PACKED,        CI_RGB888,        CI_RGBT555_0,              //RGB+Transparent bit 0        CI_RGBT888_0,        CI_RGBT555_1,              //RGB+Transparent bit 1          CI_RGBT888_1,            CI_INVALID_FORMAT,        CI_YCBCR422,               //YCBCR        CI_YCBCR422_PLANAR,        //YCBCR Planaried        CI_INVALID_FORMAT,        CI_INVALID_FORMAT};static int update_dma_chain( p_camera_context_t camera_context );static void start_dma_transfer( p_camera_context_t camera_context, unsigned block_id );static void stop_dma_transfer( p_camera_context_t camera_context );static int start_capture( p_camera_context_t camera_context, unsigned int block_id, unsigned int frames );void pxa_dma_repeat(camera_context_t  *cam_ctx);void pxa_dma_continue(camera_context_t *cam_ctx);/*********************************************************************** * * Private functions * ***********************************************************************//*Generate dma descriptorsPre-condition: these variables must be set properly                block_number, fifox_transfer_size                 dma_descriptors_virtual, dma_descriptors_physical, dma_descirptors_sizePost-condition: these variables will be set                fifox_descriptors_virtual, fifox_descriptors_physical                              fifox_num_descriptors */int update_dma_chain( p_camera_context_t camera_context ){	pxa_dma_desc *cur_des_virtual, *cur_des_physical, *last_des_virtual = NULL;	int des_transfer_size, remain_size;	unsigned int i,j;	int target_physical;	int target_virtual;	// clear descriptor pointers	camera_context->fifo0_descriptors_virtual = camera_context->fifo0_descriptors_physical = 0;	camera_context->fifo1_descriptors_virtual = camera_context->fifo1_descriptors_physical = 0;	camera_context->fifo2_descriptors_virtual = camera_context->fifo2_descriptors_physical = 0;	// calculate how many descriptors are needed per frame	camera_context->fifo0_num_descriptors = ( camera_context->fifo0_transfer_size + SINGLE_DESC_TRANS_MAX -1 )		 / SINGLE_DESC_TRANS_MAX;	camera_context->fifo1_num_descriptors = ( camera_context->fifo1_transfer_size + SINGLE_DESC_TRANS_MAX -1 )		 / SINGLE_DESC_TRANS_MAX;	camera_context->fifo2_num_descriptors = ( camera_context->fifo2_transfer_size + SINGLE_DESC_TRANS_MAX -1 )		 / SINGLE_DESC_TRANS_MAX;	// check if enough memory to generate descriptors	if ( (camera_context->fifo0_num_descriptors + camera_context->fifo1_num_descriptors +  			camera_context->fifo2_num_descriptors) * camera_context->block_number 			> camera_context->dma_descriptors_size)		return -1;	// generate fifo0 dma chains	camera_context->fifo0_descriptors_virtual = (unsigned)camera_context->dma_descriptors_virtual;	camera_context->fifo0_descriptors_physical = (unsigned)camera_context->dma_descriptors_physical;	cur_des_virtual = (pxa_dma_desc *)camera_context->fifo0_descriptors_virtual;	cur_des_physical = (pxa_dma_desc *)camera_context->fifo0_descriptors_physical;	for(i=0; i<camera_context->block_number; i++) {		// in each iteration, generate one dma chain for one frame		remain_size = camera_context->fifo0_transfer_size;		// assume the blocks are stored consecutively		target_physical = (unsigned)camera_context->buffer_physical + camera_context->block_size * i;		target_virtual = (unsigned)camera_context->buffer_virtual + camera_context->block_size * i;				for(j=0; j<camera_context->fifo0_num_descriptors; j++) {			 // set descriptor		        if (remain_size > SINGLE_DESC_TRANS_MAX)         			des_transfer_size = SINGLE_DESC_TRANS_MAX;        		else		       		des_transfer_size = remain_size;		        cur_des_virtual->ddadr = (unsigned)cur_des_physical + sizeof(pxa_dma_desc);        		cur_des_virtual->dsadr = CIBR0_PHY;       // FIFO0 physical address        		cur_des_virtual->dtadr = target_physical;        		cur_des_virtual->dcmd = des_transfer_size | DCMD_FLOWSRC | DCMD_INCTRGADDR | DCMD_BURST32;		        // advance pointers        		remain_size -= des_transfer_size;        		cur_des_virtual++;		        cur_des_physical++;        		target_physical += des_transfer_size;		        target_virtual += des_transfer_size;		}        		// stop the dma transfer on one frame captured		last_des_virtual = cur_des_virtual - 1;		//last_des_virtual->ddadr |= 0x1;	}	last_des_virtual->ddadr = ((unsigned)camera_context->fifo0_descriptors_physical);    	// generate fifo1 dma chains	if (camera_context->fifo1_transfer_size) {		// record fifo1 descriptors' start address		camera_context->fifo1_descriptors_virtual = (unsigned)cur_des_virtual;		camera_context->fifo1_descriptors_physical = (unsigned)cur_des_physical;		for(i=0; i<camera_context->block_number; i++) {			// in each iteration, generate one dma chain for one frame			remain_size = camera_context->fifo1_transfer_size;        		// assume the blocks are stored consecutively        		target_physical = (unsigned)camera_context->buffer_physical + camera_context->block_size * i         	                    + camera_context->fifo0_transfer_size;        		target_virtual = (unsigned)camera_context->buffer_virtual + camera_context->block_size * i         	                    + camera_context->fifo0_transfer_size;            		for(j=0; j<camera_context->fifo1_num_descriptors; j++) {        		        // set descriptor        			if (remain_size > SINGLE_DESC_TRANS_MAX)         		            des_transfer_size = SINGLE_DESC_TRANS_MAX;        		        else        		            des_transfer_size = remain_size;        		        cur_des_virtual->ddadr = (unsigned)cur_des_physical + sizeof(pxa_dma_desc);        		        cur_des_virtual->dsadr = CIBR1_PHY;      // FIFO1 physical address        		        cur_des_virtual->dtadr = target_physical;        		        cur_des_virtual->dcmd = des_transfer_size | DCMD_FLOWSRC | DCMD_INCTRGADDR | DCMD_BURST32;            		        // advance pointers        		        remain_size -= des_transfer_size;        		        cur_des_virtual++;        		        cur_des_physical++;        		        target_physical += des_transfer_size;        		        target_virtual += des_transfer_size;        			}        		// stop the dma transfer on one frame captured        		last_des_virtual = cur_des_virtual - 1;			//last_des_virtual->ddadr |= 0x1;        	}		last_des_virtual->ddadr = ((unsigned)camera_context->fifo1_descriptors_physical);	}    	// generate fifo2 dma chains	if (camera_context->fifo2_transfer_size) {		// record fifo1 descriptors' start address		camera_context->fifo2_descriptors_virtual = (unsigned)cur_des_virtual;		camera_context->fifo2_descriptors_physical = (unsigned)cur_des_physical;		for(i=0; i<camera_context->block_number; i++) {			// in each iteration, generate one dma chain for one frame			remain_size = camera_context->fifo2_transfer_size;			// assume the blocks are stored consecutively			target_physical = (unsigned)camera_context->buffer_physical + camera_context->block_size * i                             + camera_context->fifo0_transfer_size + camera_context->fifo1_transfer_size;    		        for(j=0; j<camera_context->fifo2_num_descriptors; j++) {                		// set descriptor                		if (remain_size > SINGLE_DESC_TRANS_MAX)                 			des_transfer_size = SINGLE_DESC_TRANS_MAX;                		else                			des_transfer_size = remain_size;                		cur_des_virtual->ddadr = (unsigned)cur_des_physical + sizeof(pxa_dma_desc);                		cur_des_virtual->dsadr = CIBR2_PHY;      // FIFO2 physical address                		cur_des_virtual->dtadr = target_physical;                		cur_des_virtual->dcmd = des_transfer_size | DCMD_FLOWSRC | DCMD_INCTRGADDR | DCMD_BURST32;                    		// advance pointers                		remain_size -= des_transfer_size;                		cur_des_virtual++;                		cur_des_physical++;                		target_physical += des_transfer_size;		        }		        // stop the dma transfer on one frame captured        		last_des_virtual = cur_des_virtual - 1;			//last_des_virtual->ddadr |= 0x1;        	}		last_des_virtual->ddadr = ((unsigned)camera_context->fifo2_descriptors_physical);	}	return 0;   }void start_dma_transfer( p_camera_context_t camera_context, unsigned block_id ){	pxa_dma_desc *des_virtual, *des_physical;    	if (block_id >= camera_context->block_number)        	return;        	// start channel 0	des_virtual = (pxa_dma_desc *)camera_context->fifo0_descriptors_virtual 		+ block_id * camera_context->fifo0_num_descriptors;	des_physical = (pxa_dma_desc *)camera_context->fifo0_descriptors_physical 		+ block_id * camera_context->fifo0_num_descriptors;        DDADR(camera_context->dma_channels[0]) = (int) des_physical;        DCSR(camera_context->dma_channels[0]) |= DCSR_RUN;	// start channel 1	if ( camera_context->fifo1_descriptors_virtual ) {		des_virtual = (pxa_dma_desc *)camera_context->fifo1_descriptors_virtual + 			block_id * camera_context->fifo1_num_descriptors;		des_physical = (pxa_dma_desc *)camera_context->fifo1_descriptors_physical + 			block_id * camera_context->fifo1_num_descriptors;                DDADR(camera_context->dma_channels[1]) = (int) des_physical;                DCSR(camera_context->dma_channels[1]) |= DCSR_RUN;	}	// start channel 2	if ( camera_context->fifo2_descriptors_virtual ) {		des_virtual = (pxa_dma_desc *)camera_context->fifo2_descriptors_virtual + 			block_id * camera_context->fifo2_num_descriptors;		des_physical = (pxa_dma_desc *)camera_context->fifo2_descriptors_physical + 			block_id * camera_context->fifo2_num_descriptors;                DDADR(camera_context->dma_channels[2]) = (int) des_physical;                DCSR(camera_context->dma_channels[2]) |= DCSR_RUN;	}}void stop_dma_transfer( p_camera_context_t camera_context ){	        int ch0, ch1, ch2;        ch0 = camera_context->dma_channels[0];        ch1 = camera_context->dma_channels[1];        ch2 = camera_context->dma_channels[2];        DCSR(ch0) &= ~DCSR_RUN;        DCSR(ch1) &= ~DCSR_RUN;        DCSR(ch2) &= ~DCSR_RUN;	return;}int start_capture( p_camera_context_t camera_context, unsigned int block_id, unsigned int frames ){	int   status;	// clear ci fifo	ci_reset_fifo();	ci_clear_int_status(0xFFFFFFFF);	// start dma	start_dma_transfer(camera_context, block_id);		// start capture	status = camera_context->camera_functions->start_capture(camera_context, frames);	return status;}/*********************************************************************** * * Init/Deinit APIs * ***********************************************************************/int camera_init( p_camera_context_t camera_context ){	int   ret = 0;	int i;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精久久久久久久久久久| 国产精品久久看| 99国产麻豆精品| 26uuu色噜噜精品一区二区| 欧美亚洲高清一区二区三区不卡| 日韩一区二区三区电影在线观看 | 午夜欧美在线一二页| 无码av中文一区二区三区桃花岛| 久久精品视频在线免费观看| 尤物av一区二区| 国产成人av在线影院| 8x8x8国产精品| 亚洲欧洲99久久| 韩国欧美国产1区| 欧美日韩成人一区| 亚洲欧美视频一区| 国产成人亚洲综合色影视| 91精品国产综合久久久久久漫画| 亚洲素人一区二区| 国产精品资源站在线| 日韩一区二区免费在线观看| 亚洲午夜免费福利视频| 不卡的av网站| 久久精品一区二区三区av| 男人的天堂亚洲一区| 欧美日韩成人一区| 午夜精品久久久久久不卡8050 | 日本欧美一区二区在线观看| 欧美性受极品xxxx喷水| 一区二区在线观看视频在线观看| 99re在线精品| 成人欧美一区二区三区小说| 成人av在线资源| 国产精品国产三级国产aⅴ中文 | 亚洲精品国久久99热| 成人午夜在线免费| 欧美激情中文不卡| av亚洲精华国产精华精| 国产精品久久久久久久久图文区| 高清av一区二区| 亚洲图片欧美激情| 在线免费观看日本欧美| 亚洲超碰精品一区二区| 欧美一区二区三区婷婷月色| 久久99久久久久久久久久久| 欧美成人性福生活免费看| 久久99久久99小草精品免视看| 精品国产制服丝袜高跟| 国产精品一区在线| 国产精品人成在线观看免费| 91免费视频网址| 亚洲成人自拍偷拍| 91精品婷婷国产综合久久性色| 久久av老司机精品网站导航| 国产区在线观看成人精品| 成人国产亚洲欧美成人综合网| 综合久久久久久久| 欧美久久久影院| 国产在线一区二区综合免费视频| 欧美激情中文字幕一区二区| 日本韩国一区二区三区| 蜜臂av日日欢夜夜爽一区| 国产日韩欧美一区二区三区综合| 99久久er热在这里只有精品66| 亚洲一区二区在线播放相泽| 日韩欧美色电影| 国产高清视频一区| 亚洲最新在线观看| 精品奇米国产一区二区三区| 99久久国产免费看| 男女男精品视频| 成人欧美一区二区三区1314| 91 com成人网| 99久久精品99国产精品| 蜜桃av一区二区在线观看| 亚洲欧洲无码一区二区三区| 日韩视频一区二区在线观看| av在线播放一区二区三区| 日本不卡123| 最新国产の精品合集bt伙计| 欧美一区二区三区日韩| 91免费小视频| 国产精品69久久久久水密桃| 亚洲午夜国产一区99re久久| 国产欧美一区二区精品婷婷 | 久久久www成人免费无遮挡大片| 91免费小视频| 国产乱理伦片在线观看夜一区| 亚洲主播在线播放| 国产精品的网站| 精品国产露脸精彩对白| 欧美嫩在线观看| 日本韩国一区二区三区| 成人性生交大片免费看在线播放| 久久爱www久久做| 首页国产丝袜综合| 亚洲精品国产a| 国产精品久久三| 国产午夜久久久久| 精品1区2区在线观看| 91精品国产欧美日韩| 色国产精品一区在线观看| 成人av免费在线播放| 成人小视频在线观看| 国产精品一卡二卡| 国产精品综合av一区二区国产馆| 日本中文字幕不卡| 亚洲成精国产精品女| 亚洲一卡二卡三卡四卡五卡| 亚洲婷婷综合色高清在线| 国产精品美女久久久久久2018 | 精品久久一区二区| 51午夜精品国产| 91精品国模一区二区三区| 欧美日韩国产系列| 欧美色图第一页| 欧美色手机在线观看| 欧美午夜免费电影| 欧美群妇大交群的观看方式| 欧美欧美欧美欧美| 91精品国产乱码| 欧美成人性福生活免费看| 日韩精品在线看片z| 欧美va亚洲va香蕉在线| 日韩美女视频在线| 国产喷白浆一区二区三区| 国产清纯美女被跳蛋高潮一区二区久久w| 国产日韩欧美不卡在线| 国产精品超碰97尤物18| 亚洲欧美福利一区二区| 亚洲国产精品一区二区久久| 亚洲午夜在线电影| 麻豆精品国产传媒mv男同| 国产激情91久久精品导航| 99久久综合99久久综合网站| 91国产免费看| 欧美一级免费观看| 国产亚洲欧美日韩在线一区| 中文字幕一区二区5566日韩| 亚洲激情第一区| 久久99国产精品成人| 99久久精品国产一区| 欧美精品乱码久久久久久 | 国产精品影视在线| 91麻豆免费看| 欧美一区二区三区免费大片| 国产日韩欧美制服另类| 亚洲综合免费观看高清完整版在线 | 国产亚洲一区字幕| 亚洲男人的天堂av| 男女视频一区二区| 欧美一区二区三区免费| 日本一区二区三区国色天香 | heyzo一本久久综合| 在线中文字幕不卡| 日韩免费电影一区| 亚洲少妇30p| 麻豆91小视频| 99精品在线免费| 日韩一区二区三区免费观看| 中文字幕在线播放不卡一区| 亚洲国产一区二区a毛片| 国产一区二区三区综合| 91精品办公室少妇高潮对白| 欧美一区二区三区爱爱| 综合色天天鬼久久鬼色| 开心九九激情九九欧美日韩精美视频电影| 成人免费视频视频| 777久久久精品| 中文字幕在线免费不卡| 秋霞电影网一区二区| 色网站国产精品| 久久这里只精品最新地址| 亚洲风情在线资源站| eeuss鲁片一区二区三区| 日韩精品一区二区三区在线播放 | 国产丝袜在线精品| 日本美女一区二区三区视频| 91女厕偷拍女厕偷拍高清| 国产日韩亚洲欧美综合| 久久国产精品露脸对白| 91精品中文字幕一区二区三区| 亚洲天堂精品视频| 成人av动漫在线| 亚洲国产激情av| 国产一区二区三区久久悠悠色av| 制服丝袜一区二区三区| 亚洲成人免费在线| 欧美制服丝袜第一页| 亚洲天堂成人在线观看| av电影在线观看完整版一区二区| 国产午夜亚洲精品不卡 | 蜜臀av性久久久久蜜臀aⅴ流畅| 日本韩国一区二区三区| 亚洲激情图片一区| 在线免费不卡电影| 亚洲国产成人va在线观看天堂| 色呦呦日韩精品| 亚洲综合另类小说| 色狠狠一区二区|