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

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

?? csi.c

?? freescale MX21 0V9650攝像頭驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
	unsigned int mclkdiv = 4;	//default set to perclk4/4 => 22MHz
	_reg_GPIO_GIUS(GPIOD) &= ~0x60000;
	_reg_GPIO_GPR(GPIOD) &= ~0x60000;
//disable GPIO PB[21..10]
	_reg_GPIO_GIUS(GPIOB) &= ~0x3FFC00;

	_reg_GPIO_GIUS(GPIOB) |= 0x4000000;
	_reg_GPIO_PUEN(GPIOB) |= 0x4000000;
	_reg_GPIO_DDIR(GPIOB) |= 0x4000000;
	_reg_GPIO_OCR2(GPIOB) |= 0x300000;
	_reg_GPIO_DR(GPIOB) |= 0x4000000;
          udelay(5000);
	_reg_GPIO_DR(GPIOB) &= ~0x4000000;

//hclk clock enable
	_reg_CRM_PCCR0 |= 0x80000000;

//temp solution
//version check should be done in run time
	g_csi_ver = 2;

//reset
	_reg_CSI_CSICR1 = CSICR1_RESET_VAL;
	_reg_CSI_CSICR2 = CSICR2_RESET_VAL;
	if(g_csi_ver == 2)
		_reg_CSI_CSICR3 = CSICR3_RESET_VAL;
			//need to enable hclk before CSICR3 can be access

//enable perclk4
	_reg_CRM_PCCR0 |= 0x00400000;
	val = _reg_CRM_PCDR1;
	val &= ~(0x3F << 24);
	val |= (perclk4div - 1) << 24;
	_reg_CRM_PCDR1 = val;
	
	_reg_CSI_CSICR1 = CSICR1_RESET_VAL;
	_reg_CSI_CSICR2 = CSICR2_RESET_VAL;
	_reg_CSI_CSICR3 = CSICR3_RESET_VAL;
	
//enable default mclk clock
	val = CSICR1_RESET_VAL;
	val |= ((mclkdiv / 2) - 1) << SHIFT_MCLKDIV;
	val |= BIT_MCLKEN;
	_reg_CSI_CSICR1 = val;

	return;
}


static void csi_cleanup(void)
{
	_reg_CSI_CSICR1 = CSICR1_RESET_VAL;
	_reg_CSI_CSICR2 = CSICR2_RESET_VAL;
	_reg_CSI_CSICR3 = CSICR3_RESET_VAL;
	return;
}


//Read a frame by polling
static int csi_poll(unsigned int * _buf, int byte_size)
{
	int i, j;
	int word_size = byte_size >> 2;

	unsigned int *_kbuf;
	int korder;
	int required_pages;
	int extra_pages;
//alloc a tmp buffer in kernel space
	required_pages = byte_size >> PAGE_SHIFT;
	for (korder = 0 ; required_pages >> korder ; korder++) {;}
	extra_pages = (1 << korder) - required_pages;
	_kbuf = (unsigned int *)__get_free_pages(GFP_KERNEL, korder);
	if(!_kbuf)
	{
		printk("csi error: buffer alloc failed\n");
		return -1;
	}
	
//poll sof
	_reg_CSI_CSISR = BIT_SOF_INT;
	while(!(_reg_CSI_CSISR & BIT_SOF_INT));
	_reg_CSI_CSISR = BIT_SOF_INT;

//clear fifo overflow
	if(_reg_CSI_CSISR & BIT_RFF_OR_INT)
		_reg_CSI_CSISR = BIT_RFF_OR_INT;

//read rx fifo
	j = 0;
	while(1)
	{
	//overflow check
		if(_reg_CSI_CSISR & BIT_RFF_OR_INT)
		{
//			printk("csi error: overflow\n");
			_reg_CSI_CSISR = BIT_RFF_OR_INT;
		}
	//poll rx fifo full
		if(_reg_CSI_CSISR & BIT_RXFF_INT)
		{
			for(i = 0; i < 8; i ++)
				_kbuf[j ++] = _reg_CSI_CSIRXR;
		}
		if(j >= word_size)
			break;
	}
	copy_to_user(_buf, _kbuf, byte_size);
	free_pages((int)_kbuf, korder);

	return 0;
}

static void csi_reset_frame_count(void)
{
	_reg_CSI_CSICR3 |= BIT_FRMCNT_RST;
	return;
}

static int csi_get_frame_count(void)
{
	int count;
	count = _reg_CSI_CSICR3 >> SHIFT_FRMCNT;

	return count;
}


//global static
static devfs_handle_t devfs_handle;
static int gMajor = 0;

//functions and interface
static int 		csi_open(struct inode *inode, struct file *filp);
static int 		csi_release(struct inode *inode, struct file *filp);
static ssize_t 	csi_read(struct file *filp, char *buf, size_t size, loff_t *l);
static ssize_t 	csi_write(struct file *filp, const char *buf, size_t size, loff_t *l);
static int 		csi_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);

struct file_operations csi_fops = 
{
	open:		csi_open,
	release:	csi_release,
	read:		csi_read,
	write:		csi_write,
	ioctl:		csi_ioctl,
};
static OV9650_CFG g_ov9650_cfg;


//init module does only the basic things
//dma & irq are turned on later according to csi config
int __init init_module()
{
	int result;

	csi_module_init();
	_reg_CRM_PCDR1 &= ~0x3f000000;
	_reg_CRM_PCDR1 |= 0x2000000;
	_reg_CSI_CSICR1 |= 0x2;  //latch on rising edge
	_reg_CSI_CSICR1 |= 0x4;	// invert the PIXCLK
	_reg_CSI_CSICR1 |= 0x40000000;
	_reg_CSI_CSICR1 |= 0x40000;
	_reg_CSI_CSICR1 |= 0x1000000;
	_reg_CSI_CSICR1 |= 0x100000;
	_reg_CSI_CSICR1 |= 0x10000000;
	_reg_CSI_CSICR1 |= 0x10; //gated clock mode
	_reg_CSI_CSICR1 |= 0x800;
	_reg_CSI_CSICR1 |= 0x80; //big endian
	_reg_CSI_CSICR1 |= 0x100;        //sync FIFO clear
	_reg_CSI_CSICR1 |= 0x0200;       //MCLK = HCLK / 2
	_reg_CSI_CSICR1 |= 0x1000;         //HHTech add:set clock divider(=4)
	_reg_CSI_CSICR1 |= 0x20000;      //SOF rising edge
	_reg_CSI_CSICR1 &= ~0xF000;
//	_reg_CSI_CSICR1 |= 0x1000;
	_reg_CSI_CSICR1 &= ~0x18000;
	_reg_CSI_CSICR1 |= 0x10000;
	_reg_CSI_CSICR1 |= 0x80000000;
	_reg_CSI_CSICR1 &= ~0x80;
	printk("MX21 CSI driver\n");
	printk("h/w version %d\n", g_csi_ver);
	printk("s/w version 0.0\n"__DATE__" / "__TIME__"\n");
	printk("CSI_CSICR1 0x%8x\n",_reg_CSI_CSICR1);

//register CSI character device
 	result = devfs_register_chrdev(0, "csi2c", &csi_fops);
 	if ( result < 0 )
 	{
		printk("csi error: unable to register driver\n");
		return -ENODEV;
	}
	devfs_handle = devfs_register(NULL, "csi2c", DEVFS_FL_DEFAULT,
				      result, 0,
				      S_IFCHR | S_IRUSR | S_IWUSR,
				      &csi_fops, NULL);   	
	gMajor = result;
        if (request_irq
            (31, csi_intr_handler, SA_INTERRUPT, "CSI", NULL))
                printk
                    ("*** Cannot register interrupt handler for CSI ! ***\n");
        else
                printk("CSI interrupt handler registered\n");

	malloc_buffer();

	sensor_reset();
	i2c_test();
	
	ov9650_config_SENSOR(&g_ov9650_cfg);
//	ov9650_config_QVGA(&g_ov9650_cfg);
	printk("OV9650 Sensor Init OK!\n");

   	return 0;
}


void __exit cleanup_module()
{    
	csi_cleanup();

   	if(gMajor > 0)
   	{
		devfs_unregister_chrdev(gMajor, "csi");
		devfs_unregister(devfs_handle);
	}

	printk("CSI driver is unloaded sucessfully\n\n");
        free_irq(31,0);
        free_buffer();	
	return;
}
// DMA support HHTECH

static int csi_open(struct inode *inode, struct file *filp)
{
        dma_request_t csi_dma_req = {0};
       
        MOD_INC_USE_COUNT;
        return 0;
}


static int csi_release(struct inode *inode, struct file *filp)
{
        MOD_DEC_USE_COUNT;
	return 0;	
}


static ssize_t csi_read(struct file *filp, char *buf, size_t size, loff_t *l)
{
	int i;
	while(!PRP_poll_ch1_buf1_complete());
	copy_to_user(buf, csi_data_buf, size);
	return 0;
}


static ssize_t csi_write(struct file *filp, const char *buf, size_t size, loff_t *l)
{
	printk("csi error: write ioctl is not implemented\n");
	return -1;
}


