ov511.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:177k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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