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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This program is free software; you can redistribute it and/or modify
  3.  * it under the terms of the GNU General Public License as published by
  4.  * the Free Software Foundation; either version 2, or (at your option)
  5.  * any later version.
  6.  *
  7.  * This program is distributed in the hope that it will be useful,
  8.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.  * GNU General Public License for more details.
  11.  *
  12.  * You should have received a copy of the GNU General Public License
  13.  * along with this program; if not, write to the Free Software
  14.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15.  */
  16. #include <linux/kernel.h>
  17. #include <linux/sched.h>
  18. #include <linux/list.h>
  19. #include <linux/slab.h>
  20. #define __NO_VERSION__ /* Temporary: usbvideo is not a module yet */
  21. #include <linux/module.h>
  22. #include <linux/mm.h>
  23. #include <linux/smp_lock.h>
  24. #include <linux/vmalloc.h>
  25. #include <linux/wrapper.h>
  26. #include <linux/init.h>
  27. #include <linux/spinlock.h>
  28. #include <asm/io.h>
  29. #include "usbvideo.h"
  30. #if defined(MAP_NR)
  31. #define virt_to_page(v) MAP_NR(v) /* Kernels 2.2.x */
  32. #endif
  33. static int video_nr = -1;
  34. MODULE_PARM(video_nr, "i");
  35. /*
  36.  * Local prototypes.
  37.  */
  38. #if USES_PROC_FS
  39. static void usbvideo_procfs_level1_create(usbvideo_t *ut);
  40. static void usbvideo_procfs_level1_destroy(usbvideo_t *ut);
  41. static void usbvideo_procfs_level2_create(uvd_t *uvd);
  42. static void usbvideo_procfs_level2_destroy(uvd_t *uvd);
  43. static int usbvideo_default_procfs_read_proc(
  44. char *page, char **start, off_t off, int count,
  45. int *eof, void *data);
  46. static int usbvideo_default_procfs_write_proc(
  47. struct file *file, const char *buffer, 
  48. unsigned long count, void *data);
  49. #endif
  50. /*******************************/
  51. /* Memory management functions */
  52. /*******************************/
  53. /*
  54.  * Here we want the physical address of the memory.
  55.  * This is used when initializing the contents of the area.
  56.  */
  57. unsigned long usbvideo_kvirt_to_pa(unsigned long adr)
  58. {
  59. unsigned long kva, ret;
  60. kva = (unsigned long) page_address(vmalloc_to_page((void *)adr));
  61. kva |= adr & (PAGE_SIZE-1); /* restore the offset */
  62. ret = __pa(kva);
  63. return ret;
  64. }
  65. void *usbvideo_rvmalloc(unsigned long size)
  66. {
  67. void *mem;
  68. unsigned long adr;
  69. size = PAGE_ALIGN(size);
  70. mem = vmalloc_32(size);
  71. if (!mem)
  72. return NULL;
  73. memset(mem, 0, size); /* Clear the ram out, no junk to the user */
  74. adr = (unsigned long) mem;
  75. while (size > 0) {
  76. mem_map_reserve(vmalloc_to_page((void *)adr));
  77. adr += PAGE_SIZE;
  78. size -= PAGE_SIZE;
  79. }
  80. return mem;
  81. }
  82. void usbvideo_rvfree(void *mem, unsigned long size)
  83. {
  84. unsigned long adr;
  85. if (!mem)
  86. return;
  87. adr = (unsigned long) mem;
  88. while ((long) size > 0) {
  89. mem_map_unreserve(vmalloc_to_page((void *)adr));
  90. adr += PAGE_SIZE;
  91. size -= PAGE_SIZE;
  92. }
  93. vfree(mem);
  94. }
  95. void RingQueue_Initialize(RingQueue_t *rq)
  96. {
  97. assert(rq != NULL);
  98. init_waitqueue_head(&rq->wqh);
  99. }
  100. void RingQueue_Allocate(RingQueue_t *rq, int rqLen)
  101. {
  102. assert(rq != NULL);
  103. assert(rqLen > 0);
  104. rq->length = rqLen;
  105. rq->queue = usbvideo_rvmalloc(rq->length);
  106. assert(rq->queue != NULL);
  107. }
  108. int RingQueue_IsAllocated(const RingQueue_t *rq)
  109. {
  110. if (rq == NULL)
  111. return 0;
  112. return (rq->queue != NULL) && (rq->length > 0);
  113. }
  114. void RingQueue_Free(RingQueue_t *rq)
  115. {
  116. assert(rq != NULL);
  117. if (RingQueue_IsAllocated(rq)) {
  118. usbvideo_rvfree(rq->queue, rq->length);
  119. rq->queue = NULL;
  120. rq->length = 0;
  121. }
  122. }
  123. int RingQueue_Dequeue(RingQueue_t *rq, unsigned char *dst, int len)
  124. {
  125. int i;
  126. assert(rq != NULL);
  127. assert(dst != NULL);
  128. for (i=0; i < len; i++) {
  129. dst[i] = rq->queue[rq->ri];
  130. RING_QUEUE_DEQUEUE_BYTES(rq,1);
  131. }
  132. return len;
  133. }
  134. int RingQueue_Enqueue(RingQueue_t *rq, const unsigned char *cdata, int n)
  135. {
  136. int enqueued = 0;
  137. assert(rq != NULL);
  138. assert(cdata != NULL);
  139. assert(rq->length > 0);
  140. while (n > 0) {
  141. int m, q_avail;
  142. /* Calculate the largest chunk that fits the tail of the ring */
  143. q_avail = rq->length - rq->wi;
  144. if (q_avail <= 0) {
  145. rq->wi = 0;
  146. q_avail = rq->length;
  147. }
  148. m = n;
  149. assert(q_avail > 0);
  150. if (m > q_avail)
  151. m = q_avail;
  152. memmove(rq->queue + rq->wi, cdata, m);
  153. RING_QUEUE_ADVANCE_INDEX(rq, wi, m);
  154. cdata += m;
  155. enqueued += m;
  156. n -= m;
  157. }
  158. return enqueued;
  159. }
  160. int RingQueue_GetLength(const RingQueue_t *rq)
  161. {
  162. int ri, wi;
  163. assert(rq != NULL);
  164. ri = rq->ri;
  165. wi = rq->wi;
  166. if (ri == wi)
  167. return 0;
  168. else if (ri < wi)
  169. return wi - ri;
  170. else
  171. return wi + (rq->length - ri);
  172. }
  173. void RingQueue_InterruptibleSleepOn(RingQueue_t *rq)
  174. {
  175. assert(rq != NULL);
  176. interruptible_sleep_on(&rq->wqh);
  177. }
  178. void RingQueue_WakeUpInterruptible(RingQueue_t *rq)
  179. {
  180. assert(rq != NULL);
  181. if (waitqueue_active(&rq->wqh))
  182. wake_up_interruptible(&rq->wqh);
  183. }
  184. /*
  185.  * usbvideo_VideosizeToString()
  186.  *
  187.  * This procedure converts given videosize value to readable string.
  188.  *
  189.  * History:
  190.  * 07-Aug-2000 Created.
  191.  * 19-Oct-2000 Reworked for usbvideo module.
  192.  */
  193. void usbvideo_VideosizeToString(char *buf, int bufLen, videosize_t vs)
  194. {
  195. char tmp[40];
  196. int n;
  197. n = 1 + sprintf(tmp, "%ldx%ld", VIDEOSIZE_X(vs), VIDEOSIZE_Y(vs));
  198. assert(n < sizeof(tmp));
  199. if ((buf == NULL) || (bufLen < n))
  200. err("usbvideo_VideosizeToString: buffer is too small.");
  201. else
  202. memmove(buf, tmp, n);
  203. }
  204. /*
  205.  * usbvideo_OverlayChar()
  206.  *
  207.  * History:
  208.  * 01-Feb-2000 Created.
  209.  */
  210. void usbvideo_OverlayChar(uvd_t *uvd, usbvideo_frame_t *frame,
  211.   int x, int y, int ch)
  212. {
  213. static const unsigned short digits[16] = {
  214. 0xF6DE, /* 0 */
  215. 0x2492, /* 1 */
  216. 0xE7CE, /* 2 */
  217. 0xE79E, /* 3 */
  218. 0xB792, /* 4 */
  219. 0xF39E, /* 5 */
  220. 0xF3DE, /* 6 */
  221. 0xF492, /* 7 */
  222. 0xF7DE, /* 8 */
  223. 0xF79E, /* 9 */
  224. 0x77DA, /* a */
  225. 0xD75C, /* b */
  226. 0xF24E, /* c */
  227. 0xD6DC, /* d */
  228. 0xF34E, /* e */
  229. 0xF348  /* f */
  230. };
  231. unsigned short digit;
  232. int ix, iy;
  233. if ((uvd == NULL) || (frame == NULL))
  234. return;
  235. if (ch >= '0' && ch <= '9')
  236. ch -= '0';
  237. else if (ch >= 'A' && ch <= 'F')
  238. ch = 10 + (ch - 'A');
  239. else if (ch >= 'a' && ch <= 'f')
  240. ch = 10 + (ch - 'a');
  241. else
  242. return;
  243. digit = digits[ch];
  244. for (iy=0; iy < 5; iy++) {
  245. for (ix=0; ix < 3; ix++) {
  246. if (digit & 0x8000) {
  247. if (uvd->paletteBits & (1L << VIDEO_PALETTE_RGB24)) {
  248. /* TODO */ RGB24_PUTPIXEL(frame, x+ix, y+iy, 0xFF, 0xFF, 0xFF);
  249. }
  250. }
  251. digit = digit << 1;
  252. }
  253. }
  254. }
  255. /*
  256.  * usbvideo_OverlayString()
  257.  *
  258.  * History:
  259.  * 01-Feb-2000 Created.
  260.  */
  261. void usbvideo_OverlayString(uvd_t *uvd, usbvideo_frame_t *frame,
  262.     int x, int y, const char *str)
  263. {
  264. while (*str) {
  265. usbvideo_OverlayChar(uvd, frame, x, y, *str);
  266. str++;
  267. x += 4; /* 3 pixels character + 1 space */
  268. }
  269. }
  270. /*
  271.  * usbvideo_OverlayStats()
  272.  *
  273.  * Overlays important debugging information.
  274.  *
  275.  * History:
  276.  * 01-Feb-2000 Created.
  277.  */
  278. void usbvideo_OverlayStats(uvd_t *uvd, usbvideo_frame_t *frame)
  279. {
  280. const int y_diff = 8;
  281. char tmp[16];
  282. int x = 10, y=10;
  283. long i, j, barLength;
  284. const int qi_x1 = 60, qi_y1 = 10;
  285. const int qi_x2 = VIDEOSIZE_X(frame->request) - 10, qi_h = 10;
  286. /* Call the user callback, see if we may proceed after that */
  287. if (VALID_CALLBACK(uvd, overlayHook)) {
  288. if (GET_CALLBACK(uvd, overlayHook)(uvd, frame) < 0)
  289. return;
  290. }
  291. /*
  292.  * We draw a (mostly) hollow rectangle with qi_xxx coordinates.
  293.  * Left edge symbolizes the queue index 0; right edge symbolizes
  294.  * the full capacity of the queue.
  295.  */
  296. barLength = qi_x2 - qi_x1 - 2;
  297. if ((barLength > 10) && (uvd->paletteBits & (1L << VIDEO_PALETTE_RGB24))) {
  298. /* TODO */ long u_lo, u_hi, q_used;
  299. long m_ri, m_wi, m_lo, m_hi;
  300. /*
  301.  * Determine fill zones (used areas of the queue):
  302.  * 0 xxxxxxx u_lo ...... uvd->dp.ri xxxxxxxx u_hi ..... uvd->dp.length
  303.  *
  304.  * if u_lo < 0 then there is no first filler.
  305.  */
  306. q_used = RingQueue_GetLength(&uvd->dp);
  307. if ((uvd->dp.ri + q_used) >= uvd->dp.length) {
  308. u_hi = uvd->dp.length;
  309. u_lo = (q_used + uvd->dp.ri) % uvd->dp.length;
  310. } else {
  311. u_hi = (q_used + uvd->dp.ri);
  312. u_lo = -1;
  313. }
  314. /* Convert byte indices into screen units */
  315. m_ri = qi_x1 + ((barLength * uvd->dp.ri) / uvd->dp.length);
  316. m_wi = qi_x1 + ((barLength * uvd->dp.wi) / uvd->dp.length);
  317. m_lo = (u_lo > 0) ? (qi_x1 + ((barLength * u_lo) / uvd->dp.length)) : -1;
  318. m_hi = qi_x1 + ((barLength * u_hi) / uvd->dp.length);
  319. for (j=qi_y1; j < (qi_y1 + qi_h); j++) {
  320. for (i=qi_x1; i < qi_x2; i++) {
  321. /* Draw border lines */
  322. if ((j == qi_y1) || (j == (qi_y1 + qi_h - 1)) ||
  323.     (i == qi_x1) || (i == (qi_x2 - 1))) {
  324. RGB24_PUTPIXEL(frame, i, j, 0xFF, 0xFF, 0xFF);
  325. continue;
  326. }
  327. /* For all other points the Y coordinate does not matter */
  328. if ((i >= m_ri) && (i <= (m_ri + 3))) {
  329. RGB24_PUTPIXEL(frame, i, j, 0x00, 0xFF, 0x00);
  330. } else if ((i >= m_wi) && (i <= (m_wi + 3))) {
  331. RGB24_PUTPIXEL(frame, i, j, 0xFF, 0x00, 0x00);
  332. } else if ((i < m_lo) || ((i > m_ri) && (i < m_hi)))
  333. RGB24_PUTPIXEL(frame, i, j, 0x00, 0x00, 0xFF);
  334. }
  335. }
  336. }
  337. sprintf(tmp, "%8lx", uvd->stats.frame_num);
  338. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  339. y += y_diff;
  340. sprintf(tmp, "%8lx", uvd->stats.urb_count);
  341. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  342. y += y_diff;
  343. sprintf(tmp, "%8lx", uvd->stats.urb_length);
  344. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  345. y += y_diff;
  346. sprintf(tmp, "%8lx", uvd->stats.data_count);
  347. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  348. y += y_diff;
  349. sprintf(tmp, "%8lx", uvd->stats.header_count);
  350. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  351. y += y_diff;
  352. sprintf(tmp, "%8lx", uvd->stats.iso_skip_count);
  353. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  354. y += y_diff;
  355. sprintf(tmp, "%8lx", uvd->stats.iso_err_count);
  356. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  357. y += y_diff;
  358. sprintf(tmp, "%8x", uvd->vpic.colour);
  359. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  360. y += y_diff;
  361. sprintf(tmp, "%8x", uvd->vpic.hue);
  362. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  363. y += y_diff;
  364. sprintf(tmp, "%8x", uvd->vpic.brightness >> 8);
  365. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  366. y += y_diff;
  367. sprintf(tmp, "%8x", uvd->vpic.contrast >> 12);
  368. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  369. y += y_diff;
  370. sprintf(tmp, "%8d", uvd->vpic.whiteness >> 8);
  371. usbvideo_OverlayString(uvd, frame, x, y, tmp);
  372. y += y_diff;
  373. }
  374. /*
  375.  * usbvideo_ReportStatistics()
  376.  *
  377.  * This procedure prints packet and transfer statistics.
  378.  *
  379.  * History:
  380.  * 14-Jan-2000 Corrected default multiplier.
  381.  */
  382. void usbvideo_ReportStatistics(const uvd_t *uvd)
  383. {
  384. if ((uvd != NULL) && (uvd->stats.urb_count > 0)) {
  385. unsigned long allPackets, badPackets, goodPackets, percent;
  386. allPackets = uvd->stats.urb_count * CAMERA_URB_FRAMES;
  387. badPackets = uvd->stats.iso_skip_count + uvd->stats.iso_err_count;
  388. goodPackets = allPackets - badPackets;
  389. /* Calculate percentage wisely, remember integer limits */
  390. assert(allPackets != 0);
  391. if (goodPackets < (((unsigned long)-1)/100))
  392. percent = (100 * goodPackets) / allPackets;
  393. else
  394. percent = goodPackets / (allPackets / 100);
  395. info("Packet Statistics: Total=%lu. Empty=%lu. Usage=%lu%%",
  396.      allPackets, badPackets, percent);
  397. if (uvd->iso_packet_len > 0) {
  398. unsigned long allBytes, xferBytes;
  399. char multiplier = ' ';
  400. allBytes = allPackets * uvd->iso_packet_len;
  401. xferBytes = uvd->stats.data_count;
  402. assert(allBytes != 0);
  403. if (xferBytes < (((unsigned long)-1)/100))
  404. percent = (100 * xferBytes) / allBytes;
  405. else
  406. percent = xferBytes / (allBytes / 100);
  407. /* Scale xferBytes for easy reading */
  408. if (xferBytes > 10*1024) {
  409. xferBytes /= 1024;
  410. multiplier = 'K';
  411. if (xferBytes > 10*1024) {
  412. xferBytes /= 1024;
  413. multiplier = 'M';
  414. if (xferBytes > 10*1024) {
  415. xferBytes /= 1024;
  416. multiplier = 'G';
  417. if (xferBytes > 10*1024) {
  418. xferBytes /= 1024;
  419. multiplier = 'T';
  420. }
  421. }
  422. }
  423. }
  424. info("Transfer Statistics: Transferred=%lu%cB Usage=%lu%%",
  425.      xferBytes, multiplier, percent);
  426. }
  427. }
  428. }
  429. /*
  430.  * usbvideo_DrawLine()
  431.  *
  432.  * A standard implementation of Bresenham's line drawing algorithm.
  433.  * This procedure is provided primarily for debugging or demo
  434.  * purposes.
  435.  */
  436. void usbvideo_DrawLine(
  437. usbvideo_frame_t *frame,
  438. int x1, int y1,
  439. int x2, int y2,
  440. unsigned char cr, unsigned char cg, unsigned char cb)
  441. {
  442. int i, dx, dy, np, d;
  443. int dinc1, dinc2, x, xinc1, xinc2, y, yinc1, yinc2;
  444. if ((dx = x2 - x1) < 0)
  445. dx = -dx;
  446. if ((dy = y2 - y1) < 0)
  447. dy = -dy;
  448. if (dx >= dy) {
  449. np = dx + 1;
  450. d = (2 * dy) - dx;
  451. dinc1 = dy << 1;
  452. dinc2 = (dy - dx) << 1;
  453. xinc1 = 1;
  454. xinc2 = 1;
  455. yinc1 = 0;
  456. yinc2 = 1;
  457. } else {
  458. np = dy + 1;
  459. d = (2 * dx) - dy;
  460. dinc1 = dx << 1;
  461. dinc2 = (dx - dy) << 1;
  462. xinc1 = 0;
  463. xinc2 = 1;
  464. yinc1 = 1;
  465. yinc2 = 1;
  466. }
  467. /* Make sure x and y move in the right directions */
  468. if (x1 > x2) {
  469. xinc1 = -xinc1;
  470. xinc2 = -xinc2;
  471. }
  472. if (y1 > y2) {
  473. yinc1 = -yinc1;
  474. yinc2 = -yinc2;
  475. }
  476. for (i=0, x=x1, y=y1; i < np; i++) {
  477. if (frame->palette == VIDEO_PALETTE_RGB24) {
  478. /* TODO */ RGB24_PUTPIXEL(frame, x, y, cr, cg, cb);
  479. }
  480. if (d < 0) {
  481. d += dinc1;
  482. x += xinc1;
  483. y += yinc1;
  484. } else {
  485. d += dinc2;
  486. x += xinc2;
  487. y += yinc2;
  488. }
  489. }
  490. }
  491. /*
  492.  * usbvideo_TestPattern()
  493.  *
  494.  * Procedure forms a test pattern (yellow grid on blue background).
  495.  *
  496.  * Parameters:
  497.  * fullframe: if TRUE then entire frame is filled, otherwise the procedure
  498.  *       continues from the current scanline.
  499.  * pmode      0: fill the frame with solid blue color (like on VCR or TV)
  500.  *       1: Draw a colored grid
  501.  *
  502.  * History:
  503.  * 01-Feb-2000 Created.
  504.  */
  505. void usbvideo_TestPattern(uvd_t *uvd, int fullframe, int pmode)
  506. {
  507. static const char proc[] = "usbvideo_TestPattern";
  508. usbvideo_frame_t *frame;
  509. int num_cell = 0;
  510. int scan_length = 0;
  511. static int num_pass = 0;
  512. if (uvd == NULL) {
  513. err("%s: uvd == NULL", proc);
  514. return;
  515. }
  516. if ((uvd->curframe < 0) || (uvd->curframe >= USBVIDEO_NUMFRAMES)) {
  517. err("%s: uvd->curframe=%d.", proc, uvd->curframe);
  518. return;
  519. }
  520. /* Grab the current frame */
  521. frame = &uvd->frame[uvd->curframe];
  522. /* Optionally start at the beginning */
  523. if (fullframe) {
  524. frame->curline = 0;
  525. frame->seqRead_Length = 0;
  526. }
  527. #if 0
  528. { /* For debugging purposes only */
  529. char tmp[20];
  530. usbvideo_VideosizeToString(tmp, sizeof(tmp), frame->request);
  531. info("testpattern: frame=%s", tmp);
  532. }
  533. #endif
  534. /* Form every scan line */
  535. for (; frame->curline < VIDEOSIZE_Y(frame->request); frame->curline++) {
  536. int i;
  537. unsigned char *f = frame->data +
  538. (VIDEOSIZE_X(frame->request) * V4L_BYTES_PER_PIXEL * frame->curline);
  539. for (i=0; i < VIDEOSIZE_X(frame->request); i++) {
  540. unsigned char cb=0x80;
  541. unsigned char cg = 0;
  542. unsigned char cr = 0;
  543. if (pmode == 1) {
  544. if (frame->curline % 32 == 0)
  545. cb = 0, cg = cr = 0xFF;
  546. else if (i % 32 == 0) {
  547. if (frame->curline % 32 == 1)
  548. num_cell++;
  549. cb = 0, cg = cr = 0xFF;
  550. } else {
  551. cb = ((num_cell*7) + num_pass) & 0xFF;
  552. cg = ((num_cell*5) + num_pass*2) & 0xFF;
  553. cr = ((num_cell*3) + num_pass*3) & 0xFF;
  554. }
  555. } else {
  556. /* Just the blue screen */
  557. }
  558. *f++ = cb;
  559. *f++ = cg;
  560. *f++ = cr;
  561. scan_length += 3;
  562. }
  563. }
  564. frame->frameState = FrameState_Done;
  565. frame->seqRead_Length += scan_length;
  566. ++num_pass;
  567. /* We do this unconditionally, regardless of FLAGS_OVERLAY_STATS */
  568. usbvideo_OverlayStats(uvd, frame);
  569. }
  570. /*
  571.  * usbvideo_HexDump()
  572.  *
  573.  * A debugging tool. Prints hex dumps.
  574.  *
  575.  * History:
  576.  * 29-Jul-2000 Added printing of offsets.
  577.  */
  578. void usbvideo_HexDump(const unsigned char *data, int len)
  579. {
  580. const int bytes_per_line = 32;
  581. char tmp[128]; /* 32*3 + 5 */
  582. int i, k;
  583. for (i=k=0; len > 0; i++, len--) {
  584. if (i > 0 && ((i % bytes_per_line) == 0)) {
  585. printk("%sn", tmp);
  586. k=0;
  587. }
  588. if ((i % bytes_per_line) == 0)
  589. k += sprintf(&tmp[k], "%04x: ", i);
  590. k += sprintf(&tmp[k], "%02x ", data[i]);
  591. }
  592. if (k > 0)
  593. printk("%sn", tmp);
  594. }
  595. /* Debugging aid */
  596. void usbvideo_SayAndWait(const char *what)
  597. {
  598. wait_queue_head_t wq;
  599. init_waitqueue_head(&wq);
  600. info("Say: %s", what);
  601. interruptible_sleep_on_timeout (&wq, HZ*3); /* Timeout */
  602. }
  603. /* ******************************************************************** */
  604. static void usbvideo_ClientIncModCount(uvd_t *uvd)
  605. {
  606. static const char proc[] = "usbvideo_ClientIncModCount";
  607. if (uvd == NULL) {
  608. err("%s: uvd == NULL", proc);
  609. return;
  610. }
  611. if (uvd->handle == NULL) {
  612. err("%s: uvd->handle == NULL", proc);
  613. return;
  614. }
  615. if (uvd->handle->md_module == NULL) {
  616. err("%s: uvd->handle->md_module == NULL", proc);
  617. return;
  618. }
  619. __MOD_INC_USE_COUNT(uvd->handle->md_module);
  620. }
  621. static void usbvideo_ClientDecModCount(uvd_t *uvd)
  622. {
  623. static const char proc[] = "usbvideo_ClientDecModCount";
  624. if (uvd == NULL) {
  625. err("%s: uvd == NULL", proc);
  626. return;
  627. }
  628. if (uvd->handle == NULL) {
  629. err("%s: uvd->handle == NULL", proc);
  630. return;
  631. }
  632. if (uvd->handle->md_module == NULL) {
  633. err("%s: uvd->handle->md_module == NULL", proc);
  634. return;
  635. }
  636. __MOD_DEC_USE_COUNT(uvd->handle->md_module);
  637. }
  638. int usbvideo_register(
  639. usbvideo_t **pCams,
  640. const int num_cams,
  641. const int num_extra,
  642. const char *driverName,
  643. const usbvideo_cb_t *cbTbl,
  644. struct module *md )
  645. {
  646. static const char proc[] = "usbvideo_register";
  647. usbvideo_t *cams;
  648. int i, base_size;
  649. /* Check parameters for sanity */
  650. if ((num_cams <= 0) || (pCams == NULL) || (cbTbl == NULL)) {
  651. err("%s: Illegal call", proc);
  652. return -EINVAL;
  653. }
  654. /* Check registration callback - must be set! */
  655. if (cbTbl->probe == NULL) {
  656. err("%s: probe() is required!", proc);
  657. return -EINVAL;
  658. }
  659. base_size = num_cams * sizeof(uvd_t) + sizeof(usbvideo_t);
  660. cams = (usbvideo_t *) kmalloc(base_size, GFP_KERNEL);
  661. if (cams == NULL) {
  662. err("Failed to allocate %d. bytes for usbvideo_t", base_size);
  663. return -ENOMEM;
  664. }
  665. dbg("%s: Allocated $%p (%d. bytes) for %d. cameras",
  666.     proc, cams, base_size, num_cams);
  667. memset(cams, 0, base_size);
  668. /* Copy callbacks, apply defaults for those that are not set */
  669. memmove(&cams->cb, cbTbl, sizeof(cams->cb));
  670. if (cams->cb.getFrame == NULL)
  671. cams->cb.getFrame = usbvideo_GetFrame;
  672. if (cams->cb.disconnect == NULL)
  673. cams->cb.disconnect = usbvideo_Disconnect;
  674. #if USES_PROC_FS
  675. /*
  676.  * If both /proc fs callbacks are NULL then we assume that the driver
  677.  * does not need procfs services at all. Leave them NULL.
  678.  */
  679. cams->uses_procfs = (cams->cb.procfs_read != NULL) || (cams->cb.procfs_write == NULL);
  680. if (cams->uses_procfs) {
  681. if (cams->cb.procfs_read == NULL)
  682. cams->cb.procfs_read = usbvideo_default_procfs_read_proc;
  683. if (cams->cb.procfs_write == NULL)
  684. cams->cb.procfs_write = usbvideo_default_procfs_write_proc;
  685. }
  686. #else /* !USES_PROC_FS */
  687. /* Report a warning so that user knows why there is no /proc entries */
  688. if ((cams->cb.procfs_read != NULL) || (cams->cb.procfs_write == NULL)) {
  689. dbg("%s: /proc fs support requested but not configured!", proc);
  690. }
  691. #endif
  692. cams->num_cameras = num_cams;
  693. cams->cam = (uvd_t *) &cams[1];
  694. cams->md_module = md;
  695. if (cams->md_module == NULL)
  696. warn("%s: module == NULL!", proc);
  697. init_MUTEX(&cams->lock); /* to 1 == available */
  698. for (i = 0; i < num_cams; i++) {
  699. uvd_t *up = &cams->cam[i];
  700. up->handle = cams;
  701. /* Allocate user_data separately because of kmalloc's limits */
  702. if (num_extra > 0) {
  703. up->user_size = num_cams * num_extra;
  704. up->user_data = (char *) kmalloc(up->user_size, GFP_KERNEL);
  705. if (up->user_data == NULL) {
  706. up->user_size = 0;
  707. err("%s: Failed to allocate user_data (%d. bytes)",
  708.     proc, up->user_size);
  709. return -ENOMEM;
  710. }
  711. dbg("%s: Allocated cams[%d].user_data=$%p (%d. bytes)",
  712.      proc, i, up->user_data, up->user_size);
  713. }
  714. }
  715. /*
  716.  * Register ourselves with USB stack.
  717.  */
  718. strcpy(cams->drvName, (driverName != NULL) ? driverName : "Unknown");
  719. cams->usbdrv.name = cams->drvName;
  720. cams->usbdrv.probe = cams->cb.probe;
  721. cams->usbdrv.disconnect = cams->cb.disconnect;
  722. #if USES_PROC_FS
  723. if (cams->uses_procfs) {
  724. dbg("%s: Creating /proc filesystem entries.", proc);
  725. usbvideo_procfs_level1_create(cams);
  726. }
  727. #endif
  728. /*
  729.  * Update global handle to usbvideo. This is very important
  730.  * because probe() can be called before usb_register() returns.
  731.  * If the handle is not yet updated then the probe() will fail.
  732.  */
  733. *pCams = cams;
  734. usb_register(&cams->usbdrv);
  735. return 0;
  736. }
  737. /*
  738.  * usbvideo_Deregister()
  739.  *
  740.  * Procedure frees all usbvideo and user data structures. Be warned that
  741.  * if you had some dynamically allocated components in ->user field then
  742.  * you should free them before calling here.
  743.  */
  744. void usbvideo_Deregister(usbvideo_t **pCams)
  745. {
  746. static const char proc[] = "usbvideo_deregister";
  747. usbvideo_t *cams;
  748. int i;
  749. if (pCams == NULL) {
  750. err("%s: pCams == NULL", proc);
  751. return;
  752. }
  753. cams = *pCams;
  754. if (cams == NULL) {
  755. err("%s: cams == NULL", proc);
  756. return;
  757. }
  758. #if USES_PROC_FS
  759. if (cams->uses_procfs) {
  760. dbg("%s: Deregistering filesystem entries.", proc);
  761. usbvideo_procfs_level1_destroy(cams);
  762. }
  763. #endif
  764. dbg("%s: Deregistering %s driver.", proc, cams->drvName);
  765. usb_deregister(&cams->usbdrv);
  766. dbg("%s: Deallocating cams=$%p (%d. cameras)", proc, cams, cams->num_cameras);
  767. for (i=0; i < cams->num_cameras; i++) {
  768. uvd_t *up = &cams->cam[i];
  769. int warning = 0;
  770. if (up->user_data != NULL) {
  771. if (up->user_size <= 0)
  772. ++warning;
  773. } else {
  774. if (up->user_size > 0)
  775. ++warning;
  776. }
  777. if (warning) {
  778. err("%s: Warning: user_data=$%p user_size=%d.",
  779.     proc, up->user_data, up->user_size);
  780. } else {
  781. dbg("%s: Freeing %d. $%p->user_data=$%p",
  782.     proc, i, up, up->user_data);
  783. kfree(up->user_data);
  784. }
  785. }
  786. /* Whole array was allocated in one chunk */
  787. dbg("%s: Freed %d uvd_t structures",
  788.     proc, cams->num_cameras);
  789. kfree(cams);
  790. *pCams = NULL;
  791. }
  792. /*
  793.  * usbvideo_Disconnect()
  794.  *
  795.  * This procedure stops all driver activity. Deallocation of
  796.  * the interface-private structure (pointed by 'ptr') is done now
  797.  * (if we don't have any open files) or later, when those files
  798.  * are closed. After that driver should be removable.
  799.  *
  800.  * This code handles surprise removal. The uvd->user is a counter which
  801.  * increments on open() and decrements on close(). If we see here that
  802.  * this counter is not 0 then we have a client who still has us opened.
  803.  * We set uvd->remove_pending flag as early as possible, and after that
  804.  * all access to the camera will gracefully fail. These failures should
  805.  * prompt client to (eventually) close the video device, and then - in
  806.  * usbvideo_v4l_close() - we decrement uvd->uvd_used and usage counter.
  807.  *
  808.  * History:
  809.  * 22-Jan-2000 Added polling of MOD_IN_USE to delay removal until all users gone.
  810.  * 27-Jan-2000 Reworked to allow pending disconnects; see xxx_close()
  811.  * 24-May-2000 Corrected to prevent race condition (MOD_xxx_USE_COUNT).
  812.  * 19-Oct-2000 Moved to usbvideo module.
  813.  */
  814. void usbvideo_Disconnect(struct usb_device *dev, void *ptr)
  815. {
  816. static const char proc[] = "usbvideo_Disconnect";
  817. uvd_t *uvd = (uvd_t *) ptr;
  818. int i;
  819. if ((dev == NULL) || (uvd == NULL)) {
  820. err("%s($%p,$%p): Illegal call.", proc, dev, ptr);
  821. return;
  822. }
  823. usbvideo_ClientIncModCount(uvd);
  824. if (uvd->debug > 0)
  825. info("%s(%p,%p.)", proc, dev, ptr);
  826. down(&uvd->lock);
  827. uvd->remove_pending = 1; /* Now all ISO data will be ignored */
  828. /* At this time we ask to cancel outstanding URBs */
  829. usbvideo_StopDataPump(uvd);
  830. for (i=0; i < USBVIDEO_NUMSBUF; i++)
  831. usb_free_urb(uvd->sbuf[i].urb);
  832. usb_dec_dev_use(uvd->dev);
  833. uvd->dev = NULL;         /* USB device is no more */
  834. if (uvd->user)
  835. info("%s: In use, disconnect pending.", proc);
  836. else
  837. usbvideo_CameraRelease(uvd);
  838. up(&uvd->lock);
  839. info("USB camera disconnected.");
  840. usbvideo_ClientDecModCount(uvd);
  841. }
  842. /*
  843.  * usbvideo_CameraRelease()
  844.  *
  845.  * This code does final release of uvd_t. This happens
  846.  * after the device is disconnected -and- all clients
  847.  * closed their files.
  848.  *
  849.  * History:
  850.  * 27-Jan-2000 Created.
  851.  */
  852. void usbvideo_CameraRelease(uvd_t *uvd)
  853. {
  854. static const char proc[] = "usbvideo_CameraRelease";
  855. if (uvd == NULL) {
  856. err("%s: Illegal call", proc);
  857. return;
  858. }
  859. video_unregister_device(&uvd->vdev);
  860. if (uvd->debug > 0)
  861. info("%s: Video unregistered.", proc);
  862. #if USES_PROC_FS
  863. assert(uvd->handle != NULL);
  864. if (uvd->handle->uses_procfs) {
  865. dbg("%s: Removing /proc/%s/ filesystem entries.", proc, uvd->handle->drvName);
  866. usbvideo_procfs_level2_destroy(uvd);
  867. }
  868. #endif
  869. RingQueue_Free(&uvd->dp);
  870. if (VALID_CALLBACK(uvd, userFree))
  871. GET_CALLBACK(uvd, userFree)(uvd);
  872. uvd->uvd_used = 0; /* This is atomic, no need to take mutex */
  873. }
  874. /*
  875.  * usbvideo_find_struct()
  876.  *
  877.  * This code searches the array of preallocated (static) structures
  878.  * and returns index of the first one that isn't in use. Returns -1
  879.  * if there are no free structures.
  880.  *
  881.  * History:
  882.  * 27-Jan-2000 Created.
  883.  */
  884. static int usbvideo_find_struct(usbvideo_t *cams)
  885. {
  886. int u, rv = -1;
  887. if (cams == NULL) {
  888. err("No usbvideo_t handle?");
  889. return -1;
  890. }
  891. down(&cams->lock);
  892. for (u = 0; u < cams->num_cameras; u++) {
  893. uvd_t *uvd = &cams->cam[u];
  894. if (!uvd->uvd_used) /* This one is free */
  895. {
  896. uvd->uvd_used = 1; /* In use now */
  897. init_MUTEX(&uvd->lock); /* to 1 == available */
  898. uvd->dev = NULL;
  899. rv = u;
  900. break;
  901. }
  902. }
  903. up(&cams->lock);
  904. return rv;
  905. }
  906. uvd_t *usbvideo_AllocateDevice(usbvideo_t *cams)
  907. {
  908. int i, devnum;
  909. uvd_t *uvd = NULL;
  910. if (cams == NULL) {
  911. err("No usbvideo_t handle?");
  912. return NULL;
  913. }
  914. devnum = usbvideo_find_struct(cams);
  915. if (devnum == -1) {
  916. err("IBM USB camera driver: Too many devices!");
  917. return NULL;
  918. }
  919. uvd = &cams->cam[devnum];
  920. dbg("Device entry #%d. at $%p", devnum, uvd);
  921. /* Not relying upon caller we increase module counter ourselves */
  922. usbvideo_ClientIncModCount(uvd);
  923. down(&uvd->lock);
  924. for (i=0; i < USBVIDEO_NUMSBUF; i++) {
  925. uvd->sbuf[i].urb = usb_alloc_urb(FRAMES_PER_DESC);
  926. if (uvd->sbuf[i].urb == NULL) {
  927. err("usb_alloc_urb(%d.) failed.", FRAMES_PER_DESC);
  928. uvd->uvd_used = 0;
  929. uvd = NULL;
  930. goto allocate_done;
  931. }
  932. }
  933. uvd->user=0;
  934. uvd->remove_pending = 0;
  935. uvd->last_error = 0;
  936. RingQueue_Initialize(&uvd->dp);
  937. /* Initialize video device structure */
  938. memset(&uvd->vdev, 0, sizeof(uvd->vdev));
  939. i = sprintf(uvd->vdev.name, "%s USB Camera", cams->drvName);
  940. if (i >= sizeof(uvd->vdev.name)) {
  941. err("Wrote too much into uvd->vdev.name, expect trouble!");
  942. }
  943. uvd->vdev.type = VID_TYPE_CAPTURE;
  944. uvd->vdev.hardware = VID_HARDWARE_CPIA;
  945. uvd->vdev.open = usbvideo_v4l_open;
  946. uvd->vdev.close = usbvideo_v4l_close;
  947. uvd->vdev.read = usbvideo_v4l_read;
  948. uvd->vdev.write = usbvideo_v4l_write;
  949. uvd->vdev.ioctl = usbvideo_v4l_ioctl;
  950. uvd->vdev.mmap = usbvideo_v4l_mmap;
  951. uvd->vdev.initialize = usbvideo_v4l_initialize;
  952. /*
  953.  * The client is free to overwrite those because we
  954.  * return control to the client's probe function right now.
  955.  */
  956. allocate_done:
  957. up (&uvd->lock);
  958. usbvideo_ClientDecModCount(uvd);
  959. return uvd;
  960. }
  961. int usbvideo_RegisterVideoDevice(uvd_t *uvd)
  962. {
  963. static const char proc[] = "usbvideo_RegisterVideoDevice";
  964. char tmp1[20], tmp2[20]; /* Buffers for printing */
  965. if (uvd == NULL) {
  966. err("%s: Illegal call.", proc);
  967. return -EINVAL;
  968. }
  969. if (uvd->video_endp == 0) {
  970. info("%s: No video endpoint specified; data pump disabled.", proc);
  971. }
  972. if (uvd->paletteBits == 0) {
  973. err("%s: No palettes specified!", proc);
  974. return -EINVAL;
  975. }
  976. if (uvd->defaultPalette == 0) {
  977. info("%s: No default palette!", proc);
  978. }
  979. uvd->max_frame_size = VIDEOSIZE_X(uvd->canvas) *
  980. VIDEOSIZE_Y(uvd->canvas) * V4L_BYTES_PER_PIXEL;
  981. usbvideo_VideosizeToString(tmp1, sizeof(tmp1), uvd->videosize);
  982. usbvideo_VideosizeToString(tmp2, sizeof(tmp2), uvd->canvas);
  983. if (uvd->debug > 0) {
  984. info("%s: iface=%d. endpoint=$%02x paletteBits=$%08lx",
  985.      proc, uvd->iface, uvd->video_endp, uvd->paletteBits);
  986. }
  987. if (video_register_device(&uvd->vdev, VFL_TYPE_GRABBER, video_nr) == -1) {
  988. err("%s: video_register_device failed", proc);
  989. return -EPIPE;
  990. }
  991. if (uvd->debug > 1) {
  992. info("%s: video_register_device() successful", proc);
  993. }
  994. if (uvd->dev == NULL) {
  995. err("%s: uvd->dev == NULL", proc);
  996. return -EINVAL;
  997. }
  998. info("%s on /dev/video%d: canvas=%s videosize=%s",
  999.      (uvd->handle != NULL) ? uvd->handle->drvName : "???",
  1000.      uvd->vdev.minor, tmp2, tmp1);
  1001. #if USES_PROC_FS
  1002. assert(uvd->handle != NULL);
  1003. if (uvd->handle->uses_procfs) {
  1004. if (uvd->debug > 0) {
  1005. info("%s: Creating /proc/video/%s/ filesystem entries.",
  1006.      proc, uvd->handle->drvName);
  1007. }
  1008. usbvideo_procfs_level2_create(uvd);
  1009. }
  1010. #endif
  1011. usb_inc_dev_use(uvd->dev);
  1012. return 0;
  1013. }
  1014. /* ******************************************************************** */
  1015. int usbvideo_v4l_initialize(struct video_device *dev)
  1016. {
  1017. return 0;
  1018. }
  1019. long usbvideo_v4l_write(struct video_device *dev, const char *buf,
  1020. unsigned long count, int noblock)
  1021. {
  1022. return -EINVAL;
  1023. }
  1024. int usbvideo_v4l_mmap(struct video_device *dev, const char *adr, unsigned long size)
  1025. {
  1026. uvd_t *uvd = (uvd_t *) dev;
  1027. unsigned long start = (unsigned long) adr;
  1028. unsigned long page, pos;
  1029. if (!CAMERA_IS_OPERATIONAL(uvd))
  1030. return -EFAULT;
  1031. if (size > (((2 * uvd->max_frame_size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
  1032. return -EINVAL;
  1033. pos = (unsigned long) uvd->fbuf;
  1034. while (size > 0) {
  1035. page = usbvideo_kvirt_to_pa(pos);
  1036. if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
  1037. return -EAGAIN;
  1038. start += PAGE_SIZE;
  1039. pos += PAGE_SIZE;
  1040. if (size > PAGE_SIZE)
  1041. size -= PAGE_SIZE;
  1042. else
  1043. size = 0;
  1044. }
  1045. return 0;
  1046. }
  1047. /*
  1048.  * usbvideo_v4l_open()
  1049.  *
  1050.  * This is part of Video 4 Linux API. The driver can be opened by one
  1051.  * client only (checks internal counter 'uvdser'). The procedure
  1052.  * then allocates buffers needed for video processing.
  1053.  *
  1054.  * History:
  1055.  * 22-Jan-2000 Rewrote, moved scratch buffer allocation here. Now the
  1056.  *             camera is also initialized here (once per connect), at
  1057.  *             expense of V4L client (it waits on open() call).
  1058.  * 27-Jan-2000 Used USBVIDEO_NUMSBUF as number of URB buffers.
  1059.  * 24-May-2000 Corrected to prevent race condition (MOD_xxx_USE_COUNT).
  1060.  */
  1061. int usbvideo_v4l_open(struct video_device *dev, int flags)
  1062. {
  1063. static const char proc[] = "usbvideo_v4l_open";
  1064. uvd_t *uvd = (uvd_t *) dev;
  1065. const int sb_size = FRAMES_PER_DESC * uvd->iso_packet_len;
  1066. int i, errCode = 0;
  1067. if (uvd->debug > 1)
  1068. info("%s($%p,$%08x", proc, dev, flags);
  1069. usbvideo_ClientIncModCount(uvd);
  1070. down(&uvd->lock);
  1071. if (uvd->user) {
  1072. err("%s: Someone tried to open an already opened device!", proc);
  1073. errCode = -EBUSY;
  1074. } else {
  1075. /* Clear statistics */
  1076. memset(&uvd->stats, 0, sizeof(uvd->stats));
  1077. /* Clean pointers so we know if we allocated something */
  1078. for (i=0; i < USBVIDEO_NUMSBUF; i++)
  1079. uvd->sbuf[i].data = NULL;
  1080. /* Allocate memory for the frame buffers */
  1081. uvd->fbuf_size = USBVIDEO_NUMFRAMES * uvd->max_frame_size;
  1082. uvd->fbuf = usbvideo_rvmalloc(uvd->fbuf_size);
  1083. RingQueue_Allocate(&uvd->dp, 128*1024); /* FIXME #define */
  1084. if ((uvd->fbuf == NULL) ||
  1085.     (!RingQueue_IsAllocated(&uvd->dp))) {
  1086. err("%s: Failed to allocate fbuf or dp", proc);
  1087. errCode = -ENOMEM;
  1088. } else {
  1089. /* Allocate all buffers */
  1090. for (i=0; i < USBVIDEO_NUMFRAMES; i++) {
  1091. uvd->frame[i].frameState = FrameState_Unused;
  1092. uvd->frame[i].data = uvd->fbuf + i*(uvd->max_frame_size);
  1093. /*
  1094.  * Set default sizes in case IOCTL (VIDIOCMCAPTURE)
  1095.  * is not used (using read() instead).
  1096.  */
  1097. uvd->frame[i].canvas = uvd->canvas;
  1098. uvd->frame[i].seqRead_Index = 0;
  1099. }
  1100. for (i=0; i < USBVIDEO_NUMSBUF; i++) {
  1101. uvd->sbuf[i].data = kmalloc(sb_size, GFP_KERNEL);
  1102. if (uvd->sbuf[i].data == NULL) {
  1103. errCode = -ENOMEM;
  1104. break;
  1105. }
  1106. }
  1107. }
  1108. if (errCode != 0) {
  1109. /* Have to free all that memory */
  1110. if (uvd->fbuf != NULL) {
  1111. usbvideo_rvfree(uvd->fbuf, uvd->fbuf_size);
  1112. uvd->fbuf = NULL;
  1113. }
  1114. RingQueue_Free(&uvd->dp);
  1115. for (i=0; i < USBVIDEO_NUMSBUF; i++) {
  1116. if (uvd->sbuf[i].data != NULL) {
  1117. kfree (uvd->sbuf[i].data);
  1118. uvd->sbuf[i].data = NULL;
  1119. }
  1120. }
  1121. }
  1122. }
  1123. /* If so far no errors then we shall start the camera */
  1124. if (errCode == 0) {
  1125. /* Start data pump if we have valid endpoint */
  1126. if (uvd->video_endp != 0)
  1127. errCode = usbvideo_StartDataPump(uvd);
  1128. if (errCode == 0) {
  1129. if (VALID_CALLBACK(uvd, setupOnOpen)) {
  1130. if (uvd->debug > 1)
  1131. info("%s: setupOnOpen callback", proc);
  1132. errCode = GET_CALLBACK(uvd, setupOnOpen)(uvd);
  1133. if (errCode < 0) {
  1134. err("%s: setupOnOpen callback failed (%d.).",
  1135.     proc, errCode);
  1136. } else if (uvd->debug > 1) {
  1137. info("%s: setupOnOpen callback successful", proc);
  1138. }
  1139. }
  1140. if (errCode == 0) {
  1141. uvd->settingsAdjusted = 0;
  1142. if (uvd->debug > 1)
  1143. info("%s: Open succeeded.", proc);
  1144. uvd->user++;
  1145. }
  1146. }
  1147. }
  1148. up(&uvd->lock);
  1149. if (errCode != 0)
  1150. usbvideo_ClientDecModCount(uvd);
  1151. if (uvd->debug > 0)
  1152. info("%s: Returning %d.", proc, errCode);
  1153. return errCode;
  1154. }
  1155. /*
  1156.  * usbvideo_v4l_close()
  1157.  *
  1158.  * This is part of Video 4 Linux API. The procedure
  1159.  * stops streaming and deallocates all buffers that were earlier
  1160.  * allocated in usbvideo_v4l_open().
  1161.  *
  1162.  * History:
  1163.  * 22-Jan-2000 Moved scratch buffer deallocation here.
  1164.  * 27-Jan-2000 Used USBVIDEO_NUMSBUF as number of URB buffers.
  1165.  * 24-May-2000 Moved MOD_DEC_USE_COUNT outside of code that can sleep.
  1166.  */
  1167. void usbvideo_v4l_close(struct video_device *dev)
  1168. {
  1169. static const char proc[] = "usbvideo_v4l_close";
  1170. uvd_t *uvd = (uvd_t *)dev;
  1171. int i;
  1172. if (uvd->debug > 1)
  1173. info("%s($%p)", proc, dev);
  1174. down(&uvd->lock);
  1175. usbvideo_StopDataPump(uvd);
  1176. usbvideo_rvfree(uvd->fbuf, uvd->fbuf_size);
  1177. uvd->fbuf = NULL;
  1178. RingQueue_Free(&uvd->dp);
  1179. for (i=0; i < USBVIDEO_NUMSBUF; i++) {
  1180. kfree(uvd->sbuf[i].data);
  1181. uvd->sbuf[i].data = NULL;
  1182. }
  1183. #if USBVIDEO_REPORT_STATS
  1184. usbvideo_ReportStatistics(uvd);
  1185. #endif    
  1186. uvd->user--;
  1187. if (uvd->remove_pending) {
  1188. if (uvd->debug > 0)
  1189. info("usbvideo_v4l_close: Final disconnect.");
  1190. usbvideo_CameraRelease(uvd);
  1191. }
  1192. up(&uvd->lock);
  1193. usbvideo_ClientDecModCount(uvd);
  1194. if (uvd->debug > 1)
  1195. info("%s: Completed.", proc);
  1196. }
  1197. /*
  1198.  * usbvideo_v4l_ioctl()
  1199.  *
  1200.  * This is part of Video 4 Linux API. The procedure handles ioctl() calls.
  1201.  *
  1202.  * History:
  1203.  * 22-Jan-2000 Corrected VIDIOCSPICT to reject unsupported settings.
  1204.  */
  1205. int usbvideo_v4l_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
  1206. {
  1207. uvd_t *uvd = (uvd_t *)dev;
  1208. if (!CAMERA_IS_OPERATIONAL(uvd))
  1209. return -EFAULT;
  1210. switch (cmd) {
  1211. case VIDIOCGCAP:
  1212. {
  1213. if (copy_to_user(arg, &uvd->vcap, sizeof(uvd->vcap)))
  1214. return -EFAULT;
  1215. return 0;
  1216. }
  1217. case VIDIOCGCHAN:
  1218. {
  1219. if (copy_to_user(arg, &uvd->vchan, sizeof(uvd->vchan)))
  1220. return -EFAULT;
  1221. return 0;
  1222. }
  1223. case VIDIOCSCHAN:
  1224. { /* Not used but we return success */
  1225. int v;
  1226. if (copy_from_user(&v, arg, sizeof(v)))
  1227. return -EFAULT;
  1228. return 0;
  1229. }
  1230. case VIDIOCGPICT:
  1231. {
  1232. if (copy_to_user(arg, &uvd->vpic, sizeof(uvd->vpic)))
  1233. return -EFAULT;
  1234. return 0;
  1235. }
  1236. case VIDIOCSPICT:
  1237. {
  1238. struct video_picture tmp;
  1239. /*
  1240.  * Use temporary 'video_picture' structure to preserve our
  1241.  * own settings (such as color depth, palette) that we
  1242.  * aren't allowing everyone (V4L client) to change.
  1243.  */
  1244. if (copy_from_user(&tmp, arg, sizeof(tmp)))
  1245. return -EFAULT;
  1246. uvd->vpic.brightness = tmp.brightness;
  1247. uvd->vpic.hue = tmp.hue;
  1248. uvd->vpic.colour = tmp.colour;
  1249. uvd->vpic.contrast = tmp.contrast;
  1250. uvd->settingsAdjusted = 0; /* Will force new settings */
  1251. return 0;
  1252. }
  1253. case VIDIOCSWIN:
  1254. {
  1255. struct video_window vw;
  1256. if (copy_from_user(&vw, arg, sizeof(vw)))
  1257. return -EFAULT;
  1258. if (vw.flags)
  1259. return -EINVAL;
  1260. if (vw.clipcount)
  1261. return -EINVAL;
  1262. if (vw.width != VIDEOSIZE_X(uvd->canvas))
  1263. return -EINVAL;
  1264. if (vw.height != VIDEOSIZE_Y(uvd->canvas))
  1265. return -EINVAL;
  1266. return 0;
  1267. }
  1268. case VIDIOCGWIN:
  1269. {
  1270. struct video_window vw;
  1271. vw.x = 0;
  1272. vw.y = 0;
  1273. vw.width = VIDEOSIZE_X(uvd->canvas);
  1274. vw.height = VIDEOSIZE_Y(uvd->canvas);
  1275. vw.chromakey = 0;
  1276. if (VALID_CALLBACK(uvd, getFPS))
  1277. vw.flags = GET_CALLBACK(uvd, getFPS)(uvd);
  1278. else 
  1279. vw.flags = 10; /* FIXME: do better! */
  1280. if (copy_to_user(arg, &vw, sizeof(vw)))
  1281. return -EFAULT;
  1282. return 0;
  1283. }
  1284. case VIDIOCGMBUF:
  1285. {
  1286. struct video_mbuf vm;
  1287. memset(&vm, 0, sizeof(vm));
  1288. vm.size = uvd->max_frame_size * 2;
  1289. vm.frames = 2;
  1290. vm.offsets[0] = 0;
  1291. vm.offsets[1] = uvd->max_frame_size;
  1292. if (copy_to_user((void *)arg, (void *)&vm, sizeof(vm)))
  1293. return -EFAULT;
  1294. return 0;
  1295. }
  1296. case VIDIOCMCAPTURE:
  1297. {
  1298. struct video_mmap vm;
  1299. if (copy_from_user((void *)&vm, (void *)arg, sizeof(vm))) {
  1300. err("VIDIOCMCAPTURE: copy_from_user() failed.");
  1301. return -EFAULT;
  1302. }
  1303. if (uvd->debug >= 1) {
  1304. info("VIDIOCMCAPTURE: frame=%d. size=%dx%d, format=%d.",
  1305.     vm.frame, vm.width, vm.height, vm.format);
  1306. }
  1307. /*
  1308.  * Check if the requested size is supported. If the requestor
  1309.  * requests too big a frame then we may be tricked into accessing
  1310.  * outside of own preallocated frame buffer (in uvd->frame).
  1311.  * This will cause oops or a security hole. Theoretically, we
  1312.  * could only clamp the size down to acceptable bounds, but then
  1313.  * we'd need to figure out how to insert our smaller buffer into
  1314.  * larger caller's buffer... this is not an easy question. So we
  1315.  * here just flatly reject too large requests, assuming that the
  1316.  * caller will resubmit with smaller size. Callers should know
  1317.  * what size we support (returned by VIDIOCGCAP). However vidcat,
  1318.  * for one, does not care and allows to ask for any size.
  1319.  */
  1320. if ((vm.width > VIDEOSIZE_X(uvd->canvas)) ||
  1321.     (vm.height > VIDEOSIZE_Y(uvd->canvas))) {
  1322. if (uvd->debug > 0) {
  1323. info("VIDIOCMCAPTURE: Size=%dx%d too large; "
  1324.      "allowed only up to %ldx%ld", vm.width, vm.height,
  1325.      VIDEOSIZE_X(uvd->canvas), VIDEOSIZE_Y(uvd->canvas));
  1326. }
  1327. return -EINVAL;
  1328. }
  1329. /* Check if the palette is supported */
  1330. if (((1L << vm.format) & uvd->paletteBits) == 0) {
  1331. if (uvd->debug > 0) {
  1332. info("VIDIOCMCAPTURE: format=%d. not supported"
  1333.      " (paletteBits=$%08lx)",
  1334.      vm.format, uvd->paletteBits);
  1335. }
  1336. return -EINVAL;
  1337. }
  1338. if ((vm.frame != 0) && (vm.frame != 1)) {
  1339. err("VIDIOCMCAPTURE: vm.frame=%d. !E [0,1]", vm.frame);
  1340. return -EINVAL;
  1341. }
  1342. if (uvd->frame[vm.frame].frameState == FrameState_Grabbing) {
  1343. /* Not an error - can happen */
  1344. }
  1345. uvd->frame[vm.frame].request = VIDEOSIZE(vm.width, vm.height);
  1346. uvd->frame[vm.frame].palette = vm.format;
  1347. /* Mark it as ready */
  1348. uvd->frame[vm.frame].frameState = FrameState_Ready;
  1349. return usbvideo_NewFrame(uvd, vm.frame);
  1350. }
  1351. case VIDIOCSYNC:
  1352. {
  1353. int frameNum, ret;
  1354. if (copy_from_user((void *)&frameNum, arg, sizeof(frameNum))) {
  1355. err("VIDIOCSYNC: copy_from_user() failed.");
  1356. return -EFAULT;
  1357. }
  1358. if(frameNum < 0 || frameNum >= USBVIDEO_NUMFRAMES)
  1359. return -EINVAL;
  1360. if (uvd->debug >= 1)
  1361. info("VIDIOCSYNC: syncing to frame %d.", frameNum);
  1362. if (uvd->flags & FLAGS_NO_DECODING)
  1363. ret = usbvideo_GetFrame(uvd, frameNum);
  1364. else if (VALID_CALLBACK(uvd, getFrame)) {
  1365. ret = GET_CALLBACK(uvd, getFrame)(uvd, frameNum);
  1366. if ((ret < 0) && (uvd->debug >= 1)) {
  1367. err("VIDIOCSYNC: getFrame() returned %d.", ret);
  1368. }
  1369. } else {
  1370. err("VIDIOCSYNC: getFrame is not set");
  1371. ret = -EFAULT;
  1372. }
  1373. /*
  1374.  * The frame is in FrameState_Done_Hold state. Release it
  1375.  * right now because its data is already mapped into
  1376.  * the user space and it's up to the application to
  1377.  * make use of it until it asks for another frame.
  1378.  */
  1379. uvd->frame[frameNum].frameState = FrameState_Unused;
  1380. return ret;
  1381. }
  1382. case VIDIOCGFBUF:
  1383. {
  1384. struct video_buffer vb;
  1385. memset(&vb, 0, sizeof(vb));
  1386. vb.base = NULL; /* frame buffer not supported, not used */
  1387. if (copy_to_user((void *)arg, (void *)&vb, sizeof(vb)))
  1388. return -EFAULT;
  1389.   return 0;
  1390.   }
  1391. case VIDIOCKEY:
  1392. return 0;
  1393. case VIDIOCCAPTURE:
  1394. return -EINVAL;
  1395. case VIDIOCSFBUF:
  1396. case VIDIOCGTUNER:
  1397. case VIDIOCSTUNER:
  1398. case VIDIOCGFREQ:
  1399. case VIDIOCSFREQ:
  1400. case VIDIOCGAUDIO:
  1401. case VIDIOCSAUDIO:
  1402. return -EINVAL;
  1403. default:
  1404. return -ENOIOCTLCMD;
  1405. }
  1406. return 0;
  1407. }
  1408. /*
  1409.  * usbvideo_v4l_read()
  1410.  *
  1411.  * This is mostly boring stuff. We simply ask for a frame and when it
  1412.  * arrives copy all the video data from it into user space. There is
  1413.  * no obvious need to override this method.
  1414.  *
  1415.  * History:
  1416.  * 20-Oct-2000 Created.
  1417.  * 01-Nov-2000 Added mutex (uvd->lock).
  1418.  */
  1419. long usbvideo_v4l_read(struct video_device *dev, char *buf, unsigned long count, int noblock)
  1420. {
  1421. static const char proc[] = "usbvideo_v4l_read";
  1422. uvd_t *uvd = (uvd_t *) dev;
  1423. int frmx = -1;
  1424. usbvideo_frame_t *frame;
  1425. if (!CAMERA_IS_OPERATIONAL(uvd) || (buf == NULL))
  1426. return -EFAULT;
  1427. if (uvd->debug >= 1)
  1428. info("%s: %ld. bytes, noblock=%d.", proc, count, noblock);
  1429. down(&uvd->lock);
  1430. /* See if a frame is completed, then use it. */
  1431. if ((uvd->frame[0].frameState == FrameState_Done) ||
  1432.     (uvd->frame[0].frameState == FrameState_Done_Hold) ||
  1433.     (uvd->frame[0].frameState == FrameState_Error)) {
  1434. frmx = 0;
  1435. } else if ((uvd->frame[1].frameState >= FrameState_Done) ||
  1436.    (uvd->frame[1].frameState == FrameState_Done_Hold) ||
  1437.    (uvd->frame[1].frameState >= FrameState_Done)) {
  1438. frmx = 1;
  1439. }
  1440. /* FIXME: If we don't start a frame here then who ever does? */
  1441. if (noblock && (frmx == -1)) {
  1442. count = -EAGAIN;
  1443. goto read_done;
  1444. }
  1445. /*
  1446.  * If no FrameState_Done, look for a FrameState_Grabbing state.
  1447.  * See if a frame is in process (grabbing), then use it.
  1448.  * We will need to wait until it becomes cooked, of course.
  1449.  */
  1450. if (frmx == -1) {
  1451. if (uvd->frame[0].frameState == FrameState_Grabbing)
  1452. frmx = 0;
  1453. else if (uvd->frame[1].frameState == FrameState_Grabbing)
  1454. frmx = 1;
  1455. }
  1456. /*
  1457.  * If no frame is active, start one. We don't care which one
  1458.  * it will be, so #0 is as good as any.
  1459.  * In read access mode we don't have convenience of VIDIOCMCAPTURE
  1460.  * to specify the requested palette (video format) on per-frame
  1461.  * basis. This means that we have to return data in -some- format
  1462.  * and just hope that the client knows what to do with it.
  1463.  * The default format is configured in uvd->defaultPalette field
  1464.  * as one of VIDEO_PALETTE_xxx values. We stuff it into the new
  1465.  * frame and initiate the frame filling process.
  1466.  */
  1467. if (frmx == -1) {
  1468. if (uvd->defaultPalette == 0) {
  1469. err("%s: No default palette; don't know what to do!", proc);
  1470. count = -EFAULT;
  1471. goto read_done;
  1472. }
  1473. frmx = 0;
  1474. /*
  1475.  * We have no per-frame control over video size.
  1476.  * Therefore we only can use whatever size was
  1477.  * specified as default.
  1478.  */
  1479. uvd->frame[frmx].request = uvd->videosize;
  1480. uvd->frame[frmx].palette = uvd->defaultPalette;
  1481. uvd->frame[frmx].frameState = FrameState_Ready;
  1482. usbvideo_NewFrame(uvd, frmx);
  1483. /* Now frame 0 is supposed to start filling... */
  1484. }
  1485. /*
  1486.  * Get a pointer to the active frame. It is either previously
  1487.  * completed frame or frame in progress but not completed yet.
  1488.  */
  1489. frame = &uvd->frame[frmx];
  1490. /*
  1491.  * Sit back & wait until the frame gets filled and postprocessed.
  1492.  * If we fail to get the picture [in time] then return the error.
  1493.  * In this call we specify that we want the frame to be waited for,
  1494.  * postprocessed and switched into FrameState_Done_Hold state. This
  1495.  * state is used to hold the frame as "fully completed" between
  1496.  * subsequent partial reads of the same frame.
  1497.  */
  1498. if (frame->frameState != FrameState_Done_Hold) {
  1499. long rv = -EFAULT;
  1500. if (uvd->flags & FLAGS_NO_DECODING)
  1501. rv = usbvideo_GetFrame(uvd, frmx);
  1502. else if (VALID_CALLBACK(uvd, getFrame))
  1503. rv = GET_CALLBACK(uvd, getFrame)(uvd, frmx);
  1504. else
  1505. err("getFrame is not set");
  1506. if ((rv != 0) || (frame->frameState != FrameState_Done_Hold)) {
  1507. count = rv;
  1508. goto read_done;
  1509. }
  1510. }
  1511. /*
  1512.  * Copy bytes to user space. We allow for partial reads, which
  1513.  * means that the user application can request read less than
  1514.  * the full frame size. It is up to the application to issue
  1515.  * subsequent calls until entire frame is read.
  1516.  *
  1517.  * First things first, make sure we don't copy more than we
  1518.  * have - even if the application wants more. That would be
  1519.  * a big security embarassment!
  1520.  */
  1521.  
  1522. if (count + frame->seqRead_Index < count)
  1523. {
  1524. count = -EINVAL;
  1525. goto read_done;
  1526. }
  1527. if ((count + frame->seqRead_Index) > frame->seqRead_Length)
  1528. count = frame->seqRead_Length - frame->seqRead_Index;
  1529. /*
  1530.  * Copy requested amount of data to user space. We start
  1531.  * copying from the position where we last left it, which
  1532.  * will be zero for a new frame (not read before).
  1533.  */
  1534. if (copy_to_user(buf, frame->data + frame->seqRead_Index, count)) {
  1535. count = -EFAULT;
  1536. goto read_done;
  1537. }
  1538. /* Update last read position */
  1539. frame->seqRead_Index += count;
  1540. if (uvd->debug >= 1) {
  1541. err("%s: {copy} count used=%ld, new seqRead_Index=%ld",
  1542. proc, count, frame->seqRead_Index);
  1543. }
  1544. /* Finally check if the frame is done with and "release" it */
  1545. if (frame->seqRead_Index >= frame->seqRead_Length) {
  1546. /* All data has been read */
  1547. frame->seqRead_Index = 0;
  1548. /* Mark it as available to be used again. */
  1549. uvd->frame[frmx].frameState = FrameState_Unused;
  1550. if (usbvideo_NewFrame(uvd, frmx ? 0 : 1)) {
  1551. err("%s: usbvideo_NewFrame failed.", proc);
  1552. }
  1553. }
  1554. read_done:
  1555. up(&uvd->lock);
  1556. return count;
  1557. }
  1558. /*
  1559.  * Make all of the blocks of data contiguous
  1560.  */
  1561. static int usbvideo_CompressIsochronous(uvd_t *uvd, struct urb *urb)
  1562. {
  1563. char *cdata;
  1564. int i, totlen = 0;
  1565. for (i = 0; i < urb->number_of_packets; i++) {
  1566. int n = urb->iso_frame_desc[i].actual_length;
  1567. int st = urb->iso_frame_desc[i].status;
  1568. cdata = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
  1569. /* Detect and ignore errored packets */
  1570. if (st < 0) {
  1571. if (uvd->debug >= 1)
  1572. err("Data error: packet=%d. len=%d. status=%d.", i, n, st);
  1573. uvd->stats.iso_err_count++;
  1574. continue;
  1575. }
  1576. /* Detect and ignore empty packets */
  1577. if (n <= 0) {
  1578. uvd->stats.iso_skip_count++;
  1579. continue;
  1580. }
  1581. totlen += n; /* Little local accounting */
  1582. RingQueue_Enqueue(&uvd->dp, cdata, n);
  1583. }
  1584. return totlen;
  1585. }
  1586. static void usbvideo_IsocIrq(struct urb *urb)
  1587. {
  1588. int i, len;
  1589. uvd_t *uvd = urb->context;
  1590. /* We don't want to do anything if we are about to be removed! */
  1591. if (!CAMERA_IS_OPERATIONAL(uvd))
  1592. return;
  1593. #if 0
  1594. if (urb->actual_length > 0) {
  1595. info("urb=$%p status=%d. errcount=%d. length=%d.",
  1596.      urb, urb->status, urb->error_count, urb->actual_length);
  1597. } else {
  1598. static int c = 0;
  1599. if (c++ % 100 == 0)
  1600. info("No Isoc data");
  1601. }
  1602. #endif
  1603. if (!uvd->streaming) {
  1604. if (uvd->debug >= 1)
  1605. info("Not streaming, but interrupt!");
  1606. return;
  1607. }
  1608. uvd->stats.urb_count++;
  1609. if (urb->actual_length <= 0)
  1610. goto urb_done_with;
  1611. /* Copy the data received into ring queue */
  1612. len = usbvideo_CompressIsochronous(uvd, urb);
  1613. uvd->stats.urb_length = len;
  1614. if (len <= 0)
  1615. goto urb_done_with;
  1616. /* Here we got some data */
  1617. uvd->stats.data_count += len;
  1618. RingQueue_WakeUpInterruptible(&uvd->dp);
  1619. urb_done_with:
  1620. for (i = 0; i < FRAMES_PER_DESC; i++) {
  1621. urb->iso_frame_desc[i].status = 0;
  1622. urb->iso_frame_desc[i].actual_length = 0;
  1623. }
  1624. return;
  1625. }
  1626. /*
  1627.  * usbvideo_StartDataPump()
  1628.  *
  1629.  * History:
  1630.  * 27-Jan-2000 Used ibmcam->iface, ibmcam->ifaceAltActive instead
  1631.  *             of hardcoded values. Simplified by using for loop,
  1632.  *             allowed any number of URBs.
  1633.  */
  1634. int usbvideo_StartDataPump(uvd_t *uvd)
  1635. {
  1636. static const char proc[] = "usbvideo_StartDataPump";
  1637. struct usb_device *dev = uvd->dev;
  1638. int i, errFlag;
  1639. if (uvd->debug > 1)
  1640. info("%s($%p)", proc, uvd);
  1641. if (!CAMERA_IS_OPERATIONAL(uvd)) {
  1642. err("%s: Camera is not operational",proc);
  1643. return -EFAULT;
  1644. }
  1645. uvd->curframe = -1;
  1646. /* Alternate interface 1 is is the biggest frame size */
  1647. i = usb_set_interface(dev, uvd->iface, uvd->ifaceAltActive);
  1648. if (i < 0) {
  1649. err("%s: usb_set_interface error", proc);
  1650. uvd->last_error = i;
  1651. return -EBUSY;
  1652. }
  1653. if (VALID_CALLBACK(uvd, videoStart))
  1654. GET_CALLBACK(uvd, videoStart)(uvd);
  1655. else 
  1656. err("%s: videoStart not set", proc);
  1657. /* We double buffer the Iso lists */
  1658. for (i=0; i < USBVIDEO_NUMSBUF; i++) {
  1659. int j, k;
  1660. struct urb *urb = uvd->sbuf[i].urb;
  1661. urb->dev = dev;
  1662. urb->context = uvd;
  1663. urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp);
  1664. urb->transfer_flags = USB_ISO_ASAP;
  1665. urb->transfer_buffer = uvd->sbuf[i].data;
  1666. urb->complete = usbvideo_IsocIrq;
  1667. urb->number_of_packets = FRAMES_PER_DESC;
  1668. urb->transfer_buffer_length = uvd->iso_packet_len * FRAMES_PER_DESC;
  1669. for (j=k=0; j < FRAMES_PER_DESC; j++, k += uvd->iso_packet_len) {
  1670. urb->iso_frame_desc[j].offset = k;
  1671. urb->iso_frame_desc[j].length = uvd->iso_packet_len;
  1672. }
  1673. }
  1674. /* Link URBs into a ring so that they invoke each other infinitely */
  1675. for (i=0; i < USBVIDEO_NUMSBUF; i++) {
  1676. if ((i+1) < USBVIDEO_NUMSBUF)
  1677. uvd->sbuf[i].urb->next = uvd->sbuf[i+1].urb;
  1678. else
  1679. uvd->sbuf[i].urb->next = uvd->sbuf[0].urb;
  1680. }
  1681. /* Submit all URBs */
  1682. for (i=0; i < USBVIDEO_NUMSBUF; i++) {
  1683. errFlag = usb_submit_urb(uvd->sbuf[i].urb);
  1684. if (errFlag)
  1685. err("%s: usb_submit_isoc(%d) ret %d", proc, i, errFlag);
  1686. }
  1687. uvd->streaming = 1;
  1688. if (uvd->debug > 1)
  1689. info("%s: streaming=1 video_endp=$%02x", proc, uvd->video_endp);
  1690. return 0;
  1691. }
  1692. /*
  1693.  * usbvideo_StopDataPump()
  1694.  *
  1695.  * This procedure stops streaming and deallocates URBs. Then it
  1696.  * activates zero-bandwidth alt. setting of the video interface.
  1697.  *
  1698.  * History:
  1699.  * 22-Jan-2000 Corrected order of actions to work after surprise removal.
  1700.  * 27-Jan-2000 Used uvd->iface, uvd->ifaceAltInactive instead of hardcoded values.
  1701.  */
  1702. void usbvideo_StopDataPump(uvd_t *uvd)
  1703. {
  1704. static const char proc[] = "usbvideo_StopDataPump";
  1705. int i, j;
  1706. if (uvd->debug > 1)
  1707. info("%s($%p)", proc, uvd);
  1708. if ((uvd == NULL) || (!uvd->streaming) || (uvd->dev == NULL))
  1709. return;
  1710. /* Unschedule all of the iso td's */
  1711. for (i=0; i < USBVIDEO_NUMSBUF; i++) {
  1712. j = usb_unlink_urb(uvd->sbuf[i].urb);
  1713. if (j < 0)
  1714. err("%s: usb_unlink_urb() error %d.", proc, j);
  1715. }
  1716. if (uvd->debug > 1)
  1717. info("%s: streaming=0", proc);
  1718. uvd->streaming = 0;
  1719. if (!uvd->remove_pending) {
  1720. /* Invoke minidriver's magic to stop the camera */
  1721. if (VALID_CALLBACK(uvd, videoStop))
  1722. GET_CALLBACK(uvd, videoStop)(uvd);
  1723. else 
  1724. err("%s: videoStop not set" ,proc);
  1725. /* Set packet size to 0 */
  1726. j = usb_set_interface(uvd->dev, uvd->iface, uvd->ifaceAltInactive);
  1727. if (j < 0) {
  1728. err("%s: usb_set_interface() error %d.", proc, j);
  1729. uvd->last_error = j;
  1730. }
  1731. }
  1732. }
  1733. /*
  1734.  * usbvideo_NewFrame()
  1735.  *
  1736.  * History:
  1737.  * 29-Mar-00 Added copying of previous frame into the current one.
  1738.  * 6-Aug-00  Added model 3 video sizes, removed redundant width, height.
  1739.  */
  1740. int usbvideo_NewFrame(uvd_t *uvd, int framenum)
  1741. {
  1742. usbvideo_frame_t *frame;
  1743. int n;
  1744. if (uvd->debug > 1)
  1745. info("usbvideo_NewFrame($%p,%d.)", uvd, framenum);
  1746. /* If we're not grabbing a frame right now and the other frame is */
  1747. /*  ready to be grabbed into, then use it instead */
  1748. if (uvd->curframe != -1)
  1749. return 0;
  1750. /* If necessary we adjust picture settings between frames */
  1751. if (!uvd->settingsAdjusted) {
  1752. if (VALID_CALLBACK(uvd, adjustPicture))
  1753. GET_CALLBACK(uvd, adjustPicture)(uvd);
  1754. uvd->settingsAdjusted = 1;
  1755. }
  1756. n = (framenum - 1 + USBVIDEO_NUMFRAMES) % USBVIDEO_NUMFRAMES;
  1757. if (uvd->frame[n].frameState == FrameState_Ready)
  1758. framenum = n;
  1759. frame = &uvd->frame[framenum];
  1760. frame->frameState = FrameState_Grabbing;
  1761. frame->scanstate = ScanState_Scanning;
  1762. frame->seqRead_Length = 0; /* Accumulated in xxx_parse_data() */
  1763. frame->deinterlace = Deinterlace_None;
  1764. frame->flags = 0; /* No flags yet, up to minidriver (or us) to set them */
  1765. uvd->curframe = framenum;
  1766. /*
  1767.  * Normally we would want to copy previous frame into the current one
  1768.  * before we even start filling it with data; this allows us to stop
  1769.  * filling at any moment; top portion of the frame will be new and
  1770.  * bottom portion will stay as it was in previous frame. If we don't
  1771.  * do that then missing chunks of video stream will result in flickering
  1772.  * portions of old data whatever it was before.
  1773.  *
  1774.  * If we choose not to copy previous frame (to, for example, save few
  1775.  * bus cycles - the frame can be pretty large!) then we have an option
  1776.  * to clear the frame before using. If we experience losses in this
  1777.  * mode then missing picture will be black (no flickering).
  1778.  *
  1779.  * Finally, if user chooses not to clean the current frame before
  1780.  * filling it with data then the old data will be visible if we fail
  1781.  * to refill entire frame with new data.
  1782.  */
  1783. if (!(uvd->flags & FLAGS_SEPARATE_FRAMES)) {
  1784. /* This copies previous frame into this one to mask losses */
  1785. memmove(frame->data, uvd->frame[1-framenum].data, uvd->max_frame_size);
  1786. } else {
  1787. if (uvd->flags & FLAGS_CLEAN_FRAMES) {
  1788. /* This provides a "clean" frame but slows things down */
  1789. memset(frame->data, 0, uvd->max_frame_size);
  1790. }
  1791. }
  1792. return 0;
  1793. }
  1794. /*
  1795.  * usbvideo_CollectRawData()
  1796.  *
  1797.  * This procedure can be used instead of 'processData' callback if you
  1798.  * only want to dump the raw data from the camera into the output
  1799.  * device (frame buffer). You can look at it with V4L client, but the
  1800.  * image will be unwatchable. The main purpose of this code and of the
  1801.  * mode FLAGS_NO_DECODING is debugging and capturing of datastreams from
  1802.  * new, unknown cameras. This procedure will be automatically invoked
  1803.  * instead of the specified callback handler when uvd->flags has bit
  1804.  * FLAGS_NO_DECODING set. Therefore, any regular build of any driver
  1805.  * based on usbvideo can use this feature at any time.
  1806.  */
  1807. void usbvideo_CollectRawData(uvd_t *uvd, usbvideo_frame_t *frame)
  1808. {
  1809. int n;
  1810. assert(uvd != NULL);
  1811. assert(frame != NULL);
  1812. /* Try to move data from queue into frame buffer */
  1813. n = RingQueue_GetLength(&uvd->dp);
  1814. if (n > 0) {
  1815. int m;
  1816. /* See how much space we have left */
  1817. m = uvd->max_frame_size - frame->seqRead_Length;
  1818. if (n > m)
  1819. n = m;
  1820. /* Now move that much data into frame buffer */
  1821. RingQueue_Dequeue(
  1822. &uvd->dp,
  1823. frame->data + frame->seqRead_Length,
  1824. m);
  1825. frame->seqRead_Length += m;
  1826. }
  1827. /* See if we filled the frame */
  1828. if (frame->seqRead_Length >= uvd->max_frame_size) {
  1829. frame->frameState = FrameState_Done;
  1830. uvd->curframe = -1;
  1831. uvd->stats.frame_num++;
  1832. }
  1833. }
  1834. int usbvideo_GetFrame(uvd_t *uvd, int frameNum)
  1835. {
  1836. static const char proc[] = "usbvideo_GetFrame";
  1837. usbvideo_frame_t *frame = &uvd->frame[frameNum];
  1838. if (uvd->debug >= 2)
  1839. info("%s($%p,%d.)", proc, uvd, frameNum);
  1840. switch (frame->frameState) {
  1841.         case FrameState_Unused:
  1842. if (uvd->debug >= 2)
  1843. info("%s: FrameState_Unused", proc);
  1844. return -EINVAL;
  1845.         case FrameState_Ready:
  1846.         case FrameState_Grabbing:
  1847.         case FrameState_Error:
  1848.         {
  1849. int ntries, signalPending;
  1850. redo:
  1851. if (!CAMERA_IS_OPERATIONAL(uvd)) {
  1852. if (uvd->debug >= 2)
  1853. info("%s: Camera is not operational (1)", proc);
  1854. return -EIO;
  1855. }
  1856. ntries = 0; 
  1857. do {
  1858. RingQueue_InterruptibleSleepOn(&uvd->dp);
  1859. signalPending = signal_pending(current);
  1860. if (!CAMERA_IS_OPERATIONAL(uvd)) {
  1861. if (uvd->debug >= 2)
  1862. info("%s: Camera is not operational (2)", proc);
  1863. return -EIO;
  1864. }
  1865. assert(uvd->fbuf != NULL);
  1866. if (signalPending) {
  1867. if (uvd->debug >= 2)
  1868. info("%s: Signal=$%08x", proc, signalPending);
  1869. if (uvd->flags & FLAGS_RETRY_VIDIOCSYNC) {
  1870. usbvideo_TestPattern(uvd, 1, 0);
  1871. uvd->curframe = -1;
  1872. uvd->stats.frame_num++;
  1873. if (uvd->debug >= 2)
  1874. info("%s: Forced test pattern screen", proc);
  1875. return 0;
  1876. } else {
  1877. /* Standard answer: Interrupted! */
  1878. if (uvd->debug >= 2)
  1879. info("%s: Interrupted!", proc);
  1880. return -EINTR;
  1881. }
  1882. } else {
  1883. /* No signals - we just got new data in dp queue */
  1884. if (uvd->flags & FLAGS_NO_DECODING)
  1885. usbvideo_CollectRawData(uvd, frame);
  1886. else if (VALID_CALLBACK(uvd, processData))
  1887. GET_CALLBACK(uvd, processData)(uvd, frame);
  1888. else 
  1889. err("%s: processData not set", proc);
  1890. }
  1891. } while (frame->frameState == FrameState_Grabbing);
  1892. if (uvd->debug >= 2) {
  1893. info("%s: Grabbing done; state=%d. (%lu. bytes)",
  1894.      proc, frame->frameState, frame->seqRead_Length);
  1895. }
  1896. if (frame->frameState == FrameState_Error) {
  1897. int ret = usbvideo_NewFrame(uvd, frameNum);
  1898. if (ret < 0) {
  1899. err("%s: usbvideo_NewFrame() failed (%d.)", proc, ret);
  1900. return ret;
  1901. }
  1902. goto redo;
  1903. }
  1904. /* Note that we fall through to meet our destiny below */
  1905.         }
  1906.         case FrameState_Done:
  1907. /*
  1908.  * Do all necessary postprocessing of data prepared in
  1909.  * "interrupt" code and the collecting code above. The
  1910.  * frame gets marked as FrameState_Done by queue parsing code.
  1911.  * This status means that we collected enough data and
  1912.  * most likely processed it as we went through. However
  1913.  * the data may need postprocessing, such as deinterlacing
  1914.  * or picture adjustments implemented in software (horror!)
  1915.  *
  1916.  * As soon as the frame becomes "final" it gets promoted to
  1917.  * FrameState_Done_Hold status where it will remain until the
  1918.  * caller consumed all the video data from the frame. Then
  1919.  * the empty shell of ex-frame is thrown out for dogs to eat.
  1920.  * But we, worried about pets, will recycle the frame!
  1921.  */
  1922. uvd->stats.frame_num++;
  1923. if ((uvd->flags & FLAGS_NO_DECODING) == 0) {
  1924. if (VALID_CALLBACK(uvd, postProcess))
  1925. GET_CALLBACK(uvd, postProcess)(uvd, frame);
  1926. if (frame->flags & USBVIDEO_FRAME_FLAG_SOFTWARE_CONTRAST)
  1927. usbvideo_SoftwareContrastAdjustment(uvd, frame);
  1928. }
  1929. frame->frameState = FrameState_Done_Hold;
  1930. if (uvd->debug >= 2)
  1931. info("%s: Entered FrameState_Done_Hold state.", proc);
  1932. return 0;
  1933. case FrameState_Done_Hold:
  1934. /*
  1935.  * We stay in this state indefinitely until someone external,
  1936.  * like ioctl() or read() call finishes digesting the frame
  1937.  * data. Then it will mark the frame as FrameState_Unused and
  1938.  * it will be released back into the wild to roam freely.
  1939.  */
  1940. if (uvd->debug >= 2)
  1941. info("%s: FrameState_Done_Hold state.", proc);
  1942. return 0;
  1943. }
  1944. /* Catch-all for other cases. We shall not be here. */
  1945. err("%s: Invalid state %d.", proc, frame->frameState);
  1946. frame->frameState = FrameState_Unused;
  1947. return 0;
  1948. }
  1949. /*
  1950.  * usbvideo_DeinterlaceFrame()
  1951.  *
  1952.  * This procedure deinterlaces the given frame. Some cameras produce
  1953.  * only half of scanlines - sometimes only even lines, sometimes only
  1954.  * odd lines. The deinterlacing method is stored in frame->deinterlace
  1955.  * variable.
  1956.  *
  1957.  * Here we scan the frame vertically and replace missing scanlines with
  1958.  * average between surrounding ones - before and after. If we have no
  1959.  * line above then we just copy next line. Similarly, if we need to
  1960.  * create a last line then preceding line is used.
  1961.  */
  1962. void usbvideo_DeinterlaceFrame(uvd_t *uvd, usbvideo_frame_t *frame)
  1963. {
  1964. if ((uvd == NULL) || (frame == NULL))
  1965. return;
  1966. if ((frame->deinterlace == Deinterlace_FillEvenLines) ||
  1967.     (frame->deinterlace == Deinterlace_FillOddLines))
  1968. {
  1969. const int v4l_linesize = VIDEOSIZE_X(frame->request) * V4L_BYTES_PER_PIXEL;
  1970. int i = (frame->deinterlace == Deinterlace_FillEvenLines) ? 0 : 1;
  1971. for (; i < VIDEOSIZE_Y(frame->request); i += 2) {
  1972. const unsigned char *fs1, *fs2;
  1973. unsigned char *fd;
  1974. int ip, in, j; /* Previous and next lines */
  1975. /*
  1976.  * Need to average lines before and after 'i'.
  1977.  * If we go out of bounds seeking those lines then
  1978.  * we point back to existing line.
  1979.  */
  1980. ip = i - 1; /* First, get rough numbers */
  1981. in = i + 1;
  1982. /* Now validate */
  1983. if (ip < 0)
  1984. ip = in;
  1985. if (in >= VIDEOSIZE_Y(frame->request))
  1986. in = ip;
  1987. /* Sanity check */
  1988. if ((ip < 0) || (in < 0) ||
  1989.     (ip >= VIDEOSIZE_Y(frame->request)) ||
  1990.     (in >= VIDEOSIZE_Y(frame->request)))
  1991. {
  1992. err("Error: ip=%d. in=%d. req.height=%ld.",
  1993.     ip, in, VIDEOSIZE_Y(frame->request));
  1994. break;
  1995. }
  1996. /* Now we need to average lines 'ip' and 'in' to produce line 'i' */
  1997. fs1 = frame->data + (v4l_linesize * ip);
  1998. fs2 = frame->data + (v4l_linesize * in);
  1999. fd = frame->data + (v4l_linesize * i);
  2000. /* Average lines around destination */
  2001. for (j=0; j < v4l_linesize; j++) {
  2002. fd[j] = (unsigned char)((((unsigned) fs1[j]) +
  2003.  ((unsigned)fs2[j])) >> 1);
  2004. }
  2005. }
  2006. }
  2007. /* Optionally display statistics on the screen */
  2008. if (uvd->flags & FLAGS_OVERLAY_STATS)
  2009. usbvideo_OverlayStats(uvd, frame);
  2010. }
  2011. /*
  2012.  * usbvideo_SoftwareContrastAdjustment()
  2013.  *
  2014.  * This code adjusts the contrast of the frame, assuming RGB24 format.
  2015.  * As most software image processing, this job is CPU-intensive.
  2016.  * Get a camera that supports hardware adjustment!
  2017.  *
  2018.  * History:
  2019.  * 09-Feb-2001  Created.
  2020.  */
  2021. void usbvideo_SoftwareContrastAdjustment(uvd_t *uvd, usbvideo_frame_t *frame)
  2022. {
  2023. static const char proc[] = "usbvideo_SoftwareContrastAdjustment";
  2024. int i, j, v4l_linesize;
  2025. signed long adj;
  2026. const int ccm = 128; /* Color correction median - see below */
  2027. if ((uvd == NULL) || (frame == NULL)) {
  2028. err("%s: Illegal call.", proc);
  2029. return;
  2030. }
  2031. adj = (uvd->vpic.contrast - 0x8000) >> 8; /* -128..+127 = -ccm..+(ccm-1)*/
  2032. RESTRICT_TO_RANGE(adj, -ccm, ccm+1);
  2033. if (adj == 0) {
  2034. /* In rare case of no adjustment */
  2035. return;
  2036. }
  2037. v4l_linesize = VIDEOSIZE_X(frame->request) * V4L_BYTES_PER_PIXEL;
  2038. for (i=0; i < VIDEOSIZE_Y(frame->request); i++) {
  2039. unsigned char *fd = frame->data + (v4l_linesize * i);
  2040. for (j=0; j < v4l_linesize; j++) {
  2041. signed long v = (signed long) fd[j];
  2042. /* Magnify up to 2 times, reduce down to zero */
  2043. v = 128 + ((ccm + adj) * (v - 128)) / ccm;
  2044. RESTRICT_TO_RANGE(v, 0, 0xFF); /* Must flatten tails */
  2045. fd[j] = (unsigned char) v;
  2046. }
  2047. }
  2048. }
  2049. /*
  2050.  * /proc interface
  2051.  *
  2052.  * We will be creating directories and entries under /proc/video using
  2053.  * external 'video_proc_entry' directory which is exported by videodev.o
  2054.  * module. Within that directory we will create $driver/ directory to
  2055.  * uniquely and uniformly refer to our specific $driver. Within that
  2056.  * directory we will finally create an entry that is named after the
  2057.  * video device node - video3, for example. The format of that file
  2058.  * is determined by callbacks that the minidriver may provide. If no
  2059.  * callbacks are provided (neither read nor write) then we don't create
  2060.  * the entry.
  2061.  *
  2062.  * Here is a sample directory entry: /proc/video/ibmcam/video3
  2063.  *
  2064.  * The "file" video3 (in example above) is readable and writeable, in
  2065.  * theory. If the minidriver provides callbacks to do reading and
  2066.  * writing then both those procedures are supported. However if the
  2067.  * driver leaves callbacks in default (NULL) state the default
  2068.  * read and write handlers are used. The default read handler reports
  2069.  * that the driver does not support /proc fs. The default write handler
  2070.  * returns error code on any write attempt.
  2071.  */
  2072. #if USES_PROC_FS
  2073. extern struct proc_dir_entry *video_proc_entry;
  2074. static void usbvideo_procfs_level1_create(usbvideo_t *ut)
  2075. {
  2076. static const char proc[] = "usbvideo_procfs_level1_create";
  2077. if (ut == NULL) {
  2078. err("%s: ut == NULL", proc);
  2079. return;
  2080. }
  2081. if (video_proc_entry == NULL) {
  2082. err("%s: /proc/video/ doesn't exist.", proc);
  2083. return;
  2084. }
  2085. ut->procfs_dEntry = create_proc_entry(ut->drvName, S_IFDIR, video_proc_entry);
  2086. if (ut->procfs_dEntry != NULL) {
  2087. if (ut->md_module != NULL)
  2088. ut->procfs_dEntry->owner = ut->md_module;
  2089. } else {
  2090. err("%s: Unable to initialize /proc/video/%s", proc, ut->drvName);
  2091. }
  2092. }
  2093. static void usbvideo_procfs_level1_destroy(usbvideo_t *ut)
  2094. {
  2095. static const char proc[] = "usbvideo_procfs_level1_destroy";
  2096. if (ut == NULL) {
  2097. err("%s: ut == NULL", proc);
  2098. return;
  2099. }
  2100. if (ut->procfs_dEntry != NULL) {
  2101. remove_proc_entry(ut->drvName, video_proc_entry);
  2102. ut->procfs_dEntry = NULL;
  2103. }
  2104. }
  2105. static void usbvideo_procfs_level2_create(uvd_t *uvd)
  2106. {
  2107. static const char proc[] = "usbvideo_procfs_level2_create";
  2108. if (uvd == NULL) {
  2109. err("%s: uvd == NULL", proc);
  2110. return;
  2111. }
  2112. assert(uvd->handle != NULL);
  2113. if (uvd->handle->procfs_dEntry == NULL) {
  2114. err("%s: uvd->handle->procfs_dEntry == NULL", proc);
  2115. return;
  2116. }
  2117. sprintf(uvd->videoName, "video%d", uvd->vdev.minor);
  2118. uvd->procfs_vEntry = create_proc_entry(
  2119. uvd->videoName,
  2120. S_IFREG | S_IRUGO | S_IWUSR,
  2121. uvd->handle->procfs_dEntry);
  2122. if (uvd->procfs_vEntry != NULL) {
  2123. uvd->procfs_vEntry->data = uvd;
  2124. uvd->procfs_vEntry->read_proc = uvd->handle->cb.procfs_read;
  2125. uvd->procfs_vEntry->write_proc = uvd->handle->cb.procfs_write;
  2126. } else {
  2127. err("%s: Failed to create entry "%s"", proc, uvd->videoName);
  2128. }
  2129. }
  2130. static void usbvideo_procfs_level2_destroy(uvd_t *uvd)
  2131. {
  2132. static const char proc[] = "usbvideo_procfs_level2_destroy";
  2133. if (uvd == NULL) {
  2134. err("%s: uvd == NULL", proc);
  2135. return;
  2136. }
  2137. if (uvd->procfs_vEntry != NULL) {
  2138. remove_proc_entry(uvd->videoName, uvd->procfs_vEntry);
  2139. uvd->procfs_vEntry = NULL;
  2140. }
  2141. }
  2142. static int usbvideo_default_procfs_read_proc(
  2143. char *page, char **start, off_t off, int count,
  2144. int *eof, void *data)
  2145. {
  2146. char *out = page;
  2147. int len;
  2148. /* Stay under PAGE_SIZE or else */
  2149. out += sprintf(out, "This driver does not support /proc services.n");
  2150. len = out - page;
  2151. len -= off;
  2152. if (len < count) {
  2153. *eof = 1;
  2154. if (len <= 0)
  2155. return 0;
  2156. } else
  2157. len = count;
  2158. *start = page + off;
  2159. return len;
  2160. }
  2161. static int usbvideo_default_procfs_write_proc(
  2162. struct file *file, const char *buffer, 
  2163. unsigned long count, void *data)
  2164. {
  2165. return -EINVAL;
  2166. }
  2167. #endif /* USES_PROC_FS */
  2168. MODULE_LICENSE("GPL");