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

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

?? csi2c.c

?? 飛思卡爾的imx1的csi的驅動參考
?? C
?? 第 1 頁 / 共 2 頁
字號:
	 * to the Linux I2C system	 */	if (i2c_add_driver( &i2c_csi_driver ) != 0)	{		printk("*** i2c_add_driver() failed ***\n");		return;	}		/* 	 * attach the client to the adapter by calling the i2c_attach_client() 	 * function of the Linux I2C system	 */	if (i2c_attach_client(&i2c_csi_client ) != 0)	{			printk("*** i2c_attach_client() failed ***\n");		i2c_del_driver(&i2c_csi_driver);		return;	}	i2c_csi_client.adapter->inc_use( i2c_csi_client.adapter );}static void I2C_cleanup(void){	i2c_detach_client(&i2c_csi_client );	i2c_del_driver(&i2c_csi_driver);}//-------------------------------////	Port enable for CSI signals////-------------------------------static void port_init_CSI(void){//	PA14 : CSI_PIXCLK//	PA13 : CSI_HSYNC//	PA12 : CSI_VSYNC//	PA11 : CSI_D7//	PA10 : CSI_D6//	PA9  : CSI_D5//	PA8  : CSI_D4//	PA7  : CSI_D3//	PA6  : CSI_D2//	PA5  : CSI_D1//	PA4  : CSI_D0//	PA3  : CSI_MCLK	* (U32 *)PTA_DDIR |=  0x00007FF8;	* (U32 *)PTA_GIUS &= ~0x00007FF8;	return;}////	Offset Calibration Block//static void offsetCal(void){	int i, j;	I2C_write(0x20, 0x00);	I2C_write(0x21, 0x10);	I2C_write(0x23, 0x2A);//offset RAM registers// 12 sets of 64 columns (768 total columns)	for (i=0; i < 12; i++)	{		// Fixing columns with 1st method.		for (j=0; j < 33; j++)		{			I2C_write(0x22,0x00);		}		I2C_write(0x22,0x0a);	// neg offset (bright col)		I2C_write(0x22,0x09);	// neg offset (bright col)		I2C_write(0x22,0x01);	// pos offset (dark col)		I2C_write(0x22,0x02);	// pos offset (dark col)				for (j=0; j < 27; j++)		{			I2C_write(0x22,0x00);		}	}}static U32 CSI_init(U32 systemClock, U32 sensorClock){	U32 mclkdiv;	U32 MCLKDIV;//set port for CSI signals	port_init_CSI();//clock divider setting	mclkdiv = systemClock / sensorClock;	if(mclkdiv % 2)	//truncate to divider to even nos.		mclkdiv -= 1;	MCLKDIV = (((mclkdiv / 2) - 1) << 12) & 0xF000;	//gen register value	* (U32 *)CSI_CTRL_REG1   = 0x00000000;		//module reset	* (U32 *)CSI_CTRL_REG1   = 0x00000001;		//module enable	* (U32 *)CSI_CTRL_REG1  |= 0x200;				//MCLK enable	* (U32 *)CSI_CTRL_REG1  |= MCLKDIV;			//set clock divider	* (U32 *)CSI_CTRL_REG1  |= 0x00020000;		//SOF int disabled, SOF = rising edge//	* (U32 *)CSI_CTRL_REG1  |= 0x00040000;		//RxFIFO full int enb	* (U32 *)CSI_CTRL_REG1  |= 0x00000100;		//sync clear FIFOs//	* (U32 *)CSI_CTRL_REG1  |= 0x01000000;		//RX FIFO overrun interrupt enable////	Set FIFO full level////	This is a system timing issue, a HIGHER full level would produce//	LESS interrupt, which may reduce the overhead of ISR or polling//	* (U32 *)CSI_CTRL_REG1 &= ~0x180000;	//full = 16 words	* (U32 *)CSI_CTRL_REG1 |= 0x100000;	//full = 16 words//return the truncated sensor clock	gSensorClock = sensorClock = systemClock / mclkdiv;		port_init_SENSOR();	// toggle INIT pin of sensor to hard reset it   *(U32 *)PTB_DR |= (0x1 << 18); 	// RESET asserted   *(U32 *)PTB_DR &= ~(0x1 << 18); 	// RESET released		// do soft reset of sensor	I2C_write(0x0E, 0x03);	//sensor reset	I2C_write(0x0E, 0x00);	//clear reset	// set global gain	I2C_write(0x10, 0);	// set color gain	I2C_write(0x00, 0x06);		// Green of Green-Red Row	I2C_write(0x01, 0x0C);		// Red	I2C_write(0x02, 0x0E);		// Blue	I2C_write(0x03, 0x06);		// Green of Blue-Green Row	// Power Configuration		I2C_write(0x0C, 0x40);	// Color Tile Configuration	I2C_write(0x05, 0x05);		//	Color Tile Configuration 	I2C_write(0x06, 0x44);		// Row 1 Definition	I2C_write(0x07, 0xEE);		// Row 2 Definition	I2C_write(0x08, 0x00);		// Row 3 Definition	I2C_write(0x09, 0x00);		// Row 4 Definition	// Set Voltage Reference 	I2C_write(0x0A, 0x76);		// Negative Voltage	I2C_write(0x0B, 0x80);		// Positive Voltage	// Post ADC Control		I2C_write(0x30, 0xFE);		// While Pixel Threshold	I2C_write(0x31, 0x01);		// Black Pixel Threshold	I2C_write(0x32, 0x00);		// Post ADC Control	// Timing Control		I2C_write(0x54, 0xC0);		// SOF control	I2C_write(0x55, 0x90);		// VCLK control	I2C_write(0x63, 0x08);		// Factory Use Only Register, 										// but you have to set it like this	I2C_write(0x60, 0x00);		// Internal Timing	// Offset Calibration		offsetCal();	// capture mode setting	I2C_write(0x40, 0x35);		// Continuous capture, continuous streaming	// set WOI	I2C_write(0x4B, 0x02);		// WOI width (640)	I2C_write(0x4C, 0x7F);			I2C_write(0x47, 0x01);		// WOI Depth (480)	I2C_write(0x48, 0xDF);			I2C_write(0x49, 0x00);		// WOI column pointer (48)	I2C_write(0x4A, 48);			I2C_write(0x45, 0x00);		// WOI row pointer (20)	I2C_write(0x46, 20);		/*		I2C_write(0x50, 0x02);		// WOI width (640+11)	I2C_write(0x51, 0x8B);		*/		return sensorClock;}//---------------------------////	SENSOR Register Write////---------------------------//#define DEBUG_I2CWR#ifdef DEBUG_I2CWR#define dprinti2cwr(str...) printk("<"__FUNCTION__"> "str)#else#define dprinti2cwr(str...)	// nothing#endifstatic void I2C_write(U32 reg, U32 data){	struct i2c_msg msg;	char buf[2];			/* 	 * store the register value to the first address of the buffer 	 * the adapter/algorithm driver will regard the first byte 	 * as the register value 	 */	buf[0] = (char)reg;	buf[1] = (char)data;	msg.addr = i2c_csi_client.addr;	msg.flags = I2C_M_WRITE;//	msg.len = count;	msg.len = 2;	msg.buf = buf;	/* 	 * initialize the message structure	 */	i2c_transfer( i2c_csi_client.adapter, &msg, 1 );}//---------------------------////	SENSOR Register Read////---------------------------static void I2C_read(U32 reg, U32 * _data){	struct i2c_msg msg[2];	char buf;	char command;	/* 	 * store the register value to the first address of the buffer 	 * the adapter/algorithm driver will regard the first byte 	 * as the register value 	 */	buf = 0;	command = (char)reg;	/* 	 * initialize the message structure	 */	msg[0].addr = i2c_csi_client.addr;	msg[0].flags = 0x00;//	msg.len = count;	msg[0].len = 1;	msg[0].buf = &command;		msg[1].addr = i2c_csi_client.addr;	msg[1].flags = I2C_M_READ;//	msg.len = count;	msg[1].len = 1;	msg[1].buf = &buf;	i2c_transfer( i2c_csi_client.adapter, msg, 2 );	*_data = (U32)buf;}void setPortSYNC(U32 level){	if(level)		* (U32 *)PTA_DR |=  0x00800000;	else		* (U32 *)PTA_DR &= ~0x00800000;			return;}//-------------------------------////	Port enable for SENSOR signals////-------------------------------static void port_init_SENSOR(void){//PA23 = SYNC (~CS5)//config PA23 for SYNC	* (U32 *)PTA_DR  &= ~0x00800000;	* (U32 *)PTA_GIUS |= 0x00800000;		* (U32 *)PTA_OCR2 |= 0x0000C000;	* (U32 *)PTA_DDIR |= 0x00800000;	* (U32 *)PTA_GPR  |= 0x00800000;//	* (U32 *)PTA_DR   |= 0x00800000;//default set port to low//	* (U32 *)PTA_DR  &= ~0x00800000;}//------------------------------------////	Capture image data with DMA////	Unified function for all //	supported image size capture////	Return TRUE if success//	Return FALSE if FIFO is overrun////------------------------------------static U32 SFCM_capture_DMA(U32 nPixel){	dma_data_size = nPixel;	readSeqNum = capSeqNum = SOFseqNum = 0;	stopCapture = 0;		* (U32 *)CSI_STS_REG   = 0x10000;	//clear last SOF irq	* (U32 *)CSI_CTRL_REG1  |= 0x60;		//prepare for sync clear FIFOs	*(U32 *)CSI_CTRL_REG1  |= 0x10000;			//enable SOF intr	return TRUE;}static void dma_complete_handler(){	*((U32 *)(DMA_CCR0+dma_channel*0x40)) = 0x800;				// disable DMA channel	*((U32 *)DMA_ISR) = (1<<dma_channel);		// clear DMA complete interrupt flag	if (stopCapture)	{		dmaStopped = 1;		wake_up_interruptible(&stop_capture_wait);		return;	}		if (*(U32 *)CSI_STS_REG & 1)	{		//	printk("!!! Data in FIFO !!!\n");		return;	}	capSeqNum++;//	if (!stopCapture)//	{		*((U32 *)(DMA_DAR0+dma_channel*0x40)) = dma_buf_phy_addr;	// destination		*((U32 *)(DMA_CNTR0+dma_channel*0x40)) = dma_data_size;		// count		*((U32 *)(DMA_CCR0+dma_channel*0x40)) = 0x809;					// enable DMAchannel		badFrame = 0;	// mark a good frame		wake_up_interruptible(&dma_wait);//	}}static void dma_error_handler(int error_type){	printk("*** CSI DMA error, type = 0x%08x ! ***\n", error_type);}static void csi_intr_handler(int irq, void *dev_id, struct pt_regs *regs){	if (*(U32 *)CSI_STS_REG & 0x10000)	// SOF intr ?	{		*(U32 *)CSI_STS_REG = 0x10000;						// clear SOF intr			if (stopCapture)		{			*(U32 *)CSI_CTRL_REG1  &= ~0x10000;				//disable SOF intr			SOFintrStopped = 1;			wake_up_interruptible(&stop_capture_wait);			return;		}		else		{			if (SOFseqNum==0)	// first SOF interrupt ?			{				*((U32 *)(DMA_DAR0+dma_channel*0x40)) = dma_buf_phy_addr;	// destination				*((U32 *)(DMA_CNTR0+dma_channel*0x40)) = dma_data_size;		// count				*((U32 *)(DMA_CCR0+dma_channel*0x40)) = 0x809;					// enable DMAchannel			}			else	// subsequent SOF interrupt (for data lost checking)			{				if (capSeqNum < SOFseqNum)	// i.e. DMA NOT completed on-time				{					// re-sync data					capSeqNum++;					*((U32 *)(DMA_CCR0+dma_channel*0x40)) = 0x800;					// disable DMA channel					// Notify read routine that there has been a bad frame					badFrame = 1;					wake_up_interruptible(&dma_wait);						*((U32 *)(DMA_DAR0+dma_channel*0x40)) = dma_buf_phy_addr;	// destination					*((U32 *)(DMA_CNTR0+dma_channel*0x40)) = dma_data_size;		// count					*((U32 *)(DMA_CCR0+dma_channel*0x40)) = 0x809;					// enable DMAchannel				}							}			readSeqNum = SOFseqNum;		// reading of last frame is not allowed			SOFseqNum++;		}		return;	}	printk("*** unknown interrupt ***\n");	*(U32 *)CSI_STS_REG = *(U32 *)CSI_STS_REG;	// clear all remaining interrupt flags}static devfs_handle_t devfs_handle;int init_module(){	int result;	printk("CSI driver "__DATE__" / "__TIME__"\n");	/* register our character device */		 	result = devfs_register_chrdev(0, "csi2c", &csi2c_fops); 	if ( result < 0 ) 	{		printk("csi2c driver: Unable to register driver\n");		return -ENODEV;	}	devfs_handle = devfs_register(NULL, "csi2c", DEVFS_FL_DEFAULT,				      result, 0,				      S_IFCHR | S_IRUSR | S_IWUSR,				      &csi2c_fops, NULL);   		      printk("make node for csi2c with 'mknod csi2c c %d 0'\n", result);		gMajor = result;		//init GPIO (PB19 / SIM_CLK) - used as STDBY by new CMOS sensor   *((U32 *)PTB_GIUS) |= 0x1 << 19;   *((U32 *)PTB_OCR2) |= 0x3 << (19 * 2 - 32);   *((U32 *)PTB_DDIR) |= 0x1 << 19;   *((U32 *)PTB_GPR ) |= 0x1 << 19;   *((U32 *)PTB_DR  ) &= ~(0x1 << 19); 	// normal mode	// init GPIO (PB18) - used as CMOS H/W reset by CMOS sensor   *((U32 *)PTB_GIUS) |= 0x1 << 18;   *((U32 *)PTB_OCR2) |= 0x3 << (18 * 2 - 32);   *((U32 *)PTB_DDIR) |= 0x1 << 18;   *((U32 *)PTB_GPR ) |= 0x1 << 18;   *((U32 *)PTB_DR  ) &= ~(0x1 << 18); 	// RESET released	if (request_irq(CSI_IRQ, csi_intr_handler, SA_INTERRUPT, "CSI", NULL))		printk("*** Cannot register interrupt handler for CSI ! ***\n");	else		printk("CSI interrupt handler registered\n");		I2C_init();	malloc_buffer();   return 0;}void cleanup_module(){	if (gMajor > 0){		devfs_unregister_chrdev(gMajor, "csi2c");		devfs_unregister(devfs_handle);		}			free_irq(CSI_IRQ, 0);	I2C_cleanup();		free_buffer();		printk("Say goodbye to csi2c\n");}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 99精品欧美一区二区三区小说 | 欧美日韩二区三区| 欧美综合亚洲图片综合区| 欧美一区午夜视频在线观看| 久久综合久久综合久久| 亚洲国产精品成人综合| 亚洲国产裸拍裸体视频在线观看乱了| 老司机精品视频在线| 国产成人在线视频播放| 在线播放中文一区| 亚洲男女一区二区三区| 日韩av电影免费观看高清完整版在线观看 | 精品视频在线视频| 国产精品人人做人人爽人人添| 视频一区视频二区中文| 成人理论电影网| 欧美一激情一区二区三区| 国产精品久久久久久久久久久免费看| 一本高清dvd不卡在线观看| 日韩欧美国产一区二区在线播放| 亚洲日本免费电影| 国产91精品入口| 久久久午夜精品| 日韩专区在线视频| 久久精品日产第一区二区三区高清版| 在线观看日韩电影| 久久综合久久99| 中文字幕一区二区日韩精品绯色| 国产一区二区三区不卡在线观看 | 日本韩国精品在线| 欧美性大战久久久| 欧美经典三级视频一区二区三区| 99久久精品国产一区| 婷婷综合久久一区二区三区| 在线视频一区二区三| 国产成人免费高清| 亚洲一区在线观看网站| www.99精品| 亚洲国产成人一区二区三区| 色成人在线视频| 国产美女视频91| 日韩精品电影在线观看| 国产精品女同互慰在线看| 91精品国产美女浴室洗澡无遮挡| 99久久伊人精品| 国产在线不卡一卡二卡三卡四卡| 亚洲福利视频一区二区| 国产欧美精品一区二区色综合| 粉嫩绯色av一区二区在线观看| 午夜av电影一区| 亚洲欧美日韩人成在线播放| 久久久高清一区二区三区| 91精品视频网| 精品亚洲免费视频| 久久你懂得1024| 日韩精品中文字幕在线一区| 日本韩国精品在线| 波多野结衣在线一区| 国产精品不卡在线观看| 精品国产成人系列| 成人激情图片网| 国产一区二三区好的| 日本不卡一区二区| 91精品国产综合久久精品图片 | www.色精品| 国产毛片一区二区| 精品一区二区三区影院在线午夜| 视频一区欧美精品| 日韩精品成人一区二区三区| 亚洲一区二区精品3399| 一区二区三区四区精品在线视频 | 日韩高清在线电影| 日本aⅴ亚洲精品中文乱码| 图片区小说区国产精品视频| 一区二区三区国产豹纹内裤在线 | 精品视频一区三区九区| 色婷婷狠狠综合| 一本色道综合亚洲| 91官网在线免费观看| 色综合久久六月婷婷中文字幕| 一本一道波多野结衣一区二区| 91丨porny丨蝌蚪视频| 亚洲综合在线第一页| 亚洲激情五月婷婷| 精品少妇一区二区三区| 91蝌蚪porny九色| 欧美午夜精品一区二区蜜桃| 在线免费观看日本一区| 欧美日本在线看| 欧美成人高清电影在线| 精品久久久久久久一区二区蜜臀| 久久嫩草精品久久久久| 中文字幕亚洲欧美在线不卡| 亚洲精品写真福利| 日本特黄久久久高潮| 国产精品亚洲一区二区三区在线 | 久久久91精品国产一区二区精品 | 在线观看一区二区视频| 91精品久久久久久蜜臀| 日韩视频在线你懂得| 国产午夜精品一区二区| 亚洲精品久久久蜜桃| 五月婷婷激情综合| 国产一区二区女| 91网页版在线| 91小视频在线| 日韩视频一区二区三区| 久久久91精品国产一区二区三区| 中文字幕制服丝袜成人av | 亚洲国产精品精华液ab| 亚洲日本免费电影| 视频一区二区中文字幕| 色婷婷综合在线| 日韩欧美不卡一区| 国产精品日韩成人| 午夜不卡av在线| 国产精品综合视频| 精品1区2区3区| 国产亚洲精久久久久久| 亚洲妇女屁股眼交7| 国产精品一区二区在线播放| 色先锋资源久久综合| 精品第一国产综合精品aⅴ| 亚洲精品v日韩精品| 精品夜夜嗨av一区二区三区| 色婷婷亚洲婷婷| 国产亚洲一本大道中文在线| 一区二区成人在线视频| 国内精品伊人久久久久影院对白| 日韩二区三区在线观看| 成人精品电影在线观看| 欧美精品高清视频| 国产精品免费视频一区| 久久国产视频网| 一本大道av伊人久久综合| 精品美女一区二区| 污片在线观看一区二区| av一二三不卡影片| 精品伦理精品一区| 亚洲18影院在线观看| 午夜精品在线看| 波多野结衣亚洲| 精品剧情在线观看| 午夜不卡在线视频| 欧洲av在线精品| 国产精品视频你懂的| 久久99精品国产麻豆婷婷洗澡| 欧美色倩网站大全免费| 亚洲婷婷在线视频| 国产福利精品导航| www国产成人| 久久超碰97中文字幕| 欧美区一区二区三区| 亚洲一区二区三区国产| 91一区在线观看| 最好看的中文字幕久久| 成人黄色免费短视频| 久久久精品国产免大香伊| 国产一区二区三区免费在线观看 | 精品一区二区久久| 欧美一级欧美三级| 国产精品123| 国产亚洲精品中文字幕| 国产精品一区二区无线| 久久网站最新地址| 国产99精品国产| 国产精品久久久久婷婷| 99在线热播精品免费| 国产精品大尺度| 91丝袜国产在线播放| 亚洲精品国产无天堂网2021| 欧洲精品中文字幕| 午夜不卡av在线| 日韩精品一区二区三区中文不卡| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产一区二区三区av电影| 欧美精品一区二区三区很污很色的| 日韩国产成人精品| 欧美精品一区二区三区四区| 国产老肥熟一区二区三区| 久久久久久久久99精品| 国产电影一区二区三区| 国产精品国产三级国产专播品爱网| 成人av网址在线| 亚洲美女免费在线| 7777女厕盗摄久久久| 麻豆精品在线视频| 国产亚洲一本大道中文在线| av影院午夜一区| 亚洲一线二线三线久久久| 欧美高清视频一二三区 | 精品一区二区三区视频| 中文字幕欧美激情| 色婷婷av一区二区| 日韩va欧美va亚洲va久久| 精品国产乱码久久久久久久久| 国产乱码精品1区2区3区| 国产精品的网站| 在线播放一区二区三区|