📄 mr97311.h
字号:
/****************************************************************************# Mars-Semi MR97311A library ## Copyright (C) 2005 <bradlch@hotmail.com> ## Part of spca5xx project ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## #****************************************************************************/static int mr97311_init(struct usb_spca50x *pcam);static void mr97311_start(struct usb_spca50x *pcam);static void mr97311_stopN(struct usb_spca50x *pcam);static void mr97311_stop0(struct usb_spca50x *pcam);static int mr97311_config(struct usb_spca50x *pcam);static __u16 mr97311_getbrightness(struct usb_spca50x *spca50x);static __u16 mr97311_getcontrast(struct usb_spca50x *spca50x);static __u16 mr97311_getcolors(struct usb_spca50x *spca50x);static void mr97311_setbrightness(struct usb_spca50x *spca50x);static void mr97311_setcontrast(struct usb_spca50x *spca50x);static void mr97311_setcolors(struct usb_spca50x *spca50x);static void mr97311_shutdown(struct usb_spca50x *spca50x);static void mr97311_setAutobright(struct usb_spca50x *spca50x);static void mr97311_setquality(struct usb_spca50x *spca50x);static int mr97311_sofdetect(struct usb_spca50x *spca50x,struct spca50x_frame *frame, unsigned char *cdata,int *iPix, int seqnum, int *datalength);/*****************************************************************/static int mr97311_init(struct usb_spca50x *pcam){return 0;}static __u16 mr97311_getbrightness(struct usb_spca50x *spca50x){return 0;}static __u16 mr97311_getcontrast(struct usb_spca50x *spca50x){return 0;}static __u16 mr97311_getcolors(struct usb_spca50x *spca50x){return 0;}static void mr97311_setbrightness(struct usb_spca50x *spca50x){}static void mr97311_setcontrast(struct usb_spca50x *spca50x){}static void mr97311_setcolors(struct usb_spca50x *spca50x){}static void mr97311_shutdown(struct usb_spca50x *spca50x){}static void mr97311_setAutobright(struct usb_spca50x *spca50x){}static void mr97311_setquality(struct usb_spca50x *spca50x){}static void mr97311_stop0(struct usb_spca50x *pcam){}/****************************************************************/static struct cam_operation fmr97311 = { .initialize = mr97311_init, .configure = mr97311_config, .start = mr97311_start, .stopN = mr97311_stopN, .stop0 = mr97311_stop0, .get_bright = mr97311_getbrightness, .set_bright = mr97311_setbrightness, .get_contrast = mr97311_getcontrast, .set_contrast = mr97311_setcontrast, .get_colors = mr97311_getcolors, .set_colors = mr97311_setcolors, .set_autobright = mr97311_setAutobright, .set_quality = mr97311_setquality, .cam_shutdown = mr97311_shutdown, .sof_detect = mr97311_sofdetect, };static int pcam_reg_write(struct usb_device *dev, __u16 index, unsigned char *value, int length);static void MISensor_BulkWrite(struct usb_device *dev, unsigned short *pch, char Address, int length, char controlbyte);//MI Register table //elvisenum { REG_HW_MI_0, REG_HW_MI_1, REG_HW_MI_2, REG_HW_MI_3, REG_HW_MI_4, REG_HW_MI_5, REG_HW_MI_6, REG_HW_MI_7, REG_HW_MI_9 = 0x09, REG_HW_MI_B = 0x0B, REG_HW_MI_C, REG_HW_MI_D, REG_HW_MI_1E = 0x1E, REG_HW_MI_20 = 0x20, REG_HW_MI_2B = 0x2B, REG_HW_MI_2C, REG_HW_MI_2D, REG_HW_MI_2E, REG_HW_MI_35 = 0x35, REG_HW_MI_5F = 0x5F, REG_HW_MI_60, REG_HW_MI_61, REG_HW_MI_62, REG_HW_MI_63, REG_HW_MI_64, REG_HW_MI_F1 = 0xF1, ATTR_TOTAL_MI_REG = 242};static void mr97311_stopN(struct usb_spca50x *pcam){ int result; char data[2]; memset(data, 0, 2); data[0] = 1; data[1] = 0; result = pcam_reg_write(pcam->dev, data[0], data, 2); if (result < 0) printk("Camera Stop failed \n");}static int pcam_reg_write(struct usb_device *dev, __u16 index, unsigned char *value, int length){ unsigned char buf[12]; int rc; int i; unsigned char index_value = 0; memset(buf, 0, sizeof(buf)); for (i = 0; i < length; i++) buf[i] = value[i]; rc = usb_control_msg(dev, usb_sndbulkpipe(dev, 4), 0x12, 0xc8, index_value, index, value, length, 5 * HZ); PDEBUG(1, "reg write: 0x%02X , result = 0x%x \n", index, rc); if (rc < 0) { PDEBUG(1, "reg write: error %d \n", rc); } return rc;}static void mr97311_start(struct usb_spca50x *pcam){ int err_code; unsigned char data[242]; unsigned short MI_buf[242]; int h_size, v_size; int intpipe; //struct usb_device *dev = pcam->dev; memset(data, 0, 242); memset(MI_buf, 0, 242); PDEBUG(1, "usb_set_interface in pcamCameraStart , interface %d , alt 8 \n", pcam->iface); if (usb_set_interface(pcam->dev, pcam->iface, 8) < 0) { err("Set packet size: set interface error"); return ; } data[0] = 0x01; //address data[1] = 0x01; err_code = pcam_reg_write(pcam->dev, data[0], data, 0x02); if (err_code < 0) { printk("Register write failed \n"); return ; } /* Initialize the MR97113 chip register */ data[0] = 0x00; //address data[1] = 0x0c | 0x01; //reg 0 data[2] = 0x01; //reg 1 switch (pcam->width) { case 1280: h_size = 1280; v_size = 1024; break; case 640: h_size = 640; v_size = 480; break; case 384: h_size = 384; v_size = 288; break; case 352: h_size = 352; v_size = 288; break; case 320: h_size = 320; v_size = 240; break; default: h_size = 352; v_size = 288; break; } data[3] = h_size / 8; //h_size , reg 2 data[4] = v_size / 8; //v_size , reg 3 data[5] = 0x30; // reg 4, MI, PAS5101 : 0x30 for 24mhz , 0x28 for 12mhz data[6] = 4; // reg 5, H start data[7] = 0xc0; // reg 6, gamma 1.5 data[8] = 3; // reg 7, V start //if(pcam->width == 320 ) //data[9]= 0x56; // reg 8, 24MHz, 2:1 scale down //else data[9] = 0x52; // reg 8, 24MHz, no scale down data[10] = 0x5d; // reg 9, I2C device address [for PAS5101 (0x40)] [for MI (0x5d)] err_code = pcam_reg_write(pcam->dev, data[0], data, 0x0b); if (err_code < 0) { PDEBUG(1, "Register write failed \n"); return ; } data[0] = 0x23; //address data[1] = 0x09; // reg 35, append frame header err_code = pcam_reg_write(pcam->dev, data[0], data, 0x02); if (err_code < 0) { PDEBUG(1, "Register write failed \n"); return ; } data[0] = 0x3C; //address if (pcam->width == 1280) data[1] = 200; // reg 60, pc-cam frame size (unit: 4KB) 800KB else data[1] = 50; // 50 reg 60, pc-cam frame size (unit: 4KB) 200KB err_code = pcam_reg_write(pcam->dev, data[0], data, 0x02); if (err_code < 0) { PDEBUG(1, "Register write failed \n"); return ; } if (0) { // fixed dark-gain data[1] = 0; // reg 94, Y Gain (1.75) data[2] = 0; // reg 95, UV Gain (1.75) data[3] = 0x3f; // reg 96, Y Gain/UV Gain/disable auto dark-gain data[4] = 0; // reg 97, set fixed dark level data[5] = 0; // reg 98, don't care } else { // auto dark-gain data[1] = 0; // reg 94, Y Gain (auto) data[2] = 0; // reg 95, UV Gain (1.75) data[3] = 0x78; // reg 96, Y Gain/UV Gain/disable auto dark-gain switch (pcam->width) { case 1280: data[4] = 154; // reg 97, %3 shadow point (unit: 256 pixel) data[5] = 51; // reg 98, %1 highlight point (uint: 256 pixel) break; case 640: data[4] = 36; // reg 97, %3 shadow point (unit: 256 pixel) data[5] = 12; // reg 98, %1 highlight point (uint: 256 pixel) break; case 320: data[4] = 9; // reg 97, %3 shadow point (unit: 256 pixel) data[5] = 3; // reg 98, %1 highlight point (uint: 256 pixel) break; } } // auto dark-gain data[0] = 0x5E; // address
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -