📄 sp5xxfw2.h
字号:
#ifndef SP5XXFW2_H#define SP5XXFW2_H/****************************************************************************# Sunplus spca504(abc) spca533 spca536 library ## Copyright (C) 2005 Michel Xhaard mxhaard@magic.fr ## ## 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 ## #****************************************************************************/#define SPCA504_PCCAM600_OFFSET_SNAPSHOT 3#define SPCA504_PCCAM600_OFFSET_COMPRESS 4#define SPCA504_PCCAM600_OFFSET_MODE 5#define SPCA504_PCCAM600_OFFSET_DATA 14 /* Frame packet header offsets for the spca533 */#define SPCA533_OFFSET_DATA 16#define SPCA533_OFFSET_FRAMSEQ 15/* Frame packet header offsets for the spca536 */#define SPCA536_OFFSET_DATA 4#define SPCA536_OFFSET_FRAMSEQ 1#include "sp5xxfw2.dat"static int sp5xxfw2_init(struct usb_spca50x *spca50x);static void sp5xxfw2_start(struct usb_spca50x *spca50x);static void sp5xxfw2_stopN(struct usb_spca50x *spca50x);static void sp5xxfw2_stop0(struct usb_spca50x *spca50x);static void sp5xxfw2_setbrightness(struct usb_spca50x *spca50x);static __u16 sp5xxfw2_getbrightness(struct usb_spca50x *spca50x);static void sp5xxfw2_setcontrast(struct usb_spca50x *spca50x);static __u16 sp5xxfw2_getcontrast(struct usb_spca50x *spca50x);static void sp5xxfw2_setcolors(struct usb_spca50x *spca50x);static __u16 sp5xxfw2_getcolors(struct usb_spca50x *spca50x);static void sp5xxfw2_setAutobright (struct usb_spca50x *spca50x);static int sp5xxfw2_config(struct usb_spca50x *spca50x);static void sp5xxfw2_setquality(struct usb_spca50x *spca50x);static void sp5xxfw2_shutdown(struct usb_spca50x *spca50x);static int sp5xxfw2_sofdetect(struct usb_spca50x *spca50x,struct spca50x_frame *frame, unsigned char *cdata,int *iPix, int seqnum,int *datalength);/************************** Virtual *************************/static void sp5xxfw2_shutdown(struct usb_spca50x *spca50x){}static void sp5xxfw2_setAutobright (struct usb_spca50x *spca50x){}static void sp5xxfw2_setquality(struct usb_spca50x *spca50x){}static void sp5xxfw2_stop0(struct usb_spca50x *spca50x){}//static __u16 sp5xxfw2_setexposure(struct usb_spca50x *spca50x);//static __u16 sp5xxfw2_getexposure(struct usb_spca50x *spca50x);/************************** Private *************************/static struct cam_operation fsp5xxfw2 = { .initialize = sp5xxfw2_init, .configure = sp5xxfw2_config, .start = sp5xxfw2_start, .stopN = sp5xxfw2_stopN, .stop0 = sp5xxfw2_stop0, .get_bright = sp5xxfw2_getbrightness, .set_bright = sp5xxfw2_setbrightness, .get_contrast = sp5xxfw2_getcontrast, .set_contrast = sp5xxfw2_setcontrast, .get_colors = sp5xxfw2_getcolors, .set_colors = sp5xxfw2_setcolors, .set_autobright = sp5xxfw2_setAutobright, .set_quality = sp5xxfw2_setquality, .cam_shutdown = sp5xxfw2_shutdown, .sof_detect = sp5xxfw2_sofdetect, };static void spca504B_SetSizeType(struct usb_spca50x *spca50x);static voidspca504_acknowledged_command(struct usb_spca50x *spca50x, __u16 reg, __u16 idx, __u16 val);static voidspca504A_acknowledged_command(struct usb_spca50x *spca50x, __u16 reg, __u16 idx, __u16 val, __u8 stat, __u8 count);static void spca504_wait_status(struct usb_spca50x *spca50x);static void spca50x_GetFirmware(struct usb_spca50x *spca50x);static int spca504B_PollingDataReady(struct usb_device *dev);static void spca504B_WaitCmdStatus(struct usb_spca50x *spca50x);static void spca504B_setQtable(struct usb_spca50x *spca50x);static void sp5xx_initContBrigHueRegisters(struct usb_spca50x *spca50x);/************************************************************/static int sp5xxfw2_init(struct usb_spca50x *spca50x){ int rc; __u8 Data = 0; __u8 i; __u8 info[6]; int err_code; switch (spca50x->bridge) { case BRIDGE_SPCA504B:{ spca5xxRegWrite(spca50x->dev, 0x1d, 0, 0, NULL, 0); spca5xxRegWrite(spca50x->dev, 0, 1, 0x2306, NULL, 0); spca5xxRegWrite(spca50x->dev, 0, 0, 0x0d04, NULL, 0); spca5xxRegWrite(spca50x->dev, 0, 0, 0x2000, NULL, 0); spca5xxRegWrite(spca50x->dev, 0, 0x13, 0x2301, NULL, 0); spca5xxRegWrite(spca50x->dev, 0, 0, 0x2306, NULL, 0); } // becare no break here init follow case BRIDGE_SPCA533: rc = spca504B_PollingDataReady(spca50x->dev); spca50x_GetFirmware(spca50x); break; case BRIDGE_SPCA536: spca50x_GetFirmware(spca50x); spca5xxRegRead(spca50x->dev, 0x00, 0, 0x5002, &Data, 1); Data = 0; spca5xxRegWrite(spca50x->dev, 0x24, 0, 0, &Data, 1); spca5xxRegRead(spca50x->dev, 0x24, 0, 0, &Data, 1); rc = spca504B_PollingDataReady(spca50x->dev); spca5xxRegWrite(spca50x->dev, 0x34, 0, 0, NULL, 0); spca504B_WaitCmdStatus(spca50x); break; case BRIDGE_SPCA504C: //pccam600 PDEBUG(2, "Opening SPCA504 (PC-CAM 600)"); spca50x_reg_write(spca50x->dev, 0xe0, 0x0000, 0x0000); spca50x_reg_write(spca50x->dev, 0xe0, 0x0000, 0x0001); // reset spca504_wait_status(spca50x); if (spca50x->desc == LogitechClickSmart420) { /* clicksmart 420 */ spca50x_write_vector(spca50x, spca504A_clicksmart420_open_data); } else { spca50x_write_vector(spca50x, spca504_pccam600_open_data); } err_code = spca50x_setup_qtable(spca50x, 0x00, 0x2800, 0x2840, qtable_creative_pccam); if (err_code < 0) { PDEBUG(2, "spca50x_setup_qtable failed"); return err_code; } break; case BRIDGE_SPCA504: PDEBUG(2, "Opening SPCA504"); if (spca50x->desc == AiptekMiniPenCam13) { /***************************************************************/ for (i = 0; i < 6; i++) { info[i] = spca50x_reg_read_with_value(spca50x->dev, 0x20, i, 0x0000, 1); } PDEBUG(0, "Read info: %d %d %d %d %d %d . Should be 1,0,2,2,0,0\n", info[0], info[1], info[2], info[3], info[4], info[5]); /* spca504a aiptek */ // Set AE AWB Banding Type 3-> 50Hz 2-> 60Hz spca504A_acknowledged_command(spca50x, 0x24, 8, 3, 0x9e, 1); // Twice sequencial need status 0xff->0x9e->0x9d spca504A_acknowledged_command(spca50x, 0x24, 8, 3, 0x9e, 0); spca504A_acknowledged_command(spca50x, 0x24, 0, 0, 0x9d, 1); /**************************************************************/ /* spca504a aiptek */ spca504A_acknowledged_command(spca50x, 0x08, 6, 0, 0x86, 1); // spca50x_reg_write (spca50x->dev, 0, 0x2000, 0); // spca50x_reg_write (spca50x->dev, 0, 0x2883, 1); // spca504A_acknowledged_command (spca50x, 0x08, 6, 0, 0x86, 1); //spca504A_acknowledged_command (spca50x, 0x24, 0, 0, 0x9D, 1); spca50x_reg_write(spca50x->dev, 0x0, 0x270c, 0x5); // L92 sno1t.txt spca50x_reg_write(spca50x->dev, 0x0, 0x2310, 0x5); spca504A_acknowledged_command(spca50x, 1, 0x0f, 0, 0xFF, 0); } /* setup qtable */ spca50x_reg_write(spca50x->dev, 0, 0x2000, 0); spca50x_reg_write(spca50x->dev, 0, 0x2883, 1); err_code = spca50x_setup_qtable(spca50x, 0x00, 0x2800, 0x2840, qtable_spca504_default); if (err_code < 0) { PDEBUG(2, "spca50x_setup_qtable failed"); return err_code; } break; } return 0;}static void sp5xxfw2_start(struct usb_spca50x *spca50x){ int rc; int enable; __u8 i; __u8 info[6]; if (spca50x->bridge == BRIDGE_SPCA504B) spca504B_setQtable(spca50x); spca504B_SetSizeType(spca50x); switch (spca50x->bridge) { case BRIDGE_SPCA504B: case BRIDGE_SPCA533: case BRIDGE_SPCA536: if (spca50x->desc == MegapixV4 || spca50x->desc == LogitechClickSmart820) { spca5xxRegWrite(spca50x->dev, 0xF0, 0, 0, NULL, 0); spca504B_WaitCmdStatus(spca50x); spca5xxRegRead(spca50x->dev, 0xF0, 0, 4, NULL, 0); spca504B_WaitCmdStatus(spca50x); } else { spca5xxRegWrite(spca50x->dev, 0x31, 0, 4, NULL, 0); spca504B_WaitCmdStatus(spca50x); rc = spca504B_PollingDataReady(spca50x->dev); } break; case BRIDGE_SPCA504: if (spca50x->desc == AiptekMiniPenCam13) { for (i = 0; i < 6; i++) { info[i] = spca50x_reg_read_with_value(spca50x->dev, 0x20, i, 0x0000, 1); } PDEBUG(0, "Read info: %d %d %d %d %d %d . Should be 1,0,2,2,0,0\n", info[0], info[1], info[2], info[3], info[4], info[5]); /* spca504a aiptek */ // Set AE AWB Banding Type 3-> 50Hz 2-> 60Hz spca504A_acknowledged_command(spca50x, 0x24, 8, 3, 0x9e, 1); // Twice sequencial need status 0xff->0x9e->0x9d spca504A_acknowledged_command(spca50x, 0x24, 8, 3, 0x9e, 0); spca504A_acknowledged_command(spca50x, 0x24, 0, 0, 0x9d, 1); } else { spca504_acknowledged_command(spca50x, 0x24, 8, 3); for (i = 0; i < 6; i++) { info[i] = spca50x_reg_read_with_value(spca50x->dev, 0x20, i, 0x0000, 1); } PDEBUG(0, "Read info: %d %d %d %d %d %d . Should be 1,0,2,2,0,0\n", info[0], info[1], info[2], info[3], info[4], info[5]); spca504_acknowledged_command(spca50x, 0x24, 8, 3); spca504_acknowledged_command(spca50x, 0x24, 0, 0); } spca504B_SetSizeType(spca50x); spca50x_reg_write(spca50x->dev, 0x0, 0x270c, 0x5); // L92 sno1t.txt spca50x_reg_write(spca50x->dev, 0x0, 0x2310, 0x5); break; case BRIDGE_SPCA504C: if (spca50x->desc == LogitechClickSmart420) { spca50x_write_vector(spca50x, spca504A_clicksmart420_init_data); } else { spca50x_write_vector(spca50x, spca504_pccam600_init_data); } enable = (spca50x->autoexpo ? 0x4 : 0x1); spca50x_reg_write(spca50x->dev, 0x0c, 0x0000, enable); // auto exposure spca50x_reg_write(spca50x->dev, 0xb0, 0x0000, enable); // auto whiteness /* set default exposure compensation and whiteness balance */ spca50x_reg_write(spca50x->dev, 0x30, 0x0001, 800); // ~ 20 fps spca50x_reg_write(spca50x->dev, 0x30, 0x0002, 1600); spca504B_SetSizeType(spca50x); break; } sp5xx_initContBrigHueRegisters(spca50x);}static void sp5xxfw2_stopN(struct usb_spca50x *spca50x){ int rc; switch (spca50x->bridge) { case BRIDGE_SPCA533: case BRIDGE_SPCA536: case BRIDGE_SPCA504B: spca5xxRegWrite(spca50x->dev, 0x31, 0, 0, NULL, 0); spca504B_WaitCmdStatus(spca50x); rc = spca504B_PollingDataReady(spca50x->dev); break; case BRIDGE_SPCA504: case BRIDGE_SPCA504C: spca50x_reg_write(spca50x->dev, 0x00, 0x2000, 0x0000); if (spca50x->desc == AiptekMiniPenCam13) { /* spca504a aiptek */ // spca504A_acknowledged_command (spca50x, 0x08, 6, 0, 0x86, 1); spca504A_acknowledged_command(spca50x, 0x24, 0x0000, 0x0000, 0x9d, 1); spca504A_acknowledged_command(spca50x, 0x01, 0x000f, 0x0000, 0xFF, 1); } else { spca504_acknowledged_command(spca50x, 0x24, 0x0000, 0x0000); spca50x_reg_write(spca50x->dev, 0x01, 0x000f, 0x0); } break; }}static void sp5xxfw2_setbrightness(struct usb_spca50x *spca50x){ switch (spca50x->bridge) { case BRIDGE_SPCA533: case BRIDGE_SPCA504B: case BRIDGE_SPCA504: case BRIDGE_SPCA504C: spca50x_reg_write(spca50x->dev, 0x0, 0x21a7, (spca50x->brightness >> 8)); break; case BRIDGE_SPCA536: spca50x_reg_write(spca50x->dev, 0x0, 0x20f0, (spca50x->brightness >> 8)); break; }}static __u16 sp5xxfw2_getbrightness(struct usb_spca50x *spca50x){ __u16 brightness = 0; switch (spca50x->bridge) { case BRIDGE_SPCA533: case BRIDGE_SPCA504B: case BRIDGE_SPCA504: case BRIDGE_SPCA504C: brightness = spca50x_reg_read(spca50x->dev, 0x0, 0x21a7, 2); spca50x->brightness = (((brightness & 0xFF) - 128) % 255) << 8; break; case BRIDGE_SPCA536: brightness = spca50x_reg_read(spca50x->dev, 0x0, 0x20f0, 2); spca50x->brightness = (((brightness & 0xFF) - 128) % 255) << 8; break; } return (((brightness & 0xFF) - 128) % 255) << 8;}static void sp5xxfw2_setcontrast(struct usb_spca50x *spca50x){ switch (spca50x->bridge) { case BRIDGE_SPCA533: case BRIDGE_SPCA504B: case BRIDGE_SPCA504: case BRIDGE_SPCA504C: spca50x_reg_write(spca50x->dev, 0x0, 0x21a8, spca50x->contrast >> 8); break; case BRIDGE_SPCA536: spca50x_reg_write(spca50x->dev, 0x0, 0x20f1, spca50x->contrast >> 8); break; }}static __u16 sp5xxfw2_getcontrast(struct usb_spca50x *spca50x){ switch (spca50x->bridge) { case BRIDGE_SPCA533: case BRIDGE_SPCA504B: case BRIDGE_SPCA504: case BRIDGE_SPCA504C: spca50x->contrast = spca50x_reg_read(spca50x->dev, 0x0, 0x21a8, 2) << 8; break; case BRIDGE_SPCA536: spca50x->contrast = spca50x_reg_read(spca50x->dev, 0x0, 0x20f1, 2) << 8; break; } return spca50x->contrast;}static void sp5xxfw2_setcolors(struct usb_spca50x *spca50x){ switch (spca50x->bridge) { case BRIDGE_SPCA533: case BRIDGE_SPCA504B: case BRIDGE_SPCA504: case BRIDGE_SPCA504C: spca50x_reg_write(spca50x->dev, 0x0, 0x21ae, spca50x->colour >> 8); break; case BRIDGE_SPCA536: spca50x_reg_write(spca50x->dev, 0x0, 0x20f6, spca50x->colour >> 8); break; }}static __u16 sp5xxfw2_getcolors(struct usb_spca50x *spca50x){ switch (spca50x->bridge) { case BRIDGE_SPCA533: case BRIDGE_SPCA504B: case BRIDGE_SPCA504: case BRIDGE_SPCA504C: spca50x->colour = spca50x_reg_read(spca50x->dev, 0x0, 0x21ae, 2) << 7; break; case BRIDGE_SPCA536: spca50x->colour = spca50x_reg_read(spca50x->dev, 0x0, 0x20f6, 2) << 7; break; } return spca50x->colour;}static int sp5xxfw2_config(struct usb_spca50x *spca50x){ switch (spca50x->bridge) { case BRIDGE_SPCA504B: case BRIDGE_SPCA504: case BRIDGE_SPCA536: memset(spca50x->mode_cam, 0x00, TOTMODE * sizeof(struct mwebcam)); spca50x->mode_cam[VGA].width = 640; spca50x->mode_cam[VGA].height = 480; spca50x->mode_cam[VGA].t_palette = P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[VGA].pipe = 1023; spca50x->mode_cam[VGA].method = 0; spca50x->mode_cam[VGA].mode = 1; spca50x->mode_cam[PAL].width = 384; spca50x->mode_cam[PAL].height = 288; spca50x->mode_cam[PAL].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[PAL].pipe = 1023; spca50x->mode_cam[PAL].method = 1; spca50x->mode_cam[PAL].mode = 1; spca50x->mode_cam[SIF].width = 352; spca50x->mode_cam[SIF].height = 288; spca50x->mode_cam[SIF].t_palette =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -