m5602_s5k83a.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. /*
  2. * Driver for the s5k83a sensor
  3. *
  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>
  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. #include "m5602_s5k83a.h"
  19. static struct v4l2_pix_format s5k83a_modes[] = {
  20. {
  21. 640,
  22. 480,
  23. V4L2_PIX_FMT_SBGGR8,
  24. V4L2_FIELD_NONE,
  25. .sizeimage =
  26. 640 * 480,
  27. .bytesperline = 640,
  28. .colorspace = V4L2_COLORSPACE_SRGB,
  29. .priv = 0
  30. }
  31. };
  32. const static struct ctrl s5k83a_ctrls[] = {
  33. {
  34. {
  35. .id = V4L2_CID_BRIGHTNESS,
  36. .type = V4L2_CTRL_TYPE_INTEGER,
  37. .name = "brightness",
  38. .minimum = 0x00,
  39. .maximum = 0xff,
  40. .step = 0x01,
  41. .default_value = S5K83A_DEFAULT_BRIGHTNESS,
  42. .flags = V4L2_CTRL_FLAG_SLIDER
  43. },
  44. .set = s5k83a_set_brightness,
  45. .get = s5k83a_get_brightness
  46. }, {
  47. {
  48. .id = V4L2_CID_WHITENESS,
  49. .type = V4L2_CTRL_TYPE_INTEGER,
  50. .name = "whiteness",
  51. .minimum = 0x00,
  52. .maximum = 0xff,
  53. .step = 0x01,
  54. .default_value = S5K83A_DEFAULT_WHITENESS,
  55. .flags = V4L2_CTRL_FLAG_SLIDER
  56. },
  57. .set = s5k83a_set_whiteness,
  58. .get = s5k83a_get_whiteness,
  59. }, {
  60. {
  61. .id = V4L2_CID_GAIN,
  62. .type = V4L2_CTRL_TYPE_INTEGER,
  63. .name = "gain",
  64. .minimum = 0x00,
  65. .maximum = S5K83A_MAXIMUM_GAIN,
  66. .step = 0x01,
  67. .default_value = S5K83A_DEFAULT_GAIN,
  68. .flags = V4L2_CTRL_FLAG_SLIDER
  69. },
  70. .set = s5k83a_set_gain,
  71. .get = s5k83a_get_gain
  72. }, {
  73. {
  74. .id = V4L2_CID_HFLIP,
  75. .type = V4L2_CTRL_TYPE_BOOLEAN,
  76. .name = "horizontal flip",
  77. .minimum = 0,
  78. .maximum = 1,
  79. .step = 1,
  80. .default_value = 0
  81. },
  82. .set = s5k83a_set_hflip,
  83. .get = s5k83a_get_hflip
  84. }, {
  85. {
  86. .id = V4L2_CID_VFLIP,
  87. .type = V4L2_CTRL_TYPE_BOOLEAN,
  88. .name = "vertical flip",
  89. .minimum = 0,
  90. .maximum = 1,
  91. .step = 1,
  92. .default_value = 0
  93. },
  94. .set = s5k83a_set_vflip,
  95. .get = s5k83a_get_vflip
  96. }
  97. };
  98. static void s5k83a_dump_registers(struct sd *sd);
  99. int s5k83a_probe(struct sd *sd)
  100. {
  101. u8 prod_id = 0, ver_id = 0;
  102. int i, err = 0;
  103. if (force_sensor) {
  104. if (force_sensor == S5K83A_SENSOR) {
  105. info("Forcing a %s sensor", s5k83a.name);
  106. goto sensor_found;
  107. }
  108. /* If we want to force another sensor, don't try to probe this
  109. * one */
  110. return -ENODEV;
  111. }
  112. info("Probing for a s5k83a sensor");
  113. /* Preinit the sensor */
  114. for (i = 0; i < ARRAY_SIZE(preinit_s5k83a) && !err; i++) {
  115. u8 data[2] = {preinit_s5k83a[i][2], preinit_s5k83a[i][3]};
  116. if (preinit_s5k83a[i][0] == SENSOR)
  117. err = m5602_write_sensor(sd, preinit_s5k83a[i][1],
  118. data, 2);
  119. else
  120. err = m5602_write_bridge(sd, preinit_s5k83a[i][1],
  121. data[0]);
  122. }
  123. /* We don't know what register (if any) that contain the product id
  124. * Just pick the first addresses that seem to produce the same results
  125. * on multiple machines */
  126. if (m5602_read_sensor(sd, 0x00, &prod_id, 1))
  127. return -ENODEV;
  128. if (m5602_read_sensor(sd, 0x01, &ver_id, 1))
  129. return -ENODEV;
  130. if ((prod_id == 0xff) || (ver_id == 0xff))
  131. return -ENODEV;
  132. else
  133. info("Detected a s5k83a sensor");
  134. sensor_found:
  135. sd->gspca_dev.cam.cam_mode = s5k83a_modes;
  136. sd->gspca_dev.cam.nmodes = ARRAY_SIZE(s5k83a_modes);
  137. sd->desc->ctrls = s5k83a_ctrls;
  138. sd->desc->nctrls = ARRAY_SIZE(s5k83a_ctrls);
  139. return 0;
  140. }
  141. int s5k83a_init(struct sd *sd)
  142. {
  143. int i, err = 0;
  144. for (i = 0; i < ARRAY_SIZE(init_s5k83a) && !err; i++) {
  145. u8 data[2] = {0x00, 0x00};
  146. switch (init_s5k83a[i][0]) {
  147. case BRIDGE:
  148. err = m5602_write_bridge(sd,
  149. init_s5k83a[i][1],
  150. init_s5k83a[i][2]);
  151. break;
  152. case SENSOR:
  153. data[0] = init_s5k83a[i][2];
  154. err = m5602_write_sensor(sd,
  155. init_s5k83a[i][1], data, 1);
  156. break;
  157. case SENSOR_LONG:
  158. data[0] = init_s5k83a[i][2];
  159. data[1] = init_s5k83a[i][3];
  160. err = m5602_write_sensor(sd,
  161. init_s5k83a[i][1], data, 2);
  162. break;
  163. default:
  164. info("Invalid stream command, exiting init");
  165. return -EINVAL;
  166. }
  167. }
  168. if (dump_sensor)
  169. s5k83a_dump_registers(sd);
  170. return (err < 0) ? err : 0;
  171. }
  172. int s5k83a_start(struct sd *sd)
  173. {
  174. return s5k83a_set_led_indication(sd, 1);
  175. }
  176. int s5k83a_stop(struct sd *sd)
  177. {
  178. return s5k83a_set_led_indication(sd, 0);
  179. }
  180. int s5k83a_power_down(struct sd *sd)
  181. {
  182. return 0;
  183. }
  184. static void s5k83a_dump_registers(struct sd *sd)
  185. {
  186. int address;
  187. u8 page, old_page;
  188. m5602_read_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1);
  189. for (page = 0; page < 16; page++) {
  190. m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1);
  191. info("Dumping the s5k83a register state for page 0x%x", page);
  192. for (address = 0; address <= 0xff; address++) {
  193. u8 val = 0;
  194. m5602_read_sensor(sd, address, &val, 1);
  195. info("register 0x%x contains 0x%x",
  196. address, val);
  197. }
  198. }
  199. info("s5k83a register state dump complete");
  200. for (page = 0; page < 16; page++) {
  201. m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1);
  202. info("Probing for which registers that are read/write "
  203. "for page 0x%x", page);
  204. for (address = 0; address <= 0xff; address++) {
  205. u8 old_val, ctrl_val, test_val = 0xff;
  206. m5602_read_sensor(sd, address, &old_val, 1);
  207. m5602_write_sensor(sd, address, &test_val, 1);
  208. m5602_read_sensor(sd, address, &ctrl_val, 1);
  209. if (ctrl_val == test_val)
  210. info("register 0x%x is writeable", address);
  211. else
  212. info("register 0x%x is read only", address);
  213. /* Restore original val */
  214. m5602_write_sensor(sd, address, &old_val, 1);
  215. }
  216. }
  217. info("Read/write register probing complete");
  218. m5602_write_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1);
  219. }
  220. int s5k83a_get_brightness(struct gspca_dev *gspca_dev, __s32 *val)
  221. {
  222. int err;
  223. u8 data[2];
  224. struct sd *sd = (struct sd *) gspca_dev;
  225. err = m5602_read_sensor(sd, S5K83A_BRIGHTNESS, data, 2);
  226. if (err < 0)
  227. return err;
  228. data[1] = data[1] << 1;
  229. *val = data[1];
  230. return err;
  231. }
  232. int s5k83a_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
  233. {
  234. int err;
  235. u8 data[2];
  236. struct sd *sd = (struct sd *) gspca_dev;
  237. data[0] = 0x00;
  238. data[1] = 0x20;
  239. err = m5602_write_sensor(sd, 0x14, data, 2);
  240. if (err < 0)
  241. return err;
  242. data[0] = 0x01;
  243. data[1] = 0x00;
  244. err = m5602_write_sensor(sd, 0x0d, data, 2);
  245. if (err < 0)
  246. return err;
  247. /* FIXME: This is not sane, we need to figure out the composition
  248. of these registers */
  249. data[0] = val >> 3; /* brightness, high 5 bits */
  250. data[1] = val >> 1; /* brightness, high 7 bits */
  251. err = m5602_write_sensor(sd, S5K83A_BRIGHTNESS, data, 2);
  252. return err;
  253. }
  254. int s5k83a_get_whiteness(struct gspca_dev *gspca_dev, __s32 *val)
  255. {
  256. int err;
  257. u8 data;
  258. struct sd *sd = (struct sd *) gspca_dev;
  259. err = m5602_read_sensor(sd, S5K83A_WHITENESS, &data, 1);
  260. if (err < 0)
  261. return err;
  262. *val = data;
  263. return err;
  264. }
  265. int s5k83a_set_whiteness(struct gspca_dev *gspca_dev, __s32 val)
  266. {
  267. int err;
  268. u8 data[1];
  269. struct sd *sd = (struct sd *) gspca_dev;
  270. data[0] = val;
  271. err = m5602_write_sensor(sd, S5K83A_WHITENESS, data, 1);
  272. return err;
  273. }
  274. int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
  275. {
  276. int err;
  277. u8 data[2];
  278. struct sd *sd = (struct sd *) gspca_dev;
  279. err = m5602_read_sensor(sd, S5K83A_GAIN, data, 2);
  280. if (err < 0)
  281. return err;
  282. data[1] = data[1] & 0x3f;
  283. if (data[1] > S5K83A_MAXIMUM_GAIN)
  284. data[1] = S5K83A_MAXIMUM_GAIN;
  285. *val = data[1];
  286. return err;
  287. }
  288. int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
  289. {
  290. int err;
  291. u8 data[2];
  292. struct sd *sd = (struct sd *) gspca_dev;
  293. data[0] = 0;
  294. data[1] = val;
  295. err = m5602_write_sensor(sd, S5K83A_GAIN, data, 2);
  296. return err;
  297. }
  298. int s5k83a_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
  299. {
  300. int err;
  301. u8 data[1];
  302. struct sd *sd = (struct sd *) gspca_dev;
  303. data[0] = 0x05;
  304. err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
  305. if (err < 0)
  306. return err;
  307. err = m5602_read_sensor(sd, S5K83A_FLIP, data, 1);
  308. *val = (data[0] | 0x40) ? 1 : 0;
  309. return err;
  310. }
  311. int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
  312. {
  313. int err;
  314. u8 data[1];
  315. struct sd *sd = (struct sd *) gspca_dev;
  316. data[0] = 0x05;
  317. err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
  318. if (err < 0)
  319. return err;
  320. err = m5602_read_sensor(sd, S5K83A_FLIP, data, 1);
  321. if (err < 0)
  322. return err;
  323. /* set or zero six bit, seven is hflip */
  324. data[0] = (val) ? (data[0] & 0x80) | 0x40 | S5K83A_FLIP_MASK
  325. : (data[0] & 0x80) | S5K83A_FLIP_MASK;
  326. err = m5602_write_sensor(sd, S5K83A_FLIP, data, 1);
  327. if (err < 0)
  328. return err;
  329. data[0] = (val) ? 0x0b : 0x0a;
  330. err = m5602_write_sensor(sd, S5K83A_VFLIP_TUNE, data, 1);
  331. return err;
  332. }
  333. int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
  334. {
  335. int err;
  336. u8 data[1];
  337. struct sd *sd = (struct sd *) gspca_dev;
  338. data[0] = 0x05;
  339. err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
  340. if (err < 0)
  341. return err;
  342. err = m5602_read_sensor(sd, S5K83A_FLIP, data, 1);
  343. *val = (data[0] | 0x80) ? 1 : 0;
  344. return err;
  345. }
  346. int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
  347. {
  348. int err;
  349. u8 data[1];
  350. struct sd *sd = (struct sd *) gspca_dev;
  351. data[0] = 0x05;
  352. err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
  353. if (err < 0)
  354. return err;
  355. err = m5602_read_sensor(sd, S5K83A_FLIP, data, 1);
  356. if (err < 0)
  357. return err;
  358. /* set or zero seven bit, six is vflip */
  359. data[0] = (val) ? (data[0] & 0x40) | 0x80 | S5K83A_FLIP_MASK
  360. : (data[0] & 0x40) | S5K83A_FLIP_MASK;
  361. err = m5602_write_sensor(sd, S5K83A_FLIP, data, 1);
  362. if (err < 0)
  363. return err;
  364. data[0] = (val) ? 0x0a : 0x0b;
  365. err = m5602_write_sensor(sd, S5K83A_HFLIP_TUNE, data, 1);
  366. return err;
  367. }
  368. int s5k83a_set_led_indication(struct sd *sd, u8 val)
  369. {
  370. int err = 0;
  371. u8 data[1];
  372. err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, data);
  373. if (err < 0)
  374. return err;
  375. if (val)
  376. data[0] = data[0] | S5K83A_GPIO_LED_MASK;
  377. else
  378. data[0] = data[0] & ~S5K83A_GPIO_LED_MASK;
  379. err = m5602_write_bridge(sd, M5602_XB_GPIO_DAT, data[0]);
  380. return (err < 0) ? err : 0;
  381. }