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

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

?? cam_interface1.c

?? 這是一個用c語言編寫的攝像頭驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
#define MODULE
#define __KERNEL__

#include <linux/module.h>
#include <linux/kernel.h>#include <linux/mm.h>
#include <linux/slab.h>
#include <asm/dma.h>#include <asm/io.h>
#include <linux/fs.h>
#include <linux/sched.h>

#include <linux/types.h>
#include <linux/errno.h>

#include <asm/uaccess.h>
#include <asm/semaphore.h>
#include <asm/arch/S3C2440.h>#include <asm/arch/irqs.h>
#include "cam_interface.h"
MODULE_LICENSE("GPL");MODULE_AUTHOR("Cuijinbird");

#define CAM_MAJOR 0

#define CAM_BASE_ADD	0x4F000000	//Camera Interface.  Edited for 2440A#define CISRCFMT            __REG(CAM_BASE_ADD+0x00) // RW Input Source Format
#define CIWDOFST            __REG(CAM_BASE_ADD+0x04) // Window offset register
#define CIGCTRL             __REG(CAM_BASE_ADD+0x08) // Global control register
#define CICOYSA0            __REG(CAM_BASE_ADD+0x18) // Y 1 st frame start address 
#define CICOYSA1            __REG(CAM_BASE_ADD+0x1C) // Y 2 nd frame start address 
#define CICOYSA2            __REG(CAM_BASE_ADD+0x20) // Y 3 rd frame start address 
#define CICOYSA3            __REG(CAM_BASE_ADD+0x24) // Y 4 th frame start address 
#define CICOCBSA0           __REG(CAM_BASE_ADD+0x28) // Cb 1 st frame start address 
#define CICOCBSA1           __REG(CAM_BASE_ADD+0x2C) // Cb 2 nd frame start address 
#define CICOCBSA2           __REG(CAM_BASE_ADD+0x30) // Cb 3 rd frame start address 
#define CICOCBSA3           __REG(CAM_BASE_ADD+0x34) // Cb 4 th frame start address 
#define CICOCRSA0           __REG(CAM_BASE_ADD+0x38) // Cr 1 st frame start address 
#define CICOCRSA1           __REG(CAM_BASE_ADD+0x3C) // Cr 2 nd frame start address 
#define CICOCRSA2           __REG(CAM_BASE_ADD+0x40) // Cr 3 rd frame start address 
#define CICOCRSA3           __REG(CAM_BASE_ADD+0x44) // Cr 4 th frame start address 
#define CICOTRGFMT          __REG(CAM_BASE_ADD+0x48) // Target image format of codec
#define CICOCTRL            __REG(CAM_BASE_ADD+0x4C) // Codec DMA control related
#define CICOSCPRERATIO      __REG(CAM_BASE_ADD+0x50) // Codec pre-scaler ratio control
#define CICOSCPREDST        __REG(CAM_BASE_ADD+0x54) // Codec pre-scaler destination
#define CICOSCCTRL          __REG(CAM_BASE_ADD+0x58) // Codec main-scaler control
#define CICOTAREA           __REG(CAM_BASE_ADD+0x5C) // Codec pre-scaler destination
#define CICOSTATUS          __REG(CAM_BASE_ADD+0x64) // Codec path status
#define CIPRCLRSA0          __REG(CAM_BASE_ADD+0x6C) // RGB 1 st frame start address 
#define CIPRCLRSA1          __REG(CAM_BASE_ADD+0x70) // RGB 2 nd frame start address 
#define CIPRCLRSA2          __REG(CAM_BASE_ADD+0x74) // RGB 3 rd frame start address 
#define CIPRCLRSA3          __REG(CAM_BASE_ADD+0x78) // RGB 4 th frame start address 
#define CIPRTRGFMT          __REG(CAM_BASE_ADD+0x7C) // Target image format of preview
#define CIPRCTRL            __REG(CAM_BASE_ADD+0x80) // Preview DMA control related
#define CIPRSCPRERATIO      __REG(CAM_BASE_ADD+0x84) // Preview pre-scaler ratio control
#define CIPRSCPREDST        __REG(CAM_BASE_ADD+0x88) // Preview pre-scaler destination
#define CIPRSCCTRL          __REG(CAM_BASE_ADD+0x8C) // Preview main-scaler control
#define CIPRTAREA           __REG(CAM_BASE_ADD+0x90) // Preview pre-scaler destination
#define CIPRSTATUS          __REG(CAM_BASE_ADD+0x98) // Preview path status
#define CIIMGCPT            __REG(CAM_BASE_ADD+0xA0) // Image capture enable command#define CICOYSA(__x)        __REG(CAM_BASE_ADD+0x18 + (__x)*4 ) 
#define CICOCBSA(__x)       __REG(CAM_BASE_ADD+0x28 + (__x)*4 )
#define CICOCRSA(__x)       __REG(CAM_BASE_ADD+0x38 + (__x)*4 ) 
#define CIPRCLRSA(__x)      __REG(CAM_BASE_ADD+0x6C + (__x)*4 )

typedef struct {
	unsigned int sa[4]; //dma start address register. The 4 elements denotes the 4 pingpong memories and 4 frames.
} cam_dma_addr;

typedef struct {	
	unsigned int pre_ratio;
	unsigned int pre_destination;
	unsigned int main_control;
	unsigned int target_area;
} cam_scaler_regs;

typedef struct {
	cam_dma_addr Y;
	cam_dma_addr Cb;
	cam_dma_addr Cr;
	unsigned int target_format;
	unsigned int dma_control;
	cam_scaler_regs scaler;	unsigned int empty; //empty address
	unsigned int status;
} cam_codec;

typedef struct {
	cam_dma_addr RGB;
	unsigned int target_format;
	unsigned int dma_control;
	cam_scaler_regs scaler;	unsigned int empty;  //empty address
	unsigned int status;
} cam_prev;

typedef struct {
	unsigned int source_format;
	unsigned int window_offset;
	unsigned int global_control;	unsigned int empty1[3];   //empty address
	cam_codec codec;	unsigned int empty2;	//empty address
	cam_prev prev;	unsigned int empty3;    //empty address
	unsigned int image_capture;
} cam_interface_regs;

/* Parameters
CoDstWidth: Destination Width of Codec Path
CoDstHeight: Destination Height of Codec Path
PrDstWidth: Destination Width of Preview Path
PrDstHeight: Destination Height of Preview Path
WinHorOffset: Size of Window Offset for Horizontal Direction
WinVerOffset: Size of Window Offset for Vertical Direction
CoFrameBuffer: Start Address for Codec DMA
PrFrameBuffer: Start Address for Previe DMA
*/enum camif_capturing {
        CAMIF_BOTH_DMA_ON  = 0x10,
	CAMIF_DMA_ON   	   = 0x8,
	CAMIF_BOTH_DMA_OFF = 0x2,
	CAMIF_DMA_OFF      = 0x1,
	/*------------------------*/
	CAMIF_DMA_OFF_L_IRQ= 0x20,
};
enum cap_status {	PREPARE = 0x1,	CAPTURING = 0x2,	FINISH =0x3,};

typedef struct {
	char name[6];	int major;
	
	cam_interface_regs *regs;
	
	unsigned int CodecMode, PrevMode;
	
	char *cbuf;
	char *pbuf;
	dma_addr_t c_phyaddr, p_phyaddr;
	unsigned int cbuf_size, pbuf_size;
	
	int c_irq, p_irq;
	
	unsigned int c_format, p_format;
	unsigned int c_pp_num, p_pp_num;

	unsigned int camCodecStatus, camPrevStatus;
	unsigned int CoDstWidth, CoDstHeight;
	unsigned int PrDstWidth, PrDstHeight;
	unsigned int WinHorOffset, WinVerOffset;
	enum camif_capturing exec;	enum cap_status status;
	unsigned int now_frame_no;
	
	struct semaphore sem;
	wait_queue_head_t wq;

} cam_dev;

ssize_t cam_read(struct file *filp, char *buf, size_t count, loff_t *f_pos);
struct file_operations cam_fops = {
	read:	cam_read,//cam_read,
	ioctl:	NULL,//cam_ioctl,
	open:	NULL,//cam_open,
	release:NULL,//cam_release,
};

cam_dev Cam_Dev = {
	name:				"video",	major:				CAM_MAJOR,
	cbuf:				NULL,
	pbuf:				NULL,
	c_phyaddr:			CAM_FRAMEBUFFER_C,
	p_phyaddr:			CAM_FRAMEBUFFER_P,
	CodecMode:			1,
	PrevMode:			0,
	c_irq:				IRQ_CAM_C,	p_irq:				IRQ_CAM_P,
	c_format:			CAM_CCIR422,
	p_format:			CAM_RGB24B,
	c_pp_num:			1,
	p_pp_num:			1,
	CoDstWidth:			720,
	CoDstHeight:		540,
	PrDstWidth:			720,
	PrDstHeight:		540,
	WinHorOffset:		0,
	WinVerOffset:		0,
	now_frame_no:		0,
};

/********************************************************
 cam_codec_irq - camara interface codec interrupt handler
 
 Description:	
 - irq : interrupt number
 - dev : cam_dev structure
*/
static void cam_codec_irq(int irq, void *dev_id, struct pt_regs *regs)
{	cam_dev *dev = (cam_dev *)dev_id;
	unsigned int ov = fld_v(dev->regs->codec.status, 29, 3);
	if (ov)
	{
		printk("CODEC: FIFO error(0x%08x) and corrected\n",ov);
		dev->regs->window_offset |= (1<<30) | (1<<15) | (1<<14);
		dev->regs->window_offset &= ~((1<<30) | (1<<15) | (1<<14));
	}
	dev->now_frame_no = (fld_v(dev->regs->codec.status, 26, 2) + 2) % 4;	if (dev->status == PREPARE)	{		dev->status = CAPTURING;		printk("Start capturing...\n");		return ;	}
	if (dev->status == CAPTURING)	{		wake_up_interruptible(&dev->wq);		dev->status = FINISH;	}
}

/********************************************************
 cam_prev_irq - camara interface preview interrupt handler
 
 Description:	
 - irq : interrupt number
 - dev : cam_dev structure
*/
static void cam_prev_irq(int irq, void *dev_id, struct pt_regs *regs)
{	cam_dev *dev = (cam_dev *)dev_id;
	unsigned int ov = fld_v(dev->regs->prev.status, 30, 2);
	if (ov)
	{
		printk("PREVIEW: FIFO error(0x%08x) and corrected\n",ov);
		dev->regs->window_offset |= (1<<13) | (1<<12);
		dev->regs->window_offset &= ~((1<<13) | (1<<12));
	}
	dev->now_frame_no = (fld_v(dev->regs->prev.status, 26, 2) + 2) % 4;
	wake_up_interruptible(&dev->wq);
}

static void cam_release_irq()
{
	if (Cam_Dev.CodecMode)	{		disable_irq(Cam_Dev.c_irq);
		free_irq(Cam_Dev.c_irq, (void *)&Cam_Dev);	}	if (Cam_Dev.PrevMode)	{		disable_irq(Cam_Dev.p_irq);
		free_irq(Cam_Dev.p_irq, (void *)&Cam_Dev);	}
}

/********************************************************
 cam_irq_request - camara interface interrupt register function
					request the system interrupt line number
*/
static int cam_request_irq()
{
	int ret = 0;
	if (Cam_Dev.CodecMode) 
	{
		if ((ret = request_irq(Cam_Dev.c_irq, cam_codec_irq, SA_INTERRUPT, Cam_Dev.name, &Cam_Dev))) {
			printk("request_irq(CAM_C) failed.\n");			return ret;
		}
	}
	if (Cam_Dev.PrevMode)
	{
		if ((ret = request_irq(Cam_Dev.p_irq, cam_prev_irq, SA_INTERRUPT, Cam_Dev.name, &Cam_Dev))) {
			printk("request_irq(CAM_P) failed.\n");			return ret;
		}
	}
	return 0;
}

/********************************************************
 CalculateBurstSize - Calculate the busrt lengths
 
 Description:	
 - dstHSize: the number of the byte of H Size.
 
*/
void CalculateBurstSize(unsigned int hSize, unsigned int *mainBurstSize, unsigned int *remainedBurstSize)
{
	unsigned int tmp;	
	tmp=(hSize/4)%16;
	switch(tmp) {
		case 0:
			*mainBurstSize=16;
			*remainedBurstSize=16;
			break;
		case 4:
			*mainBurstSize=16;
			*remainedBurstSize=4;
			break;
		case 8:
			*mainBurstSize=16;
			*remainedBurstSize=8;
			break;
		default: 
			tmp=(hSize/4)%8;
			switch(tmp) {
				case 0:
					*mainBurstSize=8;
					*remainedBurstSize=8;
					break;
				case 4:
					*mainBurstSize=8;
					*remainedBurstSize=4;
				default:
					*mainBurstSize=4;
					tmp=(hSize/4)%4;
					*remainedBurstSize= (tmp) ? tmp: 4;
					break;
			}
			break;
	}		    	    		
}

