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

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

?? test_ov9650.c

?? 2440開發板測試程序(含LCD、攝像頭演示等)
?? C
字號:
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"

#include "Test_OV9650.h"
#include "camdef.h"

/************************************************/
//some macros and inline function to support porting
//from linux driver, hzh
#define	CLKCON					rCLKCON
#define	CLKCON_CAMIF		(1<<19)
#define	UPLLCON					rUPLLCON
#define	CLKDIVN					rCLKDIVN
#define	DIVN_UPLL_EN			(1<<3)
#define	CAMDIVN					rCAMDIVN
#define	CAMCLK_SET_DIV			(1<<4)
#define	CAM_CTRL				rCIGCTRL	//??

#define	GPIO_E14				14
#define	GPIO_E15				15
#define	GPIO_PULLUP_EN			(0<<30)
#define	GPIO_PULLUP_DIS			(1<<30)
#define	GPIO_MODE_IN			(0<<31)
#define	GPIO_MODE_OUT			(1UL<<31)

#define	read_gpio_bit(x)		((rGPEDAT & (1<<(x))) ? 1 : 0)
#define	write_gpio_bit_set(x)	(rGPEDAT |= 1<<(x))
#define	write_gpio_bit_clear(x)	(rGPEDAT &= ~(1<<(x)))

int USED_CAM_TYPE;

//only support GPE, in and out
static __inline void set_gpio_ctrl(unsigned int gpio)
{
	rGPECON &= ~(3<<((gpio&0xf)*2));
	if(gpio&GPIO_MODE_OUT)
		rGPECON |= 1<<((gpio&0xf)*2);
	if(gpio&GPIO_PULLUP_DIS)
		rGPEUP |= 1<<(gpio&0xf);
	else
		rGPEUP &= ~(1<<(gpio&0xf));
}

#define	ENODEV			2
#define	udelay(x)		Delay(x/50)
#define	mdelay(x)		Delay((x)*8)
#define	printk			Uart_Printf

static void CamModuleReset(void)
{
	//bit 30 is external reset
	if(USED_CAM_TYPE == CAM_OV9650)
	{
		rCIGCTRL |= (1<<30);	//external camera reset high
		Delay(30);
		rCIGCTRL &= ~(1<<30);	//external camera reset low
		Delay(30);
		//printk("Reset OV9650!\n");
	}
	else	//OV9655
	{
		rCIGCTRL &= ~(1<<30);	//external camera reset low
		Delay(30);
		rCIGCTRL |= (1<<30);	//external camera reset high
		Delay(30);
		//printk("Reset OV9655!\n");
	}
}

typedef unsigned long dma_addr_t;

#define	panic	prink


/*********** start of ov9650 ********************/
/* refer to 25p of ov9650 datasheet */
#define OV9650_SCCB_ID sccb_id
static U8 sccb_id = 0x60;	//OV9650

#define OV9650_SCCB_DELAY    100 
#define OV9650_SCCB_DELAY2   100

#define SIO_C          (GPIO_E14)
#define SIO_D          (GPIO_E15)
#define MAKE_HIGH(_x)  write_gpio_bit_set(_x)
#define MAKE_LOW(_x)   write_gpio_bit_clear(_x)
#define BIT_READ(_x)   read_gpio_bit(_x)
#define CFG_READ(_x)   set_gpio_ctrl(_x | GPIO_PULLUP_DIS | GPIO_MODE_IN)
#define CFG_WRITE(_x)  set_gpio_ctrl(_x | GPIO_PULLUP_DIS | GPIO_MODE_OUT)


#if OV9650_SCCB_DELAY > 0
#  define WAIT_CYL udelay(OV9650_SCCB_DELAY)
#else
#  define WAIT_CYL (void)(0)
#endif

#if OV9650_SCCB_DELAY2 > 0
#  define WAIT_STAB udelay(OV9650_SCCB_DELAY2)
#else
#  define WAIT_STAB (void)(0)
#endif

static unsigned int get_camera_clk(void)
{
	return 24000000;
}

/* 2-wire SCCB */
void __inline ov9650_sccb_start(void)
{
	MAKE_HIGH(SIO_C);
	MAKE_HIGH(SIO_D);
	WAIT_STAB;
	MAKE_LOW(SIO_D);
	WAIT_STAB;
	MAKE_LOW(SIO_C);
	WAIT_STAB;
}

/* 2-wire SCCB */
void __inline ov9650_sccb_end(void)
{
	MAKE_LOW(SIO_D);
	WAIT_STAB;
	MAKE_HIGH(SIO_C);
	WAIT_STAB;
	MAKE_HIGH(SIO_D);
	WAIT_STAB;
}

void __inline ov9650_sccb_write_bit(unsigned char bit)
{
	if (bit)
		MAKE_HIGH(SIO_D);
	else
		MAKE_LOW(SIO_D);
	WAIT_STAB;
	MAKE_HIGH(SIO_C);
	WAIT_CYL;
	MAKE_LOW(SIO_C);
	WAIT_STAB;
}

int __inline ov9650_sccb_read_bit(void)
{
	int tmp = 0;

	MAKE_HIGH(SIO_C);
	WAIT_CYL;
	tmp = BIT_READ(SIO_D);
	MAKE_LOW(SIO_C);
	WAIT_STAB;

	return tmp;
}	

void __inline ov9650_sccb_writechar(unsigned char data)
{
	int i = 0;

	/* data */
	for (i = 0; i < 8; i++ ) {
		ov9650_sccb_write_bit(data & 0x80);
		data <<= 1;
	}

	/* 9th bit - Don't care */
	ov9650_sccb_write_bit(1);
}

void __inline ov9650_sccb_readchar(unsigned char *val)
{
	int i;
	int tmp = 0;

	CFG_READ(SIO_D);

	for (i = 7; i >= 0; i--)
		tmp |= ov9650_sccb_read_bit() << i;

	CFG_WRITE(SIO_D);

	/* 9th bit - N.A. */
	ov9650_sccb_write_bit(1);

	*val = tmp & 0xff;
}

/* 3-phase write */
static void ov9650_sccb_sendbyte(unsigned char subaddr, unsigned char data)
{
//	down(&dev.bus_lock);

	ov9650_sccb_start();
	ov9650_sccb_writechar(OV9650_SCCB_ID);
	ov9650_sccb_writechar(subaddr);
	ov9650_sccb_writechar(data);
	ov9650_sccb_end();

	mdelay(7);

//	up(&dev.bus_lock);
}

/* 2-phase read */
static unsigned char ov9650_sccb_receivebyte(unsigned char subaddr)
{
	unsigned char value;

//	down(&dev.bus_lock);

	/* 2-phase write */
	ov9650_sccb_start();
	ov9650_sccb_writechar(OV9650_SCCB_ID);
	ov9650_sccb_writechar(subaddr);
	ov9650_sccb_end();

	/* 2-phase read */
	ov9650_sccb_start();
	ov9650_sccb_writechar(OV9650_SCCB_ID | 0x01);
	ov9650_sccb_readchar(&value);
	ov9650_sccb_end();

	mdelay(7);

//	up(&dev.bus_lock);

	return value;
}

void __inline ov9650_init(void)
{
	CFG_WRITE(SIO_C);
	CFG_WRITE(SIO_D);
	mdelay(10);
}

void __inline ov9650_deinit(void)
{
	CFG_READ(SIO_C);
	CFG_READ(SIO_D);
}

void __inline ov9650_config(void)
{
	int i;
	
	if(USED_CAM_TYPE == CAM_OV9650)
		for (i = 0; i < OV9650_REGS; i++)
		{
			if (ov9650_reg[i].subaddr == CHIP_DELAY)
				Delay(ov9650_reg[i].value);
				//mdelay(ov9650_reg[i].value);
			else
				ov9650_sccb_sendbyte(ov9650_reg[i].subaddr & 0xff
					, ov9650_reg[i].value & 0xff);
		}
	else
		for (i = 0; i < OV9655_REGS_VGA; i++)
		{
			if (ov9655_vga_reg[i].subaddr == CHIP_DELAY)
				Delay(ov9655_vga_reg[i].value);
				//mdelay(ov9655_vga_reg[i].value);
			else
				ov9650_sccb_sendbyte(ov9655_vga_reg[i].subaddr & 0xff
					, ov9655_vga_reg[i].value & 0xff);
		}
}

int __inline check_ov9650(void)
{
	int ov9650_mid = 0;
	int count = 2;

retry:
	ov9650_mid = (ov9650_sccb_receivebyte(0x0a) << 8);
	ov9650_mid |= ov9650_sccb_receivebyte(0x0b);
	//ov9650_mid = (ov9650_sccb_receivebyte(0x1c) << 8);
	//ov9650_mid |= ov9650_sccb_receivebyte(0x1d);
	count--;
	if(count) 
		goto retry;
		
	//printk("camera ID :0x%x\n",ov9650_mid);
	return ov9650_mid;
}

