📄 zc0301_pb0330.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 + -