⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zc0301_pb0330.c

📁 linux环境下中芯微芯片摄像头驱动源代码
💻 C
字号:
/*	This file about front-end configurations * * 	The values copied from ZC0301 source in kernel, because I cann't find manual. *	 *	It's created by WE.XCC at 2008.05.04 *
 *
 *	Author's E-mail:84318391@163.com */#include <linux/usb.h>#include <linux/delay.h>#include <linux/types.h>#include <linux/module.h>#include "zc0301_struct.h"#include "zc0301_debug.h"/**************************************************/int zc0301_write_reg(struct zc0301_device *cam, u16 index, u16 value){	struct usb_device *udev = NULL;	int res = 0;		if (cam == NULL)	{		debug_error("zc0301_write_reg:cam in null\n");		return -ENODEV;	}	udev = cam->usbdev;		res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0xa0, 0x40, value, index, NULL, 0, 100);	if (res < 0)		debug_error("zc0301_write_reg:res < 0\n");	return res;}int zc0301_read_reg(struct zc0301_device *cam, u16 index){	struct usb_device *udev = NULL;	u8 *buff = NULL;	int res = 0;	if (cam == NULL)	{		debug_error("zc0301_read_reg:cam is null\n");		return -ENODEV;	}	//debug_param("%s\n", __FUNCTION__);	udev = cam->usbdev;	buff = cam->control_buffer;		res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0xa1, 0xc0, 0x0001, index, buff, 1, 100);	if (res < 0)	{		debug_error("zc0301_read_reg:res < 0\n");		return -1;	}	return (int)(*buff);}int zc0301_i2c_read(struct zc0301_device *cam, u16 address, u8 length){	int err = 0, res = 0, r0 = 0, r1 = 0;	if (cam == NULL)	{		debug_error("zc0301_i2c_read:cam is null\n");		return -ENODEV;	}	err += zc0301_write_reg(cam, 0x0092, address);	err += zc0301_write_reg(cam, 0x0090,0x02);	msleep(1);	res = zc0301_read_reg(cam, 0x0091);	if (res < 0)		err += res;	r0 = zc0301_read_reg(cam, 0x0095);	if (r0 < 0)		err += r0;	r1 = zc0301_read_reg(cam, 0x0096);	if (r1 < 0)		err += r1;	res = (length <= 1) ? r0:r0 | (r1 << 8);	if (err)	{		debug_error("zc0301_i2c_read:read i2c failed\n");		return -1;	}	return res;}int zc0301_i2c_write(struct zc0301_device *cam, u16 address, u16 value){	int err = 0, res = 0;	if (cam == NULL)	{		debug_error("zc0301_i2c_write:cam is null\n");		return -ENODEV;	}		err += zc0301_write_reg(cam, 0x0092, address);	err += zc0301_write_reg(cam, 0x0093, value & 0xff);	err += zc0301_write_reg(cam, 0x0094, value >> 8);	err += zc0301_write_reg(cam, 0x0090, 0x01);	msleep(1);	res = zc0301_read_reg(cam, 0x0091);	if (res < 0)		err += res;	if (err)	{		debug_error("zc0301_i2c_write:write i2c failed\n");		return -1;	}	return 0;}/*********************************************************/int zc0301_set_compression(struct zc0301_device *cam){	int r = 0, err = 0;	if (cam == NULL)	{		debug_error("zc0301_set_compression:cam is null\n");		return -ENODEV;	}	//debug_param("%s\n", __FUNCTION__);	if ((r = zc0301_read_reg(cam, 0x0008)) < 0)		err += r;	err += zc0301_write_reg(cam, 0x0008, r | 0x11 | 0);	return err ? -EIO : 0;}int zc0301_pb0330_init(struct zc0301_device *cam){	int err = 0;	if (cam == NULL)	{		debug_error("zc0301_pb0330_init:cam is null\n");		return -ENODEV;	}	//debug_param("%s\n", __FUNCTION__);	err += zc0301_write_reg(cam, 0x0000, 0x01);	err += zc0301_write_reg(cam, 0x0008, 0x03);	err += zc0301_write_reg(cam, 0x0010, 0x0A);	err += zc0301_write_reg(cam, 0x0002, 0x00);	err += zc0301_write_reg(cam, 0x0003, 0x02);	err += zc0301_write_reg(cam, 0x0004, 0x80);	err += zc0301_write_reg(cam, 0x0005, 0x01);	err += zc0301_write_reg(cam, 0x0006, 0xE0);	err += zc0301_write_reg(cam, 0x0001, 0x01);	err += zc0301_write_reg(cam, 0x0012, 0x05);	err += zc0301_write_reg(cam, 0x0012, 0x07);	err += zc0301_write_reg(cam, 0x0098, 0x00);	err += zc0301_write_reg(cam, 0x009A, 0x00);	err += zc0301_write_reg(cam, 0x011A, 0x00);	err += zc0301_write_reg(cam, 0x011C, 0x00);	err += zc0301_write_reg(cam, 0x0012, 0x05);	err += zc0301_i2c_write(cam, 0x01, 0x0006);	err += zc0301_i2c_write(cam, 0x02, 0x0011);	err += zc0301_i2c_write(cam, 0x03, 0x01E7);	err += zc0301_i2c_write(cam, 0x04, 0x0287);	err += zc0301_i2c_write(cam, 0x06, 0x0003);	err += zc0301_i2c_write(cam, 0x07, 0x3002);	err += zc0301_i2c_write(cam, 0x20, 0x1100);	err += zc0301_i2c_write(cam, 0x2F, 0xF7B0);	err += zc0301_i2c_write(cam, 0x30, 0x0005);	err += zc0301_i2c_write(cam, 0x31, 0x0000);	err += zc0301_i2c_write(cam, 0x34, 0x0100);	err += zc0301_i2c_write(cam, 0x35, 0x0060);	err += zc0301_i2c_write(cam, 0x3D, 0x068F);	err += zc0301_i2c_write(cam, 0x40, 0x01E0);	err += zc0301_i2c_write(cam, 0x58, 0x0078);	err += zc0301_i2c_write(cam, 0x62, 0x0411);	err += zc0301_write_reg(cam, 0x0087, 0x10);	err += zc0301_write_reg(cam, 0x0101, 0x37);	err += zc0301_write_reg(cam, 0x0012, 0x05);	err += zc0301_write_reg(cam, 0x0100, 0x0D);	err += zc0301_write_reg(cam, 0x0189, 0x06);	err += zc0301_write_reg(cam, 0x01AD, 0x00);	err += zc0301_write_reg(cam, 0x01C5, 0x03);	err += zc0301_write_reg(cam, 0x01CB, 0x13);	err += zc0301_write_reg(cam, 0x0250, 0x08);	err += zc0301_write_reg(cam, 0x0301, 0x08);	err += zc0301_write_reg(cam, 0x01A8, 0x60);	err += zc0301_write_reg(cam, 0x018D, 0x6C);	err += zc0301_write_reg(cam, 0x01AD, 0x09);	err += zc0301_write_reg(cam, 0x01AE, 0x15);	err += zc0301_write_reg(cam, 0x010A, 0x50);	err += zc0301_write_reg(cam, 0x010B, 0xF8);	err += zc0301_write_reg(cam, 0x010C, 0xF8);	err += zc0301_write_reg(cam, 0x010D, 0xF8);	err += zc0301_write_reg(cam, 0x010E, 0x50);	err += zc0301_write_reg(cam, 0x010F, 0xF8);	err += zc0301_write_reg(cam, 0x0110, 0xF8);	err += zc0301_write_reg(cam, 0x0111, 0xF8);	err += zc0301_write_reg(cam, 0x0112, 0x50);	err += zc0301_write_reg(cam, 0x0008, 0x03);	err += zc0301_write_reg(cam, 0x01C6, 0x08);	err += zc0301_write_reg(cam, 0x01CB, 0x0F);	err += zc0301_write_reg(cam, 0x010A, 0x50);	err += zc0301_write_reg(cam, 0x010B, 0xF8);	err += zc0301_write_reg(cam, 0x010C, 0xF8);	err += zc0301_write_reg(cam, 0x010D, 0xF8);	err += zc0301_write_reg(cam, 0x010E, 0x50);	err += zc0301_write_reg(cam, 0x010F, 0xF8);	err += zc0301_write_reg(cam, 0x0110, 0xF8);	err += zc0301_write_reg(cam, 0x0111, 0xF8);	err += zc0301_write_reg(cam, 0x0112, 0x50);	err += zc0301_write_reg(cam, 0x0180, 0x00);	err += zc0301_write_reg(cam, 0x0019, 0x00);	err += zc0301_i2c_write(cam, 0x05, 0x0066);	err += zc0301_i2c_write(cam, 0x09, 0x02B2);	err += zc0301_i2c_write(cam, 0x10, 0x0002);	err += zc0301_write_reg(cam, 0x011D, 0x60);	err += zc0301_write_reg(cam, 0x0190, 0x00);	err += zc0301_write_reg(cam, 0x0191, 0x07);	err += zc0301_write_reg(cam, 0x0192, 0x8C);	err += zc0301_write_reg(cam, 0x0195, 0x00);	err += zc0301_write_reg(cam, 0x0196, 0x00);	err += zc0301_write_reg(cam, 0x0197, 0x8A);	err += zc0301_write_reg(cam, 0x018C, 0x10);	err += zc0301_write_reg(cam, 0x018F, 0x20);	err += zc0301_write_reg(cam, 0x01A9, 0x14);	err += zc0301_write_reg(cam, 0x01AA, 0x24);	err += zc0301_write_reg(cam, 0x001D, 0xD7);	err += zc0301_write_reg(cam, 0x001E, 0xF0);	err += zc0301_write_reg(cam, 0x001F, 0xF8);	err += zc0301_write_reg(cam, 0x0020, 0xFF);	err += zc0301_write_reg(cam, 0x01AD, 0x09);	err += zc0301_write_reg(cam, 0x01AE, 0x15);	err += zc0301_write_reg(cam, 0x0180, 0x40);	err += zc0301_write_reg(cam, 0x0180, 0x42);	msleep(100);	return err;}int zc0301_pb0330_probe(struct zc0301_device *cam){	int r0 = 0, err = 0;	if (cam == NULL)	{		debug_error("zc0301_pb0330_probe:cam is null\n");		return -ENODEV;	}	//debug_param("%s\n", __FUNCTION__);	err += zc0301_write_reg(cam, 0x0000, 0x01);	err += zc0301_write_reg(cam, 0x0010, 0x0a);	err += zc0301_write_reg(cam, 0x0001, 0x01);	err += zc0301_write_reg(cam, 0x0012, 0x03);	err += zc0301_write_reg(cam, 0x0012, 0x01);	msleep(10);	r0 = zc0301_i2c_read(cam, 0x00, 2);	if (r0 < 0 || err)		return -EIO;	if (r0 != 0x8243)		return -ENODEV;	return 0;}EXPORT_SYMBOL(zc0301_set_compression);EXPORT_SYMBOL(zc0301_pb0330_init);EXPORT_SYMBOL(zc0301_pb0330_probe);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -