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

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

?? test_ov9650.c

?? ARM S3C2440 Camera範例 on 3星ARM-ADS 編譯器平臺用
?? C
字號:
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"

#include "Test_OV9650.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)))
//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 U8 sccb_id = 0x60;	//OV9650



//---
static void CamModuleReset(void)
{
	//bit 30 is external reset
	rCIGCTRL |= (1<<30);	//external camera reset high
	Delay(30);
	rCIGCTRL &= ~(1<<30);	//external camera reset low
	Delay(30);
//	rCIGCTRL |= (1<<19);	//external camera reset high
//	Delay(30);
//	rCIGCTRL &= ~(1<<19);	//external camera reset low
//	Delay(30);
}
//---

typedef unsigned long dma_addr_t;

#define	panic	prink


/*********** start of OV7620 ********************/
/* refer to 25p of OV7620 datasheet */
#  define OV7620_SCCB_ID sccb_id//0x42  /* CS[2:0] = 000 */	//hzh, use variable

#  define OV7620_MAX_CLK 24000000 // 24MHz
#  define OV7620_PRODUCT_ID 0x7FA2


#  define OV7620_SCCB_DELAY    100 
#  define OV7620_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 OV7620_SCCB_DELAY > 0
#  define WAIT_CYL udelay(OV7620_SCCB_DELAY)
#else
#  define WAIT_CYL (void)(0)
#endif

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

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

/* 2-wire SCCB */
void __inline ov7620_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 ov7620_sccb_end(void)
{
	MAKE_LOW(SIO_D);
	WAIT_STAB;
	MAKE_HIGH(SIO_C);
	WAIT_STAB;
	MAKE_HIGH(SIO_D);
	WAIT_STAB;
}

void __inline ov7620_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 ov7620_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 ov7620_sccb_writechar(unsigned char data)
{
	int i = 0;

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

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

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

	CFG_READ(SIO_D);

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

	CFG_WRITE(SIO_D);

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

	*val = tmp & 0xff;
}

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

	ov7620_sccb_start();
	ov7620_sccb_writechar(OV7620_SCCB_ID);
	ov7620_sccb_writechar(subaddr);
	ov7620_sccb_writechar(data);
	ov7620_sccb_end();

	mdelay(7);

//	up(&dev.bus_lock);
}

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

//	down(&dev.bus_lock);

	/* 2-phase write */
	ov7620_sccb_start();
	ov7620_sccb_writechar(OV7620_SCCB_ID);
	ov7620_sccb_writechar(subaddr);
	ov7620_sccb_end();

	/* 2-phase read */
	ov7620_sccb_start();
	ov7620_sccb_writechar(OV7620_SCCB_ID | 0x01);
	ov7620_sccb_readchar(&value);
	ov7620_sccb_end();

	mdelay(7);

//	up(&dev.bus_lock);

	return value;
}

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

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

void __inline ov7620_config(void)
{
	int i;
             printk("config camera registers start\n");
/*	for (i = 0; i < OV7620_REGS; i++) {
		if (ov7620_reg[i].subaddr == CHIP_DELAY)
			mdelay(ov7620_reg[i].value);
		else
			ov7620_sccb_sendbyte(ov7620_reg[i].subaddr & 0xff
					, ov7620_reg[i].value & 0xff);
	}*/
	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
			ov7620_sccb_sendbyte(ov9650_reg[i].subaddr & 0xff
					, ov9650_reg[i].value & 0xff);
		       
	}

}

int __inline check_ov7620(void)
{
	int ret = 0;
	int ov7620_mid = 0;
	int try_count =0;	//2 times

try_again:
	//printk("OV9650_SCCB_ID is %d\n", OV7620_SCCB_ID);
	ov7620_mid = (ov7620_sccb_receivebyte(0x1c) << 8);
	ov7620_mid |= ov7620_sccb_receivebyte(0x1d);
	
	//	ov7620_sccb_sendbyte(0xec, 0);
	//	ov7620_mid = ov7620_sccb_receivebyte(0xb0);
	//	printk("read ID is 0x%x\n", ov7620_mid);

	if (ov7620_mid != OV7620_PRODUCT_ID) {
		if (!try_count++) goto try_again;
		// hzh
		//OV7620_SCCB_ID++;
		//if(OV7620_SCCB_ID) goto try_again;
		

		printk("Invalid manufacture ID (0x%04X). there is no OV7620(0x%04X)\n",
				ov7620_mid, OV7620_PRODUCT_ID);
		ret = -ENODEV;
	} else {
		//printk("OV7620(0x%04X) detected.\n", ov7620_mid);
	}
	
	//--- hzh, for ov9650
	ov7620_mid = (ov7620_sccb_receivebyte(0x0a) << 8);
	ov7620_mid |= ov7620_sccb_receivebyte(0x0b);
	//printk("Product ID is 0x%04x\n", ov7620_mid);
	//---

	return ret;
}

/********* end of OV7620 ********************/

/********** 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
 * 
 * OV7620_CLK is 12Mhz or 24Mhz
 *
 * CAMCLK = OV7620_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;
/* Supposed that you must set UPLL at first */
/*	UPLLCON = FInsrt(0x38, fPLL_MDIV) | FInsrt(0x02, fPLL_PDIV)
	                                | FInsrt(0x02, fPLL_SDIV);
	upll = s3c2440_get_bus_clk(GET_UPLL);
*/
	//--- change above to this, hzh
	//UPLLCON = (0x38<<12)|(2<<4)|(1);	//is this 96M ???
	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;
	
	init_yuvtable();
	
	s3c2440_cam_gpio_init();
	s3c2440_camif_init();
	
//	while(1)
		CamModuleReset();	//hzh
	
	ov7620_init();
	
/*	rGPECON &= ~(0xfUL<<28);
	rGPECON |= 5<<28;	
	rGPEUP  &= ~(3<<14);
	while(1) {
		rGPEDAT &= ~(3<<14);
		rGPEDAT |= 3<<14;
	}
*/	
	//GPE14,15 are open-drain output without inner pull-up,
	//so must install external pull up registers!!!
/*	while(!Uart_GetKey()) {
		MAKE_HIGH(SIO_D);
		MAKE_HIGH(SIO_C);
		Delay(10);
		MAKE_LOW(SIO_D);
		MAKE_LOW(SIO_C);
		Delay(10);
	}	
*/	
/*	CFG_READ(SIO_D);
	printk("%d\n", BIT_READ(SIO_D));
	CFG_WRITE(SIO_D);
*/
	printk("Check camera ID\n");
	ret = check_ov7620() ;
	if (ret) {
		printk("Can't find camera!\n");
		return ret;
	}
	
	printk("Initial Camera now, Please wait several minutes...\n");
	ov7620_config();
	
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩1区2区| 国产成人午夜片在线观看高清观看| 国产成人av资源| 337p日本欧洲亚洲大胆精品 | 欧美日本一区二区三区| 亚洲第一综合色| 欧美顶级少妇做爰| 久草在线在线精品观看| 久久综合九色综合97婷婷女人 | 麻豆精品一二三| 日韩欧美成人激情| 国产一区二区视频在线播放| 亚洲国产成人午夜在线一区| 97se亚洲国产综合自在线| 亚洲另类一区二区| 日韩亚洲欧美一区二区三区| 国产主播一区二区三区| 自拍偷在线精品自拍偷无码专区| 欧美在线免费观看亚洲| 久99久精品视频免费观看| 亚洲国产精品成人综合色在线婷婷 | 九九**精品视频免费播放| 国产欧美日韩在线看| 在线国产亚洲欧美| 看电影不卡的网站| 中文字幕中文乱码欧美一区二区| 欧美日韩精品三区| 国产一区二区成人久久免费影院 | 亚洲综合在线视频| 日韩欧美的一区| 一本色道久久综合亚洲91| 日本欧美一区二区在线观看| 日本一区二区三区久久久久久久久不 | 欧美在线你懂的| 国产成人精品影视| 香蕉乱码成人久久天堂爱免费| 日韩精品一区二区三区视频播放| av在线播放一区二区三区| 蜜臀av一区二区三区| 亚洲欧美另类图片小说| 久久综合久久久久88| 欧美日韩一级二级| 成人精品国产免费网站| 免费在线观看日韩欧美| 久久久久久久久久久久久久久99| 91在线看国产| 韩国精品久久久| 亚洲一区二区五区| 中文字幕不卡一区| 51久久夜色精品国产麻豆| 成人一级视频在线观看| 日韩经典一区二区| 亚洲视频在线一区| 久久久www成人免费无遮挡大片| 色成年激情久久综合| 精品一区二区日韩| 亚洲国产精品t66y| 日韩一级片在线播放| 91精品91久久久中77777| 亚洲一区二区影院| 亚洲精选一二三| 久久精品亚洲乱码伦伦中文| 欧美日韩一区精品| 波多野结衣一区二区三区| 加勒比av一区二区| 午夜精品一区二区三区免费视频| 国产精品系列在线| 欧美精品一区二区精品网| 欧美乱妇20p| 99re这里只有精品视频首页| 久久精品久久99精品久久| 亚洲www啪成人一区二区麻豆| 国产精品久久久久久久久果冻传媒| 欧美成人video| 91麻豆精品国产91久久久资源速度 | 91蜜桃视频在线| 国产91丝袜在线观看| 久久国产精品72免费观看| 调教+趴+乳夹+国产+精品| 国产午夜精品理论片a级大结局| 精品国产91九色蝌蚪| 制服.丝袜.亚洲.中文.综合| 欧美在线播放高清精品| 91精品办公室少妇高潮对白| 91亚洲精品乱码久久久久久蜜桃| 成人精品免费视频| 日本一区中文字幕| 五月综合激情网| 五月综合激情网| 丝瓜av网站精品一区二区| 亚洲色图视频网| 国产精品美女久久久久久久久 | 成人av集中营| 成人高清av在线| 99re这里只有精品视频首页| 99麻豆久久久国产精品免费优播| 成熟亚洲日本毛茸茸凸凹| av中文字幕一区| 在线观看国产精品网站| 欧美午夜电影在线播放| 欧美日免费三级在线| 欧美日韩不卡一区二区| 欧美成人国产一区二区| 国产午夜精品福利| 国产精品国产三级国产aⅴ中文 | 91麻豆精品国产91久久久更新时间| 欧美主播一区二区三区| 欧美日韩三级一区| 日韩一级黄色大片| 久久久另类综合| 久久久亚洲精品石原莉奈| 久久久久久麻豆| ...av二区三区久久精品| 亚洲精品亚洲人成人网| 日韩福利视频网| 国产精品综合网| 一本久久精品一区二区| 538在线一区二区精品国产| 久久久国产综合精品女国产盗摄| 国产精品欧美一级免费| 亚洲国产高清在线| 日精品一区二区| 高清不卡一二三区| 欧美日韩大陆在线| 26uuu成人网一区二区三区| 中文字幕一区二区三区四区| 免费看黄色91| 91影视在线播放| 久久久久久日产精品| 一区二区免费在线播放| 午夜视频一区在线观看| 国产成人免费视频网站高清观看视频 | 色综合久久综合网欧美综合网| 欧美精品少妇一区二区三区| 国产亚洲精品精华液| 夜夜精品浪潮av一区二区三区| 性欧美大战久久久久久久久| www.亚洲国产| 欧美一级黄色录像| 亚洲视频资源在线| 国产一区二区三区免费| 欧美视频一区在线| 国产调教视频一区| 蜜桃视频一区二区三区在线观看| 成人av电影免费在线播放| 欧美一区二区在线播放| 亚洲欧洲成人精品av97| 成人亚洲一区二区一| 日韩美女视频在线| 亚洲午夜激情av| 色综合视频在线观看| 中文字幕第一区二区| 蜜桃久久久久久久| 欧美日韩亚洲综合在线| 国产精品传媒视频| 成人黄色av电影| 久久先锋影音av鲁色资源网| 五月天亚洲精品| 色综合久久中文综合久久97| 欧美—级在线免费片| 久久99精品久久久| 日韩视频一区二区三区| 亚洲成人第一页| 在线免费观看不卡av| 国产精品蜜臀av| 91一区一区三区| 亚洲色图在线视频| 91免费精品国自产拍在线不卡| 久久久久久久免费视频了| 蜜桃视频免费观看一区| 欧美成人高清电影在线| 久久不见久久见中文字幕免费| 日本高清不卡在线观看| 亚洲激情图片qvod| 色哟哟欧美精品| 亚洲欧美日韩在线播放| 94-欧美-setu| 国产精品成人一区二区艾草| 99久久er热在这里只有精品15| 国产精品萝li| 国产精品乡下勾搭老头1| 精品美女一区二区| 精品一区二区三区在线播放 | 欧美成人激情免费网| 老司机午夜精品| 欧美大片日本大片免费观看| 国产高清成人在线| 中文字幕免费不卡| 99国产精品久久久| 一区二区久久久久久| 8v天堂国产在线一区二区| 美女视频一区二区三区| 日韩精品一区二区三区三区免费 | 亚洲图片自拍偷拍| 51精品视频一区二区三区| 三级不卡在线观看| 欧美tickling网站挠脚心| 男男成人高潮片免费网站| 久久久亚洲综合| 91亚洲资源网|