1c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/* 2c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * USB Driver for ALi m5602 based webcams 3c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * 40c505e688bb22c1b4431b4c07cd1fcff22fe37a2Erik Andren * Copyright (C) 2008 Erik Andrén 5c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project. 6c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br> 7c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * 8c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * Portions of code to USB interface and ALi driver software, 9c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * Copyright (c) 2006 Willem Duinker 10c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * v4l2 interface modeled after the V4L2 driver 11c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * for SN9C10x PC Camera Controllers 12c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * 13c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * This program is free software; you can redistribute it and/or 14c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * modify it under the terms of the GNU General Public License as 15c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * published by the Free Software Foundation, version 2. 16c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * 17c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren */ 18c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 19c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#ifndef M5602_BRIDGE_H_ 20c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define M5602_BRIDGE_H_ 21c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 22be2a9fae7be36864777e4b66f925d7af11578d99Jean-François Moine#include <linux/slab.h> 23c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#include "gspca.h" 24c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 25c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define MODULE_NAME "ALi m5602" 26c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 27c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/*****************************************************************************/ 28c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 29000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SENSOR_TYPE 0x00 30000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SENSOR_CTRL 0x01 31000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_LINE_OF_FRAME_H 0x02 32000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_LINE_OF_FRAME_L 0x03 33000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_PIX_OF_LINE_H 0x04 34000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_PIX_OF_LINE_L 0x05 35000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_VSYNC_PARA 0x06 36000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_HSYNC_PARA 0x07 37000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_TEST_MODE_1 0x08 38000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_TEST_MODE_2 0x09 39000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SIG_INI 0x0a 40000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_DS_PARA 0x0e 41000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_TRIG_PARA 0x0f 42000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_CLK_PD 0x10 43000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_MCU_CLK_CTRL 0x12 44000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_MCU_CLK_DIV 0x13 45000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SEN_CLK_CTRL 0x14 46000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SEN_CLK_DIV 0x15 47000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_AUD_CLK_CTRL 0x16 48000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_AUD_CLK_DIV 0x17 4986c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_AC_LINK_STATE 0x22 5086c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_PCM_SLOT_INDEX 0x24 5186c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_GPIO_SLOT_INDEX 0x25 5286c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACRX_STATUS_ADDRESS_H 0x28 5386c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACRX_STATUS_DATA_L 0x29 5486c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACRX_STATUS_DATA_H 0x2a 5586c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACTX_COMMAND_ADDRESS 0x31 5686c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACRX_COMMAND_DATA_L 0x32 5786c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACTX_COMMAND_DATA_H 0X33 58000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_DEVCTR1 0x41 59000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_EPSETR0 0x42 60000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_EPAFCTR 0x47 61000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_EPBFCTR 0x49 62000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_EPEFCTR 0x4f 63000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_TEST_REG 0x53 64000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_ALT2SIZE 0x54 65000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_ALT3SIZE 0x55 66000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_OBSFRAME 0x56 67000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_PWR_CTL 0x59 68000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_ADC_CTRL 0x60 69000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_ADC_DATA 0x61 70000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_MISC_CTRL 0x62 71000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SNAPSHOT 0x63 72000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SCRATCH_1 0x64 73000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SCRATCH_2 0x65 74000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SCRATCH_3 0x66 75000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SCRATCH_4 0x67 76000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_CTRL 0x68 77000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_CLK_DIV 0x69 78000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_DEV_ADDR 0x6a 79000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_REG_ADDR 0x6b 80000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_DATA 0x6c 81000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_STATUS 0x6d 82000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DAT_H 0x70 83000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DAT_L 0x71 84000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DIR_H 0x72 85000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DIR_L 0x73 86000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_EN_H 0x74 87000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_EN_L 0x75 88000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DAT 0x76 89000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DIR 0x77 9086c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_SEN_CLK_CONTROL 0x80 9186c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_SEN_CLK_DIVISION 0x81 9286c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_CPR_CLK_CONTROL 0x82 9386c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_CPR_CLK_DIVISION 0x83 9486c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_MCU_CLK_CONTROL 0x84 9586c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_MCU_CLK_DIVISION 0x85 9686c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_DCT_CLK_CONTROL 0x86 9786c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_DCT_CLK_DIVISION 0x87 9886c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_EC_CLK_CONTROL 0x88 9986c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_EC_CLK_DIVISION 0x89 10086c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_LBUF_CLK_CONTROL 0x8a 10186c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_LBUF_CLK_DIVISION 0x8b 102c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 1039267b1e8249983ecaded94bf23253a66a5cc55fcErik Andrén#define I2C_BUSY 0x80 104c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 105c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/*****************************************************************************/ 106c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 107c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/* Driver info */ 108c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define DRIVER_AUTHOR "ALi m5602 Linux Driver Project" 109c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define DRIVER_DESC "ALi m5602 webcam driver" 110c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 111c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define M5602_ISOC_ENDPOINT_ADDR 0x81 112c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define M5602_INTR_ENDPOINT_ADDR 0x82 113c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 114c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define M5602_URB_MSG_TIMEOUT 5000 115c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 116c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/*****************************************************************************/ 117c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 118c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/* A skeleton used for sending messages to the m5602 bridge */ 119c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenstatic const unsigned char bridge_urb_skeleton[] = { 120c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 0x13, 0x00, 0x81, 0x00 121c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren}; 122c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 123c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/* A skeleton used for sending messages to the sensor */ 124c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenstatic const unsigned char sensor_urb_skeleton[] = { 125c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 0x23, M5602_XB_GPIO_EN_H, 0x81, 0x06, 126c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 0x23, M5602_XB_MISC_CTRL, 0x81, 0x80, 127c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 0x13, M5602_XB_I2C_DEV_ADDR, 0x81, 0x00, 128c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 0x13, M5602_XB_I2C_REG_ADDR, 0x81, 0x00, 129c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 0x13, M5602_XB_I2C_DATA, 0x81, 0x00, 130c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 0x13, M5602_XB_I2C_CTRL, 0x81, 0x11 131c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren}; 132c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 133c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenstruct sd { 134c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren struct gspca_dev gspca_dev; 135c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 136c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren /* A pointer to the currently connected sensor */ 137e4cc4fcc7b85ec32f05343b02229492c06baba1aErik Andr?n const struct m5602_sensor *sensor; 138c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 139c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren /* The current frame's id, used to detect frame boundaries */ 140c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren u8 frame_id; 141c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 142c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren /* The current frame count */ 143c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren u32 frame_count; 144c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede 145c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede /* Camera rotation polling thread for "flipable" cams */ 146c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct task_struct *rotation_thread; 147c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede 148c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct { /* auto-white-bal + green/red/blue balance control cluster */ 149c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *auto_white_bal; 150c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *red_bal; 151c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *blue_bal; 152c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *green_bal; 153c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede }; 154c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct { /* autoexpo / expo cluster */ 155c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *autoexpo; 156c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *expo; 157c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede }; 158c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct { /* autogain / gain cluster */ 159c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *autogain; 160c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *gain; 161c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede }; 162c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct { /* hflip/vflip cluster */ 163c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *hflip; 164c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede struct v4l2_ctrl *vflip; 165c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede }; 166c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren}; 167c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 168c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenint m5602_read_bridge( 169ff1e6a2155a42f99a9ded8362be2962b1089296bErik Andrén struct sd *sd, const u8 address, u8 *i2c_data); 170c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 171c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenint m5602_write_bridge( 172ff1e6a2155a42f99a9ded8362be2962b1089296bErik Andrén struct sd *sd, const u8 address, const u8 i2c_data); 173c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren 1746dc4cff0c391c691dae56486f854534658fdfea8Erik Andrénint m5602_write_sensor(struct sd *sd, const u8 address, 1756dc4cff0c391c691dae56486f854534658fdfea8Erik Andrén u8 *i2c_data, const u8 len); 1766dc4cff0c391c691dae56486f854534658fdfea8Erik Andrén 177e7a7f5103bddf2491760677cdd715a865b889072Erik Andrénint m5602_read_sensor(struct sd *sd, const u8 address, 178e7a7f5103bddf2491760677cdd715a865b889072Erik Andrén u8 *i2c_data, const u8 len); 179e7a7f5103bddf2491760677cdd715a865b889072Erik Andrén 180c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#endif 181