Commit | Line | Data |
---|---|---|
c109f816 EA |
1 | /* |
2 | * USB Driver for ALi m5602 based webcams | |
3 | * | |
0c505e68 | 4 | * Copyright (C) 2008 Erik Andrén |
c109f816 EA |
5 | * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project. |
6 | * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br> | |
7 | * | |
8 | * Portions of code to USB interface and ALi driver software, | |
9 | * Copyright (c) 2006 Willem Duinker | |
10 | * v4l2 interface modeled after the V4L2 driver | |
11 | * for SN9C10x PC Camera Controllers | |
12 | * | |
13 | * This program is free software; you can redistribute it and/or | |
14 | * modify it under the terms of the GNU General Public License as | |
15 | * published by the Free Software Foundation, version 2. | |
16 | * | |
17 | */ | |
18 | ||
19 | #ifndef M5602_BRIDGE_H_ | |
20 | #define M5602_BRIDGE_H_ | |
21 | ||
be2a9fae | 22 | #include <linux/slab.h> |
c109f816 EA |
23 | #include "gspca.h" |
24 | ||
25 | #define MODULE_NAME "ALi m5602" | |
26 | ||
27 | /*****************************************************************************/ | |
28 | ||
000e177f EA |
29 | #define M5602_XB_SENSOR_TYPE 0x00 |
30 | #define M5602_XB_SENSOR_CTRL 0x01 | |
31 | #define M5602_XB_LINE_OF_FRAME_H 0x02 | |
32 | #define M5602_XB_LINE_OF_FRAME_L 0x03 | |
33 | #define M5602_XB_PIX_OF_LINE_H 0x04 | |
34 | #define M5602_XB_PIX_OF_LINE_L 0x05 | |
35 | #define M5602_XB_VSYNC_PARA 0x06 | |
36 | #define M5602_XB_HSYNC_PARA 0x07 | |
37 | #define M5602_XB_TEST_MODE_1 0x08 | |
38 | #define M5602_XB_TEST_MODE_2 0x09 | |
39 | #define M5602_XB_SIG_INI 0x0a | |
40 | #define M5602_XB_DS_PARA 0x0e | |
41 | #define M5602_XB_TRIG_PARA 0x0f | |
42 | #define M5602_XB_CLK_PD 0x10 | |
43 | #define M5602_XB_MCU_CLK_CTRL 0x12 | |
44 | #define M5602_XB_MCU_CLK_DIV 0x13 | |
45 | #define M5602_XB_SEN_CLK_CTRL 0x14 | |
46 | #define M5602_XB_SEN_CLK_DIV 0x15 | |
47 | #define M5602_XB_AUD_CLK_CTRL 0x16 | |
48 | #define M5602_XB_AUD_CLK_DIV 0x17 | |
86c9fb51 EA |
49 | #define M5602_OB_AC_LINK_STATE 0x22 |
50 | #define M5602_OB_PCM_SLOT_INDEX 0x24 | |
51 | #define M5602_OB_GPIO_SLOT_INDEX 0x25 | |
52 | #define M5602_OB_ACRX_STATUS_ADDRESS_H 0x28 | |
53 | #define M5602_OB_ACRX_STATUS_DATA_L 0x29 | |
54 | #define M5602_OB_ACRX_STATUS_DATA_H 0x2a | |
55 | #define M5602_OB_ACTX_COMMAND_ADDRESS 0x31 | |
56 | #define M5602_OB_ACRX_COMMAND_DATA_L 0x32 | |
57 | #define M5602_OB_ACTX_COMMAND_DATA_H 0X33 | |
000e177f EA |
58 | #define M5602_XB_DEVCTR1 0x41 |
59 | #define M5602_XB_EPSETR0 0x42 | |
60 | #define M5602_XB_EPAFCTR 0x47 | |
61 | #define M5602_XB_EPBFCTR 0x49 | |
62 | #define M5602_XB_EPEFCTR 0x4f | |
63 | #define M5602_XB_TEST_REG 0x53 | |
64 | #define M5602_XB_ALT2SIZE 0x54 | |
65 | #define M5602_XB_ALT3SIZE 0x55 | |
66 | #define M5602_XB_OBSFRAME 0x56 | |
67 | #define M5602_XB_PWR_CTL 0x59 | |
68 | #define M5602_XB_ADC_CTRL 0x60 | |
69 | #define M5602_XB_ADC_DATA 0x61 | |
70 | #define M5602_XB_MISC_CTRL 0x62 | |
71 | #define M5602_XB_SNAPSHOT 0x63 | |
72 | #define M5602_XB_SCRATCH_1 0x64 | |
73 | #define M5602_XB_SCRATCH_2 0x65 | |
74 | #define M5602_XB_SCRATCH_3 0x66 | |
75 | #define M5602_XB_SCRATCH_4 0x67 | |
76 | #define M5602_XB_I2C_CTRL 0x68 | |
77 | #define M5602_XB_I2C_CLK_DIV 0x69 | |
78 | #define M5602_XB_I2C_DEV_ADDR 0x6a | |
79 | #define M5602_XB_I2C_REG_ADDR 0x6b | |
80 | #define M5602_XB_I2C_DATA 0x6c | |
81 | #define M5602_XB_I2C_STATUS 0x6d | |
82 | #define M5602_XB_GPIO_DAT_H 0x70 | |
83 | #define M5602_XB_GPIO_DAT_L 0x71 | |
84 | #define M5602_XB_GPIO_DIR_H 0x72 | |
85 | #define M5602_XB_GPIO_DIR_L 0x73 | |
86 | #define M5602_XB_GPIO_EN_H 0x74 | |
87 | #define M5602_XB_GPIO_EN_L 0x75 | |
88 | #define M5602_XB_GPIO_DAT 0x76 | |
89 | #define M5602_XB_GPIO_DIR 0x77 | |
86c9fb51 EA |
90 | #define M5602_XB_SEN_CLK_CONTROL 0x80 |
91 | #define M5602_XB_SEN_CLK_DIVISION 0x81 | |
92 | #define M5602_XB_CPR_CLK_CONTROL 0x82 | |
93 | #define M5602_XB_CPR_CLK_DIVISION 0x83 | |
94 | #define M5602_XB_MCU_CLK_CONTROL 0x84 | |
95 | #define M5602_XB_MCU_CLK_DIVISION 0x85 | |
96 | #define M5602_XB_DCT_CLK_CONTROL 0x86 | |
97 | #define M5602_XB_DCT_CLK_DIVISION 0x87 | |
98 | #define M5602_XB_EC_CLK_CONTROL 0x88 | |
99 | #define M5602_XB_EC_CLK_DIVISION 0x89 | |
100 | #define M5602_XB_LBUF_CLK_CONTROL 0x8a | |
101 | #define M5602_XB_LBUF_CLK_DIVISION 0x8b | |
c109f816 | 102 | |
9267b1e8 | 103 | #define I2C_BUSY 0x80 |
c109f816 EA |
104 | |
105 | /*****************************************************************************/ | |
106 | ||
107 | /* Driver info */ | |
108 | #define DRIVER_AUTHOR "ALi m5602 Linux Driver Project" | |
109 | #define DRIVER_DESC "ALi m5602 webcam driver" | |
110 | ||
111 | #define M5602_ISOC_ENDPOINT_ADDR 0x81 | |
112 | #define M5602_INTR_ENDPOINT_ADDR 0x82 | |
113 | ||
c109f816 | 114 | #define M5602_URB_MSG_TIMEOUT 5000 |
c109f816 EA |
115 | |
116 | /*****************************************************************************/ | |
117 | ||
118 | /* A skeleton used for sending messages to the m5602 bridge */ | |
119 | static const unsigned char bridge_urb_skeleton[] = { | |
120 | 0x13, 0x00, 0x81, 0x00 | |
121 | }; | |
122 | ||
123 | /* A skeleton used for sending messages to the sensor */ | |
124 | static const unsigned char sensor_urb_skeleton[] = { | |
125 | 0x23, M5602_XB_GPIO_EN_H, 0x81, 0x06, | |
126 | 0x23, M5602_XB_MISC_CTRL, 0x81, 0x80, | |
127 | 0x13, M5602_XB_I2C_DEV_ADDR, 0x81, 0x00, | |
128 | 0x13, M5602_XB_I2C_REG_ADDR, 0x81, 0x00, | |
129 | 0x13, M5602_XB_I2C_DATA, 0x81, 0x00, | |
130 | 0x13, M5602_XB_I2C_CTRL, 0x81, 0x11 | |
131 | }; | |
132 | ||
c109f816 EA |
133 | struct sd { |
134 | struct gspca_dev gspca_dev; | |
135 | ||
c109f816 | 136 | /* A pointer to the currently connected sensor */ |
e4cc4fcc | 137 | const struct m5602_sensor *sensor; |
c109f816 | 138 | |
d2d7e9ae EA |
139 | struct sd_desc *desc; |
140 | ||
d9c700d4 EA |
141 | /* Sensor private data */ |
142 | void *sensor_priv; | |
143 | ||
c109f816 EA |
144 | /* The current frame's id, used to detect frame boundaries */ |
145 | u8 frame_id; | |
146 | ||
147 | /* The current frame count */ | |
148 | u32 frame_count; | |
149 | }; | |
150 | ||
151 | int m5602_read_bridge( | |
ff1e6a21 | 152 | struct sd *sd, const u8 address, u8 *i2c_data); |
c109f816 EA |
153 | |
154 | int m5602_write_bridge( | |
ff1e6a21 | 155 | struct sd *sd, const u8 address, const u8 i2c_data); |
c109f816 | 156 | |
6dc4cff0 EA |
157 | int m5602_write_sensor(struct sd *sd, const u8 address, |
158 | u8 *i2c_data, const u8 len); | |
159 | ||
e7a7f510 EA |
160 | int m5602_read_sensor(struct sd *sd, const u8 address, |
161 | u8 *i2c_data, const u8 len); | |
162 | ||
c109f816 | 163 | #endif |