/********************************************************
 CalculatePrescalerRatioShift - none
 
 Description:	
 - none
 
*/
void CalculatePrescalerRatioShift(unsigned int SrcSize, unsigned int DstSize, unsigned int *ratio,unsigned int *shift)
{
	if(SrcSize>=64*DstSize) {
		while(1);
	}
	else if(SrcSize>=32*DstSize) {
		*ratio=32;
		*shift=5;
	}
	else if(SrcSize>=16*DstSize) {
		*ratio=16;
		*shift=4;
	}
	else if(SrcSize>=8*DstSize) {
		*ratio=8;
		*shift=3;
	}
	else if(SrcSize>=4*DstSize) {
		*ratio=4;
		*shift=2;
	}
	else if(SrcSize>=2*DstSize) {
		*ratio=2;
		*shift=1;
	}
	else {
		*ratio=1;
		*shift=0;
	}    	
}

/********************************************************
 cam_interface_init - all camera interface registers initialize
*/
int cam_interface_init(void)
{
	unsigned int WinOfsEn;
	unsigned int divisor, multiplier;
	unsigned int MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC, MainBurstSizeRGB, RemainedBurstSizeRGB;
	unsigned int H_Shift, V_Shift, PreHorRatio, PreVerRatio, MainHorRatio, MainVerRatio;
	unsigned int SrcWidth, SrcHeight;
	unsigned int ScaleUp_H_Co, ScaleUp_V_Co, ScaleUp_H_Pr, ScaleUp_V_Pr;
	unsigned int YFrameInterval, CbFrameInterval, CrFrameInterval, RGBFrameInterval;
	
	unsigned int CoFrameBuffer = Cam_Dev.c_phyaddr, PrFrameBuffer = Cam_Dev.p_phyaddr;

	//constant for calculating codec dma address
	if(Cam_Dev.c_format == CAM_CCIR422)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99re66热这里只有精品3直播| 成人网页在线观看| 国内精品久久久久影院薰衣草| 成人开心网精品视频| 欧美精品三级在线观看| 国产精品欧美极品| 久久精工是国产品牌吗| 色老汉一区二区三区| 欧美哺乳videos| 亚洲电影欧美电影有声小说| 成人黄色国产精品网站大全在线免费观看| 欧美三级中文字| 亚洲女同ⅹxx女同tv| 国产精品综合网| 日韩免费电影网站| 日韩中文字幕区一区有砖一区| 972aa.com艺术欧美| 欧美国产日韩亚洲一区| 国产一区二区视频在线| 日韩天堂在线观看| 免费成人在线网站| 4438x成人网最大色成网站| 亚洲一区二区三区视频在线播放| 成年人网站91| 国产精品久久久久久久久久久免费看| 狠狠久久亚洲欧美| 久久综合网色—综合色88| 久草在线在线精品观看| 日韩免费福利电影在线观看| 青青青爽久久午夜综合久久午夜| 欧美日韩精品一区二区三区| 亚洲影院理伦片| 欧美日韩精品一区二区| 日韩中文字幕区一区有砖一区| 欧美日韩在线播放三区四区| 亚洲国产另类av| 欧美人妇做爰xxxⅹ性高电影| 亚洲成av人片| 日韩美女主播在线视频一区二区三区| 日本欧美肥老太交大片| 日韩免费福利电影在线观看| 国精产品一区一区三区mba桃花 | 成人白浆超碰人人人人| 久久精品一区二区三区四区| 国产福利91精品一区二区三区| 欧美xxxxxxxxx| 国产成人精品一区二区三区四区| 国产欧美一区二区三区在线看蜜臀| 国产aⅴ综合色| 亚洲精品国久久99热| 在线观看91精品国产麻豆| 免费一区二区视频| 国产亚洲一区二区在线观看| 91香蕉视频污| 天堂av在线一区| 久久久国产精品麻豆| av电影在线观看完整版一区二区| 亚洲欧美韩国综合色| 91精品欧美福利在线观看| 极品少妇xxxx偷拍精品少妇| 亚洲欧洲精品天堂一级| 欧美精品三级在线观看| 成人免费黄色大片| 午夜在线成人av| 国产色产综合色产在线视频| 欧洲av一区二区嗯嗯嗯啊| 精品综合久久久久久8888| 中文字幕一区av| 精品少妇一区二区三区在线视频| 成人激情动漫在线观看| 日韩精品五月天| 国产精品欧美久久久久一区二区 | 亚洲精品免费在线| 欧美一区二区三区思思人| 岛国精品一区二区| 奇米影视在线99精品| 1000部国产精品成人观看| 日韩视频不卡中文| 色婷婷亚洲一区二区三区| 极品少妇一区二区| 亚洲成人av资源| 国产精品福利一区二区| 精品久久久久久综合日本欧美| 91亚洲精品久久久蜜桃网站| 激情国产一区二区| 视频在线观看一区| 亚洲精品第1页| 中文字幕欧美区| 精品国产麻豆免费人成网站| 欧美日韩国产精品成人| 色婷婷av久久久久久久| 国产白丝网站精品污在线入口 | 亚洲乱码一区二区三区在线观看| 日韩欧美国产精品| 欧美电影在哪看比较好| 91久久人澡人人添人人爽欧美| 懂色av中文一区二区三区| 麻豆91在线看| 视频一区视频二区中文| 亚洲成人动漫精品| 亚洲午夜精品17c| 一区二区三区加勒比av| 最新欧美精品一区二区三区| 国产精品你懂的在线欣赏| 久久久精品日韩欧美| 精品美女在线观看| 日韩欧美中文字幕制服| 国产亲近乱来精品视频| 欧美高清视频在线高清观看mv色露露十八| 成人免费毛片嘿嘿连载视频| 国产一区二区电影| 精品无人区卡一卡二卡三乱码免费卡| 午夜精品视频一区| 亚洲成人激情av| 天使萌一区二区三区免费观看| 亚洲欧美经典视频| 亚洲最大成人综合| 亚洲.国产.中文慕字在线| 亚洲国产色一区| 日本成人在线视频网站| 日韩精品乱码免费| 日韩av在线免费观看不卡| 美女一区二区视频| 激情伊人五月天久久综合| 国产一区二区三区四区在线观看| 国产精品中文欧美| 成人动漫一区二区三区| 色香色香欲天天天影视综合网| 在线观看一区二区视频| 911国产精品| 久久久久一区二区三区四区| 91超碰这里只有精品国产| 性久久久久久久久久久久| 亚洲一区免费观看| 尤物av一区二区| 五月天欧美精品| 紧缚捆绑精品一区二区| 99久久精品国产毛片| 欧美图区在线视频| 日韩欧美一区中文| 国产精品色哟哟网站| 一区二区三区欧美在线观看| 免费成人在线影院| 成人性生交大片免费看视频在线| 91国在线观看| 精品国产乱码久久久久久久久 | 麻豆国产精品一区二区三区| 国产精品一区三区| 在线免费不卡电影| 精品91自产拍在线观看一区| 亚洲视频在线一区观看| 视频一区二区国产| 成人久久久精品乱码一区二区三区 | 99国产欧美久久久精品| 91精品免费在线观看| 国产精品传媒在线| 日韩国产高清影视| 97se亚洲国产综合自在线不卡 | 亚洲一区二区综合| 国产一区二区三区四| 欧美性大战久久久| 中文字幕av一区二区三区高| 日韩电影在线看| 91在线视频官网| 久久久欧美精品sm网站| 午夜精品国产更新| caoporn国产一区二区| 精品国产乱码久久| 亚洲一区电影777| 成人h动漫精品| 日韩精品专区在线| 亚洲高清免费视频| 91麻豆精东视频| 国产欧美日韩综合精品一区二区| 日产欧产美韩系列久久99| 一本色道**综合亚洲精品蜜桃冫| 久久久亚洲高清| 青青国产91久久久久久| 欧美日韩在线不卡| 亚洲日本在线a| 不卡视频一二三四| 国产网红主播福利一区二区| 麻豆精品一二三| 欧美一区二区精品| 视频在线观看国产精品| 欧美三级中文字幕在线观看| 亚洲欧美在线观看| av成人免费在线| 国产精品免费av| 国产91色综合久久免费分享| 26uuu亚洲| 国产一区二区三区四区五区美女| 日韩免费观看高清完整版| 日韩高清一区在线| 日韩一区二区在线观看视频 | 欧美日韩一区二区电影| 亚洲欧洲一区二区在线播放| 成人精品亚洲人成在线| 亚洲国产高清不卡| 99久久伊人精品|