videodev.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:49k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  * Video for Linux Two
  3.  *
  4.  * A generic video device interface for the LINUX operating system
  5.  * using a set of device structures/vectors for low level operations.
  6.  *
  7.  * This file replaces the videodev.c file that comes with the
  8.  * regular kernel distribution.
  9.  *
  10.  * This program is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU General Public License
  12.  * as published by the Free Software Foundation; either version
  13.  * 2 of the License, or (at your option) any later version.
  14.  *
  15.  * Author: Bill Dirks <bdirks@pacbell.net>
  16.  * based on code by Alan Cox, <alan@cymru.net>
  17.  *
  18.  * gcc -c -O2 -Wall -DMODULE videodev.c
  19.  */
  20. #ifndef __KERNEL__
  21. #define __KERNEL__
  22. #endif
  23. #include <linux/config.h>
  24. #ifndef EXPORT_SYMTAB
  25. #define EXPORT_SYMTAB
  26. #endif
  27. #include <linux/module.h>
  28. #include <linux/types.h>
  29. #include <linux/kernel.h>
  30. #include <linux/sched.h>
  31. #include <linux/mm.h>
  32. #include <linux/poll.h>
  33. #include <linux/string.h>
  34. #include <linux/errno.h>
  35. #include <linux/videodev2.h>
  36. #include <linux/proc_fs.h>
  37. #include <asm/uaccess.h>
  38. #include <asm/system.h>
  39. #include <asm/pgtable.h>
  40. #include <asm/io.h>
  41. #ifdef CONFIG_KMOD
  42. #include <linux/kmod.h>
  43. #endif
  44. #ifndef min
  45. #define min(a,b) (((a)<(b))?(a):(b))
  46. #endif
  47. static int v4l2_major = 81;
  48. MODULE_PARM(v4l2_major, "i");
  49. #define V4L2_NUM_DEVICES 256 
  50. /*
  51.  * Active devices 
  52.  */
  53. static struct v4l2_device *v4l2_device[V4L2_NUM_DEVICES];
  54. static struct v4l2_clock *masterclock;
  55. /*
  56.  * D E V I C E   O P E R A T I O N S
  57.  *
  58.  */
  59. /*
  60.  * Open a video device.
  61.  */
  62. static int
  63. video_open(struct inode *inode, struct file *file)
  64. {
  65. unsigned int minor = MINOR(inode->i_rdev);
  66. struct v4l2_device *vfl;
  67. int err;
  68. if (minor >= V4L2_NUM_DEVICES)
  69. return -ENODEV;
  70. vfl = v4l2_device[minor];
  71. if (vfl == NULL)
  72. {
  73. #ifdef CONFIG_KMOD /*  KMOD code by Erik Walthinsen  */
  74. char modname[20];
  75. sprintf(modname, "char-major-%d-%d", v4l2_major, minor);
  76. request_module(modname);
  77. vfl = v4l2_device[minor];
  78. if (vfl == NULL)
  79. #endif
  80. return -ENODEV;
  81. }
  82. if (vfl->open == NULL)
  83. return -ENODEV;
  84. err = vfl->open(vfl, file->f_flags, &file->private_data);
  85. if (err == 0 && file->private_data == NULL)
  86. {
  87. printk(KERN_ERR"V4L2: Device returned NULL open idn");
  88. err = -ENODEV;
  89. }
  90. if (err == 0)
  91. ++vfl->busy;
  92. return err;
  93. }
  94. /*
  95.  * Last close of a struct file
  96.  */
  97. static int
  98. video_release(struct inode *inode, struct file *file)
  99. {
  100. struct v4l2_device *vfl = v4l2_device[MINOR(inode->i_rdev)];
  101. if (vfl->close)
  102. vfl->close(file->private_data);
  103. file->private_data = NULL;
  104. if (vfl->busy)
  105. --vfl->busy;
  106. return 0;
  107. }
  108. /*
  109.  * Read from a video device
  110.  */
  111. static ssize_t
  112. video_read(struct file *file,
  113.    char *buf, size_t count, loff_t *ppos)
  114. {
  115. struct v4l2_device *vfl =
  116. v4l2_device[MINOR(file->f_dentry->d_inode->i_rdev)];
  117. if (vfl->read)
  118. return vfl->read(file->private_data, buf, count,
  119.  file->f_flags & O_NONBLOCK);
  120. return -EINVAL;
  121. }
  122. /*
  123.  * Write to a video device
  124.  */
  125. static ssize_t
  126. video_write(struct file *file,
  127.     const char *buf, size_t count, loff_t *ppos)
  128. {
  129. struct v4l2_device *vfl =
  130. v4l2_device[MINOR(file->f_dentry->d_inode->i_rdev)];
  131. if (vfl->write)
  132. return vfl->write(file->private_data, buf, count,
  133.   file->f_flags & O_NONBLOCK);
  134. return 0;
  135. }
  136. /*
  137.  * IO Control
  138.  */
  139. static void
  140. fill_ctrl_category(struct v4l2_queryctrl *qc);
  141. static int
  142. translate_ioctl(struct file *file,
  143. struct v4l2_device *vfl,
  144. void *per_open_data,
  145. int cmd,
  146. void *arg);
  147. static int
  148. video_ioctl(struct inode *inode, struct file *file,
  149.     unsigned int cmd, unsigned long arg)
  150. {
  151. struct v4l2_device *vfl = v4l2_device[MINOR(inode->i_rdev)];
  152. char targ[V4L2_MAX_IOCTL_SIZE];
  153. void *parg = (void *)arg;
  154. int err = -EINVAL;
  155. if (vfl->ioctl == NULL)
  156. return -EINVAL;
  157. /*  Copy arguments into temp kernel buffer  */
  158. switch (_IOC_DIR(cmd))
  159. {
  160. case _IOC_NONE:
  161. parg = (void *)arg;
  162. break;
  163. case _IOC_WRITE:
  164. case (_IOC_WRITE | _IOC_READ):
  165. if (_IOC_SIZE(cmd) > sizeof(targ))
  166. {
  167. printk(KERN_ERR"V4L2: ioctl 0x%08x arguments are "
  168.        "too big, > %dn", cmd, sizeof(targ));
  169. break;/*  Arguments are too big.  */
  170. }
  171. if (copy_from_user(targ, (void *)arg, _IOC_SIZE(cmd)))
  172. {
  173. printk(KERN_INFO"V4L2: Fault on write ioctl 0x%08x "
  174.        "copying data from user buffern", cmd);
  175. return -EFAULT;
  176. }
  177. parg = targ;
  178. break;
  179. case _IOC_READ:
  180. parg = targ;
  181. break;
  182. }
  183. /*  Fill in the category for pre-defined controls  */
  184. if (cmd == VIDIOC_QUERYCTRL)
  185. fill_ctrl_category((struct v4l2_queryctrl *)parg);
  186. /*  Try passing it to the driver first  */
  187. err = vfl->ioctl(file->private_data, cmd, parg);
  188. /*  If the driver doesn't recognize it and it's an old ioctl,
  189.     pass it through the translation layer.  */
  190. if (err == -ENOIOCTLCMD && _IOC_TYPE(cmd) == 'v')
  191. {
  192. err = translate_ioctl(file, vfl, file->private_data, 
  193.       cmd, parg);
  194. }
  195. /*  Copy results into user buffer  */
  196. switch (_IOC_DIR(cmd))
  197. {
  198. case _IOC_READ:
  199. case (_IOC_WRITE | _IOC_READ):
  200. if (parg == targ &&
  201.     copy_to_user((void *)arg, parg, _IOC_SIZE(cmd)))
  202. {
  203. printk(KERN_INFO"V4L2: Fault on read ioctl 0x%08x "
  204.        "copying results to user buffern", cmd);
  205. return -EFAULT;
  206. }
  207. break;
  208. }
  209. if (err != -ENOIOCTLCMD)
  210. return err;
  211. /*  Handle ioctls not recognized by the driver  */
  212. return -EINVAL;
  213. }
  214. /*
  215.  * Memory mapping
  216.  */ 
  217. static int
  218. video_mmap(struct file *file, struct vm_area_struct *vma)
  219. {
  220. struct v4l2_device *vfl =
  221. v4l2_device[MINOR(file->f_dentry->d_inode->i_rdev)];
  222. int err;
  223. if (vfl->mmap)
  224. {
  225. vma->vm_file = file;
  226. /*  For v4l compatibility. v4l apps typically pass zero */
  227. /*  for the offset, so replace it with the real value */
  228. /*  saved from before */
  229. if (vma->vm_offset == 0 && vfl->ioctl)
  230. {
  231. struct v4l2_buffer buf;
  232. buf.index = 0;
  233. buf.type = V4L2_BUF_TYPE_CAPTURE;
  234. if (vfl->ioctl(file->private_data,
  235.        VIDIOC_QUERYBUF, &buf) == 0)
  236. vma->vm_offset = buf.offset;
  237. }
  238. err = vfl->mmap(file->private_data, vma);
  239. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,2,3)
  240. /* This is now done in the kernel, as it should be */
  241.   if (err == 0 && vma->vm_file != NULL)
  242. ++vma->vm_file->f_count;
  243. #endif
  244. return err;
  245. }
  246. return -ENODEV;
  247. }
  248. /*
  249.  * Poll (select()) support
  250.  */
  251. static unsigned int
  252. video_poll(struct file *file, poll_table *table)
  253. {
  254. struct v4l2_device *vfl =
  255. v4l2_device[MINOR(file->f_dentry->d_inode->i_rdev)];
  256. if (vfl->poll)
  257. return vfl->poll(file->private_data, file, table);
  258. return POLLERR;
  259. }
  260. /*
  261.  * Not used.
  262.  */ 
  263. static long long
  264. video_lseek(struct file *file,
  265.     long long offset, int origin)
  266. {
  267. return -ESPIPE;
  268. }
  269. /*
  270.  * CONTROL CATEGORIES
  271.  */
  272. static void
  273. fill_ctrl_category(struct v4l2_queryctrl *qc)
  274. {
  275. if ((qc->id >= V4L2_CID_BRIGHTNESS &&
  276.      qc->id <= V4L2_CID_HUE) ||
  277.     (qc->id >= V4L2_CID_BLACK_LEVEL &&
  278.      qc->id <= V4L2_CID_LASTP1-1))
  279. {
  280. qc->category = V4L2_CTRL_CAT_VIDEO;
  281. strcpy(qc->catname, "Video");
  282. }
  283. if ((qc->id >= V4L2_CID_AUDIO_VOLUME &&
  284.      qc->id <= V4L2_CID_AUDIO_LOUDNESS))
  285. {
  286. qc->category = V4L2_CTRL_CAT_AUDIO;
  287. strcpy(qc->catname, "Audio");
  288. }
  289. if ((qc->id >= V4L2_CID_EFFECT_BASE &&
  290.      qc->id <= V4L2_CID_EFFECT_BASE + 10000))
  291. {
  292. qc->category = V4L2_CTRL_CAT_EFFECT;
  293. strcpy(qc->catname, "Effect");
  294. }
  295. strcpy(qc->catname, "Private");
  296. }
  297. /*
  298.  * B A C K W A R D   C O M P A T I B I L I T Y
  299.  *
  300.  * This code allows applications written for the original API to
  301.  * work with drivers that only understand the new API.
  302.  */
  303. static int
  304. get_v4l_control(struct v4l2_device *vfl,
  305. void *context,
  306. int cid)
  307. {
  308. struct v4l2_queryctrl qctrl2;
  309. struct v4l2_control ctrl2;
  310. int err;
  311. qctrl2.id = cid;
  312. err = vfl->ioctl(context, VIDIOC_QUERYCTRL, &qctrl2);
  313. if (err == 0)
  314. {
  315. ctrl2.id = qctrl2.id;
  316. vfl->ioctl(context, VIDIOC_G_CTRL, &ctrl2);
  317. return ((ctrl2.value - qctrl2.minimum) * 65535
  318.  + (qctrl2.maximum - qctrl2.minimum) / 2)
  319. / (qctrl2.maximum - qctrl2.minimum);
  320. }
  321. return 0;
  322. }
  323. static int
  324. set_v4l_control(struct v4l2_device *vfl,
  325. void *context,
  326. int cid,
  327. int value)
  328. {
  329. struct v4l2_queryctrl qctrl2;
  330. struct v4l2_control ctrl2;
  331. int err;
  332. qctrl2.id = cid;
  333. err = vfl->ioctl(context, VIDIOC_QUERYCTRL, &qctrl2);
  334. if (err == 0)
  335. {
  336. if (value < 0)
  337. value = 0;
  338. if (value > 65535)
  339. value = 65535;
  340. ctrl2.id = qctrl2.id;
  341. ctrl2.value = 
  342. (value * (qctrl2.maximum - qctrl2.minimum)
  343.  + 32767)
  344. / 65535;
  345. vfl->ioctl(context, VIDIOC_S_CTRL, &ctrl2);
  346. }
  347. return 0;
  348. }
  349. static int
  350. find_tuner(struct v4l2_device *vfl,
  351.    void *context,
  352.    int n)
  353. {
  354. struct v4l2_input inp2;
  355. int i;
  356. int err;
  357. /*  Find the input number of the n'th tuner  */
  358. for (i = 0; i < 100/*arbitrary*/; ++i)
  359. {
  360. inp2.index = i;
  361. err = vfl->ioctl(context, VIDIOC_ENUMINPUT, &inp2);
  362. if (err < 0)
  363. break;
  364. if (inp2.type != V4L2_INPUT_TYPE_TUNER)
  365. continue;
  366. if (n == 0)
  367. break;
  368. --n;
  369. }
  370. if (err < 0)
  371. return err;
  372. return i;
  373. }
  374. static int
  375. palette_to_pixelformat(int palette)
  376. {
  377. int pixelformat = 0;
  378. switch (palette)
  379. {
  380. case VIDEO_PALETTE_GREY:
  381. pixelformat = V4L2_PIX_FMT_GREY;
  382. break;
  383. case VIDEO_PALETTE_RGB555:
  384. pixelformat = V4L2_PIX_FMT_RGB555;
  385. break;
  386. case VIDEO_PALETTE_RGB565:
  387. pixelformat = V4L2_PIX_FMT_RGB565;
  388. break;
  389. case VIDEO_PALETTE_RGB24:
  390. pixelformat = V4L2_PIX_FMT_BGR24;
  391. break;
  392. case VIDEO_PALETTE_RGB32:
  393. pixelformat = V4L2_PIX_FMT_BGR32;
  394. break;
  395. case VIDEO_PALETTE_YUYV:
  396. case VIDEO_PALETTE_YUV422:
  397. pixelformat = V4L2_PIX_FMT_YUYV;
  398. break;
  399. case VIDEO_PALETTE_UYVY:
  400. pixelformat = V4L2_PIX_FMT_UYVY;
  401. break;
  402. case VIDEO_PALETTE_YUV420:
  403. pixelformat = V4L2_PIX_FMT_YUV420;
  404. break;
  405. case VIDEO_PALETTE_YUV422P:
  406. pixelformat = V4L2_PIX_FMT_YVU422P;
  407. break;
  408. case VIDEO_PALETTE_YUV411P:
  409. pixelformat = V4L2_PIX_FMT_YVU411P;
  410. break;
  411. }
  412. return pixelformat;
  413. }
  414. static int
  415. pixelformat_to_palette(int pixelformat)
  416. {
  417. int palette = 0;
  418. switch (pixelformat)
  419. {
  420. case V4L2_PIX_FMT_GREY:
  421. palette = VIDEO_PALETTE_GREY;
  422. break;
  423. case V4L2_PIX_FMT_RGB555:
  424. palette = VIDEO_PALETTE_RGB555;
  425. break;
  426. case V4L2_PIX_FMT_RGB565:
  427. palette = VIDEO_PALETTE_RGB565;
  428. break;
  429. case V4L2_PIX_FMT_BGR24:
  430. palette = VIDEO_PALETTE_RGB24;
  431. break;
  432. case V4L2_PIX_FMT_BGR32:
  433. palette = VIDEO_PALETTE_RGB32;
  434. break;
  435. case V4L2_PIX_FMT_YUYV:
  436. palette = VIDEO_PALETTE_YUYV;
  437. break;
  438. case V4L2_PIX_FMT_UYVY:
  439. palette = VIDEO_PALETTE_UYVY;
  440. break;
  441. case V4L2_PIX_FMT_YUV420:
  442. palette = VIDEO_PALETTE_YUV420;
  443. break;
  444. case V4L2_PIX_FMT_YVU422P:
  445. palette = VIDEO_PALETTE_YUV422P;
  446. break;
  447. case V4L2_PIX_FMT_YVU411P:
  448. palette = VIDEO_PALETTE_YUV411P;
  449. break;
  450. }
  451. return palette;
  452. }
  453. /*  Do an 'in' (wait for input) select on a single file descriptor  */
  454. /*  This stuff plaigarized from linux/fs/select.c     */
  455. #define __FD_IN(fds, n) (fds->in + n)
  456. #define BIT(i) (1UL << ((i)&(__NFDBITS-1)))
  457. #define SET(i,m) (*(m) |= (i))
  458. #ifndef HAVE_DO_SELECT
  459. /*  Note: This code, inside the #ifndef HAVE_DO_SELECT ... #endif,
  460.     is copied from fs/select.c, and is only included
  461.     here because do_select() is not exported to modules. In the future
  462.     export do_select() to modules and delete this code down to the
  463.     #endif. Thank you.
  464. */
  465. #include <linux/smp_lock.h>
  466. #include <linux/file.h>
  467. #define BITS(fds, n) (*__FD_IN(fds, n))
  468. #define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
  469. #define POLLIN_SET (POLLRDNORM | POLLRDBAND | POLLIN | POLLHUP | POLLERR)
  470. #define ISSET(i,m) (((i)&*(m)) != 0)
  471. static void free_wait(poll_table * p)
  472. {
  473.         struct poll_table_entry * entry;
  474.         poll_table *old;
  475.         while (p) {
  476.                 entry = p->entry + p->nr;
  477.                 while (p->nr > 0) {
  478.                         p->nr--;
  479.                         entry--;
  480.                         remove_wait_queue(entry->wait_address,&entry->wait);
  481.                         fput(entry->filp);
  482.                 }
  483.                 old = p;
  484.                 p = p->next;
  485.                 free_page((unsigned long) old);
  486.         }
  487. }
  488. static int 
  489. my_do_select(int n, fd_set_bits *fds, long *timeout)
  490. {
  491. poll_table *wait_table, *wait;
  492. int retval, i, off;
  493. long __timeout = *timeout;
  494. wait = wait_table = NULL;
  495. if (__timeout) {
  496. wait_table = (poll_table *) __get_free_page(GFP_KERNEL);
  497. if (!wait_table)
  498. return -ENOMEM;
  499. wait_table->nr = 0;
  500. wait_table->entry = (struct poll_table_entry *)(wait_table + 1);
  501. wait_table->next = NULL;
  502. wait = wait_table;
  503. }
  504. lock_kernel();
  505. // retval = max_select_fd(n, fds);
  506. //if (retval < 0)
  507. // goto out;
  508. //n = retval;
  509. retval = 0;
  510. for (;;) {
  511. current->state = TASK_INTERRUPTIBLE;
  512. for (i = 0 ; i < n; i++) {
  513. unsigned long bit = BIT(i);
  514. unsigned long mask;
  515. struct file *file;
  516. off = i / __NFDBITS;
  517. if (!(bit & BITS(fds, off)))
  518. continue;
  519. /*
  520.  * The poll_wait routine will increment f_count if
  521.  * the file is added to the wait table, so we don't
  522.  * need to increment it now.
  523.  */
  524. file = fcheck(i);
  525. mask = POLLNVAL;
  526. if (file) {
  527. mask = DEFAULT_POLLMASK;
  528. if (file->f_op && file->f_op->poll)
  529. mask = file->f_op->poll(file, wait);
  530. }
  531. if ((mask & POLLIN_SET) && ISSET(bit, __FD_IN(fds,off))) {
  532. retval++;
  533. wait = NULL;
  534. }
  535. }
  536. wait = NULL;
  537. if (retval || !__timeout || signal_pending(current))
  538. break;
  539. __timeout = schedule_timeout(__timeout);
  540. }
  541. current->state = TASK_RUNNING;
  542. //out:
  543. if (*timeout)
  544. free_wait(wait_table);
  545. /*
  546.  * Up-to-date the caller timeout.
  547.  */
  548. *timeout = __timeout;
  549. unlock_kernel();
  550. return retval;
  551. }
  552. #endif // HAVE_DO_SELECT
  553. static int
  554. simple_select(struct file *file)
  555. {
  556. fd_set_bits fds;
  557. char *bits;
  558. long timeout;
  559. int i, fd, n, ret, size;
  560. for (i = 0; i < current->files->max_fds; ++i)
  561. if (file == current->files->fd[i])
  562. break;
  563. if (i == current->files->max_fds)
  564. return -EINVAL;
  565. fd = i;
  566. n = fd + 1;
  567. timeout = MAX_SCHEDULE_TIMEOUT;
  568. /*
  569.  * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
  570.  * since we used fdset we need to allocate memory in units of
  571.  * long-words. 
  572.  */
  573. ret = -ENOMEM;
  574. size = FDS_BYTES(n);
  575. bits = kmalloc(6 * size, GFP_KERNEL);
  576. if (!bits)
  577. goto out_nofds;
  578. fds.in      = (unsigned long *)  bits;
  579. fds.out     = (unsigned long *) (bits +   size);
  580. fds.ex      = (unsigned long *) (bits + 2*size);
  581. fds.res_in  = (unsigned long *) (bits + 3*size);
  582. fds.res_out = (unsigned long *) (bits + 4*size);
  583. fds.res_ex  = (unsigned long *) (bits + 5*size);
  584. /*  All zero except our one file descriptor bit, for input  */
  585. memset(bits, 0, 6 * size);
  586. SET(BIT(fd), __FD_IN((&fds), fd / __NFDBITS));
  587. ret = my_do_select(n, &fds, &timeout);
  588. if (ret < 0)
  589. goto out;
  590. if (!ret) {
  591. ret = -ERESTARTNOHAND;
  592. if (signal_pending(current))
  593. goto out;
  594. ret = 0;
  595. }
  596. out:
  597. kfree(bits);
  598. out_nofds:
  599. return ret;
  600. }
  601. extern int make_my_day(void);
  602. static int
  603. translate_ioctl(struct file *file,
  604. struct v4l2_device *vfl,
  605. void *context,
  606. int cmd,
  607. void *arg)
  608. {
  609. int err = -ENOIOCTLCMD;
  610. switch (cmd)
  611. {
  612. case VIDIOCGCAP: /* capability */
  613. {
  614. struct video_capability *cap = arg;
  615. struct v4l2_capability cap2;
  616. struct v4l2_framebuffer fbuf2;
  617. err = vfl->ioctl(context, VIDIOC_QUERYCAP, &cap2);
  618. if (err < 0)
  619. break;
  620. if (cap2.flags & V4L2_FLAG_PREVIEW)
  621. {
  622. err = vfl->ioctl(context, VIDIOC_G_FBUF, &fbuf2);
  623. if (err < 0)
  624. memset(&fbuf2, 0, sizeof(fbuf2));
  625. err = 0;
  626. }
  627. memset(cap, 0, sizeof(cap));
  628. memcpy(cap->name, cap2.name, 
  629.        min(sizeof(cap->name), sizeof(cap2.name)));
  630. cap->name[sizeof(cap->name) - 1] = 0;
  631. if (cap2.type == V4L2_TYPE_CAPTURE)
  632. cap->type = VID_TYPE_CAPTURE;
  633. if (cap2.flags & V4L2_FLAG_TUNER)
  634. cap->type |= VID_TYPE_TUNER;
  635. if (cap2.flags & V4L2_FLAG_DATA_SERVICE)
  636. cap->type |= VID_TYPE_TELETEXT;
  637. if (cap2.flags & V4L2_FLAG_PREVIEW)
  638. cap->type |= VID_TYPE_OVERLAY;
  639. if (cap2.flags & V4L2_FLAG_MONOCHROME)
  640. cap->type |= VID_TYPE_MONOCHROME;
  641. if (fbuf2.flags & V4L2_FBUF_FLAG_PRIMARY)
  642. cap->type |= VID_TYPE_FRAMERAM;
  643. if (fbuf2.capability & V4L2_FBUF_CAP_CHROMAKEY)
  644. cap->type |= VID_TYPE_CHROMAKEY;
  645. if (fbuf2.capability & V4L2_FBUF_CAP_CLIPPING)
  646. cap->type |= VID_TYPE_CLIPPING;
  647. if (fbuf2.capability & V4L2_FBUF_CAP_SCALEUP ||
  648.     fbuf2.capability & V4L2_FBUF_CAP_SCALEDOWN)
  649. cap->type |= VID_TYPE_SCALES;
  650. cap->channels  = cap2.inputs;
  651. cap->audios    = cap2.audios;
  652. cap->maxwidth  = cap2.maxwidth;
  653. cap->maxheight = cap2.maxheight;
  654. cap->minwidth  = cap2.minwidth;
  655. cap->minheight = cap2.minheight;
  656. break;
  657. }
  658. case VIDIOCGFBUF: /*  get frame buffer  */
  659. {
  660. struct video_buffer *buffer = arg;
  661. struct v4l2_framebuffer fbuf2;
  662. err = vfl->ioctl(context, VIDIOC_G_FBUF, &fbuf2);
  663. if (err < 0)
  664. break;
  665. buffer->base = fbuf2.base[0];
  666. buffer->height = fbuf2.fmt.height;
  667. buffer->width = fbuf2.fmt.width;
  668. buffer->depth = fbuf2.fmt.depth;
  669. if (fbuf2.fmt.flags & V4L2_FMT_FLAG_BYTESPERLINE)
  670. buffer->bytesperline = fbuf2.fmt.bytesperline;
  671. else
  672. {
  673. buffer->bytesperline = 
  674. (fbuf2.fmt.width * fbuf2.fmt.depth + 7) & 7;
  675. buffer->bytesperline >>= 3;
  676. }
  677. if (fbuf2.fmt.pixelformat == V4L2_PIX_FMT_RGB555)
  678. buffer->depth = 15;
  679. break;
  680. }
  681. case VIDIOCSFBUF: /*  set frame buffer  */
  682. {
  683. struct video_buffer *buffer = arg;
  684. struct v4l2_framebuffer fbuf2;
  685. memset(&fbuf2, 0, sizeof(fbuf2));
  686. fbuf2.base[0] = buffer->base;
  687. fbuf2.fmt.height = buffer->height;
  688. fbuf2.fmt.width = buffer->width;
  689. fbuf2.fmt.depth = buffer->depth;
  690. switch (fbuf2.fmt.depth)
  691. {
  692. case 8:
  693. fbuf2.fmt.pixelformat = V4L2_PIX_FMT_RGB332;
  694. break;
  695. case 15:
  696. fbuf2.fmt.depth = 16;
  697. fbuf2.fmt.pixelformat = V4L2_PIX_FMT_RGB555;
  698. break;
  699. case 16:
  700. fbuf2.fmt.pixelformat = V4L2_PIX_FMT_RGB565;
  701. break;
  702. case 24:
  703. fbuf2.fmt.pixelformat = V4L2_PIX_FMT_BGR24;
  704. break;
  705. case 32:
  706. fbuf2.fmt.pixelformat = V4L2_PIX_FMT_BGR32;
  707. break;
  708. }
  709. fbuf2.fmt.flags |= V4L2_FMT_FLAG_BYTESPERLINE;
  710. fbuf2.fmt.bytesperline = buffer->bytesperline;
  711. fbuf2.flags = V4L2_FBUF_FLAG_PRIMARY;
  712. err = vfl->ioctl(context, VIDIOC_S_FBUF, &fbuf2);
  713. break;
  714. }
  715. case VIDIOCGWIN: /*  get window or capture dimensions  */
  716. {
  717. struct video_window *win = arg;
  718. struct v4l2_window win2;
  719. struct v4l2_format fmt2;
  720. err = vfl->ioctl(context, VIDIOC_G_WIN, &win2);
  721. if (err == 0)
  722. {
  723. win->x = win2.x;
  724. win->y = win2.y;
  725. win->width = win2.width;
  726. win->height = win2.height;
  727. win->chromakey = win2.chromakey;
  728. win->clips = NULL;
  729. win->clipcount = 0;
  730. break;
  731. }
  732. err = vfl->ioctl(context, VIDIOC_G_FMT, &fmt2);
  733. if (err < 0)
  734. break;
  735. win->x = 0;
  736. win->y = 0;
  737. win->width = fmt2.width;
  738. win->height = fmt2.height;
  739. win->chromakey = 0;
  740. win->clips = NULL;
  741. win->clipcount = 0;
  742. break;
  743. }
  744. case VIDIOCSWIN: /*  set window and/or capture dimensions  */
  745. {
  746. struct video_window *win = arg;
  747. struct v4l2_window win2;
  748. struct v4l2_format fmt2;
  749. err = vfl->ioctl(context, VIDIOC_G_FMT, &fmt2);
  750. if (err == 0)
  751. {
  752. fmt2.width = win->width;
  753. fmt2.height = win->height;
  754. err = vfl->ioctl(context, VIDIOC_S_FMT, &fmt2);
  755. win->width = fmt2.width;
  756. win->height = fmt2.height;
  757. }
  758. win2.x = win->x;
  759. win2.y = win->y;
  760. win2.width = win->width;
  761. win2.height = win->height;
  762. win2.chromakey = win->chromakey;
  763. win2.clips = (void *)win->clips;
  764. win2.clipcount = win->clipcount;
  765. vfl->ioctl(context, VIDIOC_S_WIN, &win2);
  766. break;
  767. }
  768. case VIDIOCCAPTURE: /*  turn on/off preview  */
  769. {
  770. err = vfl->ioctl(context, VIDIOC_PREVIEW, arg);
  771. break;
  772. }
  773. case VIDIOCGCHAN: /*  get input information  */
  774. {
  775. struct video_channel *chan = arg;
  776. struct v4l2_input input2;
  777. struct v4l2_standard std2;
  778. int sid;
  779. input2.index = chan->channel;
  780. err = vfl->ioctl(context, VIDIOC_ENUMINPUT, &input2);
  781. if (err < 0)
  782. break;
  783. chan->channel = input2.index;
  784. memcpy(chan->name, input2.name,
  785.        min(sizeof(chan->name), sizeof(input2.name)));
  786. chan->name[sizeof(chan->name) - 1] = 0;
  787. chan->tuners = (input2.type == V4L2_INPUT_TYPE_TUNER) ? 1 : 0;
  788. chan->flags = (chan->tuners) ? VIDEO_VC_TUNER : 0;
  789. if (input2.capability & V4L2_INPUT_CAP_AUDIO)
  790. chan->flags |= VIDEO_VC_AUDIO;
  791. switch (input2.type)
  792. {
  793. case V4L2_INPUT_TYPE_TUNER:
  794. chan->type = VIDEO_TYPE_TV;
  795. break;
  796. default:
  797. case V4L2_INPUT_TYPE_CAMERA:
  798. chan->type = VIDEO_TYPE_CAMERA;
  799. break;
  800. }
  801. chan->norm = 0;
  802. err = vfl->ioctl(context, VIDIOC_G_STD, &std2);
  803. if (err == 0)
  804. {
  805. sid = v4l2_video_std_confirm(&std2);
  806. switch (sid)
  807. {
  808. case V4L2_STD_NTSC:
  809. chan->norm = VIDEO_MODE_NTSC;
  810. break;
  811. case V4L2_STD_PAL:
  812. chan->norm = VIDEO_MODE_PAL;
  813. break;
  814. case V4L2_STD_SECAM:
  815. chan->norm = VIDEO_MODE_SECAM;
  816. break;
  817. }
  818. }
  819. break;
  820. }
  821. case VIDIOCSCHAN: /*  set input  */
  822. {
  823. err = vfl->ioctl(context, VIDIOC_S_INPUT, 
  824.  (void *)(*(int *)arg));
  825. break;
  826. }
  827. case VIDIOCGPICT: /*  get tone controls & partial capture format  */
  828. {
  829. struct video_picture *pict = arg;
  830. struct v4l2_format fmt2;
  831. pict->brightness = get_v4l_control(vfl, context, 
  832.    V4L2_CID_BRIGHTNESS);
  833. pict->hue = get_v4l_control(vfl, context, 
  834.     V4L2_CID_HUE);
  835. pict->contrast = get_v4l_control(vfl, context, 
  836.  V4L2_CID_CONTRAST);
  837. pict->colour = get_v4l_control(vfl, context, 
  838.        V4L2_CID_SATURATION);
  839. pict->whiteness = get_v4l_control(vfl, context, 
  840.   V4L2_CID_WHITENESS);
  841. err = vfl->ioctl(context, VIDIOC_G_FMT, &fmt2);
  842. if (err < 0)
  843. break;
  844. pict->depth = fmt2.depth;
  845. pict->palette = pixelformat_to_palette(fmt2.pixelformat);
  846. if (pict->palette == VIDEO_PALETTE_RGB555)
  847. pict->depth = 15;
  848. break;
  849. }
  850. case VIDIOCSPICT: /*  set tone controls & partial capture format  */
  851. {
  852. struct video_picture *pict = arg;
  853. struct v4l2_format fmt2;
  854. set_v4l_control(vfl, context,
  855. V4L2_CID_BRIGHTNESS, pict->brightness);
  856. set_v4l_control(vfl, context,
  857. V4L2_CID_HUE, pict->hue);
  858. set_v4l_control(vfl, context,
  859. V4L2_CID_CONTRAST, pict->contrast);
  860. set_v4l_control(vfl, context,
  861. V4L2_CID_SATURATION, pict->colour);
  862. set_v4l_control(vfl, context,
  863. V4L2_CID_WHITENESS, pict->whiteness);
  864. err = 0;
  865. vfl->ioctl(context, VIDIOC_G_FMT, &fmt2);
  866. if (fmt2.pixelformat != palette_to_pixelformat(pict->palette))
  867. {
  868. fmt2.pixelformat = palette_to_pixelformat(
  869. pict->palette);
  870. err = vfl->ioctl(context, VIDIOC_S_FMT, &fmt2);
  871. }
  872. break;
  873. }
  874. case VIDIOCGTUNER: /*  get tuner information  */
  875. {
  876. struct video_tuner *tun = arg;
  877. struct v4l2_tuner tun2;
  878. int i;
  879. int sid;
  880. i = find_tuner(vfl, context, tun->tuner);
  881. if (i < 0)
  882. {
  883. err = i;
  884. break;
  885. }
  886. tun2.input = i;
  887. err = vfl->ioctl(context, VIDIOC_G_TUNER, &tun2);
  888. if (err < 0)
  889. break;
  890. memcpy(tun->name, tun2.name,
  891.        min(sizeof(tun->name), sizeof(tun2.name)));
  892. tun->name[sizeof(tun->name) - 1] = 0;
  893. tun->rangelow = tun2.rangelow;
  894. tun->rangehigh = tun2.rangehigh;
  895. tun->flags = 0;
  896. tun->mode = VIDEO_MODE_AUTO;
  897. sid = v4l2_video_std_confirm(&tun2.std);
  898. switch (sid)
  899. {
  900. case V4L2_STD_NTSC:
  901. tun->flags = VIDEO_TUNER_NTSC;
  902. tun->mode = VIDEO_MODE_NTSC;
  903. break;
  904. case V4L2_STD_PAL:
  905. tun->flags = VIDEO_TUNER_PAL;
  906. tun->mode = VIDEO_MODE_PAL;
  907. break;
  908. case V4L2_STD_SECAM:
  909. tun->flags = VIDEO_TUNER_SECAM;
  910. tun->mode = VIDEO_MODE_SECAM;
  911. break;
  912. }
  913. if (tun2.capability & V4L2_TUNER_CAP_LOW)
  914. tun->flags |= VIDEO_TUNER_LOW;
  915. if (tun2.rxsubchans & V4L2_TUNER_SUB_STEREO)
  916. tun->flags |= VIDEO_TUNER_STEREO_ON;
  917. tun->signal = tun2.signal;
  918. break;
  919. }
  920. case VIDIOCSTUNER: /*  select a tuner input  */
  921. {
  922. int i;
  923. i = find_tuner(vfl, context, (int)arg);
  924. if (i < 0)
  925. {
  926. err = i;
  927. break;
  928. }
  929. err = vfl->ioctl(context, VIDIOC_S_INPUT, (void *)i);
  930. break;
  931. }
  932. case VIDIOCGFREQ: /*  get frequency  */
  933. {
  934. err = vfl->ioctl(context, VIDIOC_G_FREQ, arg);
  935. break;
  936. }
  937. case VIDIOCSFREQ: /*  set frequency  */
  938. {
  939. err = vfl->ioctl(context, VIDIOC_S_FREQ,
  940.  (void *)(*(int *)arg));
  941. break;
  942. }
  943. case VIDIOCGAUDIO: /*  get audio properties/controls  */
  944. {
  945. struct video_audio *aud = arg;
  946. struct v4l2_audio aud2;
  947. struct v4l2_queryctrl qctrl2;
  948. struct v4l2_tuner tun2;
  949. int v;
  950. err = vfl->ioctl(context, VIDIOC_G_AUDIO, &aud2);
  951. if (err < 0)
  952. break;
  953. memcpy(aud->name, aud2.name,
  954.        min(sizeof(aud->name), sizeof(aud2.name)));
  955. aud->name[sizeof(aud->name) - 1] = 0;
  956. aud->audio = aud2.audio;
  957. aud->flags = 0;
  958. v = get_v4l_control(vfl, context, V4L2_CID_AUDIO_VOLUME);
  959. if (v >= 0)
  960. {
  961. aud->volume = v;
  962. aud->flags |= VIDEO_AUDIO_VOLUME;
  963. }
  964. v = get_v4l_control(vfl, context, V4L2_CID_AUDIO_BASS);
  965. if (v >= 0)
  966. {
  967. aud->bass = v;
  968. aud->flags |= VIDEO_AUDIO_BASS;
  969. }
  970. v = get_v4l_control(vfl, context, V4L2_CID_AUDIO_TREBLE);
  971. if (v >= 0)
  972. {
  973. aud->treble = v;
  974. aud->flags |= VIDEO_AUDIO_TREBLE;
  975. }
  976. v = get_v4l_control(vfl, context, V4L2_CID_AUDIO_BALANCE);
  977. if (v >= 0)
  978. {
  979. aud->balance = v;
  980. aud->flags |= VIDEO_AUDIO_BALANCE;
  981. }
  982. v = get_v4l_control(vfl, context, V4L2_CID_AUDIO_MUTE);
  983. if (v >= 0)
  984. {
  985. if (v)
  986. aud->flags |= VIDEO_AUDIO_MUTE;
  987. aud->flags |= VIDEO_AUDIO_MUTABLE;
  988. }
  989. aud->step = 1;
  990. qctrl2.id = V4L2_CID_AUDIO_VOLUME;
  991. if (vfl->ioctl(context, VIDIOC_QUERYCTRL, &qctrl2) == 0)
  992. aud->step = qctrl2.step;
  993. aud->mode = 0;
  994. err = vfl->ioctl(context, VIDIOC_G_TUNER, &tun2);
  995. if (err < 0)
  996. {
  997. err = 0;
  998. break;
  999. }
  1000. switch (tun2.audmode)
  1001. {
  1002. case V4L2_TUNER_MODE_MONO:
  1003. aud->mode = VIDEO_SOUND_MONO;
  1004. break;
  1005. case V4L2_TUNER_MODE_STEREO:
  1006. aud->mode = VIDEO_SOUND_STEREO;
  1007. break;
  1008. case V4L2_TUNER_MODE_LANG2:
  1009. aud->mode = VIDEO_SOUND_LANG2;
  1010. break;
  1011. }
  1012. break;
  1013. }
  1014. case VIDIOCSAUDIO: /*  set audio controls  */
  1015. {
  1016. struct video_audio *aud = arg;
  1017. struct v4l2_audio aud2;
  1018. struct v4l2_tuner tun2;
  1019. int i;
  1020. aud2.audio = aud2.audio;
  1021. err = vfl->ioctl(context, VIDIOC_S_AUDIO, &aud2);
  1022. if (err < 0)
  1023. break;
  1024. set_v4l_control(vfl, context, V4L2_CID_AUDIO_VOLUME, 
  1025. aud->volume);
  1026. set_v4l_control(vfl, context, V4L2_CID_AUDIO_BASS,
  1027. aud->bass);
  1028. set_v4l_control(vfl, context, V4L2_CID_AUDIO_TREBLE,
  1029. aud->treble);
  1030. set_v4l_control(vfl, context, V4L2_CID_AUDIO_BALANCE,
  1031. aud->balance);
  1032. set_v4l_control(vfl, context, V4L2_CID_AUDIO_MUTE,
  1033. !!(aud->flags & VIDEO_AUDIO_MUTE));
  1034. err = vfl->ioctl(context, VIDIOC_G_INPUT, &i);
  1035. if (err < 0)
  1036. {
  1037. err = 0;
  1038. break;
  1039. }
  1040. tun2.input = i;
  1041. err = vfl->ioctl(context, VIDIOC_G_TUNER, &tun2);
  1042. if (err == 0)
  1043. {
  1044. switch (aud->mode)
  1045. {
  1046. default:
  1047. case VIDEO_SOUND_MONO:
  1048. tun2.audmode = V4L2_TUNER_MODE_MONO;
  1049. break;
  1050. case VIDEO_SOUND_STEREO:
  1051. tun2.audmode = V4L2_TUNER_MODE_STEREO;
  1052. break;
  1053. case VIDEO_SOUND_LANG2:
  1054. tun2.audmode = V4L2_TUNER_MODE_LANG2;
  1055. break;
  1056. }
  1057. vfl->ioctl(context, VIDIOC_S_TUNER, &tun2);
  1058. }
  1059. err = 0;
  1060. break;
  1061. }
  1062. case VIDIOCGMBUF: /*  get mmap parameters  */
  1063. {
  1064. struct video_mbuf *mbuf = arg;
  1065. struct v4l2_requestbuffers reqbuf2;
  1066. struct v4l2_buffer buf2;
  1067. struct v4l2_format fmt2, fmt2o;
  1068. struct v4l2_capability cap2;
  1069. int i;
  1070. /*  Set the format to maximum dimensions  */
  1071. if ((err = vfl->ioctl(context, VIDIOC_QUERYCAP, &cap2)) < 0)
  1072. break;
  1073. if ((err = vfl->ioctl(context, VIDIOC_G_FMT, &fmt2o)) < 0)
  1074. break;
  1075. fmt2 = fmt2o;
  1076. fmt2.width = cap2.maxwidth;
  1077. fmt2.height = cap2.maxheight;
  1078. if ((err = vfl->ioctl(context, VIDIOC_S_FMT, &fmt2)) < 0)
  1079. break;
  1080. reqbuf2.count = 2; /* v4l always used two buffers */
  1081. reqbuf2.type = V4L2_BUF_TYPE_CAPTURE | V4L2_BUF_REQ_CONTIG;
  1082. err = vfl->ioctl(context, VIDIOC_REQBUFS, &reqbuf2);
  1083. if (err < 0 || reqbuf2.count < 2 || reqbuf2.type
  1084.     != (V4L2_BUF_TYPE_CAPTURE | V4L2_BUF_REQ_CONTIG))
  1085. {/* Driver doesn't support v4l back-compatibility  */
  1086. vfl->ioctl(context, VIDIOC_S_FMT, &fmt2o);
  1087. reqbuf2.count = 1;
  1088. reqbuf2.type = V4L2_BUF_TYPE_CAPTURE;
  1089. err = vfl->ioctl(context, VIDIOC_REQBUFS, &reqbuf2);
  1090. if (err < 0)
  1091. {
  1092. err = -EINVAL;
  1093. break;
  1094. }
  1095. printk(KERN_INFO"V4L2: Device "%s" doesn't support"
  1096.        " v4l memory mappingn", vfl->name);
  1097. }
  1098. buf2.index = 0;
  1099. buf2.type = V4L2_BUF_TYPE_CAPTURE;
  1100. err = vfl->ioctl(context, VIDIOC_QUERYBUF, &buf2);
  1101. mbuf->size = buf2.length * reqbuf2.count;
  1102. mbuf->frames = reqbuf2.count;
  1103. memset(mbuf->offsets, 0, sizeof(mbuf->offsets));
  1104. for (i = 0; i < mbuf->frames; ++i)
  1105. mbuf->offsets[i] = i * buf2.length;
  1106. break;
  1107. }
  1108. case VIDIOCMCAPTURE: /*  capture a frame  */
  1109. {
  1110. struct video_mmap *mm = arg;
  1111. struct v4l2_buffer buf2;
  1112. struct v4l2_format fmt2;
  1113. err = vfl->ioctl(context, VIDIOC_G_FMT, &fmt2);
  1114. if (err < 0)
  1115. break;
  1116. if (mm->width != fmt2.width || mm->height != fmt2.height ||
  1117.     palette_to_pixelformat(mm->format) != fmt2.pixelformat)
  1118. {/* New capture format...  */
  1119. //vfl->ioctl(context, VIDIOC_STREAMOFF, 
  1120. //    (void *)V4L2_BUF_TYPE_CAPTURE);
  1121. fmt2.width = mm->width;
  1122. fmt2.height = mm->height;
  1123. fmt2.pixelformat = palette_to_pixelformat(mm->format);
  1124. err = vfl->ioctl(context, VIDIOC_S_FMT, &fmt2);
  1125. if (err < 0)
  1126. break;
  1127. }
  1128. buf2.index = mm->frame;
  1129. buf2.type = V4L2_BUF_TYPE_CAPTURE;
  1130. err = vfl->ioctl(context, VIDIOC_QUERYBUF, &buf2);
  1131. if (err < 0)
  1132. break;
  1133. err = vfl->ioctl(context, VIDIOC_QBUF, &buf2);
  1134. if (err < 0)
  1135. break;
  1136. vfl->ioctl(context, VIDIOC_STREAMON, (void *)buf2.type);
  1137. break;
  1138. }
  1139. case VIDIOCSYNC: /*  wait for a frame  */
  1140. {
  1141. int *i = arg;
  1142. struct v4l2_buffer buf2;
  1143. buf2.index = *i;
  1144. buf2.type = V4L2_BUF_TYPE_CAPTURE;
  1145. err = vfl->ioctl(context, VIDIOC_QUERYBUF, &buf2);
  1146. if (err < 0) /*  No such buffer */
  1147. break;
  1148. if (!(buf2.flags & V4L2_BUF_FLAG_MAPPED))
  1149. {/* Buffer is not mapped  */
  1150. err = -EINVAL;
  1151. break;
  1152. }
  1153. /*  Loop as long as the buffer is queued, but not done  */
  1154. while ((buf2.flags &
  1155. (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))
  1156.        == V4L2_BUF_FLAG_QUEUED)
  1157. {
  1158. err = simple_select(file);
  1159. if (err < 0 || /* error or sleep was interrupted  */
  1160.     err == 0) /* timeout? Shouldn't occur.  */
  1161. break;
  1162. vfl->ioctl(context, VIDIOC_QUERYBUF, &buf2);
  1163. }
  1164. if (!(buf2.flags & V4L2_BUF_FLAG_DONE)) /* not done */
  1165. break;
  1166. do
  1167. {
  1168. err = vfl->ioctl(context, VIDIOC_DQBUF, &buf2);
  1169. } while (err == 0 && buf2.index != *i);
  1170. break;
  1171. }
  1172. case VIDIOCGUNIT: /*  get related device minors  */
  1173. /*  No translation  */
  1174. break;
  1175. case VIDIOCGCAPTURE: /*    */
  1176. /*  No translation, yet...  */
  1177. printk(KERN_INFO"V4L2: VIDIOCGCAPTURE not implemented. "
  1178.        "Send patches to bdirks@pacbell.net :-)n");
  1179. break;
  1180. case VIDIOCSCAPTURE: /*    */
  1181. /*  No translation, yet...  */
  1182. printk(KERN_INFO"V4L2: VIDIOCSCAPTURE not implemented. "
  1183.        "Send patches to bdirks@pacbell.net :-)n");
  1184. break;
  1185. }
  1186. return err;
  1187. }
  1188. /*
  1189.  * D E V I C E   R E G I S T R A T I O N
  1190.  *
  1191.  * Video for Linux Two device drivers request registration here.
  1192.  */
  1193. int
  1194. v4l2_register_device(struct v4l2_device *vfl)
  1195. {
  1196. int i = 0;
  1197. int err;
  1198. if (vfl == NULL)
  1199. {
  1200. printk(KERN_ERR"V4L2: v4l2_register_device() passed"
  1201.        " a NULL pointer!n");
  1202. return -1;
  1203. }
  1204. i = vfl->minor;
  1205. if (vfl->open == NULL)
  1206. {
  1207. printk(KERN_ERR "V4L2: Device %d has no open methodn", i);
  1208. return -1;
  1209. }
  1210. if (i < 0 || i >= V4L2_NUM_DEVICES)
  1211. {
  1212. printk(KERN_ERR"V4L2: Minor value %d is out of rangen", i);
  1213. return -1;
  1214. }
  1215. if (v4l2_device[i] != NULL)
  1216. {
  1217. printk(KERN_ERR"V4L2: %s and %s have both been assigned"
  1218.        " minor %dn", v4l2_device[i]->name,
  1219.        vfl->name, i);
  1220. return 1;
  1221. }
  1222. v4l2_device[i] = vfl;
  1223. /* The init call may sleep so we book the slot out then call */
  1224. MOD_INC_USE_COUNT;
  1225. err = 0;
  1226. if (vfl->initialize)
  1227. err = vfl->initialize(vfl);
  1228. if (err < 0)
  1229. {
  1230. printk(KERN_ERR "V4L2: %s initialize method failedn",
  1231.        vfl->name);
  1232. v4l2_device[i] = NULL;
  1233. MOD_DEC_USE_COUNT;
  1234. return err;
  1235. }
  1236. vfl->busy = 0;
  1237. vfl->name[sizeof(vfl->name) - 1] = 0;
  1238. printk(KERN_INFO"V4L2: Registered "%s" as char device %d, %dn",
  1239.  vfl->name, v4l2_major, vfl->minor);
  1240. memset(vfl->v4l2_reserved, 0, sizeof(vfl->v4l2_reserved));
  1241. vfl->v4l2_priv = NULL;
  1242. return 0;
  1243. }
  1244. /*
  1245.  * Unregister an unused video for linux device
  1246.  */
  1247. void
  1248. v4l2_unregister_device(struct v4l2_device *vfl)
  1249. {
  1250. if (vfl->minor < 0 || vfl->minor >= V4L2_NUM_DEVICES ||
  1251.     v4l2_device[vfl->minor] != vfl)
  1252. {
  1253. printk(KERN_ERR"V4L2: bad unregistern");
  1254. return;
  1255. }
  1256. v4l2_device[vfl->minor] = NULL;
  1257. MOD_DEC_USE_COUNT;
  1258. }
  1259. /*
  1260.  * / p r o c / v i d e o d e v   H A N D L E R
  1261.  */
  1262. /*  Original /proc file code from Erik Walthinsen  */
  1263. static char *device_types[] =
  1264. {
  1265. "capture", "codec", "output", "effects", 
  1266. "vbi", "vtr", "teletext", "radio", 
  1267. "undef", "undef", "undef", "undef",
  1268. };
  1269. static int
  1270. video_read_proc(char *buf, char **start, off_t offset, int len, int unused)
  1271. {
  1272. struct v4l2_device *vfl;
  1273. int i;
  1274. char *t;
  1275. len = 0;
  1276. len += sprintf(buf, "Video for Linux Two: V%d.%d alpha."
  1277.        " Major device: %dn",
  1278.        V4L2_MAJOR_VERSION, V4L2_MINOR_VERSION,
  1279.        v4l2_major);
  1280. //len += sprintf(buf+len,"minor: type      busy namen");
  1281. for (i = 0; i < V4L2_NUM_DEVICES; i++)
  1282. {
  1283. vfl = v4l2_device[i];
  1284. if (vfl == NULL)
  1285. continue;
  1286. if  (len > (PAGE_SIZE - 80))
  1287. return len;
  1288. if (vfl->type >= 0 &&
  1289.     vfl->type < sizeof(device_types)/sizeof(char*))
  1290. t = device_types[vfl->type];
  1291. else if (vfl->type >= V4L2_TYPE_PRIVATE)
  1292. t = "private";
  1293. else 
  1294. t = "undef";
  1295. len += sprintf(buf+len, "%5d: %-9s %3d  %sn",
  1296.        vfl->minor, t, vfl->busy, vfl->name);
  1297. }
  1298. return len;
  1299. }
  1300. /* proc file for /proc/videodev */
  1301. static struct proc_dir_entry video_proc_entry =
  1302. {
  1303. 0, 8, "videodev", S_IFREG | S_IRUGO, 1, 0, 0, 0, NULL,
  1304. &video_read_proc
  1305. };
  1306. /*
  1307.  * V I D E O   F O R   L I N U X   T W O   I N I T I A L I Z A T I O N
  1308.  */
  1309. static struct file_operations video_fops =
  1310. {
  1311. video_lseek,
  1312. video_read,
  1313. video_write,
  1314. NULL, /* readdir */
  1315. video_poll,
  1316. video_ioctl,
  1317. video_mmap,
  1318. video_open,
  1319. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,118)
  1320. NULL,
  1321. #endif
  1322. video_release
  1323. };
  1324. /*
  1325.  * Initialize Video for Linux Two
  1326.  */
  1327. int videodev_init(void)
  1328. {
  1329. int i;
  1330. printk(KERN_INFO"Video for Linux Two: V%d.%d alpha."
  1331.        " Major device: %dn",
  1332.        V4L2_MAJOR_VERSION, V4L2_MINOR_VERSION, v4l2_major);
  1333. if (register_chrdev(v4l2_major, "v4l2", &video_fops))
  1334. {
  1335. printk("V4L2: Unable to get major %dn", v4l2_major);
  1336. return -EIO;
  1337. }
  1338. /* make sure there's a way to tell if a device is not there */
  1339. for (i = 0; i < V4L2_NUM_DEVICES; i++)
  1340. v4l2_device[i] = NULL;
  1341. proc_register(&proc_root, &video_proc_entry);
  1342. masterclock = NULL;
  1343. return 0;
  1344. }
  1345. #ifdef MODULE
  1346. int init_module(void)
  1347. {
  1348. return videodev_init();
  1349. }
  1350. void cleanup_module(void)
  1351. {
  1352. proc_unregister(&proc_root, video_proc_entry.low_ino);
  1353. unregister_chrdev(v4l2_major, "v4l2");
  1354. }
  1355. #endif
  1356. /*
  1357.  *
  1358.  * V 4 L 2   D R I V E R   H E L P E R   A P I
  1359.  *
  1360.  */
  1361. void
  1362. v4l2_version(int *major, int *minor)
  1363. {
  1364. *major = V4L2_MAJOR_VERSION;
  1365. *minor = V4L2_MINOR_VERSION;
  1366. }
  1367. int
  1368. v4l2_major_number(void)
  1369. {
  1370. return v4l2_major;
  1371. }
  1372. struct v4l2_device *
  1373. v4l2_device_from_minor(int minor)
  1374. {
  1375. if (minor < 0 || minor >= V4L2_NUM_DEVICES)
  1376. return NULL;
  1377. return v4l2_device[minor];
  1378. }
  1379. struct v4l2_device *
  1380. v4l2_device_from_file(struct file *file)
  1381. {
  1382. if (file == NULL)
  1383. return NULL;
  1384. return v4l2_device_from_minor(MINOR(file->f_dentry->d_inode->i_rdev));
  1385. }
  1386. void *
  1387. v4l2_openid_from_file(struct file *file)
  1388. {
  1389. if (file == NULL)
  1390. return NULL;
  1391. return file->private_data;
  1392. }
  1393. static struct mm_struct *
  1394. find_init_mm(void)
  1395. {
  1396. static struct mm_struct *mm;
  1397. struct task_struct *p;
  1398. if (mm)
  1399. return mm;
  1400. for (p = current; p && (p = p->next_task) != current; )
  1401. if (p->pid == 0)
  1402. break;
  1403. mm = (p) ? p->mm : NULL;
  1404. return mm;
  1405. }
  1406. /*  Useful for using vmalloc()ed memory as DMA target  */
  1407. unsigned long
  1408. v4l2_vmalloc_to_bus(void *virt)
  1409. {
  1410. pgd_t *pgd;
  1411. pmd_t *pmd;
  1412. pte_t *pte;
  1413. unsigned long a = (unsigned long)virt;
  1414. struct mm_struct *mm = find_init_mm();
  1415. if (mm == NULL ||
  1416.     pgd_none(*(pgd = pgd_offset(mm,  a))) ||
  1417.     pmd_none(*(pmd = pmd_offset(pgd, a))) ||
  1418.     pte_none(*(pte = pte_offset(pmd, a))))
  1419. return 0;
  1420. return virt_to_bus((void *)pte_page(*pte))
  1421. + (a & (PAGE_SIZE - 1));
  1422. }
  1423. /*  Useful for a nopage handler when mmap()ing vmalloc()ed memory  */
  1424. unsigned long
  1425. v4l2_vmalloc_to_page(void *virt)
  1426. {
  1427. pgd_t *pgd;
  1428. pmd_t *pmd;
  1429. pte_t *pte;
  1430. unsigned long a = (unsigned long)virt;
  1431. struct mm_struct *mm = find_init_mm();
  1432. if (mm == NULL ||
  1433.     pgd_none(*(pgd = pgd_offset(current->mm, a))) ||
  1434.     pmd_none(*(pmd = pmd_offset(pgd,         a))) ||
  1435.     pte_none(*(pte = pte_offset(pmd,         a))))
  1436. return 0;
  1437. return pte_page(*pte);
  1438. }
  1439. /*
  1440.  *  Simple queue management
  1441.  */
  1442. static rwlock_t rw_lock_unlocked = RW_LOCK_UNLOCKED;
  1443. void
  1444. v4l2_q_init(struct v4l2_queue *q)
  1445. {
  1446. if (q == NULL)
  1447. return;
  1448. q->qlock = rw_lock_unlocked;
  1449. q->forw = (struct v4l2_q_node *)q;
  1450. q->back = (struct v4l2_q_node *)q;
  1451. }
  1452. void
  1453. v4l2_q_add_head(struct v4l2_queue *q, struct v4l2_q_node *node)
  1454. {
  1455. unsigned long flags;
  1456. if (q == NULL || node == NULL)
  1457. return;
  1458. if (q->forw == NULL || q->back == NULL)
  1459. v4l2_q_init(q);
  1460. write_lock_irqsave(&(q->qlock), flags);
  1461. node->forw = q->forw;
  1462. node->back = (struct v4l2_q_node *)q;
  1463. q->forw->back = node;
  1464. q->forw = node;
  1465. write_unlock_irqrestore(&(q->qlock), flags);
  1466. }
  1467. void
  1468. v4l2_q_add_tail(struct v4l2_queue *q, struct v4l2_q_node *node)
  1469. {
  1470. unsigned long flags;
  1471. if (q == NULL || node == NULL)
  1472. return;
  1473. if (q->forw == NULL || q->back == NULL)
  1474. v4l2_q_init(q);
  1475. write_lock_irqsave(&(q->qlock), flags);
  1476. node->forw = (struct v4l2_q_node *)q;
  1477. node->back = q->back;
  1478. q->back->forw = node;
  1479. q->back = node;
  1480. write_unlock_irqrestore(&(q->qlock), flags);
  1481. }
  1482. void *
  1483. v4l2_q_del_head(struct v4l2_queue *q)
  1484. {
  1485. unsigned long flags;
  1486. struct v4l2_q_node *node;
  1487. if (q == NULL)
  1488. return NULL;
  1489. write_lock_irqsave(&(q->qlock), flags);
  1490. if (q->forw == NULL || q->back == NULL ||
  1491.     q->forw == (struct v4l2_q_node *)q ||
  1492.     q->back == (struct v4l2_q_node *)q)
  1493. {
  1494. write_unlock_irqrestore(&(q->qlock), flags);
  1495. return NULL;
  1496. }
  1497. node = q->forw;
  1498. node->forw->back = (struct v4l2_q_node *)q;
  1499. q->forw = node->forw;
  1500. node->forw = NULL;
  1501. node->back = NULL;
  1502. write_unlock_irqrestore(&(q->qlock), flags);
  1503. return node;
  1504. }
  1505. void *
  1506. v4l2_q_del_tail(struct v4l2_queue *q)
  1507. {
  1508. unsigned long flags;
  1509. struct v4l2_q_node *node;
  1510. if (q == NULL)
  1511. return NULL;
  1512. write_lock_irqsave(&(q->qlock), flags);
  1513. if (q->forw == NULL || q->back == NULL ||
  1514.     q->forw == (struct v4l2_q_node *)q ||
  1515.     q->back == (struct v4l2_q_node *)q)
  1516. {
  1517. write_unlock_irqrestore(&(q->qlock), flags);
  1518. return NULL;
  1519. }
  1520. node = q->back;
  1521. node->back->forw = (struct v4l2_q_node *)q;
  1522. q->back = node->back;
  1523. node->forw = NULL;
  1524. node->back = NULL;
  1525. write_unlock_irqrestore(&(q->qlock), flags);
  1526. return node;
  1527. }
  1528. void *
  1529. v4l2_q_peek_head(struct v4l2_queue *q)
  1530. {
  1531. unsigned long flags;
  1532. struct v4l2_q_node *node;
  1533. read_lock_irqsave(&(q->qlock), flags);
  1534. if (q == NULL || q->forw == NULL || q->forw == (struct v4l2_q_node *)q)
  1535. {
  1536. read_unlock_irqrestore(&(q->qlock), flags);
  1537. return NULL;
  1538. }
  1539. node = q->forw;
  1540. read_unlock_irqrestore(&(q->qlock), flags);
  1541. return node;
  1542. }
  1543. void *
  1544. v4l2_q_peek_tail(struct v4l2_queue *q)
  1545. {
  1546. unsigned long flags;
  1547. struct v4l2_q_node *node;
  1548. read_lock_irqsave(&(q->qlock), flags);
  1549. if (q == NULL || q->back == NULL || q->back == (struct v4l2_q_node *)q)
  1550. {
  1551. read_unlock_irqrestore(&(q->qlock), flags);
  1552. return NULL;
  1553. }
  1554. node = q->back;
  1555. read_unlock_irqrestore(&(q->qlock), flags);
  1556. return node;
  1557. }
  1558. void *
  1559. v4l2_q_yank_node(struct v4l2_queue *q, struct v4l2_q_node *node)
  1560. {
  1561. unsigned long flags;
  1562. struct v4l2_q_node *t;
  1563. if (v4l2_q_peek_head(q) == NULL || node == NULL)
  1564. return NULL;
  1565. write_lock_irqsave(&(q->qlock), flags);
  1566. for (t = q->forw; t != (struct v4l2_q_node *)q; t = t->forw)
  1567. if (t == node)
  1568. {
  1569. node->back->forw = node->forw;
  1570. node->forw->back = node->back;
  1571. node->forw = NULL;
  1572. node->back = NULL;
  1573. write_unlock_irqrestore(&(q->qlock), flags);
  1574. return node;
  1575. }
  1576. write_unlock_irqrestore(&(q->qlock), flags);
  1577. return NULL;
  1578. }
  1579. /*
  1580.  *  Math functions
  1581.  */
  1582. u32
  1583. v4l2_math_div6432(u64 a, u32 d, u32 *r)
  1584. {
  1585. u32 q, m;
  1586. #ifdef __i386__
  1587. __asm__ __volatile__ (
  1588. " movl %2,%%eaxn"
  1589. " movl %3,%%edxn"
  1590. " divl %4n"
  1591. " movl %%eax,%0n"
  1592. " movl %%edx,%1n"
  1593. : "=g" (q), "=g" (m)
  1594. : "g" ((u32)a), "g" ((u32)(a >> 32)), "g" (d)
  1595. : "eax", "edx"
  1596. );
  1597. #else
  1598. q = a / d;
  1599. m = a % d;
  1600. #endif
  1601. if (r) *r = m;
  1602. return q;
  1603. }
  1604. void
  1605. v4l2_timeval_delta(struct timeval *d,
  1606.    struct timeval *a,
  1607.    struct timeval *b)
  1608. {
  1609. if (a->tv_sec < b->tv_sec ||
  1610.     (a->tv_sec == b->tv_sec && a->tv_usec < b->tv_usec))
  1611. {
  1612. d->tv_sec = b->tv_sec - a->tv_sec;
  1613. d->tv_usec = b->tv_usec - a->tv_usec;
  1614. }
  1615. else
  1616. {
  1617. d->tv_sec = a->tv_sec - b->tv_sec;
  1618. d->tv_usec = a->tv_usec - b->tv_usec;
  1619. }
  1620. if (d->tv_usec < 0)
  1621. {
  1622. d->tv_usec += 1000000;
  1623. d->tv_sec -= 1;
  1624. }
  1625. }
  1626. unsigned long
  1627. v4l2_timeval_divide(struct timeval *t, unsigned long p_100ns)
  1628. {
  1629. /*  Note: 'p_100ns' is in 100ns units, and the quotient is rounded  */
  1630. u64 t_100ns;
  1631. t_100ns = (u64)t->tv_sec * 10000000 + t->tv_usec * 10;
  1632. return v4l2_math_div6432(t_100ns + (p_100ns >> 1), p_100ns, NULL);
  1633. }
  1634. /*  Force the timeval to be an integer multiple of p_100ns  */
  1635. unsigned long
  1636. v4l2_timeval_correct(struct timeval *t, unsigned long p_100ns)
  1637. {
  1638. unsigned long n;
  1639. u32 m;
  1640. n = v4l2_timeval_divide(t, p_100ns);
  1641. t->tv_sec = v4l2_math_div6432((u64)p_100ns * n, 10000000, &m);
  1642. t->tv_usec = m / 10;
  1643. return n;
  1644. }
  1645. /*
  1646.  * Master clock and Timeval operations
  1647.  */
  1648. int
  1649. v4l2_masterclock_register(struct v4l2_clock *clock)
  1650. {
  1651. if (clock == NULL || clock->gettime == NULL)
  1652. return -1;
  1653. if (masterclock != NULL)
  1654. return -1;
  1655. masterclock = clock;
  1656. MOD_INC_USE_COUNT;
  1657. return 0;
  1658. }
  1659. void
  1660. v4l2_masterclock_unregister(struct v4l2_clock *clock)
  1661. {
  1662. if (clock != masterclock)
  1663. return;
  1664. masterclock = NULL;
  1665. MOD_DEC_USE_COUNT;
  1666. }
  1667. void
  1668. v4l2_masterclock_gettime(struct timeval *curr)
  1669. {
  1670. if (masterclock)
  1671. masterclock->gettime(curr);
  1672. else
  1673. do_gettimeofday(curr);
  1674. }
  1675. /*
  1676.  *  Video Standard Operations (contributed by Michael Schimek)
  1677.  */
  1678. /* This is the recommended method to deal with the framerate fields. More 
  1679.    sophisticated drivers will access the fields directly. */
  1680. unsigned int
  1681. v4l2_video_std_fps(struct v4l2_standard *vs)
  1682. if (vs->framerate.numerator > 0)
  1683. return (((vs->framerate.denominator << 8) / 
  1684.  vs->framerate.numerator) + 
  1685. (1 << 7)) / (1 << 8);
  1686. return 0;
  1687. }
  1688. /*  Compute the time per frame in 100ns units  */
  1689. unsigned long
  1690. v4l2_video_std_tpf(struct v4l2_standard *vs)
  1691. {
  1692. return v4l2_math_div6432(
  1693. (u64)vs->framerate.numerator * 10000000
  1694. + vs->framerate.denominator / 2,
  1695. vs->framerate.denominator,
  1696. NULL);
  1697. }
  1698. /*  Used only in v4l2_video_std_confirm()  */
  1699. static void
  1700. catc1p2e6(__u8 *s, char c, int n)
  1701. {
  1702. n /= 10000;
  1703. sprintf(s + strlen(s), "%c%d.%02d", c, n / 100, n % 100);
  1704. }
  1705. /* Verify the validity of the parameters of a v4l2_standard structure and
  1706.    create the name and id from the other fields. It does not relieve a 
  1707.    driver from examining if it can fulfill the request.  Returns an 
  1708.    errno < 0 if inconsistent, 0 if an unknown but maybe usable format, 
  1709.    or the V4L2_STD_XXX_X value if a known standard. */
  1710. int
  1711. v4l2_video_std_confirm(struct v4l2_standard *vs)
  1712. {
  1713. unsigned int rate  = 0;
  1714. unsigned int lines = vs->framelines;
  1715. int std   = 0;
  1716. strcpy(vs->name, "Unknown");
  1717. if (vs->reserved1 || vs->reserved2)
  1718. return -EINVAL;
  1719. if (vs->framerate.numerator > 0 &&
  1720.     vs->framerate.denominator > 0)
  1721. rate = v4l2_video_std_fps(vs);
  1722. if (vs->framelines >= 624 && vs->framelines <= 626)
  1723. lines = 625;
  1724. else if (vs->framelines >= 524 && vs->framelines <= 526)
  1725. lines = 525;
  1726. if (rate == 0 || lines == 0 || rate > 200)
  1727. return -EINVAL;
  1728. switch (vs->colorstandard)
  1729. {
  1730. case V4L2_COLOR_STD_PAL:
  1731. strcpy(vs->name, "PAL");
  1732. if (rate == 25 && lines == 625)
  1733. switch (vs->colorstandard_data.pal.colorsubcarrier)
  1734. {
  1735. case V4L2_COLOR_SUBC_PAL_N:
  1736. strcpy(vs->name, "PAL-N");
  1737. if (vs->transmission & ~V4L2_TRANSM_STD_N)
  1738. return -EINVAL;
  1739. return V4L2_STD_PAL_N;
  1740. case V4L2_COLOR_SUBC_PAL:
  1741. if (vs->transmission & 
  1742.     ~(V4L2_TRANSM_STD_B | V4L2_TRANSM_STD_G |
  1743.       V4L2_TRANSM_STD_H | V4L2_TRANSM_STD_I |
  1744.       V4L2_TRANSM_STD_D))
  1745. return -EINVAL;
  1746. std = V4L2_STD_PAL;
  1747. goto addtransm;
  1748. }
  1749. else if (rate == 30 && lines == 525)
  1750. switch (vs->colorstandard_data.pal.colorsubcarrier)
  1751. {
  1752. case V4L2_COLOR_SUBC_PAL_M:
  1753. strcpy(vs->name, "PAL-M");
  1754. if (vs->transmission & ~V4L2_TRANSM_STD_M)
  1755. return -EINVAL;
  1756. return V4L2_STD_PAL_M;
  1757. case V4L2_COLOR_SUBC_PAL:
  1758. strcpy(vs->name, "PAL-60");
  1759. if (vs->transmission)
  1760. return -EINVAL;
  1761. return V4L2_STD_PAL_60;
  1762. }
  1763. if (vs->transmission)
  1764. return -EINVAL;
  1765. catc1p2e6(vs->name, ' ', 
  1766.   vs->colorstandard_data.pal.colorsubcarrier);
  1767. break;
  1768. case V4L2_COLOR_STD_NTSC:
  1769. strcpy(vs->name, "NTSC");
  1770. if (rate == 25 && lines == 625)
  1771. switch (vs->colorstandard_data.ntsc.colorsubcarrier)
  1772. {
  1773. case V4L2_COLOR_SUBC_NTSC:
  1774. strcpy(vs->name, "NTSC-N");
  1775. if (vs->transmission & ~V4L2_TRANSM_STD_N)
  1776. return -EINVAL;
  1777. return V4L2_STD_NTSC_N;
  1778. }
  1779. else if (rate == 30 && lines == 525)
  1780. switch (vs->colorstandard_data.ntsc.colorsubcarrier)
  1781. {
  1782. case V4L2_COLOR_SUBC_NTSC:
  1783. if (vs->transmission & ~V4L2_TRANSM_STD_M)
  1784. return -EINVAL;
  1785. std = V4L2_STD_NTSC;
  1786. goto addtransm;
  1787. case V4L2_COLOR_SUBC_PAL:
  1788. strcpy(vs->name, "NTSC-44");
  1789. if (vs->transmission)
  1790. return -EINVAL;
  1791. return V4L2_STD_NTSC_44;
  1792. }
  1793. if (vs->transmission)
  1794. return -EINVAL;
  1795. catc1p2e6(vs->name, ' ', 
  1796.   vs->colorstandard_data.ntsc.colorsubcarrier);
  1797. break;
  1798. case V4L2_COLOR_STD_SECAM:
  1799. strcpy(vs->name, "SECAM");
  1800. if (rate == 25 && lines == 625)
  1801. if (vs->colorstandard_data.secam.f0b == 
  1802.     V4L2_COLOR_SUBC_SECAMB &&
  1803.     vs->colorstandard_data.secam.f0r == 
  1804.     V4L2_COLOR_SUBC_SECAMR)
  1805. {
  1806. if (vs->transmission &
  1807.     ~(V4L2_TRANSM_STD_B | V4L2_TRANSM_STD_D |
  1808.               V4L2_TRANSM_STD_G | V4L2_TRANSM_STD_K |
  1809.               V4L2_TRANSM_STD_K1 | V4L2_TRANSM_STD_L))
  1810. return -EINVAL;
  1811. std = V4L2_STD_SECAM;
  1812. goto addtransm;
  1813. }
  1814. if (vs->transmission)
  1815. return -EINVAL;
  1816. catc1p2e6(vs->name, ' ', vs->colorstandard_data.secam.f0b);
  1817. catc1p2e6(vs->name, '/', vs->colorstandard_data.secam.f0r);
  1818. break;
  1819. default:
  1820. return -EINVAL;
  1821. }
  1822.         sprintf(vs->name + strlen(vs->name), " %d/%d",
  1823.         vs->framelines, rate);
  1824. return std;
  1825.  addtransm:
  1826. if (vs->transmission) strcat(vs->name, "-");
  1827.         if (vs->transmission & V4L2_TRANSM_STD_B) strcat(vs->name, "B/");
  1828.         if (vs->transmission & V4L2_TRANSM_STD_G) strcat(vs->name, "G/");
  1829.         if (vs->transmission & V4L2_TRANSM_STD_H) strcat(vs->name, "H/");
  1830. if (vs->transmission & V4L2_TRANSM_STD_I) strcat(vs->name, "I/");
  1831. if (vs->transmission & V4L2_TRANSM_STD_D) strcat(vs->name, "D/");
  1832. if (vs->transmission & V4L2_TRANSM_STD_K) strcat(vs->name, "K/");
  1833. if (vs->transmission & V4L2_TRANSM_STD_K1) strcat(vs->name, "K1/");
  1834. if (vs->transmission & V4L2_TRANSM_STD_L) strcat(vs->name, "L/");
  1835. if (vs->transmission & V4L2_TRANSM_STD_M) strcat(vs->name, "M/");
  1836. if (vs->transmission & V4L2_TRANSM_STD_N) strcat(vs->name, "N/");
  1837. if (vs->name[strlen(vs->name) - 1] == '/')
  1838. vs->name[strlen(vs->name) - 1] = 0;    
  1839. return std;
  1840. }
  1841. /* Fill in the fields of a v4l2_standard structure according to the
  1842.    'id' and 'transmission' parameters.  Returns negative on error.  */
  1843. int
  1844. v4l2_video_std_construct(struct v4l2_standard *vs,
  1845.  int id, __u32 transmission)
  1846. {
  1847. memset(vs, 0, sizeof(struct v4l2_standard));
  1848. vs->framerate.numerator = 1;
  1849. vs->framerate.denominator = 25;
  1850. vs->framelines = 625;
  1851. switch (id)
  1852. {
  1853. case V4L2_STD_PAL_60:
  1854. vs->framerate.numerator = 1001;
  1855. vs->framerate.denominator = 30000;
  1856. vs->framelines = 525;
  1857. /* fall thru */
  1858. case V4L2_STD_PAL:
  1859. vs->colorstandard = V4L2_COLOR_STD_PAL;
  1860. vs->colorstandard_data.pal.colorsubcarrier =
  1861. V4L2_COLOR_SUBC_PAL;
  1862. break;
  1863. case V4L2_STD_PAL_M:
  1864. vs->framerate.numerator = 1001;
  1865. vs->framerate.denominator = 30000;
  1866. vs->framelines = 525;
  1867. vs->colorstandard = V4L2_COLOR_STD_PAL;
  1868. vs->colorstandard_data.pal.colorsubcarrier = 
  1869. V4L2_COLOR_SUBC_PAL_M;
  1870. break;
  1871. case V4L2_STD_PAL_N:
  1872. vs->colorstandard = V4L2_COLOR_STD_PAL;
  1873. vs->colorstandard_data.pal.colorsubcarrier = 
  1874. V4L2_COLOR_SUBC_PAL_N;
  1875. break;
  1876. case V4L2_STD_NTSC:
  1877. vs->framerate.numerator = 1001;
  1878. vs->framerate.denominator = 30000;
  1879. vs->framelines = 525;
  1880. /* fall thru */
  1881. case V4L2_STD_NTSC_N:
  1882. vs->colorstandard = V4L2_COLOR_STD_NTSC;
  1883. vs->colorstandard_data.ntsc.colorsubcarrier = 
  1884. V4L2_COLOR_SUBC_NTSC;
  1885. break;
  1886. case V4L2_STD_NTSC_44:
  1887. vs->framerate.numerator = 1001;
  1888. vs->framerate.denominator = 30000;
  1889. vs->framelines = 525;
  1890. vs->colorstandard = V4L2_COLOR_STD_NTSC;
  1891. vs->colorstandard_data.ntsc.colorsubcarrier = 
  1892. V4L2_COLOR_SUBC_PAL;
  1893. break;
  1894. case V4L2_STD_SECAM:
  1895. vs->colorstandard = V4L2_COLOR_STD_SECAM;
  1896. vs->colorstandard_data.secam.f0b = V4L2_COLOR_SUBC_SECAMB;
  1897. vs->colorstandard_data.secam.f0r = V4L2_COLOR_SUBC_SECAMR;
  1898. break;
  1899. default:
  1900. return -EINVAL;
  1901. }
  1902. vs->transmission = transmission;
  1903. return v4l2_video_std_confirm(vs);
  1904. }
  1905. /*---------------------------------------*/
  1906. EXPORT_SYMBOL(v4l2_register_device);
  1907. EXPORT_SYMBOL(v4l2_unregister_device);
  1908. EXPORT_SYMBOL(v4l2_version);
  1909. EXPORT_SYMBOL(v4l2_major_number);
  1910. EXPORT_SYMBOL(v4l2_device_from_minor);
  1911. EXPORT_SYMBOL(v4l2_device_from_file);
  1912. EXPORT_SYMBOL(v4l2_openid_from_file);
  1913. EXPORT_SYMBOL(v4l2_vmalloc_to_bus);
  1914. EXPORT_SYMBOL(v4l2_vmalloc_to_page);
  1915. EXPORT_SYMBOL(v4l2_q_init);
  1916. EXPORT_SYMBOL(v4l2_q_add_head);
  1917. EXPORT_SYMBOL(v4l2_q_add_tail);
  1918. EXPORT_SYMBOL(v4l2_q_del_head);
  1919. EXPORT_SYMBOL(v4l2_q_del_tail);
  1920. EXPORT_SYMBOL(v4l2_q_peek_head);
  1921. EXPORT_SYMBOL(v4l2_q_peek_tail);
  1922. EXPORT_SYMBOL(v4l2_q_yank_node);
  1923. EXPORT_SYMBOL(v4l2_math_div6432);
  1924. EXPORT_SYMBOL(v4l2_timeval_delta);
  1925. EXPORT_SYMBOL(v4l2_timeval_divide);
  1926. EXPORT_SYMBOL(v4l2_timeval_correct);
  1927. EXPORT_SYMBOL(v4l2_masterclock_register);
  1928. EXPORT_SYMBOL(v4l2_masterclock_unregister);
  1929. EXPORT_SYMBOL(v4l2_masterclock_gettime);
  1930. EXPORT_SYMBOL(v4l2_video_std_fps);
  1931. EXPORT_SYMBOL(v4l2_video_std_tpf);
  1932. EXPORT_SYMBOL(v4l2_video_std_confirm);
  1933. EXPORT_SYMBOL(v4l2_video_std_construct);