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

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

?? pxa_camera-hzh.c

?? 基于intel xscale下的linux系統camera驅動程序
?? 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一区二区三区免费野_久草精品视频
亚洲九九爱视频| 日韩精品中文字幕在线不卡尤物| 久久国产福利国产秒拍| 亚洲成a天堂v人片| 日精品一区二区三区| 日本网站在线观看一区二区三区| 亚洲女人小视频在线观看| 欧美激情一区二区在线| 色域天天综合网| 成人黄色免费短视频| 粉嫩蜜臀av国产精品网站| 国产一区91精品张津瑜| 国产美女精品一区二区三区| 麻豆一区二区三| 日韩成人精品视频| 捆绑调教一区二区三区| 日韩av午夜在线观看| 日韩在线一区二区| 老司机午夜精品99久久| 青青草国产精品97视觉盛宴| 日产国产欧美视频一区精品| 日韩电影免费在线观看网站| 免费在线观看一区二区三区| 青青草97国产精品免费观看 | 91精品蜜臀在线一区尤物| 91在线观看免费视频| 色网站国产精品| 在线观看成人小视频| 欧美性大战久久| 777a∨成人精品桃花网| 精品不卡在线视频| 日韩欧美中文一区| 国产性天天综合网| 中文字幕一区二区三区四区| 亚洲欧美一区二区三区极速播放 | 性做久久久久久| 天天亚洲美女在线视频| 亚洲成人午夜影院| 九九视频精品免费| 91性感美女视频| 91网站在线观看视频| 欧美欧美欧美欧美| 久久久久亚洲综合| 中文字幕成人av| 亚洲国产欧美日韩另类综合| 久久99久久久欧美国产| 成人毛片在线观看| 欧美一级日韩免费不卡| 国产欧美一区二区精品性| 久久综合九色综合97婷婷| **性色生活片久久毛片| 激情综合色丁香一区二区| 在线精品视频一区二区三四| 国产欧美日韩麻豆91| 韩日av一区二区| 欧美一区二区在线免费播放| 亚洲自拍偷拍麻豆| 一本久道久久综合中文字幕| 国产精品久久久久婷婷| 国产精品99久久久久久宅男| 日韩欧美中文字幕一区| 日韩av电影免费观看高清完整版在线观看| fc2成人免费人成在线观看播放 | 成人免费视频caoporn| 欧美一区二区三区在线看| 亚洲午夜精品在线| 欧美在线一二三| 亚洲与欧洲av电影| 欧美性大战久久久久久久| 亚洲欧美激情插| 日本精品一级二级| 亚洲综合在线视频| 在线亚洲欧美专区二区| 亚洲在线中文字幕| 欧美性受极品xxxx喷水| 亚洲国产精品久久人人爱 | 精品一区精品二区高清| 日韩免费在线观看| 国模娜娜一区二区三区| 久久人人超碰精品| 成人性视频免费网站| 国产精品天天看| 99久久综合色| 亚洲综合久久久久| 777xxx欧美| 精品一区精品二区高清| 日本一区二区三区国色天香 | 7777精品伊人久久久大香线蕉的| 午夜精品福利视频网站 | 国产不卡一区视频| 国产精品久久久久久久久免费桃花| 成人高清免费观看| 亚洲一区二区av在线| 717成人午夜免费福利电影| 九九热在线视频观看这里只有精品| www亚洲一区| 在线看国产一区二区| 免费成人美女在线观看.| 国产欧美一区二区三区鸳鸯浴| yourporn久久国产精品| 五月激情六月综合| 久久精品人人做人人爽人人| 99国产精品一区| 日韩电影免费一区| 国产精品女上位| 538在线一区二区精品国产| 国产在线精品免费av| 亚洲精品你懂的| 精品久久久久一区二区国产| av男人天堂一区| 蜜桃传媒麻豆第一区在线观看| 国产精品久久久久久久久久免费看 | 91麻豆精品国产91久久久资源速度 | 国产精品自拍网站| 亚洲男同性视频| 国产亚洲一区二区三区| 日本韩国欧美一区| 国产传媒欧美日韩成人| 亚洲亚洲精品在线观看| 中文字幕不卡的av| 欧美xxxxx裸体时装秀| 91看片淫黄大片一级在线观看| 久久99精品国产91久久来源| 亚洲在线视频一区| 国产精品久久毛片| 精品国产亚洲在线| 8x8x8国产精品| 在线观看网站黄不卡| 懂色av噜噜一区二区三区av| 男人的天堂久久精品| 亚洲精品中文字幕乱码三区| 久久综合九色综合欧美就去吻 | 精品久久久久久久久久久院品网| 欧美丝袜丝交足nylons| 成人av在线网| 高清不卡一区二区在线| 国产乱子伦一区二区三区国色天香| 午夜国产精品一区| 亚洲综合精品久久| 一区二区三区电影在线播| 国产精品不卡一区二区三区| 国产三级一区二区| 久久亚洲免费视频| 精品国产乱码久久久久久牛牛 | 亚洲综合在线观看视频| 中文字幕亚洲不卡| 18涩涩午夜精品.www| 中文字幕一区二区三中文字幕| 国产精品免费视频观看| 国产精品网站导航| 成人欧美一区二区三区| 自拍视频在线观看一区二区| 国产精品成人一区二区三区夜夜夜| 欧美激情在线一区二区| 国产精品二三区| 亚洲综合免费观看高清完整版在线| 亚洲激情图片一区| 亚洲已满18点击进入久久| 亚洲伊人伊色伊影伊综合网| 天天综合日日夜夜精品| 日本大胆欧美人术艺术动态| 美女mm1313爽爽久久久蜜臀| 国产一区二区三区黄视频| 国产1区2区3区精品美女| 成人18视频在线播放| 91美女片黄在线观看| 欧美偷拍一区二区| 日韩欧美高清dvd碟片| 精品处破学生在线二十三| 国产精品网友自拍| 亚洲一区二区三区四区在线免费观看| 亚洲午夜精品17c| 久久精品国产第一区二区三区| 国产成人午夜视频| 91亚洲精品一区二区乱码| 欧美日韩一区国产| 欧美大片拔萝卜| 国产精品九色蝌蚪自拍| 午夜精品福利视频网站| 国产一区中文字幕| 99久久精品99国产精品| 欧美一区二区三区日韩视频| 国产亚洲1区2区3区| 亚洲综合成人在线| 国产精品2024| 欧美片网站yy| 国产精品青草久久| 免费久久99精品国产| 成人精品小蝌蚪| 日韩午夜av一区| 亚洲美女一区二区三区| 美女诱惑一区二区| 91国在线观看| 久久久天堂av| 视频一区二区中文字幕| 91同城在线观看| 欧美国产日韩精品免费观看| 五月天国产精品| 色94色欧美sute亚洲线路二| 久久久精品日韩欧美|