ov511.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:161k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * OmniVision OV511 Camera-to-USB Bridge Driver
  3.  *
  4.  * Copyright (c) 1999-2002 Mark W. McClelland
  5.  * Original decompression code Copyright 1998-2000 OmniVision Technologies
  6.  * Many improvements by Bret Wallach <bwallac1@san.rr.com>
  7.  * Color fixes by by Orion Sky Lawlor <olawlor@acm.org> (2/26/2000)
  8.  * Snapshot code by Kevin Moore
  9.  * OV7620 fixes by Charl P. Botha <cpbotha@ieee.org>
  10.  * Changes by Claudio Matsuoka <claudio@conectiva.com>
  11.  * Original SAA7111A code by Dave Perks <dperks@ibm.net>
  12.  * URB error messages from pwc driver by Nemosoft
  13.  * generic_ioctl() code from videodev.c by Gerd Knorr and Alan Cox
  14.  *
  15.  * Based on the Linux CPiA driver written by Peter Pregler,
  16.  * Scott J. Bertin and Johannes Erdfelt.
  17.  * 
  18.  * Please see the file: linux/Documentation/usb/ov511.txt 
  19.  * and the website at:  http://alpha.dyndns.org/ov511
  20.  * for more info.
  21.  *
  22.  * This program is free software; you can redistribute it and/or modify it
  23.  * under the terms of the GNU General Public License as published by the
  24.  * Free Software Foundation; either version 2 of the License, or (at your
  25.  * option) any later version.
  26.  *
  27.  * This program is distributed in the hope that it will be useful, but
  28.  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  29.  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  30.  * for more details.
  31.  *
  32.  * You should have received a copy of the GNU General Public License
  33.  * along with this program; if not, write to the Free Software Foundation,
  34.  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  35.  */
  36. #include <linux/config.h>
  37. #include <linux/version.h>
  38. #include <linux/module.h>
  39. #include <linux/init.h>
  40. #include <linux/fs.h>
  41. #include <linux/vmalloc.h>
  42. #include <linux/slab.h>
  43. #include <linux/proc_fs.h>
  44. #include <linux/ctype.h>
  45. #include <linux/pagemap.h>
  46. #include <asm/io.h>
  47. #include <asm/semaphore.h>
  48. #include <asm/processor.h>
  49. #include <linux/wrapper.h>
  50. #if defined (__i386__)
  51. #include <asm/cpufeature.h>
  52. #endif
  53. #include "ov511.h"
  54. /*
  55.  * Version Information
  56.  */
  57. #define DRIVER_VERSION "v1.61 for Linux 2.4"
  58. #define EMAIL "mark@alpha.dyndns.org"
  59. #define DRIVER_AUTHOR "Mark McClelland <mmcclell@bigfoot.com> & Bret Wallach 
  60. & Orion Sky Lawlor <olawlor@acm.org> & Kevin Moore & Charl P. Botha 
  61. <cpbotha@ieee.org> & Claudio Matsuoka <claudio@conectiva.com>"
  62. #define DRIVER_DESC "ov511 USB Camera Driver"
  63. #define OV511_I2C_RETRIES 3
  64. #define ENABLE_Y_QUANTABLE 1
  65. #define ENABLE_UV_QUANTABLE 1
  66. #define OV511_MAX_UNIT_VIDEO 16
  67. /* Pixel count * 3 bytes for RGB */
  68. #define MAX_FRAME_SIZE(w, h) ((w) * (h) * 3)
  69. #define MAX_DATA_SIZE(w, h) (MAX_FRAME_SIZE(w, h) + sizeof(struct timeval))
  70. /* Max size * bytes per YUV420 pixel (1.5) + one extra isoc frame for safety */
  71. #define MAX_RAW_DATA_SIZE(w, h) ((w) * (h) * 3 / 2 + 1024)
  72. #define FATAL_ERROR(rc) ((rc) < 0 && (rc) != -EPERM)
  73. /**********************************************************************
  74.  * Module Parameters
  75.  * (See ov511.txt for detailed descriptions of these)
  76.  **********************************************************************/
  77. /* These variables (and all static globals) default to zero */
  78. static int autobright = 1;
  79. static int autogain = 1;
  80. static int autoexp = 1;
  81. static int debug;
  82. static int snapshot;
  83. static int fix_rgb_offset;
  84. static int force_rgb;
  85. static int cams = 1;
  86. static int compress;
  87. static int testpat;
  88. static int sensor_gbr;
  89. static int dumppix;
  90. static int led  = 1;
  91. static int dump_bridge;
  92. static int dump_sensor;
  93. static int printph;
  94. static int phy = 0x1f;
  95. static int phuv = 0x05;
  96. static int pvy = 0x06;
  97. static int pvuv = 0x06;
  98. static int qhy = 0x14;
  99. static int qhuv = 0x03;
  100. static int qvy = 0x04;
  101. static int qvuv = 0x04;
  102. static int lightfreq;
  103. static int bandingfilter;
  104. static int clockdiv = -1;
  105. static int packetsize = -1;
  106. static int framedrop = -1;
  107. static int fastset;
  108. static int force_palette;
  109. static int backlight;
  110. static int unit_video[OV511_MAX_UNIT_VIDEO];
  111. static int remove_zeros;
  112. static int mirror;
  113. MODULE_PARM(autobright, "i");
  114. MODULE_PARM_DESC(autobright, "Sensor automatically changes brightness");
  115. MODULE_PARM(autogain, "i");
  116. MODULE_PARM_DESC(autogain, "Sensor automatically changes gain");
  117. MODULE_PARM(autoexp, "i");
  118. MODULE_PARM_DESC(autoexp, "Sensor automatically changes exposure");
  119. MODULE_PARM(debug, "i");
  120. MODULE_PARM_DESC(debug,
  121.   "Debug level: 0=none, 1=inits, 2=warning, 3=config, 4=functions, 5=max");
  122. MODULE_PARM(snapshot, "i");
  123. MODULE_PARM_DESC(snapshot, "Enable snapshot mode");
  124. MODULE_PARM(fix_rgb_offset, "i");
  125. MODULE_PARM_DESC(fix_rgb_offset,
  126.   "Fix vertical misalignment of red and blue at 640x480");
  127. MODULE_PARM(force_rgb, "i");
  128. MODULE_PARM_DESC(force_rgb, "Read RGB instead of BGR");
  129. MODULE_PARM(cams, "i");
  130. MODULE_PARM_DESC(cams, "Number of simultaneous cameras");
  131. MODULE_PARM(compress, "i");
  132. MODULE_PARM_DESC(compress, "Turn on compression (not reliable yet)");
  133. MODULE_PARM(testpat, "i");
  134. MODULE_PARM_DESC(testpat,
  135.   "Replace image with vertical bar testpattern (only partially working)");
  136. MODULE_PARM(dumppix, "i");
  137. MODULE_PARM_DESC(dumppix, "Dump raw pixel data");
  138. MODULE_PARM(led, "i");
  139. MODULE_PARM_DESC(led,
  140.   "LED policy (OV511+ or later). 0=off, 1=on (default), 2=auto (on when open)");
  141. MODULE_PARM(dump_bridge, "i");
  142. MODULE_PARM_DESC(dump_bridge, "Dump the bridge registers");
  143. MODULE_PARM(dump_sensor, "i");
  144. MODULE_PARM_DESC(dump_sensor, "Dump the sensor registers");
  145. MODULE_PARM(printph, "i");
  146. MODULE_PARM_DESC(printph, "Print frame start/end headers");
  147. MODULE_PARM(phy, "i");
  148. MODULE_PARM_DESC(phy, "Prediction range (horiz. Y)");
  149. MODULE_PARM(phuv, "i");
  150. MODULE_PARM_DESC(phuv, "Prediction range (horiz. UV)");
  151. MODULE_PARM(pvy, "i");
  152. MODULE_PARM_DESC(pvy, "Prediction range (vert. Y)");
  153. MODULE_PARM(pvuv, "i");
  154. MODULE_PARM_DESC(pvuv, "Prediction range (vert. UV)");
  155. MODULE_PARM(qhy, "i");
  156. MODULE_PARM_DESC(qhy, "Quantization threshold (horiz. Y)");
  157. MODULE_PARM(qhuv, "i");
  158. MODULE_PARM_DESC(qhuv, "Quantization threshold (horiz. UV)");
  159. MODULE_PARM(qvy, "i");
  160. MODULE_PARM_DESC(qvy, "Quantization threshold (vert. Y)");
  161. MODULE_PARM(qvuv, "i");
  162. MODULE_PARM_DESC(qvuv, "Quantization threshold (vert. UV)");
  163. MODULE_PARM(lightfreq, "i");
  164. MODULE_PARM_DESC(lightfreq,
  165.   "Light frequency. Set to 50 or 60 Hz, or zero for default settings");
  166. MODULE_PARM(bandingfilter, "i");
  167. MODULE_PARM_DESC(bandingfilter,
  168.   "Enable banding filter (to reduce effects of fluorescent lighting)");
  169. MODULE_PARM(clockdiv, "i");
  170. MODULE_PARM_DESC(clockdiv, "Force pixel clock divisor to a specific value");
  171. MODULE_PARM(packetsize, "i");
  172. MODULE_PARM_DESC(packetsize, "Force a specific isoc packet size");
  173. MODULE_PARM(framedrop, "i");
  174. MODULE_PARM_DESC(framedrop, "Force a specific frame drop register setting");
  175. MODULE_PARM(fastset, "i");
  176. MODULE_PARM_DESC(fastset, "Allows picture settings to take effect immediately");
  177. MODULE_PARM(force_palette, "i");
  178. MODULE_PARM_DESC(force_palette, "Force the palette to a specific value");
  179. MODULE_PARM(backlight, "i");
  180. MODULE_PARM_DESC(backlight, "For objects that are lit from behind");
  181. MODULE_PARM(unit_video, "1-" __MODULE_STRING(OV511_MAX_UNIT_VIDEO) "i");
  182. MODULE_PARM_DESC(unit_video,
  183.   "Force use of specific minor number(s). 0 is not allowed.");
  184. MODULE_PARM(remove_zeros, "i");
  185. MODULE_PARM_DESC(remove_zeros,
  186.   "Remove zero-padding from uncompressed incoming data");
  187. MODULE_PARM(mirror, "i");
  188. MODULE_PARM_DESC(mirror, "Reverse image horizontally");
  189. MODULE_AUTHOR(DRIVER_AUTHOR);
  190. MODULE_DESCRIPTION(DRIVER_DESC);
  191. MODULE_LICENSE("GPL");
  192. /**********************************************************************
  193.  * Miscellaneous Globals
  194.  **********************************************************************/
  195. static struct usb_driver ov511_driver;
  196. static struct ov51x_decomp_ops *ov511_decomp_ops;
  197. static struct ov51x_decomp_ops *ov511_mmx_decomp_ops;
  198. static struct ov51x_decomp_ops *ov518_decomp_ops;
  199. static struct ov51x_decomp_ops *ov518_mmx_decomp_ops;
  200. /* Number of times to retry a failed I2C transaction. Increase this if you
  201.  * are getting "Failed to read sensor ID..." */
  202. static int i2c_detect_tries = 5;
  203. /* MMX support is present in kernel and CPU. Checked upon decomp module load. */
  204. static int ov51x_mmx_available;
  205. static __devinitdata struct usb_device_id device_table [] = {
  206. { USB_DEVICE(VEND_OMNIVISION, PROD_OV511) },
  207. { USB_DEVICE(VEND_OMNIVISION, PROD_OV511PLUS) },
  208. { USB_DEVICE(VEND_OMNIVISION, PROD_OV518) },
  209. { USB_DEVICE(VEND_OMNIVISION, PROD_OV518PLUS) },
  210. { USB_DEVICE(VEND_MATTEL, PROD_ME2CAM) },
  211. { }  /* Terminating entry */
  212. };
  213. MODULE_DEVICE_TABLE (usb, device_table);
  214. static unsigned char yQuanTable511[] = OV511_YQUANTABLE;
  215. static unsigned char uvQuanTable511[] = OV511_UVQUANTABLE;
  216. static unsigned char yQuanTable518[] = OV518_YQUANTABLE;
  217. static unsigned char uvQuanTable518[] = OV518_UVQUANTABLE;
  218. /**********************************************************************
  219.  * Symbolic Names
  220.  **********************************************************************/
  221. /* Known OV511-based cameras */
  222. static struct symbolic_list camlist[] = {
  223. {   0, "Generic Camera (no ID)" },
  224. {   1, "Mustek WCam 3X" },
  225. {   3, "D-Link DSB-C300" },
  226. {   4, "Generic OV511/OV7610" },
  227. {   5, "Puretek PT-6007" },
  228. {   6, "Lifeview USB Life TV (NTSC)" },
  229. {  21, "Creative Labs WebCam 3" },
  230. {  22, "Lifeview USB Life TV (PAL D/K+B/G)" },
  231. {  36, "Koala-Cam" },
  232. {  38, "Lifeview USB Life TV (PAL)" },
  233. {  41, "Samsung Anycam MPC-M10" },
  234. {  43, "Mtekvision Zeca MV402" },
  235. {  46, "Suma eON" },
  236. {  70, "Lifeview USB Life TV (PAL/SECAM)" },
  237. { 100, "Lifeview RoboCam" },
  238. { 102, "AverMedia InterCam Elite" },
  239. { 112, "MediaForte MV300" }, /* or OV7110 evaluation kit */
  240. { 192, "Webeye 2000B" },
  241. {  -1, NULL }
  242. };
  243. /* Video4Linux1 Palettes */
  244. static struct symbolic_list v4l1_plist[] = {
  245. { VIDEO_PALETTE_GREY, "GREY" },
  246. { VIDEO_PALETTE_HI240, "HI240" },
  247. { VIDEO_PALETTE_RGB565, "RGB565" },
  248. { VIDEO_PALETTE_RGB24, "RGB24" },
  249. { VIDEO_PALETTE_RGB32, "RGB32" },
  250. { VIDEO_PALETTE_RGB555, "RGB555" },
  251. { VIDEO_PALETTE_YUV422, "YUV422" },
  252. { VIDEO_PALETTE_YUYV, "YUYV" },
  253. { VIDEO_PALETTE_UYVY, "UYVY" },
  254. { VIDEO_PALETTE_YUV420, "YUV420" },
  255. { VIDEO_PALETTE_YUV411, "YUV411" },
  256. { VIDEO_PALETTE_RAW, "RAW" },
  257. { VIDEO_PALETTE_YUV422P,"YUV422P" },
  258. { VIDEO_PALETTE_YUV411P,"YUV411P" },
  259. { VIDEO_PALETTE_YUV420P,"YUV420P" },
  260. { VIDEO_PALETTE_YUV410P,"YUV410P" },
  261. { -1, NULL }
  262. };
  263. static struct symbolic_list brglist[] = {
  264. { BRG_OV511, "OV511" },
  265. { BRG_OV511PLUS, "OV511+" },
  266. { BRG_OV518, "OV518" },
  267. { BRG_OV518PLUS, "OV518+" },
  268. { -1, NULL }
  269. };
  270. static struct symbolic_list senlist[] = {
  271. { SEN_OV76BE, "OV76BE" },
  272. { SEN_OV7610, "OV7610" },
  273. { SEN_OV7620, "OV7620" },
  274. { SEN_OV7620AE, "OV7620AE" },
  275. { SEN_OV6620, "OV6620" },
  276. { SEN_OV6630, "OV6630" },
  277. { SEN_OV6630AE, "OV6630AE" },
  278. { SEN_OV6630AF, "OV6630AF" },
  279. { SEN_OV8600, "OV8600" },
  280. { SEN_KS0127, "KS0127" },
  281. { SEN_KS0127B, "KS0127B" },
  282. { SEN_SAA7111A, "SAA7111A" },
  283. { -1, NULL }
  284. };
  285. /* URB error codes: */
  286. static struct symbolic_list urb_errlist[] = {
  287. { -ENOSR, "Buffer error (overrun)" },
  288. { -EPIPE, "Stalled (device not responding)" },
  289. { -EOVERFLOW, "Babble (bad cable?)" },
  290. { -EPROTO, "Bit-stuff error (bad cable?)" },
  291. { -EILSEQ, "CRC/Timeout" },
  292. { -ETIMEDOUT, "NAK (device does not respond)" },
  293. { -1, NULL }
  294. };
  295. /**********************************************************************
  296.  * Prototypes
  297.  **********************************************************************/
  298. static void ov51x_clear_snapshot(struct usb_ov511 *);
  299. static inline int sensor_get_picture(struct usb_ov511 *,
  300.      struct video_picture *);
  301. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  302. static int sensor_get_exposure(struct usb_ov511 *, unsigned char *);
  303. static int ov51x_control_ioctl(struct inode *, struct file *, unsigned int,
  304.        unsigned long);
  305. static int ov51x_check_snapshot(struct usb_ov511 *);
  306. #endif
  307. /**********************************************************************
  308.  * Memory management
  309.  **********************************************************************/
  310. /* Here we want the physical address of the memory.
  311.  * This is used when initializing the contents of the area.
  312.  */
  313. static inline unsigned long
  314. kvirt_to_pa(unsigned long adr)
  315. {
  316. unsigned long kva, ret;
  317. kva = (unsigned long) page_address(vmalloc_to_page((void *)adr));
  318. kva |= adr & (PAGE_SIZE-1); /* restore the offset */
  319. ret = __pa(kva);
  320. return ret;
  321. }
  322. static void *
  323. rvmalloc(unsigned long size)
  324. {
  325. void *mem;
  326. unsigned long adr;
  327. size = PAGE_ALIGN(size);
  328. mem = vmalloc_32(size);
  329. if (!mem)
  330. return NULL;
  331. memset(mem, 0, size); /* Clear the ram out, no junk to the user */
  332. adr = (unsigned long) mem;
  333. while (size > 0) {
  334. mem_map_reserve(vmalloc_to_page((void *)adr));
  335. adr += PAGE_SIZE;
  336. size -= PAGE_SIZE;
  337. }
  338. return mem;
  339. }
  340. static void
  341. rvfree(void *mem, unsigned long size)
  342. {
  343. unsigned long adr;
  344. if (!mem)
  345. return;
  346. adr = (unsigned long) mem;
  347. while ((long) size > 0) {
  348. mem_map_unreserve(vmalloc_to_page((void *)adr));
  349. adr += PAGE_SIZE;
  350. size -= PAGE_SIZE;
  351. }
  352. vfree(mem);
  353. }
  354. /**********************************************************************
  355.  * /proc interface
  356.  * Based on the CPiA driver version 0.7.4 -claudio
  357.  **********************************************************************/
  358. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  359. static struct proc_dir_entry *ov511_proc_entry = NULL;
  360. extern struct proc_dir_entry *video_proc_entry;
  361. static struct file_operations ov511_control_fops = {
  362. ioctl: ov51x_control_ioctl,
  363. };
  364. #define YES_NO(x) ((x) ? "yes" : "no")
  365. /* /proc/video/ov511/<minor#>/info */
  366. static int
  367. ov511_read_proc_info(char *page, char **start, off_t off, int count, int *eof,
  368.      void *data)
  369. {
  370. char *out = page;
  371. int i, len;
  372. struct usb_ov511 *ov = data;
  373. struct video_picture p;
  374. unsigned char exp;
  375. if (!ov || !ov->dev)
  376. return -ENODEV;
  377. sensor_get_picture(ov, &p);
  378. sensor_get_exposure(ov, &exp);
  379. /* IMPORTANT: This output MUST be kept under PAGE_SIZE
  380.  *            or we need to get more sophisticated. */
  381. out += sprintf(out, "driver_version  : %sn", DRIVER_VERSION);
  382. out += sprintf(out, "custom_id       : %dn", ov->customid);
  383. out += sprintf(out, "model           : %sn", ov->desc);
  384. out += sprintf(out, "streaming       : %sn", YES_NO(ov->streaming));
  385. out += sprintf(out, "grabbing        : %sn", YES_NO(ov->grabbing));
  386. out += sprintf(out, "compress        : %sn", YES_NO(ov->compress));
  387. out += sprintf(out, "subcapture      : %sn", YES_NO(ov->sub_flag));
  388. out += sprintf(out, "sub_size        : %d %d %d %dn",
  389.        ov->subx, ov->suby, ov->subw, ov->subh);
  390. out += sprintf(out, "data_format     : %sn",
  391.        force_rgb ? "RGB" : "BGR");
  392. out += sprintf(out, "brightness      : %dn", p.brightness >> 8);
  393. out += sprintf(out, "colour          : %dn", p.colour >> 8);
  394. out += sprintf(out, "contrast        : %dn", p.contrast >> 8);
  395. out += sprintf(out, "hue             : %dn", p.hue >> 8);
  396. out += sprintf(out, "exposure        : %dn", exp);
  397. out += sprintf(out, "num_frames      : %dn", OV511_NUMFRAMES);
  398. for (i = 0; i < OV511_NUMFRAMES; i++) {
  399. out += sprintf(out, "frame           : %dn", i);
  400. out += sprintf(out, "  depth         : %dn",
  401.        ov->frame[i].depth);
  402. out += sprintf(out, "  size          : %d %dn",
  403.        ov->frame[i].width, ov->frame[i].height);
  404. out += sprintf(out, "  format        : %sn",
  405.        symbolic(v4l1_plist, ov->frame[i].format));
  406. out += sprintf(out, "  data_buffer   : 0x%pn",
  407.        ov->frame[i].data);
  408. }
  409. out += sprintf(out, "snap_enabled    : %sn", YES_NO(ov->snap_enabled));
  410. out += sprintf(out, "bridge          : %sn",
  411.        symbolic(brglist, ov->bridge));
  412. out += sprintf(out, "sensor          : %sn",
  413.        symbolic(senlist, ov->sensor));
  414. out += sprintf(out, "packet_size     : %dn", ov->packet_size);
  415. out += sprintf(out, "framebuffer     : 0x%pn", ov->fbuf);
  416. len = out - page;
  417. len -= off;
  418. if (len < count) {
  419. *eof = 1;
  420. if (len <= 0)
  421. return 0;
  422. } else
  423. len = count;
  424. *start = page + off;
  425. return len;
  426. }
  427. /* /proc/video/ov511/<minor#>/button
  428.  *
  429.  * When the camera's button is pressed, the output of this will change from a
  430.  * 0 to a 1 (ASCII). It will retain this value until it is read, after which
  431.  * it will reset to zero.
  432.  *
  433.  * SECURITY NOTE: Since reading this file can change the state of the snapshot
  434.  * status, it is important for applications that open it to keep it locked
  435.  * against access by other processes, using flock() or a similar mechanism. No
  436.  * locking is provided by this driver.
  437.  */
  438. static int
  439. ov511_read_proc_button(char *page, char **start, off_t off, int count, int *eof,
  440.        void *data)
  441. {
  442. char *out = page;
  443. int len, status;
  444. struct usb_ov511 *ov = data;
  445. if (!ov || !ov->dev)
  446. return -ENODEV;
  447. status = ov51x_check_snapshot(ov);
  448. out += sprintf(out, "%d", status);
  449. if (status)
  450. ov51x_clear_snapshot(ov);
  451. len = out - page;
  452. len -= off;
  453. if (len < count) {
  454. *eof = 1;
  455. if (len <= 0)
  456. return 0;
  457. } else {
  458. len = count;
  459. }
  460. *start = page + off;
  461. return len;
  462. }
  463. static void
  464. create_proc_ov511_cam(struct usb_ov511 *ov)
  465. {
  466. char dirname[10];
  467. if (!ov511_proc_entry || !ov)
  468. return;
  469. /* Create per-device directory */
  470. snprintf(dirname, 10, "%d", ov->vdev.minor);
  471. PDEBUG(4, "creating /proc/video/ov511/%s/", dirname);
  472. ov->proc_devdir = create_proc_entry(dirname, S_IFDIR, ov511_proc_entry);
  473. if (!ov->proc_devdir)
  474. return;
  475. ov->proc_devdir->owner = THIS_MODULE;
  476. /* Create "info" entry (human readable device information) */
  477. PDEBUG(4, "creating /proc/video/ov511/%s/info", dirname);
  478. ov->proc_info = create_proc_read_entry("info", S_IFREG|S_IRUGO|S_IWUSR,
  479. ov->proc_devdir, ov511_read_proc_info, ov);
  480. if (!ov->proc_info)
  481. return;
  482. ov->proc_info->owner = THIS_MODULE;
  483. /* Don't create it if old snapshot mode on (would cause race cond.) */
  484. if (!snapshot) {
  485. /* Create "button" entry (snapshot button status) */
  486. PDEBUG(4, "creating /proc/video/ov511/%s/button", dirname);
  487. ov->proc_button = create_proc_read_entry("button",
  488. S_IFREG|S_IRUGO|S_IWUSR, ov->proc_devdir,
  489. ov511_read_proc_button, ov);
  490. if (!ov->proc_button)
  491. return;
  492. }
  493. ov->proc_button->owner = THIS_MODULE;
  494. /* Create "control" entry (ioctl() interface) */
  495. PDEBUG(4, "creating /proc/video/ov511/%s/control", dirname);
  496. lock_kernel();
  497. ov->proc_control = create_proc_entry("control", S_IFREG|S_IRUGO|S_IWUSR,
  498. ov->proc_devdir);
  499. if (!ov->proc_control) {
  500. unlock_kernel();
  501. return;
  502. }
  503. ov->proc_control->owner = THIS_MODULE;
  504. ov->proc_control->data = ov;
  505. ov->proc_control->proc_fops = &ov511_control_fops;
  506. unlock_kernel();
  507. }
  508. static void
  509. destroy_proc_ov511_cam(struct usb_ov511 *ov)
  510. {
  511. char dirname[10];
  512. if (!ov || !ov->proc_devdir)
  513. return;
  514. snprintf(dirname, 10, "%d", ov->vdev.minor);
  515. /* Destroy "control" entry */
  516. if (ov->proc_control) {
  517. PDEBUG(4, "destroying /proc/video/ov511/%s/control", dirname);
  518. remove_proc_entry("control", ov->proc_devdir);
  519. ov->proc_control = NULL;
  520. }
  521. /* Destroy "button" entry */
  522. if (ov->proc_button) {
  523. PDEBUG(4, "destroying /proc/video/ov511/%s/button", dirname);
  524. remove_proc_entry("button", ov->proc_devdir);
  525. ov->proc_button = NULL;
  526. }
  527. /* Destroy "info" entry */
  528. if (ov->proc_info) {
  529. PDEBUG(4, "destroying /proc/video/ov511/%s/info", dirname);
  530. remove_proc_entry("info", ov->proc_devdir);
  531. ov->proc_info = NULL;
  532. }
  533. /* Destroy per-device directory */
  534. PDEBUG(4, "destroying /proc/video/ov511/%s/", dirname);
  535. remove_proc_entry(dirname, ov511_proc_entry);
  536. ov->proc_devdir = NULL;
  537. }
  538. static void
  539. proc_ov511_create(void)
  540. {
  541. /* No current standard here. Alan prefers /proc/video/ as it keeps
  542.  * /proc "less cluttered than /proc/randomcardifoundintheshed/"
  543.  * -claudio
  544.  */
  545. if (video_proc_entry == NULL) {
  546. err("Error: /proc/video/ does not exist");
  547. return;
  548. }
  549. ov511_proc_entry = create_proc_entry("ov511", S_IFDIR,
  550.      video_proc_entry);
  551. if (ov511_proc_entry)
  552. ov511_proc_entry->owner = THIS_MODULE;
  553. else
  554. err("Unable to create /proc/video/ov511");
  555. }
  556. static void
  557. proc_ov511_destroy(void)
  558. {
  559. PDEBUG(3, "removing /proc/video/ov511");
  560. if (ov511_proc_entry == NULL)
  561. return;
  562. remove_proc_entry("ov511", video_proc_entry);
  563. }
  564. #endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS */
  565. /**********************************************************************
  566.  *
  567.  * Register I/O
  568.  *
  569.  **********************************************************************/
  570. /* Write an OV51x register */
  571. static int
  572. reg_w(struct usb_ov511 *ov, unsigned char reg, unsigned char value)
  573. {
  574. int rc;
  575. PDEBUG(5, "0x%02X:0x%02X", reg, value);
  576. down(&ov->cbuf_lock);
  577. ov->cbuf[0] = value;
  578. rc = usb_control_msg(ov->dev,
  579.      usb_sndctrlpipe(ov->dev, 0),
  580.      (ov->bclass == BCL_OV518)?1:2 /* REG_IO */,
  581.      USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  582.      0, (__u16)reg, &ov->cbuf[0], 1, HZ);
  583. up(&ov->cbuf_lock);
  584. if (rc < 0)
  585. err("reg write: error %d: %s", rc, symbolic(urb_errlist, rc));
  586. return rc;
  587. }
  588. /* Read from an OV51x register */
  589. /* returns: negative is error, pos or zero is data */
  590. static int
  591. reg_r(struct usb_ov511 *ov, unsigned char reg)
  592. {
  593. int rc;
  594. down(&ov->cbuf_lock);
  595. rc = usb_control_msg(ov->dev,
  596.      usb_rcvctrlpipe(ov->dev, 0),
  597.      (ov->bclass == BCL_OV518)?1:3 /* REG_IO */,
  598.      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  599.      0, (__u16)reg, &ov->cbuf[0], 1, HZ);
  600. if (rc < 0) {
  601. err("reg read: error %d: %s", rc, symbolic(urb_errlist, rc));
  602. } else {
  603. rc = ov->cbuf[0];
  604. PDEBUG(5, "0x%02X:0x%02X", reg, ov->cbuf[0]);
  605. }
  606. up(&ov->cbuf_lock);
  607. return rc;
  608. }
  609. /*
  610.  * Writes bits at positions specified by mask to an OV51x reg. Bits that are in
  611.  * the same position as 1's in "mask" are cleared and set to "value". Bits
  612.  * that are in the same position as 0's in "mask" are preserved, regardless
  613.  * of their respective state in "value".
  614.  */
  615. static int
  616. reg_w_mask(struct usb_ov511 *ov,
  617.    unsigned char reg,
  618.    unsigned char value,
  619.    unsigned char mask)
  620. {
  621. int ret;
  622. unsigned char oldval, newval;
  623. ret = reg_r(ov, reg);
  624. if (ret < 0)
  625. return ret;
  626. oldval = (unsigned char) ret;
  627. oldval &= (~mask); /* Clear the masked bits */
  628. value &= mask; /* Enforce mask on value */
  629. newval = oldval | value; /* Set the desired bits */
  630. return (reg_w(ov, reg, newval));
  631. }
  632. /* 
  633.  * Writes multiple (n) byte value to a single register. Only valid with certain
  634.  * registers (0x30 and 0xc4 - 0xce).
  635.  */
  636. static int
  637. ov518_reg_w32(struct usb_ov511 *ov, unsigned char reg, u32 val, int n)
  638. {
  639. int rc;
  640. PDEBUG(5, "0x%02X:%7d, n=%d", reg, val, n);
  641. down(&ov->cbuf_lock);
  642. *((u32 *)ov->cbuf) = __cpu_to_le32(val);
  643. rc = usb_control_msg(ov->dev,
  644.      usb_sndctrlpipe(ov->dev, 0),
  645.      1 /* REG_IO */,
  646.      USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  647.      0, (__u16)reg, ov->cbuf, n, HZ);
  648. up(&ov->cbuf_lock);
  649. if (rc < 0)
  650. err("reg write multiple: error %d: %s", rc,
  651.     symbolic(urb_errlist, rc));
  652. return rc;
  653. }
  654. static int
  655. ov511_upload_quan_tables(struct usb_ov511 *ov)
  656. {
  657. unsigned char *pYTable = yQuanTable511;
  658. unsigned char *pUVTable = uvQuanTable511;
  659. unsigned char val0, val1;
  660. int i, rc, reg = R511_COMP_LUT_BEGIN;
  661. PDEBUG(4, "Uploading quantization tables");
  662. for (i = 0; i < OV511_QUANTABLESIZE / 2; i++) {
  663. if (ENABLE_Y_QUANTABLE) {
  664. val0 = *pYTable++;
  665. val1 = *pYTable++;
  666. val0 &= 0x0f;
  667. val1 &= 0x0f;
  668. val0 |= val1 << 4;
  669. rc = reg_w(ov, reg, val0);
  670. if (rc < 0)
  671. return rc;
  672. }
  673. if (ENABLE_UV_QUANTABLE) {
  674. val0 = *pUVTable++;
  675. val1 = *pUVTable++;
  676. val0 &= 0x0f;
  677. val1 &= 0x0f;
  678. val0 |= val1 << 4;
  679. rc = reg_w(ov, reg + OV511_QUANTABLESIZE/2, val0);
  680. if (rc < 0)
  681. return rc;
  682. }
  683. reg++;
  684. }
  685. return 0;
  686. }
  687. /* OV518 quantization tables are 8x4 (instead of 8x8) */
  688. static int
  689. ov518_upload_quan_tables(struct usb_ov511 *ov)
  690. {
  691. unsigned char *pYTable = yQuanTable518;
  692. unsigned char *pUVTable = uvQuanTable518;
  693. unsigned char val0, val1;
  694. int i, rc, reg = R511_COMP_LUT_BEGIN;
  695. PDEBUG(4, "Uploading quantization tables");
  696. for (i = 0; i < OV518_QUANTABLESIZE / 2; i++) {
  697. if (ENABLE_Y_QUANTABLE) {
  698. val0 = *pYTable++;
  699. val1 = *pYTable++;
  700. val0 &= 0x0f;
  701. val1 &= 0x0f;
  702. val0 |= val1 << 4;
  703. rc = reg_w(ov, reg, val0);
  704. if (rc < 0)
  705. return rc;
  706. }
  707. if (ENABLE_UV_QUANTABLE) {
  708. val0 = *pUVTable++;
  709. val1 = *pUVTable++;
  710. val0 &= 0x0f;
  711. val1 &= 0x0f;
  712. val0 |= val1 << 4;
  713. rc = reg_w(ov, reg + OV518_QUANTABLESIZE/2, val0);
  714. if (rc < 0)
  715. return rc;
  716. }
  717. reg++;
  718. }
  719. return 0;
  720. }
  721. static int
  722. ov51x_reset(struct usb_ov511 *ov, unsigned char reset_type)
  723. {
  724. int rc;
  725. /* Setting bit 0 not allowed on 518/518Plus */
  726. if (ov->bclass == BCL_OV518)
  727. reset_type &= 0xfe;
  728. PDEBUG(4, "Reset: type=0x%02X", reset_type);
  729. rc = reg_w(ov, R51x_SYS_RESET, reset_type);
  730. rc = reg_w(ov, R51x_SYS_RESET, 0);
  731. if (rc < 0)
  732. err("reset: command failed");
  733. return rc;
  734. }
  735. /**********************************************************************
  736.  *
  737.  * Low-level I2C I/O functions
  738.  *
  739.  **********************************************************************/
  740. /* NOTE: Do not call this function directly!
  741.  * The OV518 I2C I/O procedure is different, hence, this function.
  742.  * This is normally only called from i2c_w(). Note that this function
  743.  * always succeeds regardless of whether the sensor is present and working.
  744.  */
  745. static int
  746. ov518_i2c_write_internal(struct usb_ov511 *ov,
  747.  unsigned char reg,
  748.  unsigned char value)
  749. {
  750. int rc;
  751. PDEBUG(5, "0x%02X:0x%02X", reg, value);
  752. /* Select camera register */
  753. rc = reg_w(ov, R51x_I2C_SADDR_3, reg);
  754. if (rc < 0) return rc;
  755. /* Write "value" to I2C data port of OV511 */
  756. rc = reg_w(ov, R51x_I2C_DATA, value);
  757. if (rc < 0) return rc;
  758. /* Initiate 3-byte write cycle */
  759. rc = reg_w(ov, R518_I2C_CTL, 0x01);
  760. if (rc < 0) return rc;
  761. return 0;
  762. }
  763. /* NOTE: Do not call this function directly! */
  764. static int
  765. ov511_i2c_write_internal(struct usb_ov511 *ov,
  766.  unsigned char reg,
  767.  unsigned char value)
  768. {
  769. int rc, retries;
  770. PDEBUG(5, "0x%02X:0x%02X", reg, value);
  771. /* Three byte write cycle */
  772. for (retries = OV511_I2C_RETRIES; ; ) {
  773. /* Select camera register */
  774. rc = reg_w(ov, R51x_I2C_SADDR_3, reg);
  775. if (rc < 0) return rc;
  776. /* Write "value" to I2C data port of OV511 */
  777. rc = reg_w(ov, R51x_I2C_DATA, value);
  778. if (rc < 0) return rc;
  779. /* Initiate 3-byte write cycle */
  780. rc = reg_w(ov, R511_I2C_CTL, 0x01);
  781. if (rc < 0) return rc;
  782. do rc = reg_r(ov, R511_I2C_CTL);
  783. while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
  784. if (rc < 0) return rc;
  785. if ((rc&2) == 0) /* Ack? */
  786. break;
  787. #if 0
  788. /* I2C abort */
  789. reg_w(ov, R511_I2C_CTL, 0x10);
  790. #endif
  791. if (--retries < 0) {
  792. err("i2c write retries exhausted");
  793. return -1;
  794. }
  795. }
  796. return 0;
  797. }
  798. /* NOTE: Do not call this function directly!
  799.  * The OV518 I2C I/O procedure is different, hence, this function.
  800.  * This is normally only called from i2c_r(). Note that this function
  801.  * always succeeds regardless of whether the sensor is present and working.
  802.  */
  803. static int
  804. ov518_i2c_read_internal(struct usb_ov511 *ov, unsigned char reg)
  805. {
  806. int rc, value;
  807. /* Select camera register */
  808. rc = reg_w(ov, R51x_I2C_SADDR_2, reg);
  809. if (rc < 0) return rc;
  810. /* Initiate 2-byte write cycle */
  811. rc = reg_w(ov, R518_I2C_CTL, 0x03);
  812. if (rc < 0) return rc;
  813. /* Initiate 2-byte read cycle */
  814. rc = reg_w(ov, R518_I2C_CTL, 0x05);
  815. if (rc < 0) return rc;
  816. value = reg_r(ov, R51x_I2C_DATA);
  817. PDEBUG(5, "0x%02X:0x%02X", reg, value);
  818. return value;
  819. }
  820. /* NOTE: Do not call this function directly!
  821.  * returns: negative is error, pos or zero is data */
  822. static int
  823. ov511_i2c_read_internal(struct usb_ov511 *ov, unsigned char reg)
  824. {
  825. int rc, value, retries;
  826. /* Two byte write cycle */
  827. for (retries = OV511_I2C_RETRIES; ; ) {
  828. /* Select camera register */
  829. rc = reg_w(ov, R51x_I2C_SADDR_2, reg);
  830. if (rc < 0) return rc;
  831. /* Initiate 2-byte write cycle */
  832. rc = reg_w(ov, R511_I2C_CTL, 0x03);
  833. if (rc < 0) return rc;
  834. do rc = reg_r(ov, R511_I2C_CTL);
  835. while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
  836. if (rc < 0) return rc;
  837. if ((rc&2) == 0) /* Ack? */
  838. break;
  839. /* I2C abort */
  840. reg_w(ov, R511_I2C_CTL, 0x10);
  841. if (--retries < 0) {
  842. err("i2c write retries exhausted");
  843. return -1;
  844. }
  845. }
  846. /* Two byte read cycle */
  847. for (retries = OV511_I2C_RETRIES; ; ) {
  848. /* Initiate 2-byte read cycle */
  849. rc = reg_w(ov, R511_I2C_CTL, 0x05);
  850. if (rc < 0) return rc;
  851. do rc = reg_r(ov, R511_I2C_CTL);
  852. while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
  853. if (rc < 0) return rc;
  854. if ((rc&2) == 0) /* Ack? */
  855. break;
  856. /* I2C abort */
  857. rc = reg_w(ov, R511_I2C_CTL, 0x10);
  858. if (rc < 0) return rc;
  859. if (--retries < 0) {
  860. err("i2c read retries exhausted");
  861. return -1;
  862. }
  863. }
  864. value = reg_r(ov, R51x_I2C_DATA);
  865. PDEBUG(5, "0x%02X:0x%02X", reg, value);
  866. /* This is needed to make i2c_w() work */
  867. rc = reg_w(ov, R511_I2C_CTL, 0x05);
  868. if (rc < 0)
  869. return rc;
  870. return value;
  871. }
  872. /* returns: negative is error, pos or zero is data */
  873. static int
  874. i2c_r(struct usb_ov511 *ov, unsigned char reg)
  875. {
  876. int rc;
  877. down(&ov->i2c_lock);
  878. if (ov->bclass == BCL_OV518)
  879. rc = ov518_i2c_read_internal(ov, reg);
  880. else
  881. rc = ov511_i2c_read_internal(ov, reg);
  882. up(&ov->i2c_lock);
  883. return rc;
  884. }
  885. static int
  886. i2c_w(struct usb_ov511 *ov, unsigned char reg, unsigned char value)
  887. {
  888. int rc;
  889. down(&ov->i2c_lock);
  890. if (ov->bclass == BCL_OV518)
  891. rc = ov518_i2c_write_internal(ov, reg, value);
  892. else
  893. rc = ov511_i2c_write_internal(ov, reg, value);
  894. up(&ov->i2c_lock);
  895. return rc;
  896. }
  897. /* Do not call this function directly! */
  898. static int
  899. ov51x_i2c_write_mask_internal(struct usb_ov511 *ov,
  900.       unsigned char reg,
  901.       unsigned char value,
  902.       unsigned char mask)
  903. {
  904. int rc;
  905. unsigned char oldval, newval;
  906. if (mask == 0xff) {
  907. newval = value;
  908. } else {
  909. if (ov->bclass == BCL_OV518)
  910. rc = ov518_i2c_read_internal(ov, reg);
  911. else
  912. rc = ov511_i2c_read_internal(ov, reg);
  913. if (rc < 0)
  914. return rc;
  915. oldval = (unsigned char) rc;
  916. oldval &= (~mask); /* Clear the masked bits */
  917. value &= mask; /* Enforce mask on value */
  918. newval = oldval | value; /* Set the desired bits */
  919. }
  920. if (ov->bclass == BCL_OV518)
  921. return (ov518_i2c_write_internal(ov, reg, newval));
  922. else
  923. return (ov511_i2c_write_internal(ov, reg, newval));
  924. }
  925. /* Writes bits at positions specified by mask to an I2C reg. Bits that are in
  926.  * the same position as 1's in "mask" are cleared and set to "value". Bits
  927.  * that are in the same position as 0's in "mask" are preserved, regardless
  928.  * of their respective state in "value".
  929.  */
  930. static int
  931. i2c_w_mask(struct usb_ov511 *ov,
  932.    unsigned char reg,
  933.    unsigned char value,
  934.    unsigned char mask)
  935. {
  936. int rc;
  937. down(&ov->i2c_lock);
  938. rc = ov51x_i2c_write_mask_internal(ov, reg, value, mask);
  939. up(&ov->i2c_lock);
  940. return rc;
  941. }
  942. /* Set the read and write slave IDs. The "slave" argument is the write slave,
  943.  * and the read slave will be set to (slave + 1). ov->i2c_lock should be held
  944.  * when calling this. This should not be called from outside the i2c I/O
  945.  * functions.
  946.  */
  947. static inline int
  948. i2c_set_slave_internal(struct usb_ov511 *ov, unsigned char slave)
  949. {
  950. int rc;
  951. rc = reg_w(ov, R51x_I2C_W_SID, slave);
  952. if (rc < 0) return rc;
  953. rc = reg_w(ov, R51x_I2C_R_SID, slave + 1);
  954. if (rc < 0) return rc;
  955. return 0;
  956. }
  957. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  958. /* Write to a specific I2C slave ID and register, using the specified mask */
  959. static int
  960. i2c_w_slave(struct usb_ov511 *ov,
  961.     unsigned char slave,
  962.     unsigned char reg,
  963.     unsigned char value,
  964.     unsigned char mask)
  965. {
  966. int rc = 0;
  967. down(&ov->i2c_lock);
  968. /* Set new slave IDs */
  969. rc = i2c_set_slave_internal(ov, slave);
  970. if (rc < 0) goto out;
  971. rc = ov51x_i2c_write_mask_internal(ov, reg, value, mask);
  972. out:
  973. /* Restore primary IDs */
  974. if (i2c_set_slave_internal(ov, ov->primary_i2c_slave) < 0)
  975. err("Couldn't restore primary I2C slave");
  976. up(&ov->i2c_lock);
  977. return rc;
  978. }
  979. /* Read from a specific I2C slave ID and register */
  980. static int
  981. i2c_r_slave(struct usb_ov511 *ov,
  982.     unsigned char slave,
  983.     unsigned char reg)
  984. {
  985. int rc;
  986. down(&ov->i2c_lock);
  987. /* Set new slave IDs */
  988. rc = i2c_set_slave_internal(ov, slave);
  989. if (rc < 0) goto out;
  990. if (ov->bclass == BCL_OV518)
  991. rc = ov518_i2c_read_internal(ov, reg);
  992. else
  993. rc = ov511_i2c_read_internal(ov, reg);
  994. out:
  995. /* Restore primary IDs */
  996. if (i2c_set_slave_internal(ov, ov->primary_i2c_slave) < 0)
  997. err("Couldn't restore primary I2C slave");
  998. up(&ov->i2c_lock);
  999. return rc;
  1000. }
  1001. #endif /* defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS) */
  1002. /* Sets I2C read and write slave IDs. Returns <0 for error */
  1003. static int
  1004. ov51x_set_slave_ids(struct usb_ov511 *ov, unsigned char sid)
  1005. {
  1006. int rc;
  1007. down(&ov->i2c_lock);
  1008. rc = i2c_set_slave_internal(ov, sid);
  1009. if (rc < 0) goto out;
  1010. // FIXME: Is this actually necessary?
  1011. rc = ov51x_reset(ov, OV511_RESET_NOREGS);
  1012. if (rc < 0) goto out;
  1013. out:
  1014. up(&ov->i2c_lock);
  1015. return rc;
  1016. }
  1017. static int
  1018. write_regvals(struct usb_ov511 *ov, struct ov511_regvals * pRegvals)
  1019. {
  1020. int rc;
  1021. while (pRegvals->bus != OV511_DONE_BUS) {
  1022. if (pRegvals->bus == OV511_REG_BUS) {
  1023. if ((rc = reg_w(ov, pRegvals->reg, pRegvals->val)) < 0)
  1024. return rc;
  1025. } else if (pRegvals->bus == OV511_I2C_BUS) {
  1026. if ((rc = i2c_w(ov, pRegvals->reg, pRegvals->val)) < 0)
  1027. return rc;
  1028. } else {
  1029. err("Bad regval array");
  1030. return -1;
  1031. }
  1032. pRegvals++;
  1033. }
  1034. return 0;
  1035. }
  1036. #ifdef OV511_DEBUG
  1037. static void
  1038. dump_i2c_range(struct usb_ov511 *ov, int reg1, int regn)
  1039. {
  1040. int i;
  1041. int rc;
  1042. for (i = reg1; i <= regn; i++) {
  1043. rc = i2c_r(ov, i);
  1044. info("Sensor[0x%02X] = 0x%02X", i, rc);
  1045. }
  1046. }
  1047. static void
  1048. dump_i2c_regs(struct usb_ov511 *ov)
  1049. {
  1050. info("I2C REGS");
  1051. dump_i2c_range(ov, 0x00, 0x7C);
  1052. }
  1053. static void
  1054. dump_reg_range(struct usb_ov511 *ov, int reg1, int regn)
  1055. {
  1056. int i;
  1057. int rc;
  1058. for (i = reg1; i <= regn; i++) {
  1059. rc = reg_r(ov, i);
  1060. info("OV511[0x%02X] = 0x%02X", i, rc);
  1061. }
  1062. }
  1063. /* FIXME: Should there be an OV518 version of this? */
  1064. static void
  1065. ov511_dump_regs(struct usb_ov511 *ov)
  1066. {
  1067. info("CAMERA INTERFACE REGS");
  1068. dump_reg_range(ov, 0x10, 0x1f);
  1069. info("DRAM INTERFACE REGS");
  1070. dump_reg_range(ov, 0x20, 0x23);
  1071. info("ISO FIFO REGS");
  1072. dump_reg_range(ov, 0x30, 0x31);
  1073. info("PIO REGS");
  1074. dump_reg_range(ov, 0x38, 0x39);
  1075. dump_reg_range(ov, 0x3e, 0x3e);
  1076. info("I2C REGS");
  1077. dump_reg_range(ov, 0x40, 0x49);
  1078. info("SYSTEM CONTROL REGS");
  1079. dump_reg_range(ov, 0x50, 0x55);
  1080. dump_reg_range(ov, 0x5e, 0x5f);
  1081. info("OmniCE REGS");
  1082. dump_reg_range(ov, 0x70, 0x79);
  1083. /* NOTE: Quantization tables are not readable. You will get the value
  1084.  * in reg. 0x79 for every table register */
  1085. dump_reg_range(ov, 0x80, 0x9f);
  1086. dump_reg_range(ov, 0xa0, 0xbf);
  1087. }
  1088. #endif
  1089. /*****************************************************************************/
  1090. /* Temporarily stops OV511 from functioning. Must do this before changing
  1091.  * registers while the camera is streaming */
  1092. static inline int
  1093. ov51x_stop(struct usb_ov511 *ov)
  1094. {
  1095. PDEBUG(4, "stopping");
  1096. ov->stopped = 1;
  1097. if (ov->bclass == BCL_OV518)
  1098. return (reg_w_mask(ov, R51x_SYS_RESET, 0x3a, 0x3a));
  1099. else
  1100. return (reg_w(ov, R51x_SYS_RESET, 0x3d));
  1101. }
  1102. /* Restarts OV511 after ov511_stop() is called. Has no effect if it is not
  1103.  * actually stopped (for performance). */
  1104. static inline int
  1105. ov51x_restart(struct usb_ov511 *ov)
  1106. {
  1107. if (ov->stopped) {
  1108. PDEBUG(4, "restarting");
  1109. ov->stopped = 0;
  1110. /* Reinitialize the stream */
  1111. if (ov->bclass == BCL_OV518)
  1112. reg_w(ov, 0x2f, 0x80);
  1113. return (reg_w(ov, R51x_SYS_RESET, 0x00));
  1114. }
  1115. return 0;
  1116. }
  1117. /* Resets the hardware snapshot button */
  1118. static void
  1119. ov51x_clear_snapshot(struct usb_ov511 *ov)
  1120. {
  1121. if (ov->bclass == BCL_OV511) {
  1122. reg_w(ov, R51x_SYS_SNAP, 0x01);
  1123. reg_w(ov, R51x_SYS_SNAP, 0x03);
  1124. reg_w(ov, R51x_SYS_SNAP, 0x01);
  1125. } else if (ov->bclass == BCL_OV518) {
  1126. warn("snapshot reset not supported yet on OV518(+)");
  1127. } else {
  1128. err("clear snap: invalid bridge type");
  1129. }
  1130. }
  1131. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  1132. /* Checks the status of the snapshot button. Returns 1 if it was pressed since
  1133.  * it was last cleared, and zero in all other cases (including errors) */
  1134. static int
  1135. ov51x_check_snapshot(struct usb_ov511 *ov)
  1136. {
  1137. int ret, status = 0;
  1138. if (ov->bclass == BCL_OV511) {
  1139. ret = reg_r(ov, R51x_SYS_SNAP);
  1140. if (ret < 0) {
  1141. err("Error checking snspshot status (%d)", ret);
  1142. } else if (ret & 0x08) {
  1143. status = 1;
  1144. }
  1145. } else if (ov->bclass == BCL_OV518) {
  1146. warn("snapshot check not supported yet on OV518(+)");
  1147. } else {
  1148. err("check snap: invalid bridge type");
  1149. }
  1150. return status;
  1151. }
  1152. #endif
  1153. /* This does an initial reset of an OmniVision sensor and ensures that I2C
  1154.  * is synchronized. Returns <0 for failure.
  1155.  */
  1156. static int
  1157. init_ov_sensor(struct usb_ov511 *ov)
  1158. {
  1159. int i, success;
  1160. /* Reset the sensor */
  1161. if (i2c_w(ov, 0x12, 0x80) < 0) return -EIO;
  1162. /* Wait for it to initialize */
  1163. schedule_timeout (1 + 150 * HZ / 1000);
  1164. for (i = 0, success = 0; i < i2c_detect_tries && !success; i++) {
  1165. if ((i2c_r(ov, OV7610_REG_ID_HIGH) == 0x7F) &&
  1166.     (i2c_r(ov, OV7610_REG_ID_LOW) == 0xA2)) {
  1167. success = 1;
  1168. continue;
  1169. }
  1170. /* Reset the sensor */
  1171. if (i2c_w(ov, 0x12, 0x80) < 0) return -EIO;
  1172. /* Wait for it to initialize */
  1173. schedule_timeout(1 + 150 * HZ / 1000);
  1174. /* Dummy read to sync I2C */
  1175. if (i2c_r(ov, 0x00) < 0) return -EIO;
  1176. }
  1177. if (!success)
  1178. return -EIO;
  1179. PDEBUG(1, "I2C synced in %d attempt(s)", i);
  1180. return 0;
  1181. }
  1182. static int
  1183. ov511_set_packet_size(struct usb_ov511 *ov, int size)
  1184. {
  1185. int alt, mult;
  1186. if (ov51x_stop(ov) < 0)
  1187. return -EIO;
  1188. mult = size >> 5;
  1189. if (ov->bridge == BRG_OV511) {
  1190. if (size == 0) alt = OV511_ALT_SIZE_0;
  1191. else if (size == 257) alt = OV511_ALT_SIZE_257;
  1192. else if (size == 513) alt = OV511_ALT_SIZE_513;
  1193. else if (size == 769) alt = OV511_ALT_SIZE_769;
  1194. else if (size == 993) alt = OV511_ALT_SIZE_993;
  1195. else {
  1196. err("Set packet size: invalid size (%d)", size);
  1197. return -EINVAL;
  1198. }
  1199. } else if (ov->bridge == BRG_OV511PLUS) {
  1200. if (size == 0) alt = OV511PLUS_ALT_SIZE_0;
  1201. else if (size == 33) alt = OV511PLUS_ALT_SIZE_33;
  1202. else if (size == 129) alt = OV511PLUS_ALT_SIZE_129;
  1203. else if (size == 257) alt = OV511PLUS_ALT_SIZE_257;
  1204. else if (size == 385) alt = OV511PLUS_ALT_SIZE_385;
  1205. else if (size == 513) alt = OV511PLUS_ALT_SIZE_513;
  1206. else if (size == 769) alt = OV511PLUS_ALT_SIZE_769;
  1207. else if (size == 961) alt = OV511PLUS_ALT_SIZE_961;
  1208. else {
  1209. err("Set packet size: invalid size (%d)", size);
  1210. return -EINVAL;
  1211. }
  1212. } else {
  1213. err("Set packet size: Invalid bridge type");
  1214. return -EINVAL;
  1215. }
  1216. PDEBUG(3, "%d, mult=%d, alt=%d", size, mult, alt);
  1217. if (reg_w(ov, R51x_FIFO_PSIZE, mult) < 0)
  1218. return -EIO;
  1219. if (usb_set_interface(ov->dev, ov->iface, alt) < 0) {
  1220. err("Set packet size: set interface error");
  1221. return -EBUSY;
  1222. }
  1223. if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
  1224. return -EIO;
  1225. ov->packet_size = size;
  1226. if (ov51x_restart(ov) < 0)
  1227. return -EIO;
  1228. return 0;
  1229. }
  1230. /* Note: Unlike the OV511/OV511+, the size argument does NOT include the
  1231.  * optional packet number byte. The actual size *is* stored in ov->packet_size,
  1232.  * though. */
  1233. static int
  1234. ov518_set_packet_size(struct usb_ov511 *ov, int size)
  1235. {
  1236. int alt;
  1237. if (ov51x_stop(ov) < 0)
  1238. return -EIO;
  1239. if (ov->bclass == BCL_OV518) {
  1240. if (size == 0) alt = OV518_ALT_SIZE_0;
  1241. else if (size == 128) alt = OV518_ALT_SIZE_128;
  1242. else if (size == 256) alt = OV518_ALT_SIZE_256;
  1243. else if (size == 384) alt = OV518_ALT_SIZE_384;
  1244. else if (size == 512) alt = OV518_ALT_SIZE_512;
  1245. else if (size == 640) alt = OV518_ALT_SIZE_640;
  1246. else if (size == 768) alt = OV518_ALT_SIZE_768;
  1247. else if (size == 896) alt = OV518_ALT_SIZE_896;
  1248. else {
  1249. err("Set packet size: invalid size (%d)", size);
  1250. return -EINVAL;
  1251. }
  1252. } else {
  1253. err("Set packet size: Invalid bridge type");
  1254. return -EINVAL;
  1255. }
  1256. PDEBUG(3, "%d, alt=%d", size, alt);
  1257. ov->packet_size = size;
  1258. if (size > 0) {
  1259. /* Program ISO FIFO size reg (packet number isn't included) */
  1260. ov518_reg_w32(ov, 0x30, size, 2);
  1261. if (ov->packet_numbering)
  1262. ++ov->packet_size;
  1263. }
  1264. if (usb_set_interface(ov->dev, ov->iface, alt) < 0) {
  1265. err("Set packet size: set interface error");
  1266. return -EBUSY;
  1267. }
  1268. /* Initialize the stream */
  1269. if (reg_w(ov, 0x2f, 0x80) < 0)
  1270. return -EIO;
  1271. if (ov51x_restart(ov) < 0)
  1272. return -EIO;
  1273. if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
  1274. return -EIO;
  1275. return 0;
  1276. }
  1277. /* Upload compression params and quantization tables. Returns 0 for success. */
  1278. static int
  1279. ov511_init_compression(struct usb_ov511 *ov)
  1280. {
  1281. int rc = 0;
  1282. if (!ov->compress_inited) {
  1283. reg_w(ov, 0x70, phy);
  1284. reg_w(ov, 0x71, phuv);
  1285. reg_w(ov, 0x72, pvy);
  1286. reg_w(ov, 0x73, pvuv);
  1287. reg_w(ov, 0x74, qhy);
  1288. reg_w(ov, 0x75, qhuv);
  1289. reg_w(ov, 0x76, qvy);
  1290. reg_w(ov, 0x77, qvuv);
  1291. if (ov511_upload_quan_tables(ov) < 0) {
  1292. err("Error uploading quantization tables");
  1293. rc = -EIO;
  1294. goto out;
  1295. }
  1296. }
  1297. ov->compress_inited = 1;
  1298. out:
  1299. return rc;
  1300. }
  1301. /* Upload compression params and quantization tables. Returns 0 for success. */
  1302. static int
  1303. ov518_init_compression(struct usb_ov511 *ov)
  1304. {
  1305. int rc = 0;
  1306. if (!ov->compress_inited) {
  1307. if (ov518_upload_quan_tables(ov) < 0) {
  1308. err("Error uploading quantization tables");
  1309. rc = -EIO;
  1310. goto out;
  1311. }
  1312. }
  1313. ov->compress_inited = 1;
  1314. out:
  1315. return rc;
  1316. }
  1317. /* -------------------------------------------------------------------------- */
  1318. /* Sets sensor's contrast setting to "val" */
  1319. static int
  1320. sensor_set_contrast(struct usb_ov511 *ov, unsigned short val)
  1321. {
  1322. int rc;
  1323. PDEBUG(3, "%d", val);
  1324. if (ov->stop_during_set)
  1325. if (ov51x_stop(ov) < 0)
  1326. return -EIO;
  1327. switch (ov->sensor) {
  1328. case SEN_OV7610:
  1329. case SEN_OV6620:
  1330. {
  1331. rc = i2c_w(ov, OV7610_REG_CNT, val >> 8);
  1332. if (rc < 0)
  1333. goto out;
  1334. break;
  1335. }
  1336. case SEN_OV6630:
  1337. {
  1338. rc = i2c_w_mask(ov, OV7610_REG_CNT, val >> 12, 0x0f);
  1339. if (rc < 0)
  1340. goto out;
  1341. break;
  1342. }
  1343. case SEN_OV7620:
  1344. {
  1345. unsigned char ctab[] = {
  1346. 0x01, 0x05, 0x09, 0x11, 0x15, 0x35, 0x37, 0x57,
  1347. 0x5b, 0xa5, 0xa7, 0xc7, 0xc9, 0xcf, 0xef, 0xff
  1348. };
  1349. /* Use Y gamma control instead. Bit 0 enables it. */
  1350. rc = i2c_w(ov, 0x64, ctab[val>>12]);
  1351. if (rc < 0)
  1352. goto out;
  1353. break;
  1354. }
  1355. case SEN_SAA7111A:
  1356. {
  1357. rc = i2c_w(ov, 0x0b, val >> 9);
  1358. if (rc < 0)
  1359. goto out;
  1360. break;
  1361. }
  1362. default:
  1363. {
  1364. PDEBUG(3, "Unsupported with this sensor");
  1365. rc = -EPERM;
  1366. goto out;
  1367. }
  1368. }
  1369. rc = 0; /* Success */
  1370. ov->contrast = val;
  1371. out:
  1372. if (ov51x_restart(ov) < 0)
  1373. return -EIO;
  1374. return rc;
  1375. }
  1376. /* Gets sensor's contrast setting */
  1377. static int
  1378. sensor_get_contrast(struct usb_ov511 *ov, unsigned short *val)
  1379. {
  1380. int rc;
  1381. switch (ov->sensor) {
  1382. case SEN_OV7610:
  1383. case SEN_OV6620:
  1384. rc = i2c_r(ov, OV7610_REG_CNT);
  1385. if (rc < 0)
  1386. return rc;
  1387. else
  1388. *val = rc << 8;
  1389. break;
  1390. case SEN_OV6630:
  1391. rc = i2c_r(ov, OV7610_REG_CNT);
  1392. if (rc < 0)
  1393. return rc;
  1394. else
  1395. *val = rc << 12;
  1396. break;
  1397. case SEN_OV7620:
  1398. /* Use Y gamma reg instead. Bit 0 is the enable bit. */
  1399. rc = i2c_r(ov, 0x64);
  1400. if (rc < 0)
  1401. return rc;
  1402. else
  1403. *val = (rc & 0xfe) << 8;
  1404. break;
  1405. case SEN_SAA7111A:
  1406. *val = ov->contrast;
  1407. break;
  1408. default:
  1409. PDEBUG(3, "Unsupported with this sensor");
  1410. return -EPERM;
  1411. }
  1412. PDEBUG(3, "%d", *val);
  1413. ov->contrast = *val;
  1414. return 0;
  1415. }
  1416. /* -------------------------------------------------------------------------- */
  1417. /* Sets sensor's brightness setting to "val" */
  1418. static int
  1419. sensor_set_brightness(struct usb_ov511 *ov, unsigned short val)
  1420. {
  1421. int rc;
  1422. PDEBUG(4, "%d", val);
  1423. if (ov->stop_during_set)
  1424. if (ov51x_stop(ov) < 0)
  1425. return -EIO;
  1426. switch (ov->sensor) {
  1427. case SEN_OV7610:
  1428. case SEN_OV76BE:
  1429. case SEN_OV6620:
  1430. case SEN_OV6630:
  1431. rc = i2c_w(ov, OV7610_REG_BRT, val >> 8);
  1432. if (rc < 0)
  1433. goto out;
  1434. break;
  1435. case SEN_OV7620:
  1436. /* 7620 doesn't like manual changes when in auto mode */
  1437. if (!ov->auto_brt) {
  1438. rc = i2c_w(ov, OV7610_REG_BRT, val >> 8);
  1439. if (rc < 0)
  1440. goto out;
  1441. }
  1442. break;
  1443. case SEN_SAA7111A:
  1444. rc = i2c_w(ov, 0x0a, val >> 8);
  1445. if (rc < 0)
  1446. goto out;
  1447. break;
  1448. default:
  1449. PDEBUG(3, "Unsupported with this sensor");
  1450. rc = -EPERM;
  1451. goto out;
  1452. }
  1453. rc = 0; /* Success */
  1454. ov->brightness = val;
  1455. out:
  1456. if (ov51x_restart(ov) < 0)
  1457. return -EIO;
  1458. return rc;
  1459. }
  1460. /* Gets sensor's brightness setting */
  1461. static int
  1462. sensor_get_brightness(struct usb_ov511 *ov, unsigned short *val)
  1463. {
  1464. int rc;
  1465. switch (ov->sensor) {
  1466. case SEN_OV7610:
  1467. case SEN_OV76BE:
  1468. case SEN_OV7620:
  1469. case SEN_OV6620:
  1470. case SEN_OV6630:
  1471. rc = i2c_r(ov, OV7610_REG_BRT);
  1472. if (rc < 0)
  1473. return rc;
  1474. else
  1475. *val = rc << 8;
  1476. break;
  1477. case SEN_SAA7111A:
  1478. *val = ov->brightness;
  1479. break;
  1480. default:
  1481. PDEBUG(3, "Unsupported with this sensor");
  1482. return -EPERM;
  1483. }
  1484. PDEBUG(3, "%d", *val);
  1485. ov->brightness = *val;
  1486. return 0;
  1487. }
  1488. /* -------------------------------------------------------------------------- */
  1489. /* Sets sensor's saturation (color intensity) setting to "val" */
  1490. static int
  1491. sensor_set_saturation(struct usb_ov511 *ov, unsigned short val)
  1492. {
  1493. int rc;
  1494. PDEBUG(3, "%d", val);
  1495. if (ov->stop_during_set)
  1496. if (ov51x_stop(ov) < 0)
  1497. return -EIO;
  1498. switch (ov->sensor) {
  1499. case SEN_OV7610:
  1500. case SEN_OV76BE:
  1501. case SEN_OV6620:
  1502. case SEN_OV6630:
  1503. rc = i2c_w(ov, OV7610_REG_SAT, val >> 8);
  1504. if (rc < 0)
  1505. goto out;
  1506. break;
  1507. case SEN_OV7620:
  1508. // /* Use UV gamma control instead. Bits 0 & 7 are reserved. */
  1509. // rc = ov_i2c_write(ov->dev, 0x62, (val >> 9) & 0x7e);
  1510. // if (rc < 0)
  1511. // goto out;
  1512. rc = i2c_w(ov, OV7610_REG_SAT, val >> 8);
  1513. if (rc < 0)
  1514. goto out;
  1515. break;
  1516. case SEN_SAA7111A:
  1517. rc = i2c_w(ov, 0x0c, val >> 9);
  1518. if (rc < 0)
  1519. goto out;
  1520. break;
  1521. default:
  1522. PDEBUG(3, "Unsupported with this sensor");
  1523. rc = -EPERM;
  1524. goto out;
  1525. }
  1526. rc = 0; /* Success */
  1527. ov->colour = val;
  1528. out:
  1529. if (ov51x_restart(ov) < 0)
  1530. return -EIO;
  1531. return rc;
  1532. }
  1533. /* Gets sensor's saturation (color intensity) setting */
  1534. static int
  1535. sensor_get_saturation(struct usb_ov511 *ov, unsigned short *val)
  1536. {
  1537. int rc;
  1538. switch (ov->sensor) {
  1539. case SEN_OV7610:
  1540. case SEN_OV76BE:
  1541. case SEN_OV6620:
  1542. case SEN_OV6630:
  1543. rc = i2c_r(ov, OV7610_REG_SAT);
  1544. if (rc < 0)
  1545. return rc;
  1546. else
  1547. *val = rc << 8;
  1548. break;
  1549. case SEN_OV7620:
  1550. // /* Use UV gamma reg instead. Bits 0 & 7 are reserved. */
  1551. // rc = i2c_r(ov, 0x62);
  1552. // if (rc < 0)
  1553. // return rc;
  1554. // else
  1555. // *val = (rc & 0x7e) << 9;
  1556. rc = i2c_r(ov, OV7610_REG_SAT);
  1557. if (rc < 0)
  1558. return rc;
  1559. else
  1560. *val = rc << 8;
  1561. break;
  1562. case SEN_SAA7111A:
  1563. *val = ov->colour;
  1564. break;
  1565. default:
  1566. PDEBUG(3, "Unsupported with this sensor");
  1567. return -EPERM;
  1568. }
  1569. PDEBUG(3, "%d", *val);
  1570. ov->colour = *val;
  1571. return 0;
  1572. }
  1573. /* -------------------------------------------------------------------------- */
  1574. /* Sets sensor's hue (red/blue balance) setting to "val" */
  1575. static int
  1576. sensor_set_hue(struct usb_ov511 *ov, unsigned short val)
  1577. {
  1578. int rc;
  1579. PDEBUG(3, "%d", val);
  1580. if (ov->stop_during_set)
  1581. if (ov51x_stop(ov) < 0)
  1582. return -EIO;
  1583. switch (ov->sensor) {
  1584. case SEN_OV7610:
  1585. case SEN_OV6620:
  1586. case SEN_OV6630:
  1587. rc = i2c_w(ov, OV7610_REG_RED, 0xFF - (val >> 8));
  1588. if (rc < 0)
  1589. goto out;
  1590. rc = i2c_w(ov, OV7610_REG_BLUE, val >> 8);
  1591. if (rc < 0)
  1592. goto out;
  1593. break;
  1594. case SEN_OV7620:
  1595. // Hue control is causing problems. I will enable it once it's fixed.
  1596. #if 0
  1597. rc = i2c_w(ov, 0x7a, (unsigned char)(val >> 8) + 0xb);
  1598. if (rc < 0)
  1599. goto out;
  1600. rc = i2c_w(ov, 0x79, (unsigned char)(val >> 8) + 0xb);
  1601. if (rc < 0)
  1602. goto out;
  1603. #endif
  1604. break;
  1605. case SEN_SAA7111A:
  1606. rc = i2c_w(ov, 0x0d, (val + 32768) >> 8);
  1607. if (rc < 0)
  1608. goto out;
  1609. break;
  1610. default:
  1611. PDEBUG(3, "Unsupported with this sensor");
  1612. rc = -EPERM;
  1613. goto out;
  1614. }
  1615. rc = 0; /* Success */
  1616. ov->hue = val;
  1617. out:
  1618. if (ov51x_restart(ov) < 0)
  1619. return -EIO;
  1620. return rc;
  1621. }
  1622. /* Gets sensor's hue (red/blue balance) setting */
  1623. static int
  1624. sensor_get_hue(struct usb_ov511 *ov, unsigned short *val)
  1625. {
  1626. int rc;
  1627. switch (ov->sensor) {
  1628. case SEN_OV7610:
  1629. case SEN_OV6620:
  1630. case SEN_OV6630:
  1631. rc = i2c_r(ov, OV7610_REG_BLUE);
  1632. if (rc < 0)
  1633. return rc;
  1634. else
  1635. *val = rc << 8;
  1636. break;
  1637. case SEN_OV7620:
  1638. rc = i2c_r(ov, 0x7a);
  1639. if (rc < 0)
  1640. return rc;
  1641. else
  1642. *val = rc << 8;
  1643. break;
  1644. case SEN_SAA7111A:
  1645. *val = ov->hue;
  1646. break;
  1647. default:
  1648. PDEBUG(3, "Unsupported with this sensor");
  1649. return -EPERM;
  1650. }
  1651. PDEBUG(3, "%d", *val);
  1652. ov->hue = *val;
  1653. return 0;
  1654. }
  1655. /* -------------------------------------------------------------------------- */
  1656. static inline int
  1657. sensor_set_picture(struct usb_ov511 *ov, struct video_picture *p)
  1658. {
  1659. int rc;
  1660. PDEBUG(4, "sensor_set_picture");
  1661. ov->whiteness = p->whiteness;
  1662. /* Don't return error if a setting is unsupported, or rest of settings
  1663.          * will not be performed */
  1664. rc = sensor_set_contrast(ov, p->contrast);
  1665. if (FATAL_ERROR(rc))
  1666. return rc;
  1667. rc = sensor_set_brightness(ov, p->brightness);
  1668. if (FATAL_ERROR(rc))
  1669. return rc;
  1670. rc = sensor_set_saturation(ov, p->colour);
  1671. if (FATAL_ERROR(rc))
  1672. return rc;
  1673. rc = sensor_set_hue(ov, p->hue);
  1674. if (FATAL_ERROR(rc))
  1675. return rc;
  1676. return 0;
  1677. }
  1678. static inline int
  1679. sensor_get_picture(struct usb_ov511 *ov, struct video_picture *p)
  1680. {
  1681. int rc;
  1682. PDEBUG(4, "sensor_get_picture");
  1683. /* Don't return error if a setting is unsupported, or rest of settings
  1684.          * will not be performed */
  1685. rc = sensor_get_contrast(ov, &(p->contrast));
  1686. if (FATAL_ERROR(rc))
  1687. return rc;
  1688. rc = sensor_get_brightness(ov, &(p->brightness));
  1689. if (FATAL_ERROR(rc))
  1690. return rc;
  1691. rc = sensor_get_saturation(ov, &(p->colour));
  1692. if (FATAL_ERROR(rc))
  1693. return rc;
  1694. rc = sensor_get_hue(ov, &(p->hue));
  1695. if (FATAL_ERROR(rc))
  1696. return rc;
  1697. p->whiteness = 105 << 8;
  1698. /* Can we get these from frame[0]? -claudio? */
  1699. p->depth = ov->frame[0].depth;
  1700. p->palette = ov->frame[0].format;
  1701. return 0;
  1702. }
  1703. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  1704. // FIXME: Exposure range is only 0x00-0x7f in interlace mode
  1705. /* Sets current exposure for sensor. This only has an effect if auto-exposure
  1706.  * is off */
  1707. static inline int
  1708. sensor_set_exposure(struct usb_ov511 *ov, unsigned char val)
  1709. {
  1710. int rc;
  1711. PDEBUG(3, "%d", val);
  1712. if (ov->stop_during_set)
  1713. if (ov51x_stop(ov) < 0)
  1714. return -EIO;
  1715. switch (ov->sensor) {
  1716. case SEN_OV6620:
  1717. case SEN_OV6630:
  1718. case SEN_OV7610:
  1719. case SEN_OV7620:
  1720. case SEN_OV76BE:
  1721. case SEN_OV8600:
  1722. rc = i2c_w(ov, 0x10, val);
  1723. if (rc < 0)
  1724. goto out;
  1725. break;
  1726. case SEN_KS0127:
  1727. case SEN_KS0127B:
  1728. case SEN_SAA7111A:
  1729. PDEBUG(3, "Unsupported with this sensor");
  1730. return -EPERM;
  1731. default:
  1732. err("Sensor not supported for set_exposure");
  1733. return -EINVAL;
  1734. }
  1735. rc = 0; /* Success */
  1736. ov->exposure = val;
  1737. out:
  1738. if (ov51x_restart(ov) < 0)
  1739. return -EIO;
  1740. return rc;
  1741. }
  1742. /* Gets current exposure level from sensor, regardless of whether it is under
  1743.  * manual control. */
  1744. static int
  1745. sensor_get_exposure(struct usb_ov511 *ov, unsigned char *val)
  1746. {
  1747. int rc;
  1748. switch (ov->sensor) {
  1749. case SEN_OV7610:
  1750. case SEN_OV6620:
  1751. case SEN_OV6630:
  1752. case SEN_OV7620:
  1753. case SEN_OV76BE:
  1754. case SEN_OV8600:
  1755. rc = i2c_r(ov, 0x10);
  1756. if (rc < 0)
  1757. return rc;
  1758. else
  1759. *val = rc;
  1760. break;
  1761. case SEN_KS0127:
  1762. case SEN_KS0127B:
  1763. case SEN_SAA7111A:
  1764. val = 0;
  1765. PDEBUG(3, "Unsupported with this sensor");
  1766. return -EPERM;
  1767. default:
  1768. err("Sensor not supported for get_exposure");
  1769. return -EINVAL;
  1770. }
  1771. PDEBUG(3, "%d", *val);
  1772. ov->exposure = *val;
  1773. return 0;
  1774. }
  1775. #endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS */
  1776. /* Turns on or off the LED. Only has an effect with OV511+/OV518(+) */
  1777. static inline void
  1778. ov51x_led_control(struct usb_ov511 *ov, int enable)
  1779. {
  1780. PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
  1781. if (ov->bridge == BRG_OV511PLUS)
  1782. reg_w(ov, R511_SYS_LED_CTL, enable ? 1 : 0);
  1783. else if (ov->bclass == BCL_OV518)
  1784. reg_w_mask(ov, R518_GPIO_OUT, enable ? 0x02 : 0x00, 0x02);
  1785. return;
  1786. }
  1787. /* Matches the sensor's internal frame rate to the lighting frequency.
  1788.  * Valid frequencies are:
  1789.  * 50 - 50Hz, for European and Asian lighting
  1790.  * 60 - 60Hz, for American lighting
  1791.  *
  1792.  * Tested with: OV7610, OV7620, OV76BE, OV6620
  1793.  * Unsupported: KS0127, KS0127B, SAA7111A
  1794.  * Returns: 0 for success
  1795.  */
  1796. static int
  1797. sensor_set_light_freq(struct usb_ov511 *ov, int freq)
  1798. {
  1799. int sixty;
  1800. PDEBUG(4, "%d Hz", freq);
  1801. if (freq == 60)
  1802. sixty = 1;
  1803. else if (freq == 50)
  1804. sixty = 0;
  1805. else {
  1806. err("Invalid light freq (%d Hz)", freq);
  1807. return -EINVAL;
  1808. }
  1809. switch (ov->sensor) {
  1810. case SEN_OV7610:
  1811. i2c_w_mask(ov, 0x2a, sixty?0x00:0x80, 0x80);
  1812. i2c_w(ov, 0x2b, sixty?0x00:0xac);
  1813. i2c_w_mask(ov, 0x13, 0x10, 0x10);
  1814. i2c_w_mask(ov, 0x13, 0x00, 0x10);
  1815. break;
  1816. case SEN_OV7620:
  1817. case SEN_OV76BE:
  1818. case SEN_OV8600:
  1819. i2c_w_mask(ov, 0x2a, sixty?0x00:0x80, 0x80);
  1820. i2c_w(ov, 0x2b, sixty?0x00:0xac);
  1821. i2c_w_mask(ov, 0x76, 0x01, 0x01);
  1822. break;
  1823. case SEN_OV6620:
  1824. case SEN_OV6630:
  1825. i2c_w(ov, 0x2b, sixty?0xa8:0x28);
  1826. i2c_w(ov, 0x2a, sixty?0x84:0xa4);
  1827. break;
  1828. case SEN_KS0127:
  1829. case SEN_KS0127B:
  1830. case SEN_SAA7111A:
  1831. PDEBUG(5, "Unsupported with this sensor");
  1832. return -EPERM;
  1833. default:
  1834. err("Sensor not supported for set_light_freq");
  1835. return -EINVAL;
  1836. }
  1837. ov->lightfreq = freq;
  1838. return 0;
  1839. }
  1840. /* If enable is true, turn on the sensor's banding filter, otherwise turn it
  1841.  * off. This filter tries to reduce the pattern of horizontal light/dark bands
  1842.  * caused by some (usually fluorescent) lighting. The light frequency must be
  1843.  * set either before or after enabling it with ov51x_set_light_freq().
  1844.  *
  1845.  * Tested with: OV7610, OV7620, OV76BE, OV6620.
  1846.  * Unsupported: KS0127, KS0127B, SAA7111A
  1847.  * Returns: 0 for success
  1848.  */
  1849. static inline int
  1850. sensor_set_banding_filter(struct usb_ov511 *ov, int enable)
  1851. {
  1852. int rc;
  1853. PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
  1854. if (ov->sensor == SEN_KS0127 || ov->sensor == SEN_KS0127B
  1855. || ov->sensor == SEN_SAA7111A) {
  1856. PDEBUG(5, "Unsupported with this sensor");
  1857. return -EPERM;
  1858. }
  1859. rc = i2c_w_mask(ov, 0x2d, enable?0x04:0x00, 0x04);
  1860. if (rc < 0)
  1861. return rc;
  1862. ov->bandfilt = enable;
  1863. return 0;
  1864. }
  1865. /* If enable is true, turn on the sensor's auto brightness control, otherwise
  1866.  * turn it off.
  1867.  *
  1868.  * Unsupported: KS0127, KS0127B, SAA7111A
  1869.  * Returns: 0 for success
  1870.  */
  1871. static inline int
  1872. sensor_set_auto_brightness(struct usb_ov511 *ov, int enable)
  1873. {
  1874. int rc;
  1875. PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
  1876. if (ov->sensor == SEN_KS0127 || ov->sensor == SEN_KS0127B
  1877. || ov->sensor == SEN_SAA7111A) {
  1878. PDEBUG(5, "Unsupported with this sensor");
  1879. return -EPERM;
  1880. }
  1881. rc = i2c_w_mask(ov, 0x2d, enable?0x10:0x00, 0x10);
  1882. if (rc < 0)
  1883. return rc;
  1884. ov->auto_brt = enable;
  1885. return 0;
  1886. }
  1887. /* If enable is true, turn on the sensor's auto exposure control, otherwise
  1888.  * turn it off.
  1889.  *
  1890.  * Unsupported: KS0127, KS0127B, SAA7111A
  1891.  * Returns: 0 for success
  1892.  */
  1893. static inline int
  1894. sensor_set_auto_exposure(struct usb_ov511 *ov, int enable)
  1895. {
  1896. PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
  1897. switch (ov->sensor) {
  1898. case SEN_OV7610:
  1899. i2c_w_mask(ov, 0x29, enable?0x00:0x80, 0x80);
  1900. break;
  1901. case SEN_OV6620:
  1902. case SEN_OV7620:
  1903. case SEN_OV76BE:
  1904. case SEN_OV8600:
  1905. i2c_w_mask(ov, 0x13, enable?0x01:0x00, 0x01);
  1906. break;
  1907. case SEN_OV6630:
  1908. i2c_w_mask(ov, 0x28, enable?0x00:0x10, 0x10);
  1909. break;
  1910. case SEN_KS0127:
  1911. case SEN_KS0127B:
  1912. case SEN_SAA7111A:
  1913. PDEBUG(5, "Unsupported with this sensor");
  1914. return -EPERM;
  1915. default:
  1916. err("Sensor not supported for set_auto_exposure");
  1917. return -EINVAL;
  1918. }
  1919. ov->auto_exp = enable;
  1920. return 0;
  1921. }
  1922. /* Modifies the sensor's exposure algorithm to allow proper exposure of objects
  1923.  * that are illuminated from behind.
  1924.  *
  1925.  * Tested with: OV6620, OV7620
  1926.  * Unsupported: OV7610, OV76BE, KS0127, KS0127B, SAA7111A
  1927.  * Returns: 0 for success
  1928.  */
  1929. static int
  1930. sensor_set_backlight(struct usb_ov511 *ov, int enable)
  1931. {
  1932. PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
  1933. switch (ov->sensor) {
  1934. case SEN_OV7620:
  1935. case SEN_OV8600:
  1936. i2c_w_mask(ov, 0x68, enable?0xe0:0xc0, 0xe0);
  1937. i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
  1938. i2c_w_mask(ov, 0x28, enable?0x02:0x00, 0x02);
  1939. break;
  1940. case SEN_OV6620:
  1941. i2c_w_mask(ov, 0x4e, enable?0xe0:0xc0, 0xe0);
  1942. i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
  1943. i2c_w_mask(ov, 0x0e, enable?0x80:0x00, 0x80);
  1944. break;
  1945. case SEN_OV6630:
  1946. i2c_w_mask(ov, 0x4e, enable?0x80:0x60, 0xe0);
  1947. i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
  1948. i2c_w_mask(ov, 0x28, enable?0x02:0x00, 0x02);
  1949. break;
  1950. case SEN_OV7610:
  1951. case SEN_OV76BE:
  1952. case SEN_KS0127:
  1953. case SEN_KS0127B:
  1954. case SEN_SAA7111A:
  1955. PDEBUG(5, "Unsupported with this sensor");
  1956. return -EPERM;
  1957. default:
  1958. err("Sensor not supported for set_backlight");
  1959. return -EINVAL;
  1960. }
  1961. ov->backlight = enable;
  1962. return 0;
  1963. }
  1964. static inline int
  1965. sensor_set_mirror(struct usb_ov511 *ov, int enable)
  1966. {
  1967. PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
  1968. switch (ov->sensor) {
  1969. case SEN_OV6620:
  1970. case SEN_OV6630:
  1971. case SEN_OV7610:
  1972. case SEN_OV7620:
  1973. case SEN_OV76BE:
  1974. case SEN_OV8600:
  1975. i2c_w_mask(ov, 0x12, enable?0x40:0x00, 0x40);
  1976. break;
  1977. case SEN_KS0127:
  1978. case SEN_KS0127B:
  1979. case SEN_SAA7111A:
  1980. PDEBUG(5, "Unsupported with this sensor");
  1981. return -EPERM;
  1982. default:
  1983. err("Sensor not supported for set_mirror");
  1984. return -EINVAL;
  1985. }
  1986. ov->mirror = enable;
  1987. return 0;
  1988. }
  1989. /* Returns number of bits per pixel (regardless of where they are located;
  1990.  * planar or not), or zero for unsupported format.
  1991.  */
  1992. static inline int
  1993. get_depth(int palette)
  1994. {
  1995. switch (palette) {
  1996. case VIDEO_PALETTE_GREY:    return 8;
  1997. case VIDEO_PALETTE_YUV420:  return 12;
  1998. case VIDEO_PALETTE_YUV420P: return 12; /* Planar */
  1999. case VIDEO_PALETTE_RGB565:  return 16;
  2000. case VIDEO_PALETTE_RGB24:   return 24;
  2001. case VIDEO_PALETTE_YUV422:  return 16;
  2002. case VIDEO_PALETTE_YUYV:    return 16;
  2003. case VIDEO_PALETTE_YUV422P: return 16; /* Planar */
  2004. default:     return 0;  /* Invalid format */
  2005. }
  2006. }
  2007. /* Bytes per frame. Used by read(). Return of 0 indicates error */
  2008. static inline long int
  2009. get_frame_length(struct ov511_frame *frame)
  2010. {
  2011. if (!frame)
  2012. return 0;
  2013. else
  2014. return ((frame->width * frame->height
  2015.  * get_depth(frame->format)) >> 3);
  2016. }
  2017. static int
  2018. mode_init_ov_sensor_regs(struct usb_ov511 *ov, int width, int height,
  2019.  int mode, int sub_flag, int qvga)
  2020. {
  2021. int clock;
  2022. /******** Mode (VGA/QVGA) and sensor specific regs ********/
  2023. switch (ov->sensor) {
  2024. case SEN_OV7610:
  2025. i2c_w(ov, 0x14, qvga?0x24:0x04);
  2026. // FIXME: Does this improve the image quality or frame rate?
  2027. #if 0
  2028. i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
  2029. i2c_w(ov, 0x24, 0x10);
  2030. i2c_w(ov, 0x25, qvga?0x40:0x8a);
  2031. i2c_w(ov, 0x2f, qvga?0x30:0xb0);
  2032. i2c_w(ov, 0x35, qvga?0x1c:0x9c);
  2033. #endif
  2034. break;
  2035. case SEN_OV7620:
  2036. // i2c_w(ov, 0x2b, 0x00);
  2037. i2c_w(ov, 0x14, qvga?0xa4:0x84);
  2038. i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
  2039. i2c_w(ov, 0x24, qvga?0x20:0x3a);
  2040. i2c_w(ov, 0x25, qvga?0x30:0x60);
  2041. i2c_w_mask(ov, 0x2d, qvga?0x40:0x00, 0x40);
  2042. i2c_w_mask(ov, 0x67, qvga?0xf0:0x90, 0xf0);
  2043. i2c_w_mask(ov, 0x74, qvga?0x20:0x00, 0x20);
  2044. break;
  2045. case SEN_OV76BE:
  2046. // i2c_w(ov, 0x2b, 0x00);
  2047. i2c_w(ov, 0x14, qvga?0xa4:0x84);
  2048. // FIXME: Enable this once 7620AE uses 7620 initial settings
  2049. #if 0
  2050. i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
  2051. i2c_w(ov, 0x24, qvga?0x20:0x3a);
  2052. i2c_w(ov, 0x25, qvga?0x30:0x60);
  2053. i2c_w_mask(ov, 0x2d, qvga?0x40:0x00, 0x40);
  2054. i2c_w_mask(ov, 0x67, qvga?0xb0:0x90, 0xf0);
  2055. i2c_w_mask(ov, 0x74, qvga?0x20:0x00, 0x20);
  2056. #endif
  2057. break;
  2058. case SEN_OV6620:
  2059. case SEN_OV6630:
  2060. i2c_w(ov, 0x14, qvga?0x24:0x04);
  2061. /* No special settings yet */
  2062. break;
  2063. default:
  2064. err("Invalid sensor");
  2065. return -EINVAL;
  2066. }
  2067. /******** Palette-specific regs ********/
  2068. if (mode == VIDEO_PALETTE_GREY) {
  2069. if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV76BE) {
  2070. /* these aren't valid on the OV6620/OV7620/6630? */
  2071. i2c_w_mask(ov, 0x0e, 0x40, 0x40);
  2072. }
  2073. i2c_w_mask(ov, 0x13, 0x20, 0x20);
  2074. } else {
  2075. if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV76BE) {
  2076. /* not valid on the OV6620/OV7620/6630? */
  2077. i2c_w_mask(ov, 0x0e, 0x00, 0x40);
  2078. }
  2079. i2c_w_mask(ov, 0x13, 0x00, 0x20);
  2080. }
  2081. /******** Clock programming ********/
  2082. // FIXME: Test this with OV6630
  2083. /* The OV6620 needs special handling. This prevents the 
  2084.  * severe banding that normally occurs */
  2085. if (ov->sensor == SEN_OV6620 || ov->sensor == SEN_OV6630)
  2086. {
  2087. /* Clock down */
  2088. i2c_w(ov, 0x2a, 0x04);
  2089. if (ov->compress) {
  2090. // clock = 0;    /* This ensures the highest frame rate */
  2091. clock = 3;
  2092. } else if (clockdiv == -1) {   /* If user didn't override it */
  2093. clock = 3;    /* Gives better exposure time */
  2094. } else {
  2095. clock = clockdiv;
  2096. }
  2097. PDEBUG(4, "Setting clock divisor to %d", clock);
  2098. i2c_w(ov, 0x11, clock);
  2099. i2c_w(ov, 0x2a, 0x84);
  2100. /* This next setting is critical. It seems to improve
  2101.  * the gain or the contrast. The "reserved" bits seem
  2102.  * to have some effect in this case. */
  2103. i2c_w(ov, 0x2d, 0x85);
  2104. }
  2105. else
  2106. {
  2107. if (ov->compress) {
  2108. clock = 1;    /* This ensures the highest frame rate */
  2109. } else if (clockdiv == -1) {   /* If user didn't override it */
  2110. /* Calculate and set the clock divisor */
  2111. clock = ((sub_flag ? ov->subw * ov->subh
  2112.   : width * height)
  2113.  * (mode == VIDEO_PALETTE_GREY ? 2 : 3) / 2)
  2114.  / 66000;
  2115. } else {
  2116. clock = clockdiv;
  2117. }
  2118. PDEBUG(4, "Setting clock divisor to %d", clock);
  2119. i2c_w(ov, 0x11, clock);
  2120. }
  2121. /******** Special Features ********/
  2122. if (framedrop >= 0)
  2123. i2c_w(ov, 0x16, framedrop);
  2124. if (sensor_gbr)
  2125. i2c_w_mask(ov, 0x12, 0x08, 0x08);
  2126. else
  2127. i2c_w_mask(ov, 0x12, 0x00, 0x08);
  2128. /* Test Pattern */
  2129. i2c_w_mask(ov, 0x12, (testpat?0x02:0x00), 0x02);
  2130. /* Auto white balance */
  2131. // if (awb)
  2132. i2c_w_mask(ov, 0x12, 0x04, 0x04);
  2133. // else
  2134. // i2c_w_mask(ov, 0x12, 0x00, 0x04);
  2135. // This will go away as soon as ov51x_mode_init_sensor_regs()
  2136. // is fully tested.
  2137. /* 7620/6620/6630? don't have register 0x35, so play it safe */
  2138. if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV76BE) {
  2139. if (width == 640 && height == 480)
  2140. i2c_w(ov, 0x35, 0x9e);
  2141. else
  2142. i2c_w(ov, 0x35, 0x1e);
  2143. }
  2144. return 0;
  2145. }
  2146. static int
  2147. set_ov_sensor_window(struct usb_ov511 *ov, int width, int height, int mode,
  2148.      int sub_flag)
  2149. {
  2150. int ret;
  2151. int hwsbase, hwebase, vwsbase, vwebase, hwsize, vwsize; 
  2152. int hoffset, voffset, hwscale = 0, vwscale = 0;
  2153. /* The different sensor ICs handle setting up of window differently.
  2154.  * IF YOU SET IT WRONG, YOU WILL GET ALL ZERO ISOC DATA FROM OV51x!!! */
  2155. switch (ov->sensor) {
  2156. case SEN_OV7610:
  2157. case SEN_OV76BE:
  2158. hwsbase = 0x38;
  2159. hwebase = 0x3a;
  2160. vwsbase = vwebase = 0x05;
  2161. break;
  2162. case SEN_OV6620:
  2163. case SEN_OV6630:
  2164. hwsbase = 0x38;
  2165. hwebase = 0x3a;
  2166. vwsbase = 0x05;
  2167. vwebase = 0x06;
  2168. break;
  2169. case SEN_OV7620:
  2170. hwsbase = 0x2f; /* From 7620.SET (spec is wrong) */
  2171. hwebase = 0x2f;
  2172. vwsbase = vwebase = 0x05;
  2173. break;
  2174. default:
  2175. err("Invalid sensor");
  2176. return -EINVAL;
  2177. }
  2178. if (ov->sensor == SEN_OV6620 || ov->sensor == SEN_OV6630) {
  2179. /* Note: OV518(+) does downsample on its own) */
  2180. if ((width > 176 && height > 144)
  2181.     || ov->bclass == BCL_OV518) {  /* CIF */
  2182. ret = mode_init_ov_sensor_regs(ov, width, height,
  2183. mode, sub_flag, 0);
  2184. if (ret < 0)
  2185. return ret;
  2186. hwscale = 1;
  2187. vwscale = 1;  /* The datasheet says 0; it's wrong */
  2188. hwsize = 352;
  2189. vwsize = 288;
  2190. } else if (width > 176 || height > 144) {
  2191. err("Illegal dimensions");
  2192. return -EINVAL;
  2193. } else {     /* QCIF */
  2194. ret = mode_init_ov_sensor_regs(ov, width, height,
  2195. mode, sub_flag, 1);
  2196. if (ret < 0)
  2197. return ret;
  2198. hwsize = 176;
  2199. vwsize = 144;
  2200. }
  2201. } else {
  2202. if (width > 320 && height > 240) {  /* VGA */
  2203. ret = mode_init_ov_sensor_regs(ov, width, height,
  2204. mode, sub_flag, 0);
  2205. if (ret < 0)
  2206. return ret;
  2207. hwscale = 2;
  2208. vwscale = 1;
  2209. hwsize = 640;
  2210. vwsize = 480;
  2211. } else if (width > 320 || height > 240) {
  2212. err("Illegal dimensions");
  2213. return -EINVAL;
  2214. } else {     /* QVGA */
  2215. ret = mode_init_ov_sensor_regs(ov, width, height,
  2216. mode, sub_flag, 1);
  2217. if (ret < 0)
  2218. return ret;
  2219. hwscale = 1;
  2220. hwsize = 320;
  2221. vwsize = 240;
  2222. }
  2223. }
  2224. /* Center the window */
  2225. hoffset = ((hwsize - width) / 2) >> hwscale;
  2226. voffset = ((vwsize - height) / 2) >> vwscale;
  2227. /* FIXME! - This needs to be changed to support 160x120 and 6620!!! */
  2228. if (sub_flag) {
  2229. i2c_w(ov, 0x17, hwsbase+(ov->subx>>hwscale));
  2230. i2c_w(ov, 0x18, hwebase+((ov->subx+ov->subw)>>hwscale));
  2231. i2c_w(ov, 0x19, vwsbase+(ov->suby>>vwscale));
  2232. i2c_w(ov, 0x1a, vwebase+((ov->suby+ov->subh)>>vwscale));
  2233. } else {
  2234. i2c_w(ov, 0x17, hwsbase + hoffset);
  2235. i2c_w(ov, 0x18, hwebase + hoffset + (hwsize>>hwscale));
  2236. i2c_w(ov, 0x19, vwsbase + voffset);
  2237. i2c_w(ov, 0x1a, vwebase + voffset + (vwsize>>vwscale));
  2238. }
  2239. #ifdef OV511_DEBUG
  2240. if (dump_sensor)
  2241. dump_i2c_regs(ov);
  2242. #endif
  2243. return 0;
  2244. }
  2245. /* Set up the OV511/OV511+ with the given image parameters.
  2246.  *
  2247.  * Do not put any sensor-specific code in here (including I2C I/O functions)
  2248.  */
  2249. static int
  2250. ov511_mode_init_regs(struct usb_ov511 *ov,
  2251.      int width, int height, int mode, int sub_flag)
  2252. {
  2253. int hsegs, vsegs;
  2254. if (sub_flag) {
  2255. width = ov->subw;
  2256. height = ov->subh;
  2257. }
  2258. PDEBUG(3, "width:%d, height:%d, mode:%d, sub:%d",
  2259.        width, height, mode, sub_flag);
  2260. // FIXME: This should be moved to a 7111a-specific function once
  2261. // subcapture is dealt with properly
  2262. if (ov->sensor == SEN_SAA7111A) {
  2263. if (width == 320 && height == 240) {
  2264. /* No need to do anything special */
  2265. } else if (width == 640 && height == 480) {
  2266. /* Set the OV511 up as 320x480, but keep the
  2267.  * V4L resolution as 640x480 */
  2268. width = 320;
  2269. } else {
  2270. err("SAA7111A only allows 320x240 or 640x480");
  2271. return -EINVAL;
  2272. }
  2273. }
  2274. /* Make sure width and height are a multiple of 8 */
  2275. if (width % 8 || height % 8) {
  2276. err("Invalid size (%d, %d) (mode = %d)", width, height, mode);
  2277. return -EINVAL;
  2278. }
  2279. if (width < ov->minwidth || height < ov->minheight) {
  2280. err("Requested dimensions are too small");
  2281. return -EINVAL;
  2282. }
  2283. if (ov51x_stop(ov) < 0)
  2284. return -EIO;
  2285. if (mode == VIDEO_PALETTE_GREY) {
  2286. reg_w(ov, R511_CAM_UV_EN, 0x00);
  2287. reg_w(ov, R511_SNAP_UV_EN, 0x00);
  2288. reg_w(ov, R511_SNAP_OPTS, 0x01);
  2289. } else {
  2290. reg_w(ov, R511_CAM_UV_EN, 0x01);
  2291. reg_w(ov, R511_SNAP_UV_EN, 0x01);
  2292. reg_w(ov, R511_SNAP_OPTS, 0x03);
  2293. }
  2294. /* Here I'm assuming that snapshot size == image size.
  2295.  * I hope that's always true. --claudio
  2296.  */
  2297. hsegs = (width >> 3) - 1;
  2298. vsegs = (height >> 3) - 1;
  2299. reg_w(ov, R511_CAM_PXCNT, hsegs);
  2300. reg_w(ov, R511_CAM_LNCNT, vsegs);
  2301. reg_w(ov, R511_CAM_PXDIV, 0x00);
  2302. reg_w(ov, R511_CAM_LNDIV, 0x00);
  2303. /* YUV420, low pass filer on */
  2304. reg_w(ov, R511_CAM_OPTS, 0x03);
  2305. /* Snapshot additions */
  2306. reg_w(ov, R511_SNAP_PXCNT, hsegs);
  2307. reg_w(ov, R511_SNAP_LNCNT, vsegs);
  2308. reg_w(ov, R511_SNAP_PXDIV, 0x00);
  2309. reg_w(ov, R511_SNAP_LNDIV, 0x00);
  2310. if (ov->compress) {
  2311. /* Enable Y and UV quantization and compression */
  2312. reg_w(ov, R511_COMP_EN, 0x07);
  2313. reg_w(ov, R511_COMP_LUT_EN, 0x03);
  2314. ov51x_reset(ov, OV511_RESET_OMNICE);
  2315. }
  2316. if (ov51x_restart(ov) < 0)
  2317. return -EIO;
  2318. return 0;
  2319. }
  2320. /* Sets up the OV518/OV518+ with the given image parameters
  2321.  *
  2322.  * OV518 needs a completely different approach, until we can figure out what
  2323.  * the individual registers do. Also, only 15 FPS is supported now.
  2324.  *
  2325.  * Do not put any sensor-specific code in here (including I2C I/O functions)
  2326.  */
  2327. static int
  2328. ov518_mode_init_regs(struct usb_ov511 *ov,
  2329.      int width, int height, int mode, int sub_flag)
  2330. {
  2331. int hsegs, vsegs, hi_res;
  2332. if (sub_flag) {
  2333. width = ov->subw;
  2334. height = ov->subh;
  2335. }
  2336. PDEBUG(3, "width:%d, height:%d, mode:%d, sub:%d",
  2337.        width, height, mode, sub_flag);
  2338. if (width % 16 || height % 8) {
  2339. err("Invalid size (%d, %d)", width, height);
  2340. return -EINVAL;
  2341. }
  2342. if (width < ov->minwidth || height < ov->minheight) {
  2343. err("Requested dimensions are too small");
  2344. return -EINVAL;
  2345. }
  2346. if (width >= 320 && height >= 240) {
  2347. hi_res = 1;
  2348. } else if (width >= 320 || height >= 240) {
  2349. err("Invalid width/height combination (%d, %d)", width, height);
  2350. return -EINVAL;
  2351. } else {
  2352. hi_res = 0;
  2353. }
  2354. if (ov51x_stop(ov) < 0)
  2355. return -EIO;
  2356. /******** Set the mode ********/
  2357. reg_w(ov, 0x2b, 0);
  2358. reg_w(ov, 0x2c, 0);
  2359. reg_w(ov, 0x2d, 0);
  2360. reg_w(ov, 0x2e, 0);
  2361. reg_w(ov, 0x3b, 0);
  2362. reg_w(ov, 0x3c, 0);
  2363. reg_w(ov, 0x3d, 0);
  2364. reg_w(ov, 0x3e, 0);
  2365. reg_w(ov, 0x28, (mode == VIDEO_PALETTE_GREY) ? 0x00:0x80);
  2366. reg_w(ov, 0x38, (mode == VIDEO_PALETTE_GREY) ? 0x00:0x80);
  2367. hsegs = width / 16;
  2368. vsegs = height / 4;
  2369. reg_w(ov, 0x29, hsegs);
  2370. reg_w(ov, 0x2a, vsegs);
  2371. reg_w(ov, 0x39, hsegs);
  2372. reg_w(ov, 0x3a, vsegs);
  2373. /* Windows driver does this here; who knows why */
  2374. reg_w(ov, 0x2f, 0x80);
  2375. /******** Set the framerate (to 15 FPS) ********/
  2376. /* Mode independent, but framerate dependent, regs */
  2377. reg_w(ov, 0x51, 0x02); /* Clock divider; lower==faster */
  2378. reg_w(ov, 0x22, 0x18);
  2379. reg_w(ov, 0x23, 0xff);
  2380. if (ov->bridge == BRG_OV518PLUS)
  2381. reg_w(ov, 0x21, 0x19);
  2382. else
  2383. reg_w(ov, 0x71, 0x19); /* Compression-related? */
  2384. // FIXME: Sensor-specific
  2385. /* Bit 5 is what matters here. Of course, it is "reserved" */
  2386. i2c_w(ov, 0x54, 0x23);
  2387. reg_w(ov, 0x2f, 0x80);
  2388. if (ov->bridge == BRG_OV518PLUS) {
  2389. reg_w(ov, 0x24, 0x94);
  2390. reg_w(ov, 0x25, 0x90);
  2391. ov518_reg_w32(ov, 0xc4,    400, 2); /* 190h   */
  2392. ov518_reg_w32(ov, 0xc6,    540, 2); /* 21ch   */
  2393. ov518_reg_w32(ov, 0xc7,    540, 2); /* 21ch   */
  2394. ov518_reg_w32(ov, 0xc8,    108, 2); /* 6ch    */
  2395. ov518_reg_w32(ov, 0xca, 131098, 3); /* 2001ah */
  2396. ov518_reg_w32(ov, 0xcb,    532, 2); /* 214h   */
  2397. ov518_reg_w32(ov, 0xcc,   2400, 2); /* 960h   */
  2398. ov518_reg_w32(ov, 0xcd,     32, 2); /* 20h    */
  2399. ov518_reg_w32(ov, 0xce,    608, 2); /* 260h   */
  2400. } else {
  2401. reg_w(ov, 0x24, 0x9f);
  2402. reg_w(ov, 0x25, 0x90);
  2403. ov518_reg_w32(ov, 0xc4,    400, 2); /* 190h   */
  2404. ov518_reg_w32(ov, 0xc6,    500, 2); /* 1f4h   */
  2405. ov518_reg_w32(ov, 0xc7,    500, 2); /* 1f4h   */
  2406. ov518_reg_w32(ov, 0xc8,    142, 2); /* 8eh    */
  2407. ov518_reg_w32(ov, 0xca, 131098, 3); /* 2001ah */
  2408. ov518_reg_w32(ov, 0xcb,    532, 2); /* 214h   */
  2409. ov518_reg_w32(ov, 0xcc,   2000, 2); /* 7d0h   */
  2410. ov518_reg_w32(ov, 0xcd,     32, 2); /* 20h    */
  2411. ov518_reg_w32(ov, 0xce,    608, 2); /* 260h   */
  2412. }
  2413. reg_w(ov, 0x2f, 0x80);
  2414. if (ov51x_restart(ov) < 0)
  2415. return -EIO;
  2416. /* Reset it just for good measure */
  2417. if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
  2418. return -EIO;
  2419. return 0;
  2420. }
  2421. /* This is a wrapper around the OV511, OV518, and sensor specific functions */
  2422. static int
  2423. mode_init_regs(struct usb_ov511 *ov,
  2424.        int width, int height, int mode, int sub_flag)
  2425. {
  2426. int rc = 0;
  2427. if (!ov || !ov->dev)
  2428. return -EFAULT;
  2429. if (ov->bclass == BCL_OV518) {
  2430. rc = ov518_mode_init_regs(ov, width, height, mode, sub_flag);
  2431. } else {
  2432. rc = ov511_mode_init_regs(ov, width, height, mode, sub_flag);
  2433. }
  2434. if (FATAL_ERROR(rc))
  2435. return rc;
  2436. switch (ov->sensor) {
  2437. case SEN_OV7610:
  2438. case SEN_OV7620:
  2439. case SEN_OV76BE:
  2440. case SEN_OV8600:
  2441. case SEN_OV6620:
  2442. case SEN_OV6630:
  2443. rc = set_ov_sensor_window(ov, width, height, mode, sub_flag);
  2444. break;
  2445. case SEN_KS0127:
  2446. case SEN_KS0127B:
  2447. err("KS0127-series decoders not supported yet");
  2448. rc = -EINVAL;
  2449. break;
  2450. case SEN_SAA7111A:
  2451. // rc = mode_init_saa_sensor_regs(ov, width, height, mode,
  2452. //        sub_flag);
  2453. PDEBUG(1, "SAA status = 0x%02X", i2c_r(ov, 0x1f));
  2454. break;
  2455. default:
  2456. err("Unknown sensor");
  2457. rc = -EINVAL;
  2458. }
  2459. if (FATAL_ERROR(rc))
  2460. return rc;
  2461. /* Sensor-independent settings */
  2462. rc = sensor_set_auto_brightness(ov, ov->auto_brt);
  2463. if (FATAL_ERROR(rc))
  2464. return rc;
  2465. rc = sensor_set_auto_exposure(ov, ov->auto_exp);
  2466. if (FATAL_ERROR(rc))
  2467. return rc;
  2468. rc = sensor_set_banding_filter(ov, bandingfilter);
  2469. if (FATAL_ERROR(rc))
  2470. return rc;
  2471. if (ov->lightfreq) {
  2472. rc = sensor_set_light_freq(ov, lightfreq);
  2473. if (FATAL_ERROR(rc))
  2474. return rc;
  2475. }
  2476. rc = sensor_set_backlight(ov, ov->backlight);
  2477. if (FATAL_ERROR(rc))
  2478. return rc;
  2479. rc = sensor_set_mirror(ov, ov->mirror);
  2480. if (FATAL_ERROR(rc))
  2481. return rc;
  2482. return 0;
  2483. }
  2484. /* This sets the default image parameters. This is useful for apps that use
  2485.  * read() and do not set these.
  2486.  */
  2487. static int
  2488. ov51x_set_default_params(struct usb_ov511 *ov)
  2489. {
  2490. int i;
  2491. /* Set default sizes in case IOCTL (VIDIOCMCAPTURE) is not used
  2492.  * (using read() instead). */
  2493. for (i = 0; i < OV511_NUMFRAMES; i++) {
  2494. ov->frame[i].width = ov->maxwidth;
  2495. ov->frame[i].height = ov->maxheight;
  2496. ov->frame[i].bytes_read = 0;
  2497. if (force_palette)
  2498. ov->frame[i].format = force_palette;
  2499. else
  2500. ov->frame[i].format = VIDEO_PALETTE_RGB24;
  2501. ov->frame[i].depth = get_depth(ov->frame[i].format);
  2502. }
  2503. PDEBUG(3, "%dx%d, %s", ov->maxwidth, ov->maxheight,
  2504.        symbolic(v4l1_plist, ov->frame[0].format));
  2505. /* Initialize to max width/height, YUV420 or RGB24 (if supported) */
  2506. if (mode_init_regs(ov, ov->maxwidth, ov->maxheight,
  2507.    ov->frame[0].format, 0) < 0)
  2508. return -EINVAL;
  2509. return 0;
  2510. }
  2511. /**********************************************************************
  2512.  *
  2513.  * Video decoder stuff
  2514.  *
  2515.  **********************************************************************/
  2516. /* Set analog input port of decoder */
  2517. static int
  2518. decoder_set_input(struct usb_ov511 *ov, int input)
  2519. {
  2520. PDEBUG(4, "port %d", input);
  2521. switch (ov->sensor) {
  2522. case SEN_SAA7111A:
  2523. {
  2524. /* Select mode */
  2525. i2c_w_mask(ov, 0x02, input, 0x07);
  2526. /* Bypass chrominance trap for modes 4..7 */
  2527. i2c_w_mask(ov, 0x09, (input > 3) ? 0x80:0x00, 0x80);
  2528. break;
  2529. }
  2530. default:
  2531. return -EINVAL;
  2532. }
  2533. return 0;
  2534. }
  2535. /* Get ASCII name of video input */
  2536. static int
  2537. decoder_get_input_name(struct usb_ov511 *ov, int input, char *name)
  2538. {
  2539. switch (ov->sensor) {
  2540. case SEN_SAA7111A:
  2541. {
  2542. if (input < 0 || input > 7)
  2543. return -EINVAL;
  2544. else if (input < 4)
  2545. sprintf(name, "CVBS-%d", input);
  2546. else // if (input < 8)
  2547. sprintf(name, "S-Video-%d", input - 4);
  2548. break;
  2549. }
  2550. default:
  2551. sprintf(name, "%s", "Camera");
  2552. }
  2553. return 0;
  2554. }
  2555. /* Set norm (NTSC, PAL, SECAM, AUTO) */
  2556. static int
  2557. decoder_set_norm(struct usb_ov511 *ov, int norm)
  2558. {
  2559. PDEBUG(4, "%d", norm);
  2560. switch (ov->sensor) {
  2561. case SEN_SAA7111A:
  2562. {
  2563. int reg_8, reg_e;
  2564. if (norm == VIDEO_MODE_NTSC) {
  2565. reg_8 = 0x40; /* 60 Hz */
  2566. reg_e = 0x00; /* NTSC M / PAL BGHI */
  2567. } else if (norm == VIDEO_MODE_PAL) {
  2568. reg_8 = 0x00; /* 50 Hz */
  2569. reg_e = 0x00; /* NTSC M / PAL BGHI */
  2570. } else if (norm == VIDEO_MODE_AUTO) {
  2571. reg_8 = 0x80; /* Auto field detect */
  2572. reg_e = 0x00; /* NTSC M / PAL BGHI */
  2573. } else if (norm == VIDEO_MODE_SECAM) {
  2574. reg_8 = 0x00; /* 50 Hz */
  2575. reg_e = 0x50; /* SECAM / PAL 4.43 */
  2576. } else {
  2577. return -EINVAL;
  2578. }
  2579. i2c_w_mask(ov, 0x08, reg_8, 0xc0);
  2580. i2c_w_mask(ov, 0x0e, reg_e, 0x70);
  2581. break;
  2582. }
  2583. default:
  2584. return -EINVAL;
  2585. }
  2586. return 0;
  2587. }
  2588. /**********************************************************************
  2589.  *
  2590.  * Color correction functions
  2591.  *
  2592.  **********************************************************************/
  2593. /*
  2594.  * Turn a YUV4:2:0 block into an RGB block
  2595.  *
  2596.  * Video4Linux seems to use the blue, green, red channel
  2597.  * order convention-- rgb[0] is blue, rgb[1] is green, rgb[2] is red.
  2598.  *
  2599.  * Color space conversion coefficients taken from the excellent
  2600.  * http://www.inforamp.net/~poynton/ColorFAQ.html
  2601.  * In his terminology, this is a CCIR 601.1 YCbCr -> RGB.
  2602.  * Y values are given for all 4 pixels, but the U (Pb)
  2603.  * and V (Pr) are assumed constant over the 2x2 block.
  2604.  *
  2605.  * To avoid floating point arithmetic, the color conversion
  2606.  * coefficients are scaled into 16.16 fixed-point integers.
  2607.  * They were determined as follows:
  2608.  *
  2609.  * double brightness = 1.0;  (0->black; 1->full scale)
  2610.  * double saturation = 1.0;  (0->greyscale; 1->full color)
  2611.  * double fixScale = brightness * 256 * 256;
  2612.  * int rvScale = (int)(1.402 * saturation * fixScale);
  2613.  * int guScale = (int)(-0.344136 * saturation * fixScale);
  2614.  * int gvScale = (int)(-0.714136 * saturation * fixScale);
  2615.  * int buScale = (int)(1.772 * saturation * fixScale);
  2616.  * int yScale = (int)(fixScale);
  2617.  */
  2618. /* LIMIT: convert a 16.16 fixed-point value to a byte, with clipping. */
  2619. #define LIMIT(x) ((x)>0xffffff?0xff: ((x)<=0xffff?0:((x)>>16)))
  2620. static inline void
  2621. move_420_block(int yTL, int yTR, int yBL, int yBR, int u, int v,
  2622.        int rowPixels, unsigned char * rgb, int bits)
  2623. {
  2624. const int rvScale = 91881;
  2625. const int guScale = -22553;
  2626. const int gvScale = -46801;
  2627. const int buScale = 116129;
  2628. const int yScale  = 65536;
  2629. int r, g, b;
  2630. g = guScale * u + gvScale * v;
  2631. if (force_rgb) {
  2632. r = buScale * u;
  2633. b = rvScale * v;
  2634. } else {
  2635. r = rvScale * v;
  2636. b = buScale * u;
  2637. }
  2638. yTL *= yScale; yTR *= yScale;
  2639. yBL *= yScale; yBR *= yScale;
  2640. if (bits == 24) {
  2641. /* Write out top two pixels */
  2642. rgb[0] = LIMIT(b+yTL); rgb[1] = LIMIT(g+yTL);
  2643. rgb[2] = LIMIT(r+yTL);
  2644. rgb[3] = LIMIT(b+yTR); rgb[4] = LIMIT(g+yTR);
  2645. rgb[5] = LIMIT(r+yTR);
  2646. /* Skip down to next line to write out bottom two pixels */
  2647. rgb += 3 * rowPixels;
  2648. rgb[0] = LIMIT(b+yBL); rgb[1] = LIMIT(g+yBL);
  2649. rgb[2] = LIMIT(r+yBL);
  2650. rgb[3] = LIMIT(b+yBR); rgb[4] = LIMIT(g+yBR);
  2651. rgb[5] = LIMIT(r+yBR);
  2652. } else if (bits == 16) {
  2653. /* Write out top two pixels */
  2654. rgb[0] = ((LIMIT(b+yTL) >> 3) & 0x1F)
  2655. | ((LIMIT(g+yTL) << 3) & 0xE0);
  2656. rgb[1] = ((LIMIT(g+yTL) >> 5) & 0x07)
  2657. | (LIMIT(r+yTL) & 0xF8);
  2658. rgb[2] = ((LIMIT(b+yTR) >> 3) & 0x1F)
  2659. | ((LIMIT(g+yTR) << 3) & 0xE0);
  2660. rgb[3] = ((LIMIT(g+yTR) >> 5) & 0x07)
  2661. | (LIMIT(r+yTR) & 0xF8);
  2662. /* Skip down to next line to write out bottom two pixels */
  2663. rgb += 2 * rowPixels;
  2664. rgb[0] = ((LIMIT(b+yBL) >> 3) & 0x1F)
  2665. | ((LIMIT(g+yBL) << 3) & 0xE0);
  2666. rgb[1] = ((LIMIT(g+yBL) >> 5) & 0x07)
  2667. | (LIMIT(r+yBL) & 0xF8);
  2668. rgb[2] = ((LIMIT(b+yBR) >> 3) & 0x1F)
  2669. | ((LIMIT(g+yBR) << 3) & 0xE0);
  2670. rgb[3] = ((LIMIT(g+yBR) >> 5) & 0x07)
  2671. | (LIMIT(r+yBR) & 0xF8);
  2672. }
  2673. }
  2674. /**********************************************************************
  2675.  *
  2676.  * Raw data parsing
  2677.  *
  2678.  **********************************************************************/
  2679. /* Copies a 64-byte segment at pIn to an 8x8 block at pOut. The width of the
  2680.  * image at pOut is specified by w.
  2681.  */
  2682. static inline void
  2683. make_8x8(unsigned char *pIn, unsigned char *pOut, int w)
  2684. {
  2685. unsigned char *pOut1 = pOut;
  2686. int x, y;
  2687. for (y = 0; y < 8; y++) {
  2688. pOut1 = pOut;
  2689. for (x = 0; x < 8; x++) {
  2690. *pOut1++ = *pIn++;
  2691. }
  2692. pOut += w;
  2693. }
  2694. }
  2695. /*
  2696.  * For RAW BW (YUV400) images, data shows up in 256 byte segments.
  2697.  * The segments represent 4 squares of 8x8 pixels as follows:
  2698.  *
  2699.  *      0  1 ...  7    64  65 ...  71   ...  192 193 ... 199
  2700.  *      8  9 ... 15    72  73 ...  79        200 201 ... 207
  2701.  *           ...              ...                    ...
  2702.  *     56 57 ... 63   120 121 ... 127        248 249 ... 255
  2703.  *
  2704.  */ 
  2705. static void
  2706. yuv400raw_to_yuv400p(struct ov511_frame *frame,
  2707.      unsigned char *pIn0, unsigned char *pOut0)
  2708. {
  2709. int x, y;
  2710. unsigned char *pIn, *pOut, *pOutLine;
  2711. /* Copy Y */
  2712. pIn = pIn0;
  2713. pOutLine = pOut0;
  2714. for (y = 0; y < frame->rawheight - 1; y += 8) {
  2715. pOut = pOutLine;
  2716. for (x = 0; x < frame->rawwidth - 1; x += 8) {
  2717. make_8x8(pIn, pOut, frame->rawwidth);
  2718. pIn += 64;
  2719. pOut += 8;
  2720. }
  2721. pOutLine += 8 * frame->rawwidth;
  2722. }
  2723. }
  2724. /*
  2725.  * For YUV4:2:0 images, the data shows up in 384 byte segments.
  2726.  * The first 64 bytes of each segment are U, the next 64 are V.  The U and
  2727.  * V are arranged as follows:
  2728.  *
  2729.  *      0  1 ...  7
  2730.  *      8  9 ... 15
  2731.  *           ...   
  2732.  *     56 57 ... 63
  2733.  *
  2734.  * U and V are shipped at half resolution (1 U,V sample -> one 2x2 block).
  2735.  *
  2736.  * The next 256 bytes are full resolution Y data and represent 4 squares
  2737.  * of 8x8 pixels as follows:
  2738.  *
  2739.  *      0  1 ...  7    64  65 ...  71   ...  192 193 ... 199
  2740.  *      8  9 ... 15    72  73 ...  79        200 201 ... 207
  2741.  *           ...              ...                    ...
  2742.  *     56 57 ... 63   120 121 ... 127   ...  248 249 ... 255
  2743.  *
  2744.  * Note that the U and V data in one segment represents a 16 x 16 pixel
  2745.  * area, but the Y data represents a 32 x 8 pixel area. If the width is not an
  2746.  * even multiple of 32, the extra 8x8 blocks within a 32x8 block belong to the
  2747.  * next horizontal stripe.
  2748.  *
  2749.  * If dumppix module param is set, _parse_data just dumps the incoming segments,
  2750.  * verbatim, in order, into the frame. When used with vidcat -f ppm -s 640x480
  2751.  * this puts the data on the standard output and can be analyzed with the
  2752.  * parseppm.c utility I wrote.  That's a much faster way for figuring out how
  2753.  * this data is scrambled.
  2754.  */
  2755. /* Converts from raw, uncompressed segments at pIn0 to a YUV420P frame at pOut0.
  2756.  *
  2757.  * FIXME: Currently only handles width and height that are multiples of 16
  2758.  */
  2759. static void
  2760. yuv420raw_to_yuv420p(struct ov511_frame *frame,
  2761.      unsigned char *pIn0, unsigned char *pOut0)
  2762. {
  2763. int k, x, y;
  2764. unsigned char *pIn, *pOut, *pOutLine;
  2765. const unsigned int a = frame->rawwidth * frame->rawheight;
  2766. const unsigned int w = frame->rawwidth / 2;
  2767. /* Copy U and V */
  2768. pIn = pIn0;
  2769. pOutLine = pOut0 + a;
  2770. for (y = 0; y < frame->rawheight - 1; y += 16) {
  2771. pOut = pOutLine;
  2772. for (x = 0; x < frame->rawwidth - 1; x += 16) {
  2773. make_8x8(pIn, pOut, w);
  2774. make_8x8(pIn + 64, pOut + a/4, w);
  2775. pIn += 384;
  2776. pOut += 8;
  2777. }
  2778. pOutLine += 8 * w;
  2779. }
  2780. /* Copy Y */
  2781. pIn = pIn0 + 128;
  2782. pOutLine = pOut0;
  2783. k = 0;
  2784. for (y = 0; y < frame->rawheight - 1; y += 8) {
  2785. pOut = pOutLine;
  2786. for (x = 0; x < frame->rawwidth - 1; x += 8) {
  2787. make_8x8(pIn, pOut, frame->rawwidth);
  2788. pIn += 64;
  2789. pOut += 8;
  2790. if ((++k) > 3) {
  2791. k = 0;
  2792. pIn += 128;
  2793. }
  2794. }
  2795. pOutLine += 8 * frame->rawwidth;
  2796. }
  2797. }
  2798. /*
  2799.  * fixFrameRGBoffset--
  2800.  * My camera seems to return the red channel about 1 pixel
  2801.  * low, and the blue channel about 1 pixel high. After YUV->RGB
  2802.  * conversion, we can correct this easily. OSL 2/24/2000.
  2803.  */
  2804. static void
  2805. fixFrameRGBoffset(struct ov511_frame *frame)
  2806. {
  2807. int x, y;
  2808. int rowBytes = frame->width*3, w = frame->width;
  2809. unsigned char *rgb = frame->data;
  2810. const int shift = 1;  /* Distance to shift pixels by, vertically */
  2811. /* Don't bother with little images */
  2812. if (frame->width < 400)
  2813. return;
  2814. /* This only works with RGB24 */
  2815. if (frame->format != VIDEO_PALETTE_RGB24)
  2816. return;
  2817. /* Shift red channel up */
  2818. for (y = shift; y < frame->height; y++) {
  2819. int lp = (y-shift)*rowBytes;     /* Previous line offset */
  2820. int lc = y*rowBytes;             /* Current line offset */
  2821. for (x = 0; x < w; x++)
  2822. rgb[lp+x*3+2] = rgb[lc+x*3+2]; /* Shift red up */
  2823. }
  2824. /* Shift blue channel down */
  2825. for (y = frame->height-shift-1; y >= 0; y--) {
  2826. int ln = (y + shift) * rowBytes;  /* Next line offset */
  2827. int lc = y * rowBytes;            /* Current line offset */
  2828. for (x = 0; x < w; x++)
  2829. rgb[ln+x*3+0] = rgb[lc+x*3+0]; /* Shift blue down */
  2830. }
  2831. }
  2832. /**********************************************************************
  2833.  *
  2834.  * Decompression
  2835.  *
  2836.  **********************************************************************/
  2837. /* Chooses a decompression module, locks it, and sets ov->decomp_ops
  2838.  * accordingly. Returns -ENXIO if decompressor is not available, otherwise
  2839.  * returns 0 if no other error.
  2840.  */
  2841. static int
  2842. request_decompressor(struct usb_ov511 *ov)
  2843. {
  2844. if (!ov)
  2845. return -ENODEV;
  2846. if (ov->decomp_ops) {
  2847. err("ERROR: Decompressor already requested!");
  2848. return -EINVAL;
  2849. }
  2850. lock_kernel();
  2851. /* Try to get MMX, and fall back on no-MMX if necessary */
  2852. if (ov->bclass == BCL_OV511) {
  2853. if (ov511_mmx_decomp_ops) {
  2854. PDEBUG(3, "Using OV511 MMX decompressor");
  2855. ov->decomp_ops = ov511_mmx_decomp_ops;
  2856. } else if (ov511_decomp_ops) {
  2857. PDEBUG(3, "Using OV511 decompressor");
  2858. ov->decomp_ops = ov511_decomp_ops;
  2859. } else {
  2860. err("No decompressor available");
  2861. }
  2862. } else if (ov->bclass == BCL_OV518) {
  2863. if (ov518_mmx_decomp_ops) {
  2864. PDEBUG(3, "Using OV518 MMX decompressor");
  2865. ov->decomp_ops = ov518_mmx_decomp_ops;
  2866. } else if (ov518_decomp_ops) {