/********** start of S/W YUV2RGB ************/
#define XLATTABSIZE      256
#define MulDiv(x, y, z)	((long)((int) x * (int) y) / (int) z)

//#define CLIP(x)	min_t(int, 255, max_t(int, 0, (x)))
#define CLIP(x) {if(x<0) x=0;if(x>255) x=255;}

#define RED_REGION      0xf800
#define GREEN_REGION    0x07e0
#define BLUE_REGION     0x001f

int XlatY[XLATTABSIZE] = { 0 };
int XlatV_B[XLATTABSIZE] = { 0 };
int XlatV_G[XLATTABSIZE] = { 0 };
int XlatU_G[XLATTABSIZE] = { 0 };
int XlatU_R[XLATTABSIZE] = { 0 };

#define ORIG_XLAT 1
void init_yuvtable (void)
{
	int i, j;

	for (i = 0; i < XLATTABSIZE; i++) {
#if ORIG_XLAT
		j = min(253, max(16, i));
#else
		j = (255 * i + 110) / 220;	// scale up
		j = min(255, max(j, 16));
#endif
		// orig: XlatY[i] = (int ) j;
		XlatY[i] = j-16;
	}

	for (i = 0; i < XLATTABSIZE; i++) {
#if ORIG_XLAT
		j = min(240, max(16, i));
		j -= 128;
#else
		j = i - 128;		// make signed
		if (j < 0)
			j++;			// noise reduction
		j = (127 * j + 56) / 112;	// scale up
		j = min(127, max(-128, j));
#endif

		XlatV_B[i] = MulDiv (j, 1000, 564);	/* j*219/126 */
		XlatV_G[i] = MulDiv (j, 1100, 3328);
		XlatU_G[i] = MulDiv (j, 3100, 4207);
		XlatU_R[i] = MulDiv (j, 1000, 713);
	}
}

#define MORE_QUALITY 1
void __inline yuv_convert_rgb16(unsigned char *rawY, unsigned char *rawU,
	  	unsigned char *rawV, unsigned char *rgb, int size)
{
	unsigned short  buf1, buf3;
	int   red;
	int   blue;
	int   green;
	unsigned long   cnt;
	int    Y, U, V;
	unsigned short  data;
	unsigned short  data2;

	for ( cnt = 0 ; cnt < size; cnt +=2){
		buf1 = *(rawY+cnt) & 0xff;  // Y data
		buf3 = *(rawY+cnt+1) & 0xff;  // Y data

		U = *(rawV+cnt/2) & 0xff;
		V = *(rawU+cnt/2) & 0xff;

#if MORE_QUALITY
		Y = buf1;
#else
		Y = ((buf1+buf3)/2);
#endif

		red = XlatY[Y] + XlatU_R[U];
		CLIP(red);
		green = XlatY[Y] - XlatV_G[V] - XlatU_G[U];
		CLIP(green);
		blue = XlatY[Y] + XlatV_B[V];
		CLIP(blue);

		data = ((red << 8) & RED_REGION)
				| ((green << 3) & GREEN_REGION)
				| (blue >> 3);

#if MORE_QUALITY
		Y = buf3;
		red = XlatY[Y] + XlatU_R[U];
		CLIP(red);
		green = XlatY[Y] - XlatV_G[V] - XlatU_G[U];
		CLIP(green);
		blue = XlatY[Y] + XlatV_B[V];
		CLIP(blue);

		data2 = ((red << 8) & RED_REGION)
				| ((green << 3) & GREEN_REGION)
				| (blue >> 3);
#else
		data2 = data;
#endif

		*(unsigned short *)(rgb + 2 * cnt) = data;
		*(unsigned short *)(rgb + 2 * (cnt + 1))= data2;
	}
}

/********** end of S/W YUV2RGB ******************/

static void s3c2440_cam_gpio_init(void)
{
	//--- changed, hzh
	rGPJCON = 0x2aaaaaa;
	rGPJDAT = 0;
	rGPJUP  = 0;	//pull-up enable
}

