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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? csi.c

?? freescale MX21 0V9650攝像頭驅(qū)動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
*
*	MX21 CSI driver
*
*	cliff.wong@motorola.com
*	12 Jun, 04
*/

#include <asm/dma.h>
#include <asm/mach/dma.h>
#include <asm/arch/dma.h>
#include <asm/arch/mx2.h>
#include <asm/arch/platform.h>
#include "khead.h"
#include "csi.h"
#include "ov9650.h"

//tapeout 2 specific
#ifndef	_reg_CSI_CSICR3
#define	_reg_CSI_CSICR3		(*((volatile unsigned long *)(CSI_IO_ADDRESS(CSI_BASE_ADDR+0x1C))))
#endif

//reset values
#define CSICR1_RESET_VAL	0x40000800
#define CSICR2_RESET_VAL	0x0
#define CSICR3_RESET_VAL	0x0

//csi control reg 1
#define BIT_SWAP16_EN		(0x1 << 31)
#define BIT_EXT_VSYNC		(0x1 << 30)
#define BIT_EOF_INT_EN		(0x1 << 29)
#define BIT_PRP_IF_EN		(0x1 << 28)
#define BIT_CCIR_MODE		(0x1 << 27)
#define BIT_COF_INT_EN		(0x1 << 26)
#define BIT_SF_OR_INTEN		(0x1 << 25)
#define BIT_RF_OR_INTEN		(0x1 << 24)
#define BIT_STATFF_LEVEL	(0x3 << 22)
#define BIT_STATFF_INTEN	(0x1 << 21)
#define BIT_RXFF_LEVEL		(0x3 << 19)
#define BIT_RXFF_INTEN		(0x1 << 18)
#define BIT_SOF_POL			(0x1 << 17)
#define BIT_SOF_INTEN		(0x1 << 16)
#define BIT_MCLKDIV			(0xF << 12)
#define BIT_HSYNC_POL		(0x1 << 11)
#define BIT_CCIR_EN			(0x1 << 10)
#define BIT_MCLKEN			(0x1 << 9)
#define BIT_FCC				(0x1 << 8)
#define BIT_PACK_DIR		(0x1 << 7)
#define BIT_CLR_STATFIFO	(0x1 << 6)
#define BIT_CLR_RXFIFO		(0x1 << 5)
#define BIT_GCLK_MODE		(0x1 << 4)
#define BIT_INV_DATA		(0x1 << 3)
#define BIT_INV_PCLK		(0x1 << 2)
#define BIT_REDGE			(0x1 << 1)

#define SHIFT_STATFF_LEVEL	22
#define SHIFT_RXFF_LEVEL	19
#define SHIFT_MCLKDIV		12

//control reg 3
#define BIT_FRMCNT			(0xFFFF << 16)
#define BIT_FRMCNT_RST		(0x1 << 15)
#define BIT_CSI_SUP			(0x1 << 3)
#define BIT_ZERO_PACK_EN	(0x1 << 2)
#define BIT_ECC_INT_EN		(0x1 << 1)
#define BIT_ECC_AUTO_EN		(0x1)

#define SHIFT_FRMCNT		16

//csi status reg
#define BIT_SFF_OR_INT		(0x1 << 25)
#define BIT_RFF_OR_INT		(0x1 << 24)
#define BIT_STATFF_INT		(0x1 << 21)
#define BIT_RXFF_INT		(0x1 << 18)
#define BIT_EOF_INT			(0x1 << 17)
#define BIT_SOF_INT			(0x1 << 16)
#define BIT_F2_INT			(0x1 << 15)
#define BIT_F1_INT			(0x1 << 14)
#define BIT_COF_INT			(0x1 << 13)
#define BIT_ECC_INT			(0x1 << 1)
#define BIT_DRDY			(0x1 << 0)

static U32			SFCM_capture_DMA(U32 nPixel);
static void			dma_complete_handler(void);
static void			dma_error_handler(int error_type);
static void			csi_read_cfg(CSI_CFG * _cfg);
static void			csi_config(CSI_CFG * _cfg);
static void			csi_reset_frame_count(void);
static int			csi_get_frame_count(void);

//global
int 				sensorFrameCount = 0;
static int			g_csi_ver;
static CSI_CFG 		g_csi_cfg;
static CSI_STATUS	g_csi_status;
static U32			*csi_data_buf = 0;
static U32			*csi_data_buf2 = 0;
static dmach_t		dma_channel;
static U32			dma_buf_phy_addr;
static U32			dma_buf_phy_addr2;
static U32			dma_data_size;

static U32			readSeqNum;
static U32			capSeqNum;
static U32			SOFseqNum;
static U8			stopCapture;
static int			DMA_ModuleInitDone = 0;

static DECLARE_WAIT_QUEUE_HEAD(dma_wait);

#include "dma.c"

static void csi_read_status(CSI_STATUS * _status)
{
	_status->sff_or_int	= (_reg_CSI_CSISR & BIT_SFF_OR_INT) ? 1 : 0;
	_status->rff_or_int	= (_reg_CSI_CSISR & BIT_RFF_OR_INT) ? 1 : 0;
	_status->statff_int	= (_reg_CSI_CSISR & BIT_STATFF_INT) ? 1 : 0;
	_status->rxff_int	= (_reg_CSI_CSISR & BIT_RXFF_INT) 	? 1 : 0;
	_status->eof_int	= (_reg_CSI_CSISR & BIT_EOF_INT) 	? 1 : 0;
	_status->sof_int	= (_reg_CSI_CSISR & BIT_SOF_INT) 	? 1 : 0;
	_status->f2_int		= (_reg_CSI_CSISR & BIT_F2_INT) 	? 1 : 0;
	_status->f1_int		= (_reg_CSI_CSISR & BIT_F1_INT) 	? 1 : 0;
	_status->cof_int	= (_reg_CSI_CSISR & BIT_COF_INT) 	? 1 : 0;
	_status->ecc_int	= (_reg_CSI_CSISR & BIT_ECC_INT) 	? 1 : 0;
	_status->drdy		= (_reg_CSI_CSISR & BIT_DRDY) 		? 1 : 0;
	
	return;
}

static void csi_irq_handler(int irq, void * data, struct pt_regs * pt)
{
	csi_read_status(&g_csi_status);

	//go to individual handlers
	//leave it untouched if user has not enabled the interrupt
	if(g_csi_cfg.rf_or_inten)
	{
		if(g_csi_status.rff_or_int)
		{
			g_csi_status.rff_or_int = 0;
			
			printk("csi error: rxff overflow\n");
			
			//flush fifo
			_reg_CSI_CSICR1 &= ~BIT_FCC;
			_reg_CSI_CSICR1 |= BIT_CLR_RXFIFO;
			if(g_csi_cfg.fcc)
				_reg_CSI_CSICR1 |= BIT_FCC;
			
			_reg_CSI_CSISR = BIT_RFF_OR_INT;
		}
	}
	if(g_csi_cfg.sof_inten)
	{
		if(g_csi_status.sof_int)
		{
			_reg_CSI_CSISR = BIT_SOF_INT;
			g_csi_status.sof_int = 0;
		}
	}
	
	return;
}

static void csi_read_cfg(CSI_CFG * _cfg)
{
	unsigned int tmp;
	unsigned val;

	//1. read from register
	//control reg 1
	val = _reg_CSI_CSICR1;
	_cfg->swap16_en		= (val & BIT_SWAP16_EN)		? 1 : 0;
	_cfg->ext_vsync		= (val & BIT_EXT_VSYNC)		? 1 : 0;
	_cfg->eof_int_en	= (val & BIT_EOF_INT_EN)	? 1 : 0;
	_cfg->prp_if_en		= (val & BIT_PRP_IF_EN)		? 1 : 0;
	_cfg->ccir_mode		= (val & BIT_CCIR_MODE)		? 1 : 0;
	_cfg->cof_int_en	= (val & BIT_COF_INT_EN)	? 1 : 0;
	_cfg->sf_or_inten	= (val & BIT_SF_OR_INTEN)	? 1 : 0;
	_cfg->rf_or_inten	= (val & BIT_RF_OR_INTEN)	? 1 : 0;
	
	tmp = (val & BIT_STATFF_LEVEL) >> SHIFT_STATFF_LEVEL;
	if(tmp == 0x3)
		_cfg->statff_level = 16;
	else if(tmp == 0x2)
		_cfg->statff_level = 12;
	else if(tmp == 0x1)
		_cfg->statff_level = 8;
	else
		_cfg->statff_level = 4;
		
	_cfg->staff_inten = (val & BIT_STATFF_INTEN)? 1 : 0;
	
	tmp = (val & BIT_RXFF_LEVEL) >> SHIFT_RXFF_LEVEL;
	if(tmp == 0x3)
		_cfg->rxff_level = 24;
	else if(tmp == 0x2)
		_cfg->rxff_level = 16;
	else if(tmp == 0x1)
		_cfg->rxff_level = 8;
	else
		_cfg->rxff_level = 4;
		
	_cfg->rxff_inten = (val & BIT_RXFF_INTEN)? 1 : 0;
	_cfg->sof_pol = (val & BIT_SOF_POL)? 1 : 0;
	_cfg->sof_inten = (val & BIT_SOF_INTEN)? 1 : 0;

	tmp = (val & BIT_MCLKDIV) >> SHIFT_MCLKDIV;
	_cfg->mclkdiv = (tmp + 1) * 2;
	
	_cfg->hsync_pol = (val & BIT_HSYNC_POL)? 1 : 0;
	_cfg->ccir_en = (val & BIT_CCIR_EN)? 1 : 0;
	_cfg->mclken = (val & BIT_MCLKEN)? 1 : 0;
	_cfg->fcc = (val & BIT_FCC)? 1 : 0;
	_cfg->pack_dir = (val & BIT_PACK_DIR)? 1 : 0;
	
	_cfg->gclk_mode = (val & BIT_GCLK_MODE)? 1 : 0;
	_cfg->inv_data = (val & BIT_INV_DATA)? 1 : 0;
	_cfg->inv_pclk = (val & BIT_INV_PCLK)? 1 : 0;
	_cfg->redge = (val & BIT_REDGE)? 1 : 0;

	//control reg 3
	val = _reg_CSI_CSICR3;
	_cfg->csi_sup = (val & BIT_CSI_SUP)? 1 : 0;
	_cfg->zero_pack_en = (val & BIT_ZERO_PACK_EN)? 1 : 0;
	_cfg->ecc_int_en = (val & BIT_ECC_INT_EN)? 1 : 0;
	_cfg->ecc_auto_en = (val & BIT_ECC_AUTO_EN)? 1 : 0;
	
	//rxfifo reg
	val = _reg_CSI_CSIRXCNT;

	//keep system settings
	_cfg->module_irq_enable = g_csi_cfg.module_irq_enable;

//2. update global config
	memcpy(&g_csi_cfg, _cfg, sizeof(CSI_CFG));

	return;
}

static void csi_config(CSI_CFG * _cfg)
{
	unsigned int tmp;
	unsigned val = 0x0;
	int rt;

//1. write to registers
	//control reg 1
	if(_cfg->swap16_en)
		val |= BIT_SWAP16_EN;
	if(_cfg->ext_vsync)
		val |= BIT_EXT_VSYNC;
	if(_cfg->eof_int_en)
		val |= BIT_EOF_INT_EN;
	if(_cfg->prp_if_en)
		val |= BIT_PRP_IF_EN;
	if(_cfg->ccir_mode)
		val |= BIT_CCIR_MODE;
	if(_cfg->cof_int_en)
		val |= BIT_COF_INT_EN;
	if(_cfg->sf_or_inten)
		val |= BIT_SF_OR_INTEN;
	if(_cfg->rf_or_inten)
		val |= BIT_RF_OR_INTEN;

	if(_cfg->statff_level == 16)
		tmp = 0x3;
	else if(_cfg->statff_level == 12)
		tmp = 0x2;
	else if(_cfg->statff_level == 8)
		tmp = 0x1;
	else
		tmp = 0x0;
	val |= (tmp << SHIFT_STATFF_LEVEL);

	if(_cfg->staff_inten)
		val|= BIT_STATFF_INTEN;
	
	if(_cfg->rxff_level == 24)
		tmp = 0x3;
	else if(_cfg->rxff_level == 16)
		tmp = 0x2;
	else if(_cfg->rxff_level == 8)
		tmp = 0x1;
	else
		tmp = 0x0;
	val |= (tmp << SHIFT_RXFF_LEVEL);
		
	if(_cfg->rxff_inten)
		val |= BIT_RXFF_INTEN;
	if(_cfg->sof_pol)
		val |= BIT_SOF_POL;
	if(_cfg->sof_inten)
		val |= BIT_SOF_INTEN;

	tmp = (_cfg->mclkdiv / 2) - 1;
	val |= (tmp << SHIFT_MCLKDIV);
	
	if(_cfg->hsync_pol)
		val |= BIT_HSYNC_POL;
	if(_cfg->ccir_en)
		val |= BIT_CCIR_EN;
	if(_cfg->mclken)
		val |= BIT_MCLKEN;
	if(_cfg->fcc)
		val |= BIT_FCC;
	if(_cfg->pack_dir)
		val |= BIT_PACK_DIR;
	
	if(_cfg->gclk_mode)
		val |= BIT_GCLK_MODE;
	if(_cfg->inv_data)
		val |= BIT_INV_DATA;
	if(_cfg->inv_pclk)
		val |= BIT_INV_PCLK;
	if(_cfg->redge)
		val |= BIT_REDGE;
	
	_reg_CSI_CSICR1 = val;

	//control reg 3
	val = 0x0;
	if(_cfg->csi_sup)
		val |= BIT_CSI_SUP;
	if(_cfg->zero_pack_en)
		val |= BIT_ZERO_PACK_EN;
	if(_cfg->ecc_int_en)
		val |= BIT_ECC_INT_EN;
	if(_cfg->ecc_auto_en)
		val |= BIT_ECC_AUTO_EN;
		
	_reg_CSI_CSICR3 = val;

	//rxfifo counter
	_reg_CSI_CSIRXCNT = _cfg->rxcnt;

//2. update global config
	memcpy(&g_csi_cfg, _cfg, sizeof(CSI_CFG));

//3. interrupt enable
	if(_cfg->module_irq_enable)
	{
		rt = request_irq(INT_CSI, 
			  	 csi_irq_handler,
			  	 SA_INTERRUPT,
				 "csi",
				 "csi");

		if(rt)
			printk("csi error: irq request fail\n");
	}
	
//4. init status flags
	memset(&g_csi_status, 0, sizeof(CSI_CFG));

	return;
}


