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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *    QuickCam Driver For Video4Linux.
  3.  *
  4.  * Video4Linux conversion work by Alan Cox.
  5.  * Parport compatibility by Phil Blundell.
  6.  * Busy loop avoidance by Mark Cooke.
  7.  *
  8.  *    Module parameters:
  9.  *
  10.  * maxpoll=<1 - 5000>
  11.  *
  12.  *   When polling the QuickCam for a response, busy-wait for a
  13.  *   maximum of this many loops. The default of 250 gives little
  14.  *   impact on interactive response.
  15.  *
  16.  *   NOTE: If this parameter is set too high, the processor
  17.  * will busy wait until this loop times out, and then
  18.  * slowly poll for a further 5 seconds before failing
  19.  * the transaction. You have been warned.
  20.  *
  21.  * yieldlines=<1 - 250>
  22.  *
  23.  *   When acquiring a frame from the camera, the data gathering
  24.  *   loop will yield back to the scheduler after completing
  25.  *   this many lines. The default of 4 provides a trade-off
  26.  *   between increased frame acquisition time and impact on
  27.  *   interactive response.
  28.  */
  29. /* qcam-lib.c -- Library for programming with the Connectix QuickCam.
  30.  * See the included documentation for usage instructions and details
  31.  * of the protocol involved. */
  32. /* Version 0.5, August 4, 1996 */
  33. /* Version 0.7, August 27, 1996 */
  34. /* Version 0.9, November 17, 1996 */
  35. /******************************************************************
  36. Copyright (C) 1996 by Scott Laird
  37. Permission is hereby granted, free of charge, to any person obtaining
  38. a copy of this software and associated documentation files (the
  39. "Software"), to deal in the Software without restriction, including
  40. without limitation the rights to use, copy, modify, merge, publish,
  41. distribute, sublicense, and/or sell copies of the Software, and to
  42. permit persons to whom the Software is furnished to do so, subject to
  43. the following conditions:
  44. The above copyright notice and this permission notice shall be
  45. included in all copies or substantial portions of the Software.
  46. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  47. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  48. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  49. IN NO EVENT SHALL SCOTT LAIRD BE LIABLE FOR ANY CLAIM, DAMAGES OR
  50. OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  51. ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  52. OTHER DEALINGS IN THE SOFTWARE.
  53. ******************************************************************/
  54. #include <linux/module.h>
  55. #include <linux/delay.h>
  56. #include <linux/errno.h>
  57. #include <linux/fs.h>
  58. #include <linux/init.h>
  59. #include <linux/kernel.h>
  60. #include <linux/slab.h>
  61. #include <linux/mm.h>
  62. #include <linux/parport.h>
  63. #include <linux/sched.h>
  64. #include <linux/version.h>
  65. #include <linux/videodev.h>
  66. #include <asm/semaphore.h>
  67. #include <asm/uaccess.h>
  68. #include "bw-qcam.h"
  69. static unsigned int maxpoll=250;   /* Maximum busy-loop count for qcam I/O */
  70. static unsigned int yieldlines=4;  /* Yield after this many during capture */
  71. static int video_nr = -1;
  72. #if LINUX_VERSION_CODE >= 0x020117
  73. MODULE_PARM(maxpoll,"i");
  74. MODULE_PARM(yieldlines,"i");   
  75. MODULE_PARM(video_nr,"i");
  76. #endif
  77. extern __inline__ int read_lpstatus(struct qcam_device *q)
  78. {
  79. return parport_read_status(q->pport);
  80. }
  81. extern __inline__ int read_lpcontrol(struct qcam_device *q)
  82. {
  83. return parport_read_control(q->pport);
  84. }
  85. extern __inline__ int read_lpdata(struct qcam_device *q)
  86. {
  87. return parport_read_data(q->pport);
  88. }
  89. extern __inline__ void write_lpdata(struct qcam_device *q, int d)
  90. {
  91. parport_write_data(q->pport, d);
  92. }
  93. extern __inline__ void write_lpcontrol(struct qcam_device *q, int d)
  94. {
  95. parport_write_control(q->pport, d);
  96. }
  97. static int qc_waithand(struct qcam_device *q, int val);
  98. static int qc_command(struct qcam_device *q, int command);
  99. static int qc_readparam(struct qcam_device *q);
  100. static int qc_setscanmode(struct qcam_device *q);
  101. static int qc_readbytes(struct qcam_device *q, char buffer[]);
  102. static struct video_device qcam_template;
  103. static int qc_calibrate(struct qcam_device *q)
  104. {
  105. /*
  106.  * Bugfix by Hanno Mueller hmueller@kabel.de, Mai 21 96
  107.  * The white balance is an individiual value for each
  108.  * quickcam.
  109.  */
  110. int value;
  111. int count = 0;
  112. qc_command(q, 27); /* AutoAdjustOffset */
  113. qc_command(q, 0); /* Dummy Parameter, ignored by the camera */
  114. /* GetOffset (33) will read 255 until autocalibration */
  115. /* is finished. After that, a value of 1-254 will be */
  116. /* returned. */
  117. do {
  118. qc_command(q, 33);
  119. value = qc_readparam(q);
  120. mdelay(1);
  121. schedule();
  122. count++;
  123. } while (value == 0xff && count<2048);
  124. q->whitebal = value;
  125. return value;
  126. }
  127. /* Initialize the QuickCam driver control structure.  This is where
  128.  * defaults are set for people who don't have a config file.*/
  129. static struct qcam_device *qcam_init(struct parport *port)
  130. {
  131. struct qcam_device *q;
  132. q = kmalloc(sizeof(struct qcam_device), GFP_KERNEL);
  133. if(q==NULL)
  134. return NULL;
  135. q->pport = port;
  136. q->pdev = parport_register_device(port, "bw-qcam", NULL, NULL,
  137.   NULL, 0, NULL);
  138. if (q->pdev == NULL) 
  139. {
  140. printk(KERN_ERR "bw-qcam: couldn't register for %s.n",
  141.        port->name);
  142. kfree(q);
  143. return NULL;
  144. }
  145. memcpy(&q->vdev, &qcam_template, sizeof(qcam_template));
  146. init_MUTEX(&q->lock);
  147. q->port_mode = (QC_ANY | QC_NOTSET);
  148. q->width = 320;
  149. q->height = 240;
  150. q->bpp = 4;
  151. q->transfer_scale = 2;
  152. q->contrast = 192;
  153. q->brightness = 180;
  154. q->whitebal = 105;
  155. q->top = 1;
  156. q->left = 14;
  157. q->mode = -1;
  158. q->status = QC_PARAM_CHANGE;
  159. return q;
  160. }
  161. /* qc_command is probably a bit of a misnomer -- it's used to send
  162.  * bytes *to* the camera.  Generally, these bytes are either commands
  163.  * or arguments to commands, so the name fits, but it still bugs me a
  164.  * bit.  See the documentation for a list of commands. */
  165. static int qc_command(struct qcam_device *q, int command)
  166. {
  167. int n1, n2;
  168. int cmd;
  169. write_lpdata(q, command);
  170. write_lpcontrol(q, 6);
  171. n1 = qc_waithand(q, 1);
  172. write_lpcontrol(q, 0xe);
  173. n2 = qc_waithand(q, 0);
  174. cmd = (n1 & 0xf0) | ((n2 & 0xf0) >> 4);
  175. return cmd;
  176. }
  177. static int qc_readparam(struct qcam_device *q)
  178. {
  179. int n1, n2;
  180. int cmd;
  181. write_lpcontrol(q, 6);
  182. n1 = qc_waithand(q, 1);
  183. write_lpcontrol(q, 0xe);
  184. n2 = qc_waithand(q, 0);
  185. cmd = (n1 & 0xf0) | ((n2 & 0xf0) >> 4);
  186. return cmd;
  187. }
  188. /* qc_waithand busy-waits for a handshake signal from the QuickCam.
  189.  * Almost all communication with the camera requires handshaking. */
  190. static int qc_waithand(struct qcam_device *q, int val)
  191. {
  192. int status;
  193. int runs=0;
  194. if (val)
  195. {
  196. while (!((status = read_lpstatus(q)) & 8))
  197. {
  198. /* 1000 is enough spins on the I/O for all normal
  199.    cases, at that point we start to poll slowly 
  200.    until the camera wakes up. However, we are
  201.    busy blocked until the camera responds, so
  202.    setting it lower is much better for interactive
  203.    response. */
  204.    
  205. if(runs++>maxpoll)
  206. {
  207. current->state=TASK_INTERRUPTIBLE;
  208. schedule_timeout(HZ/200);
  209. }
  210. if(runs>(maxpoll+1000)) /* 5 seconds */
  211. return -1;
  212. }
  213. }
  214. else
  215. {
  216. while (((status = read_lpstatus(q)) & 8))
  217. {
  218. /* 1000 is enough spins on the I/O for all normal
  219.    cases, at that point we start to poll slowly 
  220.    until the camera wakes up. However, we are
  221.    busy blocked until the camera responds, so
  222.    setting it lower is much better for interactive
  223.    response. */
  224.    
  225. if(runs++>maxpoll)
  226. {
  227. current->state=TASK_INTERRUPTIBLE;
  228. schedule_timeout(HZ/200);
  229. }
  230. if(runs++>(maxpoll+1000)) /* 5 seconds */
  231. return -1;
  232. }
  233. }
  234. return status;
  235. }
  236. /* Waithand2 is used when the qcam is in bidirectional mode, and the
  237.  * handshaking signal is CamRdy2 (bit 0 of data reg) instead of CamRdy1
  238.  * (bit 3 of status register).  It also returns the last value read,
  239.  * since this data is useful. */
  240. static unsigned int qc_waithand2(struct qcam_device *q, int val)
  241. {
  242. unsigned int status;
  243. int runs=0;
  244. do 
  245. {
  246. status = read_lpdata(q);
  247. /* 1000 is enough spins on the I/O for all normal
  248.    cases, at that point we start to poll slowly 
  249.    until the camera wakes up. However, we are
  250.    busy blocked until the camera responds, so
  251.    setting it lower is much better for interactive
  252.    response. */
  253.    
  254. if(runs++>maxpoll)
  255. {
  256. current->state=TASK_INTERRUPTIBLE;
  257. schedule_timeout(HZ/200);
  258. }
  259. if(runs++>(maxpoll+1000)) /* 5 seconds */
  260. return 0;
  261. }
  262. while ((status & 1) != val);
  263. return status;
  264. }
  265. /* Try to detect a QuickCam.  It appears to flash the upper 4 bits of
  266.    the status register at 5-10 Hz.  This is only used in the autoprobe
  267.    code.  Be aware that this isn't the way Connectix detects the
  268.    camera (they send a reset and try to handshake), but this should be
  269.    almost completely safe, while their method screws up my printer if
  270.    I plug it in before the camera. */
  271. static int qc_detect(struct qcam_device *q)
  272. {
  273. int reg, lastreg;
  274. int count = 0;
  275. int i;
  276. lastreg = reg = read_lpstatus(q) & 0xf0;
  277. for (i = 0; i < 500; i++) 
  278. {
  279. reg = read_lpstatus(q) & 0xf0;
  280. if (reg != lastreg)
  281. count++;
  282. lastreg = reg;
  283. mdelay(2);
  284. }
  285. #if 0
  286. /* Force camera detection during testing. Sometimes the camera
  287.    won't be flashing these bits. Possibly unloading the module
  288.    in the middle of a grab? Or some timeout condition?
  289.    I've seen this parameter as low as 19 on my 450Mhz box - mpc */
  290. printk("Debugging: QCam detection counter <30-200 counts as detected>: %dn", count);
  291. return 1;
  292. #endif
  293. /* Be (even more) liberal in what you accept...  */
  294. /* if (count > 30 && count < 200) */
  295. if (count > 20 && count < 300)
  296. return 1; /* found */
  297. else
  298. return 0; /* not found */
  299. }
  300. /* Reset the QuickCam.  This uses the same sequence the Windows
  301.  * QuickPic program uses.  Someone with a bi-directional port should
  302.  * check that bi-directional mode is detected right, and then
  303.  * implement bi-directional mode in qc_readbyte(). */
  304. static void qc_reset(struct qcam_device *q)
  305. {
  306. switch (q->port_mode & QC_FORCE_MASK) 
  307. {
  308. case QC_FORCE_UNIDIR:
  309. q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_UNIDIR;
  310. break;
  311. case QC_FORCE_BIDIR:
  312. q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_BIDIR;
  313. break;
  314. case QC_ANY:
  315. write_lpcontrol(q, 0x20);
  316. write_lpdata(q, 0x75);
  317. if (read_lpdata(q) != 0x75) {
  318. q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_BIDIR;
  319. } else {
  320. q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_UNIDIR;
  321. }
  322. break;
  323. }
  324. write_lpcontrol(q, 0xb);
  325. udelay(250);
  326. write_lpcontrol(q, 0xe);
  327. qc_setscanmode(q); /* in case port_mode changed */
  328. }
  329. /* Decide which scan mode to use.  There's no real requirement that
  330.  * the scanmode match the resolution in q->height and q-> width -- the
  331.  * camera takes the picture at the resolution specified in the
  332.  * "scanmode" and then returns the image at the resolution specified
  333.  * with the resolution commands.  If the scan is bigger than the
  334.  * requested resolution, the upper-left hand corner of the scan is
  335.  * returned.  If the scan is smaller, then the rest of the image
  336.  * returned contains garbage. */
  337. static int qc_setscanmode(struct qcam_device *q)
  338. {
  339. int old_mode = q->mode;
  340. switch (q->transfer_scale) 
  341. {
  342. case 1:
  343. q->mode = 0;
  344. break;
  345. case 2:
  346. q->mode = 4;
  347. break;
  348. case 4:
  349. q->mode = 8;
  350. break;
  351. }
  352. switch (q->bpp) 
  353. {
  354. case 4:
  355. break;
  356. case 6:
  357. q->mode += 2;
  358. break;
  359. }
  360. switch (q->port_mode & QC_MODE_MASK) 
  361. {
  362. case QC_BIDIR:
  363. q->mode += 1;
  364. break;
  365. case QC_NOTSET:
  366. case QC_UNIDIR:
  367. break;
  368. }
  369. if (q->mode != old_mode)
  370. q->status |= QC_PARAM_CHANGE;
  371. return 0;
  372. }
  373. /* Reset the QuickCam and program for brightness, contrast,
  374.  * white-balance, and resolution. */
  375. void qc_set(struct qcam_device *q)
  376. {
  377. int val;
  378. int val2;
  379. qc_reset(q);
  380. /* Set the brightness.  Yes, this is repetitive, but it works.
  381.  * Shorter versions seem to fail subtly.  Feel free to try :-). */
  382. /* I think the problem was in qc_command, not here -- bls */
  383. qc_command(q, 0xb);
  384. qc_command(q, q->brightness);
  385. val = q->height / q->transfer_scale;
  386. qc_command(q, 0x11);
  387. qc_command(q, val);
  388. if ((q->port_mode & QC_MODE_MASK) == QC_UNIDIR && q->bpp == 6) {
  389. /* The normal "transfers per line" calculation doesn't seem to work
  390.    as expected here (and yet it works fine in qc_scan).  No idea
  391.    why this case is the odd man out.  Fortunately, Laird's original
  392.    working version gives me a good way to guess at working values.
  393.    -- bls */
  394. val = q->width;
  395. val2 = q->transfer_scale * 4;
  396. } else {
  397. val = q->width * q->bpp;
  398. val2 = (((q->port_mode & QC_MODE_MASK) == QC_BIDIR) ? 24 : 8) *
  399.     q->transfer_scale;
  400. }
  401. val = (val + val2 - 1) / val2;
  402. qc_command(q, 0x13);
  403. qc_command(q, val);
  404. /* Setting top and left -- bls */
  405. qc_command(q, 0xd);
  406. qc_command(q, q->top);
  407. qc_command(q, 0xf);
  408. qc_command(q, q->left / 2);
  409. qc_command(q, 0x19);
  410. qc_command(q, q->contrast);
  411. qc_command(q, 0x1f);
  412. qc_command(q, q->whitebal);
  413. /* Clear flag that we must update the grabbing parameters on the camera
  414.    before we grab the next frame */
  415. q->status &= (~QC_PARAM_CHANGE);
  416. }
  417. /* Qc_readbytes reads some bytes from the QC and puts them in
  418.    the supplied buffer.  It returns the number of bytes read,
  419.    or -1 on error. */
  420. extern __inline__ int qc_readbytes(struct qcam_device *q, char buffer[])
  421. {
  422. int ret=1;
  423. unsigned int hi, lo;
  424. unsigned int hi2, lo2;
  425. static int state = 0;
  426. if (buffer == NULL) 
  427. {
  428. state = 0;
  429. return 0;
  430. }
  431. switch (q->port_mode & QC_MODE_MASK) 
  432. {
  433. case QC_BIDIR: /* Bi-directional Port */
  434. write_lpcontrol(q, 0x26);
  435. lo = (qc_waithand2(q, 1) >> 1);
  436. hi = (read_lpstatus(q) >> 3) & 0x1f;
  437. write_lpcontrol(q, 0x2e);
  438. lo2 = (qc_waithand2(q, 0) >> 1);
  439. hi2 = (read_lpstatus(q) >> 3) & 0x1f;
  440. switch (q->bpp) 
  441. {
  442. case 4:
  443. buffer[0] = lo & 0xf;
  444. buffer[1] = ((lo & 0x70) >> 4) | ((hi & 1) << 3);
  445. buffer[2] = (hi & 0x1e) >> 1;
  446. buffer[3] = lo2 & 0xf;
  447. buffer[4] = ((lo2 & 0x70) >> 4) | ((hi2 & 1) << 3);
  448. buffer[5] = (hi2 & 0x1e) >> 1;
  449. ret = 6;
  450. break;
  451. case 6:
  452. buffer[0] = lo & 0x3f;
  453. buffer[1] = ((lo & 0x40) >> 6) | (hi << 1);
  454. buffer[2] = lo2 & 0x3f;
  455. buffer[3] = ((lo2 & 0x40) >> 6) | (hi2 << 1);
  456. ret = 4;
  457. break;
  458. }
  459. break;
  460. case QC_UNIDIR: /* Unidirectional Port */
  461. write_lpcontrol(q, 6);
  462. lo = (qc_waithand(q, 1) & 0xf0) >> 4;
  463. write_lpcontrol(q, 0xe);
  464. hi = (qc_waithand(q, 0) & 0xf0) >> 4;
  465. switch (q->bpp) 
  466. {
  467. case 4:
  468. buffer[0] = lo;
  469. buffer[1] = hi;
  470. ret = 2;
  471. break;
  472. case 6:
  473. switch (state) 
  474. {
  475. case 0:
  476. buffer[0] = (lo << 2) | ((hi & 0xc) >> 2);
  477. q->saved_bits = (hi & 3) << 4;
  478. state = 1;
  479. ret = 1;
  480. break;
  481. case 1:
  482. buffer[0] = lo | q->saved_bits;
  483. q->saved_bits = hi << 2;
  484. state = 2;
  485. ret = 1;
  486. break;
  487. case 2:
  488. buffer[0] = ((lo & 0xc) >> 2) | q->saved_bits;
  489. buffer[1] = ((lo & 3) << 4) | hi;
  490. state = 0;
  491. ret = 2;
  492. break;
  493. }
  494. break;
  495. }
  496. break;
  497. }
  498. return ret;
  499. }
  500. /* requests a scan from the camera.  It sends the correct instructions
  501.  * to the camera and then reads back the correct number of bytes.  In
  502.  * previous versions of this routine the return structure contained
  503.  * the raw output from the camera, and there was a 'qc_convertscan'
  504.  * function that converted that to a useful format.  In version 0.3 I
  505.  * rolled qc_convertscan into qc_scan and now I only return the
  506.  * converted scan.  The format is just an one-dimensional array of
  507.  * characters, one for each pixel, with 0=black up to n=white, where
  508.  * n=2^(bit depth)-1.  Ask me for more details if you don't understand
  509.  * this. */
  510. long qc_capture(struct qcam_device * q, char *buf, unsigned long len)
  511. {
  512. int i, j, k, yield;
  513. int bytes;
  514. int linestotrans, transperline;
  515. int divisor;
  516. int pixels_per_line;
  517. int pixels_read = 0;
  518. int got=0;
  519. char buffer[6];
  520. int  shift=8-q->bpp;
  521. char invert;
  522. if (q->mode == -1) 
  523. return -ENXIO;
  524. qc_command(q, 0x7);
  525. qc_command(q, q->mode);
  526. if ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) 
  527. {
  528. write_lpcontrol(q, 0x2e); /* turn port around */
  529. write_lpcontrol(q, 0x26);
  530. (void) qc_waithand(q, 1);
  531. write_lpcontrol(q, 0x2e);
  532. (void) qc_waithand(q, 0);
  533. }
  534. /* strange -- should be 15:63 below, but 4bpp is odd */
  535. invert = (q->bpp == 4) ? 16 : 63;
  536. linestotrans = q->height / q->transfer_scale;
  537. pixels_per_line = q->width / q->transfer_scale;
  538. transperline = q->width * q->bpp;
  539. divisor = (((q->port_mode & QC_MODE_MASK) == QC_BIDIR) ? 24 : 8) *
  540.     q->transfer_scale;
  541. transperline = (transperline + divisor - 1) / divisor;
  542. for (i = 0, yield = yieldlines; i < linestotrans; i++) 
  543. {
  544. for (pixels_read = j = 0; j < transperline; j++) 
  545. {
  546. bytes = qc_readbytes(q, buffer);
  547. for (k = 0; k < bytes && (pixels_read + k) < pixels_per_line; k++) 
  548. {
  549. int o;
  550. if (buffer[k] == 0 && invert == 16) 
  551. {
  552. /* 4bpp is odd (again) -- inverter is 16, not 15, but output
  553.    must be 0-15 -- bls */
  554. buffer[k] = 16;
  555. }
  556. o=i*pixels_per_line + pixels_read + k;
  557. if(o<len)
  558. {
  559. got++;
  560. put_user((invert - buffer[k])<<shift, buf+o);
  561. }
  562. }
  563. pixels_read += bytes;
  564. }
  565. (void) qc_readbytes(q, 0); /* reset state machine */
  566. /* Grabbing an entire frame from the quickcam is a lengthy
  567.    process. We don't (usually) want to busy-block the
  568.    processor for the entire frame. yieldlines is a module
  569.    parameter. If we yield every line, the minimum frame
  570.    time will be 240 / 200 = 1.2 seconds. The compile-time
  571.    default is to yield every 4 lines. */
  572. if (i >= yield) {
  573. current->state=TASK_INTERRUPTIBLE;
  574. schedule_timeout(HZ/200);
  575. yield = i + yieldlines;
  576. }
  577. }
  578. if ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) 
  579. {
  580. write_lpcontrol(q, 2);
  581. write_lpcontrol(q, 6);
  582. udelay(3);
  583. write_lpcontrol(q, 0xe);
  584. }
  585. if(got<len)
  586. return got;
  587. return len;
  588. }
  589. /*
  590.  * Video4linux interfacing
  591.  */
  592. static int qcam_open(struct video_device *dev, int flags)
  593. {
  594. return 0;
  595. }
  596. static void qcam_close(struct video_device *dev)
  597. {
  598. }
  599. static long qcam_write(struct video_device *v, const char *buf, unsigned long count, int noblock)
  600. {
  601. return -EINVAL;
  602. }
  603. static int qcam_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
  604. {
  605. struct qcam_device *qcam=(struct qcam_device *)dev;
  606. switch(cmd)
  607. {
  608. case VIDIOCGCAP:
  609. {
  610. struct video_capability b;
  611. strcpy(b.name, "Quickcam");
  612. b.type = VID_TYPE_CAPTURE|VID_TYPE_SCALES|VID_TYPE_MONOCHROME;
  613. b.channels = 1;
  614. b.audios = 0;
  615. b.maxwidth = 320;
  616. b.maxheight = 240;
  617. b.minwidth = 80;
  618. b.minheight = 60;
  619. if(copy_to_user(arg, &b,sizeof(b)))
  620. return -EFAULT;
  621. return 0;
  622. }
  623. case VIDIOCGCHAN:
  624. {
  625. struct video_channel v;
  626. if(copy_from_user(&v, arg, sizeof(v)))
  627. return -EFAULT;
  628. if(v.channel!=0)
  629. return -EINVAL;
  630. v.flags=0;
  631. v.tuners=0;
  632. /* Good question.. its composite or SVHS so.. */
  633. v.type = VIDEO_TYPE_CAMERA;
  634. strcpy(v.name, "Camera");
  635. if(copy_to_user(arg, &v, sizeof(v)))
  636. return -EFAULT;
  637. return 0;
  638. }
  639. case VIDIOCSCHAN:
  640. {
  641. int v;
  642. if(copy_from_user(&v, arg,sizeof(v)))
  643. return -EFAULT;
  644. if(v!=0)
  645. return -EINVAL;
  646. return 0;
  647. }
  648. case VIDIOCGTUNER:
  649. {
  650. struct video_tuner v;
  651. if(copy_from_user(&v, arg, sizeof(v))!=0)
  652. return -EFAULT;
  653. if(v.tuner)
  654. return -EINVAL;
  655. strcpy(v.name, "Format");
  656. v.rangelow=0;
  657. v.rangehigh=0;
  658. v.flags= 0;
  659. v.mode = VIDEO_MODE_AUTO;
  660. if(copy_to_user(arg,&v,sizeof(v))!=0)
  661. return -EFAULT;
  662. return 0;
  663. }
  664. case VIDIOCSTUNER:
  665. {
  666. struct video_tuner v;
  667. if(copy_from_user(&v, arg, sizeof(v))!=0)
  668. return -EFAULT;
  669. if(v.tuner)
  670. return -EINVAL;
  671. if(v.mode!=VIDEO_MODE_AUTO)
  672. return -EINVAL;
  673. return 0;
  674. }
  675. case VIDIOCGPICT:
  676. {
  677. struct video_picture p;
  678. p.colour=0x8000;
  679. p.hue=0x8000;
  680. p.brightness=qcam->brightness<<8;
  681. p.contrast=qcam->contrast<<8;
  682. p.whiteness=qcam->whitebal<<8;
  683. p.depth=qcam->bpp;
  684. p.palette=VIDEO_PALETTE_GREY;
  685. if(copy_to_user(arg, &p, sizeof(p)))
  686. return -EFAULT;
  687. return 0;
  688. }
  689. case VIDIOCSPICT:
  690. {
  691. struct video_picture p;
  692. if(copy_from_user(&p, arg, sizeof(p)))
  693. return -EFAULT;
  694. if(p.palette!=VIDEO_PALETTE_GREY)
  695.      return -EINVAL;
  696. if(p.depth!=4 && p.depth!=6)
  697. return -EINVAL;
  698. /*
  699.  * Now load the camera.
  700.  */
  701. qcam->brightness = p.brightness>>8;
  702. qcam->contrast = p.contrast>>8;
  703. qcam->whitebal = p.whiteness>>8;
  704. qcam->bpp = p.depth;
  705. down(&qcam->lock);
  706. qc_setscanmode(qcam);
  707. up(&qcam->lock);
  708. qcam->status |= QC_PARAM_CHANGE;
  709. return 0;
  710. }
  711. case VIDIOCSWIN:
  712. {
  713. struct video_window vw;
  714. if(copy_from_user(&vw, arg,sizeof(vw)))
  715. return -EFAULT;
  716. if(vw.flags)
  717. return -EINVAL;
  718. if(vw.clipcount)
  719. return -EINVAL;
  720. if(vw.height<60||vw.height>240)
  721. return -EINVAL;
  722. if(vw.width<80||vw.width>320)
  723. return -EINVAL;
  724. qcam->width = 320;
  725. qcam->height = 240;
  726. qcam->transfer_scale = 4;
  727. if(vw.width>=160 && vw.height>=120)
  728. {
  729. qcam->transfer_scale = 2;
  730. }
  731. if(vw.width>=320 && vw.height>=240)
  732. {
  733. qcam->width = 320;
  734. qcam->height = 240;
  735. qcam->transfer_scale = 1;
  736. }
  737. down(&qcam->lock);
  738. qc_setscanmode(qcam);
  739. up(&qcam->lock);
  740. /* We must update the camera before we grab. We could
  741.    just have changed the grab size */
  742. qcam->status |= QC_PARAM_CHANGE;
  743. /* Ok we figured out what to use from our wide choice */
  744. return 0;
  745. }
  746. case VIDIOCGWIN:
  747. {
  748. struct video_window vw;
  749. memset(&vw, 0, sizeof(vw));
  750. vw.width=qcam->width/qcam->transfer_scale;
  751. vw.height=qcam->height/qcam->transfer_scale;
  752. if(copy_to_user(arg, &vw, sizeof(vw)))
  753. return -EFAULT;
  754. return 0;
  755. }
  756. case VIDIOCCAPTURE:
  757. return -EINVAL;
  758. case VIDIOCGFBUF:
  759. return -EINVAL;
  760. case VIDIOCSFBUF:
  761. return -EINVAL;
  762. case VIDIOCKEY:
  763. return 0;
  764. case VIDIOCGFREQ:
  765. return -EINVAL;
  766. case VIDIOCSFREQ:
  767. return -EINVAL;
  768. case VIDIOCGAUDIO:
  769. return -EINVAL;
  770. case VIDIOCSAUDIO:
  771. return -EINVAL;
  772. default:
  773. return -ENOIOCTLCMD;
  774. }
  775. return 0;
  776. }
  777. static long qcam_read(struct video_device *v, char *buf, unsigned long count,  int noblock)
  778. {
  779. struct qcam_device *qcam=(struct qcam_device *)v;
  780. int len;
  781. parport_claim_or_block(qcam->pdev);
  782. down(&qcam->lock);
  783. qc_reset(qcam);
  784. /* Update the camera parameters if we need to */
  785. if (qcam->status & QC_PARAM_CHANGE)
  786. qc_set(qcam);
  787. len=qc_capture(qcam, buf,count);
  788. up(&qcam->lock);
  789. parport_release(qcam->pdev);
  790. return len;
  791. }
  792.  
  793. static struct video_device qcam_template=
  794. {
  795. owner: THIS_MODULE,
  796. name: "Connectix Quickcam",
  797. type: VID_TYPE_CAPTURE,
  798. hardware: VID_HARDWARE_QCAM_BW,
  799. open: qcam_open,
  800. close: qcam_close,
  801. read: qcam_read,
  802. write: qcam_write,
  803. ioctl: qcam_ioctl,
  804. };
  805. #define MAX_CAMS 4
  806. static struct qcam_device *qcams[MAX_CAMS];
  807. static unsigned int num_cams = 0;
  808. int init_bwqcam(struct parport *port)
  809. {
  810. struct qcam_device *qcam;
  811. if (num_cams == MAX_CAMS)
  812. {
  813. printk(KERN_ERR "Too many Quickcams (max %d)n", MAX_CAMS);
  814. return -ENOSPC;
  815. }
  816. qcam=qcam_init(port);
  817. if(qcam==NULL)
  818. return -ENODEV;
  819. parport_claim_or_block(qcam->pdev);
  820. qc_reset(qcam);
  821. if(qc_detect(qcam)==0)
  822. {
  823. parport_release(qcam->pdev);
  824. parport_unregister_device(qcam->pdev);
  825. kfree(qcam);
  826. return -ENODEV;
  827. }
  828. qc_calibrate(qcam);
  829. parport_release(qcam->pdev);
  830. printk(KERN_INFO "Connectix Quickcam on %sn", qcam->pport->name);
  831. if(video_register_device(&qcam->vdev, VFL_TYPE_GRABBER, video_nr)==-1)
  832. {
  833. parport_unregister_device(qcam->pdev);
  834. kfree(qcam);
  835. return -ENODEV;
  836. }
  837. qcams[num_cams++] = qcam;
  838. return 0;
  839. }
  840. void close_bwqcam(struct qcam_device *qcam)
  841. {
  842. video_unregister_device(&qcam->vdev);
  843. parport_unregister_device(qcam->pdev);
  844. kfree(qcam);
  845. }
  846. /* The parport parameter controls which parports will be scanned.
  847.  * Scanning all parports causes some printers to print a garbage page.
  848.  *       -- March 14, 1999  Billy Donahue <billy@escape.com> */
  849. #ifdef MODULE
  850. static char *parport[MAX_CAMS] = { NULL, };
  851. MODULE_PARM(parport, "1-" __MODULE_STRING(MAX_CAMS) "s");
  852. #endif
  853. static void __exit exit_bw_qcams(void)
  854. {
  855. unsigned int i;
  856. for (i = 0; i < num_cams; i++)
  857. close_bwqcam(qcams[i]);
  858. }
  859. static int __init init_bw_qcams(void)
  860. {
  861. struct parport *port;
  862. #ifdef MODULE
  863. int n;
  864. if(parport[0] && strncmp(parport[0], "auto", 4)){
  865. /* user gave parport parameters */
  866. for(n=0; parport[n] && n<MAX_CAMS; n++){
  867. char *ep;
  868. unsigned long r;
  869. r = simple_strtoul(parport[n], &ep, 0);
  870. if(ep == parport[n]){
  871. printk(KERN_ERR
  872. "bw-qcam: bad port specifier "%s"n",
  873. parport[n]);
  874. continue;
  875. }
  876. for (port=parport_enumerate(); port; port=port->next){
  877. if(r!=port->number)
  878. continue;
  879. init_bwqcam(port);
  880. break;
  881. }
  882. }
  883. return (num_cams)?0:-ENODEV;
  884. /* no parameter or "auto" */
  885. for (port = parport_enumerate(); port; port=port->next)
  886. init_bwqcam(port);
  887. /* Do some sanity checks on the module parameters. */
  888. if (maxpoll > 5000) {
  889. printk("Connectix Quickcam max-poll was above 5000. Using 5000.n");
  890. maxpoll = 5000;
  891. }
  892. if (yieldlines < 1) {
  893. printk("Connectix Quickcam yieldlines was less than 1. Using 1.n");
  894. yieldlines = 1;
  895. }
  896. return (num_cams)?0:-ENODEV;
  897. #else
  898. for (port = parport_enumerate(); port; port=port->next)
  899. init_bwqcam(port);
  900. return 0;
  901. #endif
  902. }
  903. module_init(init_bw_qcams);
  904. module_exit(exit_bw_qcams);
  905. MODULE_LICENSE("GPL");