/* 
 * $\> SW.LEE
 * 
 * ov9650_CLK is 12Mhz or 24Mhz
 *
 * CAMCLK = ov9650_CLK;
 * CAMCLK_DIV =  UPLL / ( CAMCLK * 2)  - 1 ; 
 */ 


void __inline s3c2440_camif_init(void)
{
	unsigned int upll, uclk, camclk,camclk_div;

	camclk = get_camera_clk();
	CLKCON |= CLKCON_CAMIF;
	ChangeUPllValue(56, 2, 1);	//0x38==56
	CLKDIVN |= DIVN_UPLL_EN;	//UCLK=UPLL/2
	upll = 96000000;
	//---
	uclk = (CLKDIVN & DIVN_UPLL_EN) ? upll/2 : upll;
	printk("CAMERA : UPLL %08d  UCLK %08d CAMCLK %08d \n",upll, uclk, camclk);

	camclk_div = upll /( camclk * 2) -1 ;
	CAMDIVN = CAMCLK_SET_DIV | (camclk_div & 0xf ) ;
}

void __inline s3c2440_camif_deinit(void)
{
	CLKCON &= ~CLKCON_CAMIF;
	CAM_CTRL = 0;
	mdelay(5);
}


/***************************************************/
int Test_OV9650(void)
{
	int ret;
	USED_CAM_TYPE = CAM_OV9650;
	init_yuvtable();
	s3c2440_cam_gpio_init();
	s3c2440_camif_init();
	CamModuleReset();
	ov9650_init();

	printk("Check camera ID\n");
	ret = check_ov9650();
	if(ret == 0xffff)
	{
		//printk("Retry--\n");
		USED_CAM_TYPE = CAM_OV9655;
		CamModuleReset();
		ov9650_init();
		ret = check_ov9650();
	}
	if(ret == OV9655_ID) 
	{
		printk("Camera Type : OV9655\n");
	}
	else if(ret == OV9650_ID)
	{
		printk("Camera Type : OV9650\n");
	}
	else
	{
		printk("Camera ID ERROR!!!\n");
		return 1;
	}
		
	printk("Initial Camera now...\n");
	ov9650_config();
	
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一级高清毛片| 秋霞午夜av一区二区三区| 三级不卡在线观看| www..com久久爱| 日韩欧美一区二区免费| 亚洲美女视频一区| 成人av在线一区二区| 精品粉嫩aⅴ一区二区三区四区| 亚洲欧美日韩国产综合| 成人精品鲁一区一区二区| 欧美电影免费观看高清完整版在线观看| 亚洲人成网站影音先锋播放| 国产伦精品一区二区三区在线观看| 欧美日韩精品一区二区三区| 亚洲天堂免费看| 成人禁用看黄a在线| 久久嫩草精品久久久精品| 免费观看一级特黄欧美大片| 91精品国产综合久久婷婷香蕉| 伊人夜夜躁av伊人久久| 成人av小说网| 国产精品久久久久久久第一福利 | 奇米影视一区二区三区小说| 色综合天天性综合| 国产精品萝li| 91免费版在线| 亚洲精品v日韩精品| 日本精品一级二级| 亚洲制服丝袜在线| 欧美二区三区的天堂| 亚洲资源中文字幕| 欧美日韩你懂得| 视频一区二区欧美| 欧美日本国产视频| 日韩av电影天堂| 日韩欧美中文字幕制服| 久久国产精品72免费观看| 日韩欧美在线观看一区二区三区| 青青草国产精品亚洲专区无| 26uuu欧美| 成人毛片视频在线观看| **欧美大码日韩| 欧美午夜精品久久久久久孕妇 | 国产露脸91国语对白| 久久免费美女视频| 91在线视频播放| 亚洲伊人色欲综合网| 56国语精品自产拍在线观看| 秋霞国产午夜精品免费视频| 久久综合久久综合亚洲| 91麻豆精品国产| 国产一区二区三区久久久 | 亚洲国产精品久久一线不卡| 欧美色手机在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 精品999在线播放| 99久久久免费精品国产一区二区| 亚洲主播在线观看| 精品剧情v国产在线观看在线| 粉嫩久久99精品久久久久久夜| 国产精品网站在线| 欧美三级日韩三级国产三级| 狠狠色综合色综合网络| 综合久久久久久久| 欧美一级精品大片| 91亚洲精品乱码久久久久久蜜桃| 青青草视频一区| 亚洲婷婷综合久久一本伊一区| 日韩一区二区免费在线电影| 99久久99久久综合| 久久电影国产免费久久电影| 亚洲欧洲精品一区二区精品久久久| 欧美精品色综合| 波多野结衣中文字幕一区二区三区| 亚洲人成网站精品片在线观看| 精品国产欧美一区二区| 欧美中文一区二区三区| 国产成+人+日韩+欧美+亚洲| 亚洲sss视频在线视频| 日本一区二区免费在线观看视频| 欧美女孩性生活视频| 26uuu亚洲婷婷狠狠天堂| 色婷婷久久综合| 国产成都精品91一区二区三| 日韩国产欧美在线播放| 亚洲欧美电影一区二区| 国产精品热久久久久夜色精品三区| 欧美电影一区二区| 色吊一区二区三区| 成人性生交大片免费| 久久精品国产一区二区三| 亚洲mv在线观看| 亚洲国产中文字幕在线视频综合 | 欧美精品一区二区不卡| 欧美午夜精品一区| 色综合天天性综合| 99视频国产精品| 国产成人免费在线视频| 精品亚洲欧美一区| 美女视频黄久久| 日韩国产精品久久| 天天操天天色综合| 视频一区二区不卡| 视频一区中文字幕国产| www.欧美日韩国产在线| 成人性视频网站| 成人小视频免费在线观看| 国产成人免费视频网站| 韩国成人精品a∨在线观看| 蜜乳av一区二区| 美腿丝袜亚洲色图| 极品瑜伽女神91| 国产一区啦啦啦在线观看| 国产一区二区成人久久免费影院 | 国产精品高潮久久久久无| 久久精品综合网| 国产日韩欧美精品电影三级在线| 国产亚洲短视频| 中国色在线观看另类| 国产精品久久99| 亚洲美女精品一区| 夜夜精品浪潮av一区二区三区| 亚洲福利视频一区二区| 天天色综合天天| 国产一区二区视频在线播放| 国产一区二区三区在线观看精品| 国产福利精品一区二区| 成人黄色电影在线| 色婷婷综合久久| 欧美日韩一区二区欧美激情| 在线电影院国产精品| 精品三级在线看| 日本一区二区免费在线| 亚洲天堂a在线| 丝袜脚交一区二区| 国产综合色在线视频区| 色综合天天综合狠狠| 欧美日本高清视频在线观看| 欧美精品一区二区三区视频| 国产精品狼人久久影院观看方式| 亚洲免费av网站| 极品少妇一区二区| 色综合久久久久久久久| 777欧美精品| 国产午夜亚洲精品理论片色戒| 亚洲丝袜自拍清纯另类| 免费视频最近日韩| eeuss鲁片一区二区三区在线看| 91福利小视频| 久久久天堂av| 婷婷激情综合网| 国产成人av电影在线| 精品视频一区二区三区免费| 久久久久国产精品人| 亚洲国产成人av网| 风流少妇一区二区| 欧美日韩免费电影| 中文字幕的久久| 久久99精品国产麻豆不卡| 色久综合一二码| 国产日产精品1区| 日韩av不卡在线观看| 99精品视频免费在线观看| 精品三级在线观看| 亚洲一区二区黄色| bt欧美亚洲午夜电影天堂| 日韩欧美色综合网站| 亚洲最新在线观看| 懂色一区二区三区免费观看| 日韩一级免费观看| 午夜伊人狠狠久久| 91女厕偷拍女厕偷拍高清| 久久亚洲精精品中文字幕早川悠里 | 成人激情动漫在线观看| 91精品国模一区二区三区| 亚洲制服丝袜av| 91小视频免费观看| 亚洲国产精品成人综合色在线婷婷 | 精品盗摄一区二区三区| 亚洲成a人在线观看| 日本精品一级二级| 亚洲日本青草视频在线怡红院| 国产福利不卡视频| 久久综合久久久久88| 日本亚洲三级在线| 欧美日韩国产a| 一区二区在线观看免费视频播放| 成人激情免费电影网址| 欧美国产欧美综合| 成人免费观看视频| 欧美国产成人在线| 国产精品一区一区三区| www日韩大片| 国产美女视频91| 国产日韩欧美一区二区三区综合| 国产乱人伦精品一区二区在线观看| 日韩亚洲电影在线| 精品中文字幕一区二区| 欧美精品一区二区三区在线| 国产乱码精品1区2区3区|