static void csi_module_init(void)
{
	unsigned int val;
	unsigned int perclk4div = 3;	//default set to fclk/3 => 88MHz

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国女主播一区二区三区| 中文字幕一区二区三区不卡| 成人免费三级在线| 亚洲综合无码一区二区| 国产精品无码永久免费888| 欧美日韩亚洲综合在线 | 欧美高清精品3d| 中文字幕va一区二区三区| 欧美日本免费一区二区三区| 欧美精品久久天天躁| 777久久久精品| 欧美一区二区三区四区久久| 91成人看片片| 欧美三级在线视频| 精品日韩一区二区三区| 久久在线观看免费| 日韩伦理免费电影| 亚洲香肠在线观看| 久久99国产精品久久99| 日韩电影在线免费观看| 一本一本大道香蕉久在线精品| 日韩视频一区二区| 欧美日韩专区在线| 欧美日韩国产系列| 2022国产精品视频| 国产精品伦理一区二区| 亚洲丝袜另类动漫二区| 亚洲高清不卡在线观看| 裸体健美xxxx欧美裸体表演| 国产一区二区三区在线观看免费 | 久久久久97国产精华液好用吗| 欧美国产成人精品| 亚洲国产va精品久久久不卡综合| 国产精品123| 99久久伊人久久99| 欧美日韩国产高清一区二区三区| 久久久亚洲综合| 亚洲欧洲精品天堂一级| 亚洲国产婷婷综合在线精品| 另类中文字幕网| 色天天综合久久久久综合片| 精品久久久久久最新网址| 日本欧美肥老太交大片| 日本美女一区二区| 91小视频在线免费看| 久久久久青草大香线综合精品| 亚洲素人一区二区| 精品一区二区三区视频在线观看 | 久久日韩精品一区二区五区| 亚洲影视在线播放| 不卡一区二区中文字幕| 精品国产免费一区二区三区四区 | 欧美日韩一区视频| 中文字幕在线观看不卡视频| 国产在线视频不卡二| 美女www一区二区| 91论坛在线播放| 欧美丰满嫩嫩电影| 国产精品久久久久久福利一牛影视| 首页国产欧美日韩丝袜| 欧美日韩精品三区| 图片区小说区区亚洲影院| 在线中文字幕一区二区| 亚洲精选在线视频| 99久久99久久精品免费看蜜桃| 国产精品午夜久久| av日韩在线网站| 亚洲激情男女视频| 欧美视频在线观看一区二区| 亚洲第一激情av| 欧美一区二区三区在线观看 | 精品日产卡一卡二卡麻豆| 亚洲电影在线免费观看| 久色婷婷小香蕉久久| 日韩精品一区二区三区中文不卡| 日韩成人伦理电影在线观看| 欧美一区二区精品久久911| 麻豆成人久久精品二区三区小说| 精品国产第一区二区三区观看体验| 国产一区二区三区最好精华液| 国产精品久久久久久久裸模| 色婷婷狠狠综合| 久久精品国产久精国产| 中文字幕在线不卡国产视频| 欧美日韩精品是欧美日韩精品| 美女国产一区二区三区| 亚洲欧洲精品一区二区三区不卡| 欧美久久婷婷综合色| 国产综合久久久久久鬼色| 最新不卡av在线| 日韩精品一区二区三区视频| 99麻豆久久久国产精品免费| 精品一区二区三区久久久| 久久看人人爽人人| 欧美日韩你懂的| 波多野结衣精品在线| 免费观看日韩av| 亚洲一卡二卡三卡四卡| 国产精品伦理在线| 久久久美女艺术照精彩视频福利播放| 在线国产电影不卡| 99视频精品全部免费在线| 国产美女在线精品| 捆绑调教美女网站视频一区| 五月天婷婷综合| 一区二区三区在线看| 国产精品国产精品国产专区不片| 久久久噜噜噜久久中文字幕色伊伊 | 欧美日韩在线一区二区| 91视频com| 色综合久久88色综合天天6 | 91色porny| 成人午夜精品一区二区三区| 国产美女主播视频一区| 国产精品一区二区免费不卡| 激情都市一区二区| 国产一区二区导航在线播放| 精品在线亚洲视频| 蜜桃av一区二区三区| 日韩1区2区日韩1区2区| 久久爱另类一区二区小说| 久久国内精品视频| 99麻豆久久久国产精品免费优播| 国产精品一区专区| av激情亚洲男人天堂| 日本高清不卡aⅴ免费网站| 精品视频1区2区| 久久新电视剧免费观看| 欧美激情一区二区三区不卡| 中文字幕中文乱码欧美一区二区| 亚洲一区二区成人在线观看| 视频一区视频二区中文| 经典三级一区二区| 99精品国产视频| 69成人精品免费视频| 久久综合色之久久综合| 亚洲天堂网中文字| 另类调教123区| 99视频精品免费视频| 51午夜精品国产| 中文字幕日韩精品一区 | 欧美伊人久久久久久午夜久久久久| 正在播放亚洲一区| 中文字幕一区二区三区av| 日韩av中文字幕一区二区三区| 国产精品88av| 欧美成人精品福利| 亚洲精品第1页| 国产91精品一区二区麻豆亚洲| 欧美视频完全免费看| 中文字幕精品综合| 麻豆91精品视频| 欧美日韩国产天堂| 中文字幕中文字幕一区| 国产乱一区二区| 日韩一区二区三区视频| 亚洲福中文字幕伊人影院| 粉嫩av一区二区三区在线播放| 一区二区三区日韩精品| 国产成人福利片| 日本一区二区久久| 国产乱色国产精品免费视频| 精品少妇一区二区三区免费观看| 偷窥少妇高潮呻吟av久久免费| 色一情一伦一子一伦一区| 国产一区二区三区蝌蚪| 欧美一区二区三区系列电影| 午夜视频一区二区三区| 欧美日韩一区二区三区四区| 亚洲一区在线电影| 欧美疯狂性受xxxxx喷水图片| 一区二区三区日韩欧美精品| 在线看一区二区| 天堂蜜桃91精品| 欧美第一区第二区| 国产河南妇女毛片精品久久久| 国产精品毛片大码女人| 99国产精品99久久久久久| 一区二区三区欧美在线观看| 欧美日韩在线播放三区| 喷白浆一区二区| 26uuu亚洲综合色欧美 | 欧美成人aa大片| 高清beeg欧美| 午夜在线电影亚洲一区| 精品久久99ma| 91香蕉视频mp4| 亚洲成av人片在线观看| 国产亚洲综合在线| 色综合天天狠狠| 另类小说色综合网站| 亚洲欧美自拍偷拍色图| 欧美一区欧美二区| 成人av在线资源| 免费高清不卡av| 亚洲v精品v日韩v欧美v专区| xf在线a精品一区二区视频网站| 日本精品一区二区三区高清| 国产美女av一区二区三区| 亚洲精品国产高清久久伦理二区|