diff options
Diffstat (limited to 'drivers/media/video/gspca/vc032x.c')
-rw-r--r-- | drivers/media/video/gspca/vc032x.c | 360 |
1 files changed, 301 insertions, 59 deletions
diff --git a/drivers/media/video/gspca/vc032x.c b/drivers/media/video/gspca/vc032x.c index 031266a4081b..b16fd47e8ced 100644 --- a/drivers/media/video/gspca/vc032x.c +++ b/drivers/media/video/gspca/vc032x.c | |||
@@ -39,6 +39,10 @@ struct sd { | |||
39 | u8 vflip; | 39 | u8 vflip; |
40 | u8 lightfreq; | 40 | u8 lightfreq; |
41 | s8 sharpness; | 41 | s8 sharpness; |
42 | u16 exposure; | ||
43 | u8 gain; | ||
44 | u8 autogain; | ||
45 | u8 backlight; | ||
42 | 46 | ||
43 | u8 image_offset; | 47 | u8 image_offset; |
44 | 48 | ||
@@ -77,6 +81,14 @@ static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val); | |||
77 | static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val); | 81 | static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val); |
78 | static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val); | 82 | static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val); |
79 | static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val); | 83 | static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val); |
84 | static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val); | ||
85 | static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val); | ||
86 | static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val); | ||
87 | static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val); | ||
88 | static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val); | ||
89 | static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val); | ||
90 | static int sd_setbacklight(struct gspca_dev *gspca_dev, __s32 val); | ||
91 | static int sd_getbacklight(struct gspca_dev *gspca_dev, __s32 *val); | ||
80 | 92 | ||
81 | static const struct ctrl sd_ctrls[] = { | 93 | static const struct ctrl sd_ctrls[] = { |
82 | #define BRIGHTNESS_IDX 0 | 94 | #define BRIGHTNESS_IDX 0 |
@@ -185,6 +197,66 @@ static const struct ctrl sd_ctrls[] = { | |||
185 | .set = sd_setsharpness, | 197 | .set = sd_setsharpness, |
186 | .get = sd_getsharpness, | 198 | .get = sd_getsharpness, |
187 | }, | 199 | }, |
200 | #define GAIN_IDX 7 | ||
201 | { | ||
202 | { | ||
203 | .id = V4L2_CID_GAIN, | ||
204 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
205 | .name = "Gain", | ||
206 | .minimum = 0, | ||
207 | .maximum = 78, | ||
208 | .step = 1, | ||
209 | #define GAIN_DEF 0 | ||
210 | .default_value = GAIN_DEF, | ||
211 | }, | ||
212 | .set = sd_setgain, | ||
213 | .get = sd_getgain, | ||
214 | }, | ||
215 | #define EXPOSURE_IDX 8 | ||
216 | { | ||
217 | { | ||
218 | .id = V4L2_CID_EXPOSURE, | ||
219 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
220 | .name = "Exposure", | ||
221 | #define EXPOSURE_DEF 450 | ||
222 | .minimum = 0, | ||
223 | .maximum = 4095, | ||
224 | .step = 1, | ||
225 | .default_value = EXPOSURE_DEF, | ||
226 | }, | ||
227 | .set = sd_setexposure, | ||
228 | .get = sd_getexposure, | ||
229 | }, | ||
230 | #define AUTOGAIN_IDX 9 | ||
231 | { | ||
232 | { | ||
233 | .id = V4L2_CID_AUTOGAIN, | ||
234 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
235 | .name = "Automatic Gain and Exposure", | ||
236 | .minimum = 0, | ||
237 | .maximum = 1, | ||
238 | .step = 1, | ||
239 | #define AUTOGAIN_DEF 1 | ||
240 | .default_value = AUTOGAIN_DEF, | ||
241 | }, | ||
242 | .set = sd_setautogain, | ||
243 | .get = sd_getautogain, | ||
244 | }, | ||
245 | #define BACKLIGHT_IDX 10 | ||
246 | { | ||
247 | { | ||
248 | .id = V4L2_CID_BACKLIGHT_COMPENSATION, | ||
249 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
250 | .name = "Backlight Compensation", | ||
251 | .minimum = 0, | ||
252 | .maximum = 15, | ||
253 | .step = 1, | ||
254 | #define BACKLIGHT_DEF 15 | ||
255 | .default_value = BACKLIGHT_DEF, | ||
256 | }, | ||
257 | .set = sd_setbacklight, | ||
258 | .get = sd_getbacklight, | ||
259 | }, | ||
188 | }; | 260 | }; |
189 | 261 | ||
190 | /* table of the disabled controls */ | 262 | /* table of the disabled controls */ |
@@ -192,33 +264,51 @@ static u32 ctrl_dis[] = { | |||
192 | /* SENSOR_HV7131R 0 */ | 264 | /* SENSOR_HV7131R 0 */ |
193 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 265 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
194 | | (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX) | 266 | | (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX) |
195 | | (1 << SHARPNESS_IDX), | 267 | | (1 << SHARPNESS_IDX) |
268 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
269 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
196 | /* SENSOR_MI0360 1 */ | 270 | /* SENSOR_MI0360 1 */ |
197 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 271 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
198 | | (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX) | 272 | | (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX) |
199 | | (1 << SHARPNESS_IDX), | 273 | | (1 << SHARPNESS_IDX) |
274 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
275 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
200 | /* SENSOR_MI1310_SOC 2 */ | 276 | /* SENSOR_MI1310_SOC 2 */ |
201 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 277 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
202 | | (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX), | 278 | | (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX) |
279 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
280 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
203 | /* SENSOR_MI1320 3 */ | 281 | /* SENSOR_MI1320 3 */ |
204 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 282 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
205 | | (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX), | 283 | | (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX) |
284 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
285 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
206 | /* SENSOR_MI1320_SOC 4 */ | 286 | /* SENSOR_MI1320_SOC 4 */ |
207 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 287 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
208 | | (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX), | 288 | | (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX) |
289 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
290 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
209 | /* SENSOR_OV7660 5 */ | 291 | /* SENSOR_OV7660 5 */ |
210 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 292 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
211 | | (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX), | 293 | | (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX) |
294 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
295 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
212 | /* SENSOR_OV7670 6 */ | 296 | /* SENSOR_OV7670 6 */ |
213 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 297 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
214 | | (1 << SHARPNESS_IDX), | 298 | | (1 << SHARPNESS_IDX) |
299 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
300 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
215 | /* SENSOR_PO1200 7 */ | 301 | /* SENSOR_PO1200 7 */ |
216 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 302 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
217 | | (1 << LIGHTFREQ_IDX), | 303 | | (1 << LIGHTFREQ_IDX) |
304 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
305 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
218 | /* SENSOR_PO3130NC 8 */ | 306 | /* SENSOR_PO3130NC 8 */ |
219 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) | 307 | (1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX) |
220 | | (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX) | 308 | | (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX) |
221 | | (1 << SHARPNESS_IDX), | 309 | | (1 << SHARPNESS_IDX) |
310 | | (1 << GAIN_IDX) | (1 << EXPOSURE_IDX) | ||
311 | | (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX), | ||
222 | /* SENSOR_POxxxx 9 */ | 312 | /* SENSOR_POxxxx 9 */ |
223 | (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX), | 313 | (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX), |
224 | }; | 314 | }; |
@@ -2825,7 +2915,9 @@ static const u8 poxxxx_init_common[][4] = { | |||
2825 | {0x00, 0x1e, 0xc6, 0xaa}, | 2915 | {0x00, 0x1e, 0xc6, 0xaa}, |
2826 | {0x00, 0x00, 0x40, 0xdd}, | 2916 | {0x00, 0x00, 0x40, 0xdd}, |
2827 | {0x00, 0x1d, 0x05, 0xaa}, | 2917 | {0x00, 0x1d, 0x05, 0xaa}, |
2828 | 2918 | {} | |
2919 | }; | ||
2920 | static const u8 poxxxx_gamma[][4] = { | ||
2829 | {0x00, 0xd6, 0x22, 0xaa}, /* gamma 0 */ | 2921 | {0x00, 0xd6, 0x22, 0xaa}, /* gamma 0 */ |
2830 | {0x00, 0x73, 0x00, 0xaa}, | 2922 | {0x00, 0x73, 0x00, 0xaa}, |
2831 | {0x00, 0x74, 0x0a, 0xaa}, | 2923 | {0x00, 0x74, 0x0a, 0xaa}, |
@@ -2867,19 +2959,9 @@ static const u8 poxxxx_init_common[][4] = { | |||
2867 | {0x00, 0x7c, 0xba, 0xaa}, | 2959 | {0x00, 0x7c, 0xba, 0xaa}, |
2868 | {0x00, 0x7d, 0xd4, 0xaa}, | 2960 | {0x00, 0x7d, 0xd4, 0xaa}, |
2869 | {0x00, 0x7e, 0xea, 0xaa}, | 2961 | {0x00, 0x7e, 0xea, 0xaa}, |
2870 | 2962 | {} | |
2871 | {0x00, 0xaa, 0xff, 0xaa}, /* back light comp */ | 2963 | }; |
2872 | {0x00, 0xc4, 0x03, 0xaa}, | 2964 | static const u8 poxxxx_init_start_3[][4] = { |
2873 | {0x00, 0xc5, 0x19, 0xaa}, | ||
2874 | {0x00, 0xc6, 0x03, 0xaa}, | ||
2875 | {0x00, 0xc7, 0x91, 0xaa}, | ||
2876 | {0x00, 0xc8, 0x01, 0xaa}, | ||
2877 | {0x00, 0xc9, 0xdd, 0xaa}, | ||
2878 | {0x00, 0xca, 0x02, 0xaa}, | ||
2879 | {0x00, 0xcb, 0x37, 0xaa}, | ||
2880 | |||
2881 | /* read d1 */ | ||
2882 | {0x00, 0xd1, 0x3c, 0xaa}, | ||
2883 | {0x00, 0xb8, 0x28, 0xaa}, | 2965 | {0x00, 0xb8, 0x28, 0xaa}, |
2884 | {0x00, 0xb9, 0x1e, 0xaa}, | 2966 | {0x00, 0xb9, 0x1e, 0xaa}, |
2885 | {0x00, 0xb6, 0x14, 0xaa}, | 2967 | {0x00, 0xb6, 0x14, 0xaa}, |
@@ -2959,9 +3041,6 @@ static const u8 poxxxx_init_end_1[][4] = { | |||
2959 | {0x00, 0xb3, 0x08, 0xaa}, | 3041 | {0x00, 0xb3, 0x08, 0xaa}, |
2960 | {0x00, 0xb4, 0x0b, 0xaa}, | 3042 | {0x00, 0xb4, 0x0b, 0xaa}, |
2961 | {0x00, 0xb5, 0x0d, 0xaa}, | 3043 | {0x00, 0xb5, 0x0d, 0xaa}, |
2962 | {0x00, 0x59, 0x7e, 0xaa}, /* sharpness */ | ||
2963 | {0x00, 0x16, 0x00, 0xaa}, /* white balance */ | ||
2964 | {0x00, 0x18, 0x00, 0xaa}, | ||
2965 | {} | 3044 | {} |
2966 | }; | 3045 | }; |
2967 | static const u8 poxxxx_init_end_2[][4] = { | 3046 | static const u8 poxxxx_init_end_2[][4] = { |
@@ -3312,6 +3391,33 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
3312 | const struct usb_device_id *id) | 3391 | const struct usb_device_id *id) |
3313 | { | 3392 | { |
3314 | struct sd *sd = (struct sd *) gspca_dev; | 3393 | struct sd *sd = (struct sd *) gspca_dev; |
3394 | |||
3395 | sd->bridge = id->driver_info >> 8; | ||
3396 | sd->flags = id->driver_info & 0xff; | ||
3397 | |||
3398 | if (id->idVendor == 0x046d && | ||
3399 | (id->idProduct == 0x0892 || id->idProduct == 0x0896)) | ||
3400 | sd->sensor = SENSOR_POxxxx; /* no probe */ | ||
3401 | |||
3402 | sd->brightness = BRIGHTNESS_DEF; | ||
3403 | sd->contrast = CONTRAST_DEF; | ||
3404 | sd->colors = COLOR_DEF; | ||
3405 | sd->hflip = HFLIP_DEF; | ||
3406 | sd->vflip = VFLIP_DEF; | ||
3407 | sd->lightfreq = FREQ_DEF; | ||
3408 | sd->sharpness = SHARPNESS_DEF; | ||
3409 | sd->gain = GAIN_DEF; | ||
3410 | sd->exposure = EXPOSURE_DEF; | ||
3411 | sd->autogain = AUTOGAIN_DEF; | ||
3412 | sd->backlight = BACKLIGHT_DEF; | ||
3413 | |||
3414 | return 0; | ||
3415 | } | ||
3416 | |||
3417 | /* this function is called at probe and resume time */ | ||
3418 | static int sd_init(struct gspca_dev *gspca_dev) | ||
3419 | { | ||
3420 | struct sd *sd = (struct sd *) gspca_dev; | ||
3315 | struct cam *cam; | 3421 | struct cam *cam; |
3316 | int sensor; | 3422 | int sensor; |
3317 | static u8 npkt[] = { /* number of packets per ISOC message */ | 3423 | static u8 npkt[] = { /* number of packets per ISOC message */ |
@@ -3327,14 +3433,11 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
3327 | 128, /* POxxxx 9 */ | 3433 | 128, /* POxxxx 9 */ |
3328 | }; | 3434 | }; |
3329 | 3435 | ||
3330 | cam = &gspca_dev->cam; | 3436 | if (sd->sensor != SENSOR_POxxxx) |
3331 | sd->bridge = id->driver_info >> 8; | ||
3332 | sd->flags = id->driver_info & 0xff; | ||
3333 | if (id->idVendor == 0x046d && | ||
3334 | (id->idProduct == 0x0892 || id->idProduct == 0x0896)) | ||
3335 | sensor = SENSOR_POxxxx; | ||
3336 | else | ||
3337 | sensor = vc032x_probe_sensor(gspca_dev); | 3437 | sensor = vc032x_probe_sensor(gspca_dev); |
3438 | else | ||
3439 | sensor = sd->sensor; | ||
3440 | |||
3338 | switch (sensor) { | 3441 | switch (sensor) { |
3339 | case -1: | 3442 | case -1: |
3340 | PDEBUG(D_PROBE, "Unknown sensor..."); | 3443 | PDEBUG(D_PROBE, "Unknown sensor..."); |
@@ -3373,6 +3476,7 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
3373 | } | 3476 | } |
3374 | sd->sensor = sensor; | 3477 | sd->sensor = sensor; |
3375 | 3478 | ||
3479 | cam = &gspca_dev->cam; | ||
3376 | if (sd->bridge == BRIDGE_VC0321) { | 3480 | if (sd->bridge == BRIDGE_VC0321) { |
3377 | cam->cam_mode = vc0321_mode; | 3481 | cam->cam_mode = vc0321_mode; |
3378 | cam->nmodes = ARRAY_SIZE(vc0321_mode); | 3482 | cam->nmodes = ARRAY_SIZE(vc0321_mode); |
@@ -3401,28 +3505,11 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
3401 | } | 3505 | } |
3402 | } | 3506 | } |
3403 | cam->npkt = npkt[sd->sensor]; | 3507 | cam->npkt = npkt[sd->sensor]; |
3404 | |||
3405 | sd->brightness = BRIGHTNESS_DEF; | ||
3406 | sd->contrast = CONTRAST_DEF; | ||
3407 | sd->colors = COLOR_DEF; | ||
3408 | sd->hflip = HFLIP_DEF; | ||
3409 | sd->vflip = VFLIP_DEF; | ||
3410 | sd->lightfreq = FREQ_DEF; | ||
3411 | sd->sharpness = SHARPNESS_DEF; | ||
3412 | |||
3413 | gspca_dev->ctrl_dis = ctrl_dis[sd->sensor]; | 3508 | gspca_dev->ctrl_dis = ctrl_dis[sd->sensor]; |
3414 | 3509 | ||
3415 | if (sd->sensor == SENSOR_OV7670) | 3510 | if (sd->sensor == SENSOR_OV7670) |
3416 | sd->flags |= FL_HFLIP | FL_VFLIP; | 3511 | sd->flags |= FL_HFLIP | FL_VFLIP; |
3417 | 3512 | ||
3418 | return 0; | ||
3419 | } | ||
3420 | |||
3421 | /* this function is called at probe and resume time */ | ||
3422 | static int sd_init(struct gspca_dev *gspca_dev) | ||
3423 | { | ||
3424 | struct sd *sd = (struct sd *) gspca_dev; | ||
3425 | |||
3426 | if (sd->bridge == BRIDGE_VC0321) { | 3513 | if (sd->bridge == BRIDGE_VC0321) { |
3427 | reg_r(gspca_dev, 0x8a, 0, 3); | 3514 | reg_r(gspca_dev, 0x8a, 0, 3); |
3428 | reg_w(gspca_dev, 0x87, 0x00, 0x0f0f); | 3515 | reg_w(gspca_dev, 0x87, 0x00, 0x0f0f); |
@@ -3433,8 +3520,8 @@ static int sd_init(struct gspca_dev *gspca_dev) | |||
3433 | if (gspca_dev->usb_buf[0] != 0) { | 3520 | if (gspca_dev->usb_buf[0] != 0) { |
3434 | reg_w(gspca_dev, 0xa0, 0x26, 0xb300); | 3521 | reg_w(gspca_dev, 0xa0, 0x26, 0xb300); |
3435 | reg_w(gspca_dev, 0xa0, 0x04, 0xb300); | 3522 | reg_w(gspca_dev, 0xa0, 0x04, 0xb300); |
3436 | reg_w(gspca_dev, 0xa0, 0x00, 0xb300); | ||
3437 | } | 3523 | } |
3524 | reg_w(gspca_dev, 0xa0, 0x00, 0xb300); | ||
3438 | } | 3525 | } |
3439 | } | 3526 | } |
3440 | return gspca_dev->usb_err; | 3527 | return gspca_dev->usb_err; |
@@ -3551,6 +3638,82 @@ static void setsharpness(struct gspca_dev *gspca_dev) | |||
3551 | break; | 3638 | break; |
3552 | } | 3639 | } |
3553 | } | 3640 | } |
3641 | static void setgain(struct gspca_dev *gspca_dev) | ||
3642 | { | ||
3643 | struct sd *sd = (struct sd *) gspca_dev; | ||
3644 | |||
3645 | if (gspca_dev->ctrl_dis & (1 << GAIN_IDX)) | ||
3646 | return; | ||
3647 | i2c_write(gspca_dev, 0x15, &sd->gain, 1); | ||
3648 | } | ||
3649 | |||
3650 | static void setexposure(struct gspca_dev *gspca_dev) | ||
3651 | { | ||
3652 | struct sd *sd = (struct sd *) gspca_dev; | ||
3653 | u8 data; | ||
3654 | |||
3655 | if (gspca_dev->ctrl_dis & (1 << EXPOSURE_IDX)) | ||
3656 | return; | ||
3657 | data = sd->exposure >> 8; | ||
3658 | i2c_write(gspca_dev, 0x1a, &data, 1); | ||
3659 | data = sd->exposure; | ||
3660 | i2c_write(gspca_dev, 0x1b, &data, 1); | ||
3661 | } | ||
3662 | |||
3663 | static void setautogain(struct gspca_dev *gspca_dev) | ||
3664 | { | ||
3665 | struct sd *sd = (struct sd *) gspca_dev; | ||
3666 | static const u8 data[2] = {0x28, 0x3c}; | ||
3667 | |||
3668 | if (gspca_dev->ctrl_dis & (1 << AUTOGAIN_IDX)) | ||
3669 | return; | ||
3670 | i2c_write(gspca_dev, 0xd1, &data[sd->autogain], 1); | ||
3671 | } | ||
3672 | |||
3673 | static void setgamma(struct gspca_dev *gspca_dev) | ||
3674 | { | ||
3675 | /*fixme:to do */ | ||
3676 | usb_exchange(gspca_dev, poxxxx_gamma); | ||
3677 | } | ||
3678 | |||
3679 | static void setbacklight(struct gspca_dev *gspca_dev) | ||
3680 | { | ||
3681 | struct sd *sd = (struct sd *) gspca_dev; | ||
3682 | u16 v; | ||
3683 | u8 data; | ||
3684 | |||
3685 | data = (sd->backlight << 4) | 0x0f; | ||
3686 | i2c_write(gspca_dev, 0xaa, &data, 1); | ||
3687 | v = 613 + 12 * sd->backlight; | ||
3688 | data = v >> 8; | ||
3689 | i2c_write(gspca_dev, 0xc4, &data, 1); | ||
3690 | data = v; | ||
3691 | i2c_write(gspca_dev, 0xc5, &data, 1); | ||
3692 | v = 1093 - 12 * sd->backlight; | ||
3693 | data = v >> 8; | ||
3694 | i2c_write(gspca_dev, 0xc6, &data, 1); | ||
3695 | data = v; | ||
3696 | i2c_write(gspca_dev, 0xc7, &data, 1); | ||
3697 | v = 342 + 9 * sd->backlight; | ||
3698 | data = v >> 8; | ||
3699 | i2c_write(gspca_dev, 0xc8, &data, 1); | ||
3700 | data = v; | ||
3701 | i2c_write(gspca_dev, 0xc9, &data, 1); | ||
3702 | v = 702 - 9 * sd->backlight; | ||
3703 | data = v >> 8; | ||
3704 | i2c_write(gspca_dev, 0xca, &data, 1); | ||
3705 | data = v; | ||
3706 | i2c_write(gspca_dev, 0xcb, &data, 1); | ||
3707 | } | ||
3708 | |||
3709 | static void setwb(struct gspca_dev *gspca_dev) | ||
3710 | { | ||
3711 | /*fixme:to do - valid when reg d1 = 0x1c - (reg16 + reg15 = 0xa3)*/ | ||
3712 | static const u8 data[2] = {0x00, 0x00}; | ||
3713 | |||
3714 | i2c_write(gspca_dev, 0x16, &data[0], 1); | ||
3715 | i2c_write(gspca_dev, 0x18, &data[1], 1); | ||
3716 | } | ||
3554 | 3717 | ||
3555 | static int sd_start(struct gspca_dev *gspca_dev) | 3718 | static int sd_start(struct gspca_dev *gspca_dev) |
3556 | { | 3719 | { |
@@ -3662,6 +3825,16 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
3662 | default: | 3825 | default: |
3663 | /* case SENSOR_POxxxx: */ | 3826 | /* case SENSOR_POxxxx: */ |
3664 | usb_exchange(gspca_dev, poxxxx_init_common); | 3827 | usb_exchange(gspca_dev, poxxxx_init_common); |
3828 | setgamma(gspca_dev); | ||
3829 | setbacklight(gspca_dev); | ||
3830 | setbrightness(gspca_dev); | ||
3831 | setcontrast(gspca_dev); | ||
3832 | setcolors(gspca_dev); | ||
3833 | setsharpness(gspca_dev); | ||
3834 | setautogain(gspca_dev); | ||
3835 | setexposure(gspca_dev); | ||
3836 | setgain(gspca_dev); | ||
3837 | usb_exchange(gspca_dev, poxxxx_init_start_3); | ||
3665 | if (mode) | 3838 | if (mode) |
3666 | init = poxxxx_initQVGA; | 3839 | init = poxxxx_initQVGA; |
3667 | else | 3840 | else |
@@ -3693,7 +3866,6 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
3693 | break; | 3866 | break; |
3694 | } | 3867 | } |
3695 | msleep(100); | 3868 | msleep(100); |
3696 | setsharpness(gspca_dev); | ||
3697 | sethvflip(gspca_dev); | 3869 | sethvflip(gspca_dev); |
3698 | setlightfreq(gspca_dev); | 3870 | setlightfreq(gspca_dev); |
3699 | } | 3871 | } |
@@ -3704,14 +3876,10 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
3704 | reg_w(gspca_dev, 0xa0, 0x0000, 0xbfff); | 3876 | reg_w(gspca_dev, 0xa0, 0x0000, 0xbfff); |
3705 | break; | 3877 | break; |
3706 | case SENSOR_POxxxx: | 3878 | case SENSOR_POxxxx: |
3707 | setcolors(gspca_dev); | ||
3708 | setbrightness(gspca_dev); | ||
3709 | setcontrast(gspca_dev); | ||
3710 | |||
3711 | /* led on */ | ||
3712 | msleep(80); | ||
3713 | reg_w(gspca_dev, 0x89, 0xffff, 0xfdff); | ||
3714 | usb_exchange(gspca_dev, poxxxx_init_end_2); | 3879 | usb_exchange(gspca_dev, poxxxx_init_end_2); |
3880 | setwb(gspca_dev); | ||
3881 | msleep(80); /* led on */ | ||
3882 | reg_w(gspca_dev, 0x89, 0xffff, 0xfdff); | ||
3715 | break; | 3883 | break; |
3716 | } | 3884 | } |
3717 | return gspca_dev->usb_err; | 3885 | return gspca_dev->usb_err; |
@@ -3911,6 +4079,80 @@ static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val) | |||
3911 | return 0; | 4079 | return 0; |
3912 | } | 4080 | } |
3913 | 4081 | ||
4082 | static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val) | ||
4083 | { | ||
4084 | struct sd *sd = (struct sd *) gspca_dev; | ||
4085 | |||
4086 | sd->gain = val; | ||
4087 | if (gspca_dev->streaming) | ||
4088 | setgain(gspca_dev); | ||
4089 | return gspca_dev->usb_err; | ||
4090 | } | ||
4091 | |||
4092 | static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val) | ||
4093 | { | ||
4094 | struct sd *sd = (struct sd *) gspca_dev; | ||
4095 | |||
4096 | *val = sd->gain; | ||
4097 | return 0; | ||
4098 | } | ||
4099 | |||
4100 | static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val) | ||
4101 | { | ||
4102 | struct sd *sd = (struct sd *) gspca_dev; | ||
4103 | |||
4104 | sd->exposure = val; | ||
4105 | if (gspca_dev->streaming) | ||
4106 | setexposure(gspca_dev); | ||
4107 | return gspca_dev->usb_err; | ||
4108 | } | ||
4109 | |||
4110 | static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val) | ||
4111 | { | ||
4112 | struct sd *sd = (struct sd *) gspca_dev; | ||
4113 | |||
4114 | *val = sd->exposure; | ||
4115 | return 0; | ||
4116 | } | ||
4117 | |||
4118 | static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val) | ||
4119 | { | ||
4120 | struct sd *sd = (struct sd *) gspca_dev; | ||
4121 | |||
4122 | sd->autogain = val; | ||
4123 | if (gspca_dev->streaming) | ||
4124 | setautogain(gspca_dev); | ||
4125 | |||
4126 | return gspca_dev->usb_err; | ||
4127 | } | ||
4128 | |||
4129 | static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val) | ||
4130 | { | ||
4131 | struct sd *sd = (struct sd *) gspca_dev; | ||
4132 | |||
4133 | *val = sd->autogain; | ||
4134 | return 0; | ||
4135 | } | ||
4136 | |||
4137 | static int sd_setbacklight(struct gspca_dev *gspca_dev, __s32 val) | ||
4138 | { | ||
4139 | struct sd *sd = (struct sd *) gspca_dev; | ||
4140 | |||
4141 | sd->backlight = val; | ||
4142 | if (gspca_dev->streaming) | ||
4143 | setbacklight(gspca_dev); | ||
4144 | |||
4145 | return gspca_dev->usb_err; | ||
4146 | } | ||
4147 | |||
4148 | static int sd_getbacklight(struct gspca_dev *gspca_dev, __s32 *val) | ||
4149 | { | ||
4150 | struct sd *sd = (struct sd *) gspca_dev; | ||
4151 | |||
4152 | *val = sd->backlight; | ||
4153 | return 0; | ||
4154 | } | ||
4155 | |||
3914 | static int sd_querymenu(struct gspca_dev *gspca_dev, | 4156 | static int sd_querymenu(struct gspca_dev *gspca_dev, |
3915 | struct v4l2_querymenu *menu) | 4157 | struct v4l2_querymenu *menu) |
3916 | { | 4158 | { |