2 * Driver for the s5k83a sensor
4 * Copyright (C) 2008 Erik Andrén
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>
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
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.
19 #include <linux/kthread.h>
20 #include "m5602_s5k83a.h"
22 static struct v4l2_pix_format s5k83a_modes[] = {
31 .colorspace = V4L2_COLORSPACE_SRGB,
36 const static struct ctrl s5k83a_ctrls[] = {
41 .type = V4L2_CTRL_TYPE_INTEGER,
46 .default_value = S5K83A_DEFAULT_GAIN,
47 .flags = V4L2_CTRL_FLAG_SLIDER
49 .set = s5k83a_set_gain,
50 .get = s5k83a_get_gain
53 #define BRIGHTNESS_IDX 1
56 .id = V4L2_CID_BRIGHTNESS,
57 .type = V4L2_CTRL_TYPE_INTEGER,
62 .default_value = S5K83A_DEFAULT_BRIGHTNESS,
63 .flags = V4L2_CTRL_FLAG_SLIDER
65 .set = s5k83a_set_brightness,
66 .get = s5k83a_get_brightness,
68 #define EXPOSURE_IDX 2
71 .id = V4L2_CID_EXPOSURE,
72 .type = V4L2_CTRL_TYPE_INTEGER,
75 .maximum = S5K83A_MAXIMUM_EXPOSURE,
77 .default_value = S5K83A_DEFAULT_EXPOSURE,
78 .flags = V4L2_CTRL_FLAG_SLIDER
80 .set = s5k83a_set_exposure,
81 .get = s5k83a_get_exposure
87 .type = V4L2_CTRL_TYPE_BOOLEAN,
88 .name = "horizontal flip",
94 .set = s5k83a_set_hflip,
95 .get = s5k83a_get_hflip
100 .id = V4L2_CID_VFLIP,
101 .type = V4L2_CTRL_TYPE_BOOLEAN,
102 .name = "vertical flip",
108 .set = s5k83a_set_vflip,
109 .get = s5k83a_get_vflip
113 static void s5k83a_dump_registers(struct sd *sd);
114 static int s5k83a_get_rotation(struct sd *sd, u8 *reg_data);
115 static int s5k83a_set_led_indication(struct sd *sd, u8 val);
116 int s5k83a_set_flip_real(struct gspca_dev *gspca_dev, __s32 vflip, __s32 hflip);
118 int s5k83a_probe(struct sd *sd)
120 struct s5k83a_priv *sens_priv;
121 u8 prod_id = 0, ver_id = 0;
125 if (force_sensor == S5K83A_SENSOR) {
126 info("Forcing a %s sensor", s5k83a.name);
129 /* If we want to force another sensor, don't try to probe this
134 info("Probing for a s5k83a sensor");
136 /* Preinit the sensor */
137 for (i = 0; i < ARRAY_SIZE(preinit_s5k83a) && !err; i++) {
138 u8 data[2] = {preinit_s5k83a[i][2], preinit_s5k83a[i][3]};
139 if (preinit_s5k83a[i][0] == SENSOR)
140 err = m5602_write_sensor(sd, preinit_s5k83a[i][1],
143 err = m5602_write_bridge(sd, preinit_s5k83a[i][1],
147 /* We don't know what register (if any) that contain the product id
148 * Just pick the first addresses that seem to produce the same results
149 * on multiple machines */
150 if (m5602_read_sensor(sd, 0x00, &prod_id, 1))
153 if (m5602_read_sensor(sd, 0x01, &ver_id, 1))
156 if ((prod_id == 0xff) || (ver_id == 0xff))
159 info("Detected a s5k83a sensor");
163 sizeof(struct s5k83a_priv), GFP_KERNEL);
167 sens_priv->settings =
168 kmalloc(sizeof(s32)*ARRAY_SIZE(s5k83a_ctrls), GFP_KERNEL);
169 if (!sens_priv->settings)
172 sd->gspca_dev.cam.cam_mode = s5k83a_modes;
173 sd->gspca_dev.cam.nmodes = ARRAY_SIZE(s5k83a_modes);
174 sd->desc->ctrls = s5k83a_ctrls;
175 sd->desc->nctrls = ARRAY_SIZE(s5k83a_ctrls);
177 /* null the pointer! thread is't running now */
178 sens_priv->rotation_thread = NULL;
180 for (i = 0; i < ARRAY_SIZE(s5k83a_ctrls); i++)
181 sens_priv->settings[i] = s5k83a_ctrls[i].qctrl.default_value;
183 sd->sensor_priv = sens_priv;
187 int s5k83a_init(struct sd *sd)
191 for (i = 0; i < ARRAY_SIZE(init_s5k83a) && !err; i++) {
192 u8 data[2] = {0x00, 0x00};
194 switch (init_s5k83a[i][0]) {
196 err = m5602_write_bridge(sd,
202 data[0] = init_s5k83a[i][2];
203 err = m5602_write_sensor(sd,
204 init_s5k83a[i][1], data, 1);
208 data[0] = init_s5k83a[i][2];
209 data[1] = init_s5k83a[i][3];
210 err = m5602_write_sensor(sd,
211 init_s5k83a[i][1], data, 2);
214 info("Invalid stream command, exiting init");
220 s5k83a_dump_registers(sd);
222 return (err < 0) ? err : 0;
225 static int rotation_thread_function(void *data)
227 struct sd *sd = (struct sd *) data;
228 struct s5k83a_priv *sens_priv = sd->sensor_priv;
229 u8 reg, previous_rotation = 0;
232 set_current_state(TASK_INTERRUPTIBLE);
233 while (!schedule_timeout(100)) {
234 if (mutex_lock_interruptible(&sd->gspca_dev.usb_lock))
237 s5k83a_get_rotation(sd, ®);
238 if (previous_rotation != reg) {
239 previous_rotation = reg;
240 info("Camera was flipped");
242 s5k83a_get_vflip((struct gspca_dev *) sd, &vflip);
243 s5k83a_get_hflip((struct gspca_dev *) sd, &hflip);
249 s5k83a_set_flip_real((struct gspca_dev *) sd, vflip, hflip);
252 mutex_unlock(&sd->gspca_dev.usb_lock);
253 set_current_state(TASK_INTERRUPTIBLE);
256 /* return to "front" flip */
257 if (previous_rotation) {
258 s5k83a_get_vflip((struct gspca_dev *) sd, &vflip);
259 s5k83a_get_hflip((struct gspca_dev *) sd, &hflip);
260 s5k83a_set_flip_real((struct gspca_dev *) sd, vflip, hflip);
263 sens_priv->rotation_thread = NULL;
267 int s5k83a_start(struct sd *sd)
269 struct s5k83a_priv *sens_priv = sd->sensor_priv;
271 /* Create another thread, polling the GPIO ports of the camera to check
272 if it got rotated. This is how the windows driver does it so we have
273 to assume that there is no better way of accomplishing this */
274 sens_priv->rotation_thread = kthread_create(rotation_thread_function, sd, "rotation thread");
275 wake_up_process(sens_priv->rotation_thread);
277 return s5k83a_set_led_indication(sd, 1);
280 int s5k83a_stop(struct sd *sd)
282 struct s5k83a_priv *sens_priv = sd->sensor_priv;
284 if (sens_priv->rotation_thread)
285 kthread_stop(sens_priv->rotation_thread);
287 return s5k83a_set_led_indication(sd, 0);
290 void s5k83a_disconnect(struct sd *sd)
292 struct s5k83a_priv *sens_priv = sd->sensor_priv;
297 kfree(sens_priv->settings);
301 int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
303 struct sd *sd = (struct sd *) gspca_dev;
304 struct s5k83a_priv *sens_priv = sd->sensor_priv;
306 *val = sens_priv->settings[GAIN_IDX];
310 int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
314 struct sd *sd = (struct sd *) gspca_dev;
315 struct s5k83a_priv *sens_priv = sd->sensor_priv;
317 sens_priv->settings[GAIN_IDX] = val;
321 err = m5602_write_sensor(sd, 0x14, data, 2);
327 err = m5602_write_sensor(sd, 0x0d, data, 2);
331 /* FIXME: This is not sane, we need to figure out the composition
332 of these registers */
333 data[0] = val >> 3; /* gain, high 5 bits */
334 data[1] = val >> 1; /* gain, high 7 bits */
335 err = m5602_write_sensor(sd, S5K83A_GAIN, data, 2);
340 int s5k83a_get_brightness(struct gspca_dev *gspca_dev, __s32 *val)
342 struct sd *sd = (struct sd *) gspca_dev;
343 struct s5k83a_priv *sens_priv = sd->sensor_priv;
345 *val = sens_priv->settings[BRIGHTNESS_IDX];
349 int s5k83a_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
353 struct sd *sd = (struct sd *) gspca_dev;
354 struct s5k83a_priv *sens_priv = sd->sensor_priv;
356 sens_priv->settings[BRIGHTNESS_IDX] = val;
358 err = m5602_write_sensor(sd, S5K83A_BRIGHTNESS, data, 1);
362 int s5k83a_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
364 struct sd *sd = (struct sd *) gspca_dev;
365 struct s5k83a_priv *sens_priv = sd->sensor_priv;
367 *val = sens_priv->settings[EXPOSURE_IDX];
371 int s5k83a_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
375 struct sd *sd = (struct sd *) gspca_dev;
376 struct s5k83a_priv *sens_priv = sd->sensor_priv;
378 sens_priv->settings[EXPOSURE_IDX] = val;
381 err = m5602_write_sensor(sd, S5K83A_EXPOSURE, data, 2);
385 int s5k83a_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
387 struct sd *sd = (struct sd *) gspca_dev;
388 struct s5k83a_priv *sens_priv = sd->sensor_priv;
390 *val = sens_priv->settings[VFLIP_IDX];
394 int s5k83a_set_flip_real(struct gspca_dev *gspca_dev, __s32 vflip, __s32 hflip)
398 struct sd *sd = (struct sd *) gspca_dev;
401 err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
405 /* six bit is vflip, seven is hflip */
406 data[0] = S5K83A_FLIP_MASK;
407 data[0] = (vflip) ? data[0] | 0x40 : data[0];
408 data[0] = (hflip) ? data[0] | 0x80 : data[0];
410 err = m5602_write_sensor(sd, S5K83A_FLIP, data, 1);
414 data[0] = (vflip) ? 0x0b : 0x0a;
415 err = m5602_write_sensor(sd, S5K83A_VFLIP_TUNE, data, 1);
419 data[0] = (hflip) ? 0x0a : 0x0b;
420 err = m5602_write_sensor(sd, S5K83A_HFLIP_TUNE, data, 1);
424 int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
429 struct sd *sd = (struct sd *) gspca_dev;
430 struct s5k83a_priv *sens_priv = sd->sensor_priv;
432 sens_priv->settings[VFLIP_IDX] = val;
434 s5k83a_get_hflip(gspca_dev, &hflip);
436 err = s5k83a_get_rotation(sd, ®);
444 err = s5k83a_set_flip_real(gspca_dev, val, hflip);
448 int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
450 struct sd *sd = (struct sd *) gspca_dev;
451 struct s5k83a_priv *sens_priv = sd->sensor_priv;
453 *val = sens_priv->settings[HFLIP_IDX];
457 int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
462 struct sd *sd = (struct sd *) gspca_dev;
463 struct s5k83a_priv *sens_priv = sd->sensor_priv;
465 sens_priv->settings[HFLIP_IDX] = val;
467 s5k83a_get_vflip(gspca_dev, &vflip);
469 err = s5k83a_get_rotation(sd, ®);
477 err = s5k83a_set_flip_real(gspca_dev, vflip, val);
481 static int s5k83a_set_led_indication(struct sd *sd, u8 val)
486 err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, data);
491 data[0] = data[0] | S5K83A_GPIO_LED_MASK;
493 data[0] = data[0] & ~S5K83A_GPIO_LED_MASK;
495 err = m5602_write_bridge(sd, M5602_XB_GPIO_DAT, data[0]);
497 return (err < 0) ? err : 0;
500 /* Get camera rotation on Acer notebooks */
501 static int s5k83a_get_rotation(struct sd *sd, u8 *reg_data)
503 int err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, reg_data);
504 *reg_data = (*reg_data & S5K83A_GPIO_ROTATION_MASK) ? 0 : 1;
508 static void s5k83a_dump_registers(struct sd *sd)
512 m5602_read_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1);
514 for (page = 0; page < 16; page++) {
515 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1);
516 info("Dumping the s5k83a register state for page 0x%x", page);
517 for (address = 0; address <= 0xff; address++) {
519 m5602_read_sensor(sd, address, &val, 1);
520 info("register 0x%x contains 0x%x",
524 info("s5k83a register state dump complete");
526 for (page = 0; page < 16; page++) {
527 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1);
528 info("Probing for which registers that are read/write "
529 "for page 0x%x", page);
530 for (address = 0; address <= 0xff; address++) {
531 u8 old_val, ctrl_val, test_val = 0xff;
533 m5602_read_sensor(sd, address, &old_val, 1);
534 m5602_write_sensor(sd, address, &test_val, 1);
535 m5602_read_sensor(sd, address, &ctrl_val, 1);
537 if (ctrl_val == test_val)
538 info("register 0x%x is writeable", address);
540 info("register 0x%x is read only", address);
542 /* Restore original val */
543 m5602_write_sensor(sd, address, &old_val, 1);
546 info("Read/write register probing complete");
547 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1);