static int csi_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
	switch(cmd)
	{
	case IOCTL_CSI_READ_CONFIG:
		{
			csi_read_cfg(&g_csi_cfg);

			if(copy_to_user((void *)arg, (void *)&g_csi_cfg, sizeof(CSI_CFG)))
				return -EFAULT;

			break;
		}
	case IOCTL_CSI_CONFIG:
		{
			if(copy_from_user((void *)&g_csi_cfg, (void *)arg, sizeof(CSI_CFG)))
				return -EFAULT;

			csi_config(&g_csi_cfg);

			break;
		}
	case IOCTL_I2C_R:
		{
			unsigned char val,reg;
			reg = (unsigned char *) arg;
			i2c_read(reg,&val);
			return val;
		}
	case IOCTL_I2C_W:
		{
			unsigned char val,reg;
			reg = (unsigned char *)((arg >> 8) & 0xff);
			val = (unsigned char *)(arg & 0xff);
			i2c_write(reg, val);
			return 0;
		}
	case IOCTL_CSI_READ_STATUS:
		{
			csi_read_status(&g_csi_status);

			if(copy_to_user((void *)arg, (void *)&g_csi_status, sizeof(CSI_STATUS)))
				return -EFAULT;
			
			break;
		}
	case IOCTL_CSI_GET_FRMCNT:
		{
			int count;
			count = csi_get_frame_count();
			if(copy_to_user((void *)arg, (void *)&count, sizeof(int)))
				return -EFAULT;
			
			break;
		}
	case IOCTL_CSI_RST_FRMCNT:
		{
			csi_reset_frame_count();
			
			break;
		}
	case IOCTL_DMA_CAPTURE:
		{      
			return SFCM_capture_DMA((U32) arg);
 			break;
		}
	case IOCTL_STOP_CAPTURE:
		break;
	case IOCTL_SET_FMT:
		switch(arg)
		{
		case 0:
			PRP_init33(dma_buf_phy_addr,0xc2103000,0xc2106000,0xc2109000);
			ov9650_config_QVGA(&g_ov9650_cfg);
			break;
		case 1:
			PRP_init32(dma_buf_phy_addr,0xc2103000,0xc2106000,0xc2109000);
			ov9650_config_VGA(&g_ov9650_cfg);
			break;
		case 2:
			PRP_init31(dma_buf_phy_addr,0xc2103000,0xc2106000,0xc2109000);
			ov9650_config_SXGA(&g_ov9650_cfg);	
			break;
		case 3:
			PRP_init33(dma_buf_phy_addr,0xc2103000,0xc2106000,0xc2109000);
			ov9650_config_V_Q(&g_ov9650_cfg);
			break;
		case 4:
			PRP_init33(dma_buf_phy_addr,0xc2103000,0xc2106000,0xc2109000);
			ov9650_config_S_Q(&g_ov9650_cfg);
			break;
		}
		break;
	}
	
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级电影网站| av在线一区二区| 成人午夜私人影院| 欧美亚洲禁片免费| 国产偷国产偷精品高清尤物| 亚洲二区在线视频| 97se狠狠狠综合亚洲狠狠| 日韩久久免费av| 婷婷综合另类小说色区| 99久久精品国产导航| 久久综合999| 久久av中文字幕片| 色综合久久天天综合网| 日本一区二区成人| 国产一区二区三区在线观看免费 | 亚洲国产精品麻豆| 国v精品久久久网| 2023国产精品自拍| 蜜臀av性久久久久蜜臀aⅴ| 在线视频中文字幕一区二区| 亚洲女同ⅹxx女同tv| 国产成人在线视频播放| 欧美tickling网站挠脚心| 日日摸夜夜添夜夜添亚洲女人| 91伊人久久大香线蕉| 国产精品沙发午睡系列990531| 精品一二三四在线| 日韩欧美激情四射| 激情av综合网| 337p粉嫩大胆噜噜噜噜噜91av| 青青草91视频| 欧美一级淫片007| 日韩影视精彩在线| 日韩欧美国产精品一区| 日韩av电影天堂| 日韩欧美在线一区二区三区| 五月天激情小说综合| 91精品蜜臀在线一区尤物| 日日夜夜一区二区| 欧美va亚洲va| 成人午夜在线免费| 亚洲欧美电影一区二区| 在线精品国精品国产尤物884a| 亚洲一区二区在线播放相泽| 欧美日韩高清一区二区三区| 美腿丝袜亚洲综合| 久久久久久久国产精品影院| 成人动漫在线一区| 亚洲图片欧美视频| 538在线一区二区精品国产| 蜜臀国产一区二区三区在线播放| 久久久久久久久久看片| 成人av电影免费在线播放| 一区二区三区欧美视频| 欧美丰满美乳xxx高潮www| 男女性色大片免费观看一区二区 | 激情图片小说一区| 国产欧美精品一区| 色菇凉天天综合网| 免费日本视频一区| 国产欧美精品一区二区三区四区| 色综合中文字幕| 老司机精品视频导航| 国产精品欧美久久久久一区二区| 欧美在线视频你懂得| 精品中文av资源站在线观看| ...xxx性欧美| 日韩三级精品电影久久久| 成人动漫在线一区| 久久精品国产一区二区| 亚洲视频在线观看一区| 日韩视频一区二区三区在线播放| heyzo一本久久综合| 麻豆免费精品视频| 亚洲精品高清在线| 久久欧美中文字幕| 欧美猛男男办公室激情| gogo大胆日本视频一区| 乱中年女人伦av一区二区| 亚洲精品欧美专区| 国产亚洲精品超碰| 欧美一区在线视频| 91蜜桃免费观看视频| 韩国精品主播一区二区在线观看| 亚洲精品老司机| 日本一区二区三区国色天香| 欧美一区二区三区啪啪| 91蜜桃传媒精品久久久一区二区| 国产真实乱子伦精品视频| 亚洲国产综合人成综合网站| 国产精品欧美经典| 久久久久久久久久久久久夜| 欧美一区二区三区免费视频| 亚洲欧美日韩国产一区二区三区| 国产成人av电影在线| 亚洲成av人影院| 久久精品男人天堂av| 69av一区二区三区| 欧美伊人久久久久久午夜久久久久| 顶级嫩模精品视频在线看| 蜜桃一区二区三区在线| 亚洲电影一级黄| 一区二区三区高清在线| 亚洲欧美一区二区三区久本道91 | 中文字幕精品在线不卡| 26uuu另类欧美亚洲曰本| 欧美一区欧美二区| 欧美高清hd18日本| 欧美精品日韩一区| 欧美另类videos死尸| 色拍拍在线精品视频8848| 色老头久久综合| 91国偷自产一区二区开放时间| 99久久精品免费看国产| 91蜜桃免费观看视频| 99久久精品免费| 色婷婷精品大在线视频| 在线观看欧美日本| 欧美三级三级三级爽爽爽| 日本久久电影网| 欧美中文一区二区三区| 在线观看av不卡| 欧美喷水一区二区| 日韩欧美卡一卡二| 久久一夜天堂av一区二区三区| 精品国产免费一区二区三区四区 | 欧美tickle裸体挠脚心vk| 欧美r级在线观看| 精品国产成人系列| 国产婷婷色一区二区三区四区| 欧美国产精品一区二区| 国产精品卡一卡二| 亚洲一级电影视频| 日韩精品91亚洲二区在线观看 | 欧美伊人精品成人久久综合97| 欧美影院午夜播放| 日韩你懂的电影在线观看| 精品国产一区二区三区不卡| 日本一区免费视频| 亚洲欧美日韩精品久久久久| 亚洲国产成人porn| 久久国产精品99久久人人澡| 不卡大黄网站免费看| 欧美性做爰猛烈叫床潮| 日韩你懂的在线观看| 亚洲欧美在线观看| 日韩电影在线看| 大尺度一区二区| 欧美日韩中文一区| 久久亚洲精精品中文字幕早川悠里| 中文字幕一区二区三区精华液| 亚洲电影在线播放| 成人深夜在线观看| 欧美高清性hdvideosex| 久久精品亚洲一区二区三区浴池 | 精品在线一区二区| 国v精品久久久网| 欧美美女视频在线观看| 久久久久久久久99精品| 亚洲不卡一区二区三区| 国产成人亚洲综合a∨婷婷图片| 91福利在线看| 国产免费成人在线视频| 三级亚洲高清视频| 91视频精品在这里| 精品国产免费人成电影在线观看四季 | 国产午夜精品久久久久久久 | 国产精品综合视频| 欧美日韩日日夜夜| 国产精品第五页| 久久er99精品| 欧美日韩专区在线| 亚洲免费观看在线视频| 国产盗摄一区二区| 欧美喷潮久久久xxxxx| 亚洲欧美日韩在线| 大美女一区二区三区| 日韩欧美一卡二卡| 天天色图综合网| 色视频一区二区| ●精品国产综合乱码久久久久| 国产在线视频一区二区| 欧美二区三区91| 一区二区三区日韩在线观看| 成人av综合一区| 国产午夜一区二区三区| 美国一区二区三区在线播放| 欧美婷婷六月丁香综合色| 亚洲欧美影音先锋| 成人夜色视频网站在线观看| 精品国产99国产精品| 蜜桃精品在线观看| 欧美日韩亚洲综合在线 | 免费精品视频在线| 欧美日韩国产成人在线91| 亚洲一区二区美女| 在线观看一区日韩| 亚洲专区一二三| 欧美精三区欧美精三区| 亚洲午夜激情av|