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

DVD

开发平台:

Unix_Linux

  1. /* -*- linux-c -*- --------------------------------------------------------- *  
  2.  *
  3.  * Video for Linux Two
  4.  * Video Output Driver for Matrox Gx00 series
  5.  *       and Zoran DVD add-on module
  6.  *      (c) 1999 David Barth <dbarth@besancon.net>
  7.  *
  8.  * This software is in the public domain.
  9.  * Based mainly on the module example Written by Bill Dirks
  10.  */
  11. #ifndef __KERNEL__
  12. #define __KERNEL__
  13. #endif
  14. #ifndef MODULE
  15. #define MODULE
  16. #endif
  17. #include <linux/module.h>
  18. #include <linux/delay.h>
  19. #include <linux/errno.h>
  20. #include <linux/fs.h>
  21. #include <linux/kernel.h>
  22. #include <linux/malloc.h>
  23. #include <linux/mm.h>
  24. #include <linux/poll.h>
  25. #include <linux/ioport.h>
  26. #include <asm/io.h>
  27. #include <linux/sched.h>
  28. #include <linux/videodev2.h>
  29. #include <linux/version.h>
  30. #include <asm/uaccess.h>
  31. #include <linux/pci.h>
  32. #include <asm/pgtable.h>
  33. #include <asm/page.h>
  34. #include <linux/interrupt.h>
  35. #include "mgavideo.h"
  36. #include "i34.h"
  37. #define PKMOD "out: "
  38. #if 1
  39. #define debug_msg(fmt,arg...) printk(KERN_DEBUG PKMOD fmt,##arg)
  40. #else
  41. #define debug_msg(fmt,arg...)
  42. #endif
  43. #if 1
  44. #define err_msg(fmt,arg...) printk(KERN_ERR PKMOD fmt,##arg)
  45. #else
  46. #define err_msg(fmt,arg...)
  47. #endif
  48. #if 1
  49. #define info_msg(fmt,arg...) printk(KERN_INFO PKMOD fmt,##arg)
  50. #else
  51. #define info_msg(fmt,arg...)
  52. #endif
  53. /*  Video controls  */
  54. static struct v4l2_queryctrl output_control[] =
  55. {
  56. {V4L2_CID_BRIGHTNESS, "Brightness", 0, 63, 1, 32, V4L2_CTRL_TYPE_INTEGER},
  57. {V4L2_CID_CONTRAST,   "Contrast",   0, 63, 1, 32, V4L2_CTRL_TYPE_INTEGER},
  58. {V4L2_CID_SATURATION, "Saturation", 0, 63, 1, 32, V4L2_CTRL_TYPE_INTEGER},
  59. /*{V4L2_CID_HUE,        "Hue",        0, 63, 1, 32, V4L2_CTRL_TYPE_INTEGER},*/
  60. };
  61. #define MAXCONTROLS (sizeof(output_control)/sizeof(output_control[0]))
  62. #define VCTRL_BRIGHTNESS 0
  63. #define VCTRL_CONTRAST 1
  64. #define VCTRL_SATURATION 2
  65. #define VCTRL_HUE 3
  66. static int
  67. find_vctrl(int id)
  68. {
  69. int i = -1;
  70. if (id == V4L2_CID_PRIVATE_BASE ||
  71.     id <  V4L2_CID_BASE ||
  72.             id >  V4L2_CID_LASTP1)
  73. return -EDOM;
  74. #if 0
  75.         for (i = MAXCONTROLS - 1; i >= 0; i--)
  76.                 if (output_control[i].id == id)
  77.                         break;
  78. #endif
  79. if (i < 0)
  80. i = -EINVAL;
  81.         return i;
  82. }
  83. struct output_device;/* forward reference */
  84. struct video_encoder
  85. {
  86. int is_initialized;
  87. int num_outputs;
  88. int output;
  89. __u32 standards;
  90. __u32 standard;
  91. __u32 frame_period;
  92. /*  Changable method functions helps us support multiple */
  93. /*  different types of video encoders easily */
  94. int (*initialize)(struct output_device *dev);
  95. int (*set_output)(struct output_device *dev, int x);
  96. int (*set_standard)(struct output_device *dev, int x);
  97. };
  98. struct video_output
  99. {
  100. struct v4l2_output output;
  101. int control[MAXCONTROLS];
  102. struct v4l2_modulator modulator;
  103. };
  104. /*  Indices into the array of video_output's */
  105. #define VOUTPUT_COMP 0
  106. #define VOUTPUT_SVIDEO 1
  107. #define VOUTPUT_COUNT 2
  108. /*  Bus-master gather list  */
  109. struct gather_node
  110. {
  111. __u32 addr;
  112. __u32 len;
  113. };
  114. #define END_OF_GATHER_LIST 0x80000000
  115. /*  Per-open data for handling multiple opens on one device */
  116. struct device_open
  117. {
  118. int isopen;
  119. int noio;
  120. struct output_device *dev;
  121. };
  122. #define MAX_OPENS 3
  123. /*  Streaming data buffer  */
  124. struct stream_buffer
  125. {
  126. struct v4l2_q_node qnode;
  127. struct v4l2_buffer vidbuf;
  128. int requested;
  129. __u8 *vaddress;  /* vmalloc() */
  130. struct gather_node *dma_list;  /* get_free_page() */
  131. };
  132. #define MAX_OUTPUT_BUFFERS 10
  133. #define MAX_LOCKED_MEMORY 2000000
  134. /*
  135.  * Output device structure
  136.  *
  137.  * One for each handled device in the system.
  138.  * This structure holds all the global information the driver
  139.  * needs about each device.
  140.  */
  141. struct output_device
  142. {
  143. struct v4l2_device v; /*  Must be first */
  144. struct mga_dev         *mga;
  145. char shortname[16];
  146. int is_registered;
  147. int open_count;
  148. struct device_open open_data[MAX_OPENS];
  149. int io_opens;
  150. /* Per-bus index number for each device */
  151. int index;
  152. /* General type of device  */
  153. int type;
  154. /* Pointer to the pci_dev structure for this board */
  155. struct pci_dev *pci;
  156. /* I/O Base address for non-PCI devices */
  157. unsigned int iobase;
  158. /* Interrupts */
  159. int irq;
  160. int ints_enabled;
  161. struct tq_struct tqnode_dpc;/* for Bottom Half routine */
  162. struct timer_list tlnode;/* for polling interrupts */
  163. struct wait_queue *new_video_frame;
  164. /* Video output (and encoder) stuff */
  165. struct video_encoder viden;
  166. struct video_output voutput[VOUTPUT_COUNT];
  167. int hwoutput_width;
  168. int hwoutput_height;
  169. /* Client output image format */
  170. struct v4l2_format clientfmt;
  171. int output;/* which video output is selected */
  172. struct v4l2_outputparm outputparm;
  173. /* Hardware image format  */
  174. int hwoutput_bypp;
  175. int hwoutput_size;
  176. __u8 *hwoutput_buffer;/* vmalloc() */
  177. int hwoutput_buffer_size;
  178. struct gather_node *hwoutput_dma_list;/* get_free_page() */
  179. /* Hardware output state */
  180. int ready_to_output;
  181. int hwoutput_enabled;
  182. int hwoutput_completed;
  183. unsigned long time_acquired;/* millisecond time stamp */
  184. int streaming;
  185. struct stream_buffer stream_buf[MAX_OUTPUT_BUFFERS];
  186. int stream_buffers_mapped;
  187. struct v4l2_queue stream_q_output;
  188. struct v4l2_queue stream_q_done;
  189. struct timeval stream_begin;
  190. unsigned long stream_last_frame;
  191. __u8 *stream_hwoutput_buffer;
  192. /* Performance statistics */
  193. struct v4l2_performance perf;
  194.         /* video preview stuff */
  195.         struct v4l2_framebuffer  fbuf;
  196.         struct v4l2_window       window;
  197. };
  198. /* Values for type field */
  199. #define DEVICE_TYPE_0 0
  200. /* Extreme video dimensions */
  201. #define MIN_WIDTH 32
  202. #define MIN_HEIGHT 24
  203. #define MAX_WIDTH 720
  204. #define MAX_HEIGHT 576
  205. #define MAX_FRAME_AGE 200 /* ms */
  206. /*
  207.  * The Output device structure array. This is the only global
  208.  * variable in the module besides those used by the device probing
  209.  * and enumeration routines (command line overrides)
  210.  */
  211. #define NBOARDS 2
  212. static struct output_device outputdev[NBOARDS];
  213. static int unit_vout[NBOARDS] = { 16, 17, };
  214. MODULE_PARM(unit_vout, "1-"__MODULE_STRING(NBOARDS)"i");
  215. static inline struct output_device *
  216. output_device_from_file(struct file *file)
  217. {
  218. return (struct output_device *)v4l2_device_from_file(file);
  219. }
  220. /*  These macros can be used to make device I/O operations atomic  */
  221. /* static spinlock_t device_lock = SPIN_LOCK_UNLOCKED; */
  222. /* #define BEGIN_CRITICAL_SECTION  */
  223. /*         do{unsigned long flags;spin_lock_irqsave(&wavi_lock,flags) */
  224. /* #define END_CRITICAL_SECTION  */
  225. /*  spin_unlock_irqrestore(&wavi_lock,flags);}while(0) */
  226. /*
  227.  * D E V I C E   F U N C T I O N S
  228.  */
  229. static void
  230. device_initialize(struct output_device *dev)
  231. {
  232. /*  TODO: Put hardware into a sensible state and */
  233. /*        do the one-time startup things */
  234.         I34_Init(dev->mga);
  235. }
  236. static void
  237. device_brightness(struct output_device *dev, int x)
  238. {
  239. }
  240. static void
  241. device_contrast(struct output_device *dev, int x)
  242. {
  243. }
  244. static void
  245. device_saturation(struct output_device *dev, int x)
  246. {
  247. }
  248. static void
  249. device_tone_controls(struct output_device *dev)
  250. {
  251. int *ctrl;
  252. ctrl = dev->voutput[dev->output].control;
  253. device_brightness(dev, ctrl[VCTRL_BRIGHTNESS]);
  254. device_contrast(dev, ctrl[VCTRL_CONTRAST]);
  255. device_saturation(dev, ctrl[VCTRL_SATURATION]);
  256. /*  device_hue(dev, ctrl[VCTRL_HUE]); */
  257. }
  258. /*  Start or stop the DMA transfer  */
  259. static void
  260. hwoutput_enable(struct output_device *dev, int start)
  261. {
  262. /*  TODO: Start the transfer of the data  */
  263. // if (dev->streaming)
  264. // {
  265. // }
  266. // else
  267. // {
  268. // }
  269. }
  270. #if 0
  271. /*
  272.  *
  273.  * B U S   M A S T E R   F U N C T I O N S
  274.  *
  275.  */
  276. static int
  277. bm_build_gather_list(struct output_device *dev,
  278.      unsigned char    *buffer,
  279.      struct gather_node **plist)
  280. {
  281. struct gather_node *list;
  282. int i, n;
  283. unsigned char *a;
  284. if (buffer == NULL)
  285. return 0;
  286. list = *plist;
  287. if (list == NULL)
  288. {/* Assuming one page will be big enough. 4KB = 512 pieces */
  289. list = (struct gather_node *)get_free_page(GFP_KERNEL);
  290. if (list == NULL)
  291. return 0;
  292. }
  293. /*  Simple algorithm will just map the buffer contiguously by pages */
  294. /*  Note: hwoutput_buffer is vmalloc()ed, so it's page-aligned */
  295. n = (dev->hwoutput_size + PAGE_SIZE - 1) / PAGE_SIZE;
  296. a = buffer;
  297. for (i = 0; i < n; ++i)
  298. {
  299. list[i].addr = v4l2_vmalloc_to_bus(a);
  300. list[i].len = PAGE_SIZE;
  301. a += PAGE_SIZE;
  302. }
  303. /* Last page might not be full */
  304. if (dev->hwoutput_size < n * PAGE_SIZE)
  305. list[n - 1].len = dev->hwoutput_size - (n - 1) * PAGE_SIZE;
  306. list[n - 1].len |= END_OF_GATHER_LIST;
  307. #if 0
  308. debug_msg("Gather list %08lXn", virt_to_bus(list));
  309. for (i = 0; i < n; ++i)
  310. debug_msg("List %2d: A=%08X L=%08Xn",i,
  311.   list[i].addr,list[i].len);
  312. #endif
  313. *plist = list;
  314. return 1;/* ok */
  315. }
  316. #endif
  317. /*
  318.  *
  319.  * V I D E O   E N C O D E R S
  320.  *
  321.  */
  322. static int
  323. encoder_initialize(struct output_device *dev)
  324. {
  325. /*  Video encoder information fields */
  326. dev->viden.standards = (1 << V4L2_STD_NTSC) |
  327. (1 << V4L2_STD_PAL);
  328. dev->viden.num_outputs = 2;
  329. return 1;
  330. }
  331. static int
  332. encoder_set_output(struct output_device *dev, int i)
  333. {
  334. dev->output = i;
  335. /*  TODO: Switch the hardware to the new output  */
  336. return 1;
  337. }
  338. static int
  339. encoder_set_standard(struct output_device *dev, int x)
  340. {
  341. dev->viden.standard = x;
  342. /*  TODO: Switch the hardware to the new standard  */
  343. switch (x)
  344. {
  345. case V4L2_STD_NTSC:
  346. dev->viden.frame_period = 333667;
  347. break;
  348. case V4L2_STD_PAL:
  349. dev->viden.frame_period = 400000;
  350. break;
  351. case V4L2_STD_SECAM:
  352. dev->viden.frame_period = 400000;
  353. break;
  354. }
  355. return 1;
  356. }
  357. static int
  358. encoder_probe(struct output_device *dev)
  359. {
  360. /*  TODO: Probe I2C bus or whatever for the video encoder */
  361. /*  Fill in the method fields  */
  362. dev->viden.initialize = encoder_initialize;
  363. dev->viden.set_output = encoder_set_output;
  364. dev->viden.set_standard = encoder_set_standard;
  365. //info_msg("Found encoder chipn");
  366. return 1;/*  Found  */
  367. }
  368. /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  369.  *
  370.  * Probe I2C bus for video encoder and fill in the device fields
  371.  */
  372. static int
  373. find_encoder(struct output_device *dev)
  374. {
  375. if (!encoder_probe(dev))
  376. return 0;/*  Failure  */
  377. return 1;
  378. }
  379. static void
  380. set_video_output(struct output_device *dev,
  381.  int i)
  382. {
  383. if (i < 0 || i >= dev->viden.num_outputs)
  384. return;
  385. dev->viden.set_output(dev, i);
  386. device_tone_controls(dev);
  387. }
  388. /*
  389.  *
  390.  * V I D E O   O U T P U T   F U N C T I O N S
  391.  *
  392.  */
  393. /*
  394.  *  Supported image formats
  395.  */
  396. static struct v4l2_fmtdesc outfmt[] = 
  397. {
  398. { 0, {"RGB-16 (5-5-5)"},
  399. V4L2_PIX_FMT_RGB555,  0, 16, {0, 0},
  400. },
  401. { 1, {"RGB-16 (5-6-5)"},
  402. V4L2_PIX_FMT_RGB565,  0, 16, {0, 0},
  403. },
  404. { 2, {"RGB-24 (B-G-R)"},
  405. V4L2_PIX_FMT_BGR24,   0, 24, {0, 0},
  406. },
  407. { 3, {"RGB-32 (B-G-R-?)"},
  408. V4L2_PIX_FMT_BGR32,   0, 32, {0, 0},
  409. },
  410. { 4, {"Greyscale-8"},
  411. V4L2_PIX_FMT_GREY,    V4L2_FMT_CS_601YUV, 8, {0, 0},
  412. },
  413. { 5, {"YUV 4:2:2 (Y-U-Y-V)"},
  414. V4L2_PIX_FMT_YUYV,    V4L2_FMT_CS_601YUV, 16, {0, 0},
  415. },
  416. { 6, {"YUV 4:2:0 (planar)"},
  417. V4L2_PIX_FMT_YUV420,  V4L2_FMT_CS_601YUV, 12, {0, 0},
  418. },
  419. };
  420. #define NUM_OUTFMT (sizeof(outfmt)/sizeof(outfmt[0]))
  421. static void interrupt_enable(struct output_device *dev);
  422. /*  The image format has changed, width, height, pixel format.
  423.  *  Decide if the format is ok or take the closest valid format.
  424.  */
  425. static void
  426. hwoutput_new_format(struct output_device *dev)
  427. {
  428. int ntsc;
  429. int max_height;
  430. int max_width;
  431. if (dev->stream_buffers_mapped)
  432. return;
  433. ntsc = (dev->viden.standard == V4L2_STD_NTSC);
  434. dev->ready_to_output = 0;
  435. dev->clientfmt.flags = V4L2_FMT_CS_601YUV;
  436. switch (dev->clientfmt.pixelformat)
  437. {
  438. case V4L2_PIX_FMT_GREY:
  439. dev->clientfmt.depth = 8;
  440. break;
  441. case V4L2_PIX_FMT_YUV420:
  442. dev->clientfmt.depth = 12;
  443. break;
  444. case V4L2_PIX_FMT_RGB555:
  445. case V4L2_PIX_FMT_RGB565:
  446. dev->clientfmt.flags = 0;
  447. /* fall thru */
  448. case V4L2_PIX_FMT_YUYV:
  449. case V4L2_PIX_FMT_UYVY:
  450. dev->clientfmt.depth = 16;
  451. break;
  452. case V4L2_PIX_FMT_BGR24:
  453. dev->clientfmt.depth = 24;
  454. dev->clientfmt.flags = 0;
  455. break;
  456. case V4L2_PIX_FMT_BGR32:
  457. dev->clientfmt.depth = 32;
  458. dev->clientfmt.flags = 0;
  459. break;
  460. default:
  461. //debug_msg("unknown format %08Xn", dev->clientfmt.pixelformat);
  462. dev->clientfmt.depth = 24;
  463. dev->clientfmt.flags = 0;
  464. break;
  465. }
  466. dev->hwoutput_bypp = 2;
  467. if (dev->clientfmt.width < MIN_WIDTH)
  468. dev->clientfmt.width = MIN_WIDTH;
  469. if (dev->clientfmt.height < MIN_HEIGHT)
  470. dev->clientfmt.height = MIN_HEIGHT;
  471. max_width = MAX_WIDTH;
  472. max_height = MAX_HEIGHT;
  473. if (dev->clientfmt.width > max_width)
  474. dev->clientfmt.width = max_width;
  475. if (dev->clientfmt.height > max_height)
  476. dev->clientfmt.height = max_height;
  477. dev->clientfmt.width &= ~3;
  478. dev->clientfmt.height &= ~3;
  479. dev->clientfmt.sizeimage = (dev->clientfmt.width
  480.     * dev->clientfmt.height
  481.     * dev->clientfmt.depth)
  482. / 8;
  483. dev->hwoutput_size = dev->clientfmt.width
  484. * dev->clientfmt.height
  485. * dev->hwoutput_bypp;
  486. /*  TODO: Any other driver state related to the image format  */
  487. }
  488. /*  Stop the music!
  489.  */
  490. static void
  491. hwoutput_abort(struct output_device *dev)
  492. {
  493. dev->hwoutput_enabled = 0;
  494. /*  Turn off the hardware  */
  495. hwoutput_enable(dev, 0);
  496. }
  497. /*  Allocate buffers, and get everything ready to go, but don't start yet.
  498.  */
  499. static int
  500. hwoutput_begin(struct output_device *dev)
  501. {
  502. hwoutput_abort(dev);
  503. if (dev->ready_to_output)
  504. return dev->ready_to_output;
  505. if (dev->hwoutput_buffer_size < dev->hwoutput_size)
  506. {
  507. if (dev->hwoutput_buffer != NULL)
  508. vfree(dev->hwoutput_buffer);
  509. dev->hwoutput_buffer_size = 
  510. (dev->hwoutput_size + PAGE_SIZE - 1)
  511. & ~(PAGE_SIZE - 1);
  512. dev->hwoutput_buffer = (__u8 *)
  513. vmalloc(dev->hwoutput_buffer_size);
  514. if (dev->hwoutput_buffer == NULL)
  515. {
  516. dev->hwoutput_buffer_size = 0;
  517. err_msg("Can't allocate buffer"
  518. " %d bytesn", dev->hwoutput_size);
  519. return dev->ready_to_output;
  520. }
  521. }
  522. #if 0
  523. if (dev->irq && (can use DMA))
  524. bm_build_gather_list(dev, dev->hwoutput_buffer, 
  525.      &dev->hwoutput_dma_list);
  526. #endif
  527. /*  TODO: other last-minute things to get the device ready */
  528. interrupt_enable(dev);
  529. debug_msg("Ready to go!n");
  530. return (dev->ready_to_output = 1);
  531. }
  532. /*  Start an image transfer out to the hardware
  533.  */
  534. static void
  535. hwoutput_send_frame(struct output_device *dev)
  536. {
  537. if (!dev->ready_to_output)
  538. return;/* shouldn't happen */
  539. if (dev->hwoutput_enabled)
  540. return;
  541. /*  TODO: Prepare the hardware for the next image transfer */
  542. //list = dev->hwoutput_dma_list;/* DMA list for hwoutput_buffer */
  543. /*  Set up stream_hwoutput_buffer to point to the buffer to  */
  544. /*  transfer the next frame from  */
  545. if (dev->streaming)
  546. {
  547. struct stream_buffer *buf;
  548. buf = v4l2_q_peek_head(&dev->stream_q_output);
  549. if (buf != NULL)
  550. {
  551. dev->stream_hwoutput_buffer = buf->vaddress;
  552. //list = buf->dma_list;
  553. }
  554. }
  555. /*  TODO: load the DMA gather list if needed */
  556. /*  Start the hardware taking the data */
  557. hwoutput_enable(dev, 1);
  558. dev->hwoutput_enabled = 1;
  559. dev->hwoutput_completed = 0;
  560. }
  561. /*
  562.  * STREAMING IMAGES
  563.  */
  564. static int/* 1 = success; 0 = failed */
  565. hwoutput_queuebuffer(struct output_device *dev,
  566.      struct v4l2_buffer   *vidbuf)
  567. {
  568. int i = vidbuf->index;
  569. struct stream_buffer *buf = NULL;
  570. if (!dev->stream_buffers_mapped)
  571. {
  572. debug_msg("QBUF no buffers mappedn");
  573. return 0;
  574. }
  575. if (vidbuf->type != V4L2_BUF_TYPE_VIDEOOUT)
  576. {
  577. debug_msg("QBUF wrong typen");
  578. return 0;
  579. }
  580. if (i < 0 || i >= MAX_OUTPUT_BUFFERS || !dev->stream_buf[i].requested)
  581. {
  582. debug_msg("QBUF buffer index %d is out of rangen", i);
  583. return 0;
  584. }
  585. buf = &dev->stream_buf[i];
  586. if (!(buf->vidbuf.flags & V4L2_BUF_FLAG_MAPPED))
  587. {
  588. debug_msg("QBUF buffer %d is not mappedn", i);
  589. return 0;
  590. }
  591. if ((buf->vidbuf.flags & V4L2_BUF_FLAG_QUEUED))
  592. {
  593. debug_msg("QBUF buffer %d is already queuedn", i);
  594. return 0;
  595. }
  596. buf->vidbuf.flags &= ~V4L2_BUF_FLAG_DONE;
  597. v4l2_q_add_tail(&dev->stream_q_output, &buf->qnode);
  598. buf->vidbuf.flags |= V4L2_BUF_FLAG_QUEUED;
  599. return 1;
  600. }
  601. static int/* 1 = got a buffer; 0 = no buffers */
  602. hwoutput_dequeuebuffer(struct output_device *dev,
  603.        struct v4l2_buffer *buf)
  604. {
  605. struct stream_buffer *newbuf;
  606. if (!dev->streaming || buf->type != V4L2_BUF_TYPE_VIDEOOUT)
  607. {
  608. debug_msg("DQBUF not streaming or wrong buffer typen");
  609. return 0;
  610. }
  611. newbuf = v4l2_q_del_head(&dev->stream_q_done);
  612. if (newbuf == NULL)
  613. {
  614. debug_msg("DQBUF nothing on done queuen");
  615. return 0;
  616. }
  617. newbuf->vidbuf.flags &= ~V4L2_BUF_FLAG_QUEUED;
  618. *buf = newbuf->vidbuf;
  619. return 1;
  620. }
  621. static int
  622. hwoutput_streamon(struct output_device *dev,
  623.   __u32 type)
  624. {
  625. struct stream_buffer *buf;
  626. if (dev->streaming || type != V4L2_BUF_TYPE_VIDEOOUT)
  627. {
  628. debug_msg("STREAMON wrong buffer type or already streamingn");
  629. return 0;
  630. }
  631. hwoutput_abort(dev);/* cancel any transfer that might be in progress */
  632. /*  -2 is a magic number that triggers start-of-stream logic in */
  633. /*    hwoutput_interrupt()  */
  634. dev->stream_last_frame = -2;
  635. dev->perf.frames = 0;
  636. dev->perf.framesdropped = 0;
  637. dev->perf.bytesout = 0;
  638. /*  Can't send frames faster than the video output rate  */
  639. if (dev->outputparm.timeperframe < dev->viden.frame_period)
  640. dev->outputparm.timeperframe = dev->viden.frame_period;
  641. /*  Move any leftover DONE buffers to the free pool */
  642. while ((buf = v4l2_q_del_head(&dev->stream_q_done)))
  643. buf->vidbuf.flags &= ~V4L2_BUF_FLAG_QUEUED;
  644. /*  Kick off the machine */
  645. dev->streaming = 1;
  646. hwoutput_send_frame(dev);
  647. return 1;
  648. }
  649. static void
  650. hwoutput_streamoff(struct output_device *dev,
  651.    __u32 type)
  652. {
  653. if (!dev->streaming || type != V4L2_BUF_TYPE_VIDEOOUT)
  654. {
  655. debug_msg("STREAMOFF wrong buffer type or not streamingn");
  656. return;
  657. }
  658. hwoutput_abort(dev);
  659. dev->streaming = 0;
  660. /* Note: should really delay this  */
  661. dev->perf.frames = 0;
  662. dev->perf.framesdropped = 0;
  663. dev->perf.bytesout = 0;
  664. }
  665. /* Called from write(). Copy the data to a driver internal buffer
  666.  * which the hardware can read directly or can DMA from or whatever
  667.  * makes sense for the hardware. You probably want to double-buffer
  668.  * somehow so that the output is continuous.
  669.  */
  670. static int /* returns length of data or negative for error */
  671. hwoutput_writeimage(struct output_device *dev,
  672.     __u8 *hwoutput_buffer,
  673.     const __u8 *source_buffer,
  674.     int output_size,
  675.     int output_is_user)
  676. {
  677. int len;
  678. /*  TODO: take data from the source buffer */
  679. /*  Check if more data can be accepted now, if not return 
  680.     zero if the application just needs to wait, or a negative 
  681.     error code if there is a problem. Otherwise return the
  682.     number of bytes taken  */
  683. len = dev->hwoutput_size;
  684. ++dev->perf.frames;
  685. dev->perf.bytesout += len;
  686. return len;
  687. }
  688. /*  The hardware has issued the interrupt signal, depending on the device,
  689.  *  this could mean a vertical sync or a DMA completion.
  690.  *  [This function is called indirectly through the immediate task queue;
  691.  *  it executes at elevated IRQL, but it is interruptible. (It's a b.h.)]
  692.  */
  693. static void
  694. hwoutput_interrupt(void *v)
  695. {
  696. struct output_device *dev = (struct output_device *)v;
  697. struct stream_buffer *buf;
  698. struct timeval timestamp_rough;
  699. unsigned long raw_frame_num;
  700. unsigned long next_raw_frame_to_keep;
  701. unsigned long stream_frame_num;
  702. u64 temp64;
  703. /*  TODO: Check for an interrupt pending on the device, and  */
  704. /*        return if there is no interrupt pending  */
  705. /*  (In this hardware-less demo I'll just check the completed flag) */
  706. if (!dev->hwoutput_enabled ||
  707.     dev->hwoutput_completed)
  708. return;
  709. if (!dev->ints_enabled /* || TODO: some other sanity checks? */)
  710. {
  711. err_msg("Can't process the interruptn");
  712. return;
  713. }
  714. dev->hwoutput_completed = 1;
  715. if (!dev->streaming)
  716. {
  717. /*  TODO: Interrupt processing when using write() instead  */
  718. /*  of streaming for outputting frames   */
  719. //debug_msg("Ready for new framen");
  720. /*  Ready for the next frame!  */
  721. /*  (If select() or write() is blocked, wake him up.) */
  722. wake_up_interruptible(&dev->new_video_frame);
  723. return;
  724. }
  725. /*  ...Only get here in streaming mode...  */
  726. if (dev->stream_last_frame == -2)
  727. {/* First frame of the stream  */
  728. v4l2_masterclock_gettime(&dev->stream_begin);
  729. dev->stream_last_frame = -1;
  730. }
  731. buf = v4l2_q_peek_head(&dev->stream_q_output);
  732. if (buf == NULL)
  733. {/* No available buffers. TODO: Maybe do nothing, maybe use  */
  734. /* previous frame again  */
  735. return;
  736. }
  737. /*  Compute current stream time  */
  738. v4l2_masterclock_gettime(&timestamp_rough);
  739. v4l2_timeval_delta(&timestamp_rough,
  740.    &dev->stream_begin, &timestamp_rough);
  741. /*  Output rate control  */
  742. raw_frame_num = v4l2_timeval_divide(
  743. &timestamp_rough, dev->viden.frame_period);
  744. temp64 = (u64)dev->outputparm.timeperframe
  745. * (dev->stream_last_frame + 1)
  746. + (dev->viden.frame_period >> 1);
  747. next_raw_frame_to_keep = 
  748. v4l2_math_div6432(temp64, dev->viden.frame_period, NULL);
  749. if (raw_frame_num < next_raw_frame_to_keep)
  750. {/* Not time yet according to desired output frame rate,     */
  751. /* wait some more. (Similar processing to no buffers case.) */
  752. return;
  753. }
  754. /*  Time to send out next frame  */
  755. //hwoutput_writeimage(dev, dev->stream_hwoutput_buffer,
  756. //       buf->vaddress, buf->vidbuf.length, 0);
  757. /*  Mark the buffer DONE  */
  758. buf->vidbuf.flags |= V4L2_BUF_FLAG_DONE;
  759. /*  For informational purposes to the app, figure if frames have  */
  760. /*  been missed.     */
  761. stream_frame_num = v4l2_timeval_correct(&buf->vidbuf.timestamp,
  762. dev->outputparm.timeperframe);
  763. //debug_msg("Stream frame %4lu T= %lu.%06lun", stream_frame_num,
  764. //   buf->vidbuf.timestamp.tv_sec,buf->vidbuf.timestamp.tv_usec);
  765. if (stream_frame_num > dev->stream_last_frame + 1)
  766. {/* We have missed one or more frames  */
  767. dev->perf.framesdropped += stream_frame_num
  768. - dev->stream_last_frame + 1;
  769. }
  770. dev->stream_last_frame = stream_frame_num;
  771. /*  Move buffer to done queue  */
  772. buf = v4l2_q_del_head(&dev->stream_q_output);
  773. v4l2_q_add_tail(&dev->stream_q_done, &buf->qnode);
  774. /*  Send out the next frame now  */
  775. hwoutput_send_frame(dev);
  776. /*  Ready for the next frame! (select() might be waiting) */
  777. wake_up_interruptible(&dev->new_video_frame);
  778. }
  779. /*  Send a frame from a user buffer to the device
  780.  *  Return: negative = error
  781.  *     0        = keep waiting
  782.  *     positive = count of bytes sent successfully
  783.  */
  784. static long
  785. hwoutput_write(struct output_device *dev,
  786.        const __u8 *user_buffer,
  787.        int user_buffer_size)
  788. {
  789. int len = user_buffer_size;
  790. if (!dev->ints_enabled)
  791. return -EIO;
  792. if (!dev->hwoutput_completed)
  793. {/* Not ready for another frame yet */
  794. //debug_msg("Not ready for write.n");
  795. return 0;/* caller should keep waiting */
  796. }
  797. len = hwoutput_writeimage(dev, dev->hwoutput_buffer,
  798.   user_buffer, user_buffer_size, 1);
  799. return len;
  800. }
  801. /*  Stop and free all resources used for operation.
  802.  */
  803. static void
  804. hwoutput_close(struct output_device *dev)
  805. {
  806. int i;
  807. if (dev->streaming)
  808. hwoutput_streamoff(dev, V4L2_BUF_TYPE_VIDEOOUT);
  809. hwoutput_abort(dev);
  810. dev->ready_to_output = 0;
  811. if (dev->hwoutput_dma_list)
  812. free_page((unsigned long)dev->hwoutput_dma_list);
  813. dev->hwoutput_dma_list = 0;
  814. if (dev->hwoutput_buffer != NULL)
  815. vfree(dev->hwoutput_buffer);
  816. dev->hwoutput_buffer = NULL;
  817. dev->hwoutput_buffer_size = 0;
  818. for (i = 0; i < MAX_OUTPUT_BUFFERS; ++i)
  819. {
  820. dev->stream_buf[i].requested = 0;
  821. if (dev->stream_buf[i].vaddress)
  822. vfree(dev->stream_buf[i].vaddress);
  823. dev->stream_buf[i].vaddress = NULL;
  824. if (dev->stream_buf[i].dma_list)
  825. free_page((unsigned long)dev->stream_buf[i].dma_list);
  826. dev->stream_buf[i].dma_list = NULL;
  827. }
  828. }
  829. /*
  830.  *
  831.  * I N T E R R U P T   R O U T I N E S
  832.  *
  833.  */
  834. /*  This function runs at interrupt time, either in response to a hardware
  835.  *  interrupt, or on each timer tick if there is no hardware interrupt.
  836.  */
  837. static void
  838. interrupt_handler(void *v)
  839. {
  840. struct output_device *dev = (struct output_device *)v;
  841. if (!dev->ints_enabled)
  842. return;
  843. /*  Call "bottom half" of handler  */
  844. dev->tqnode_dpc.routine = hwoutput_interrupt;
  845. dev->tqnode_dpc.data = dev;
  846. queue_task(&dev->tqnode_dpc, &tq_immediate);
  847. mark_bh(IMMEDIATE_BH);
  848. if (dev->tlnode.function != NULL &&
  849.     dev->ints_enabled)
  850. {/* Poll again on next timer tick  */
  851. dev->tlnode.expires = jiffies + HZ/100;
  852. add_timer(&dev->tlnode);
  853. }
  854. }
  855. /*  Called by the system when our hardware interrupt occurs
  856.  */
  857. static void
  858. interrupt_hw(int irq, void *v,
  859.      struct pt_regs *regs)
  860. {
  861. /* struct output_device *dev = (struct output_device *)v; */
  862. if (v == NULL)
  863. return;
  864. /*  if (!(our device has interrupt pending)) */
  865. /*  { */
  866. /*  Not us. Likely another device is sharing the IRQ */
  867. /*  debug_msg("HW interrupt (not this device)n"); */
  868. /*  return; */
  869. /*  } */
  870. //debug_msg("HW interrupt (real)n");
  871. interrupt_handler(v);
  872. }
  873. static void
  874. interrupt_disable(struct output_device *dev)
  875. {
  876. if (!dev->ints_enabled)
  877. return;
  878. dev->ints_enabled = 0;
  879. /*  TODO: Disable interrupts on the device  */
  880. if (dev->irq == 0)
  881. {
  882. del_timer(&dev->tlnode);
  883. }
  884. /*  Wake up any processes that might be waiting for a frame  */
  885. /*  and let them return an error  */
  886. wake_up_interruptible(&dev->new_video_frame);
  887. }
  888. static void
  889. interrupt_enable(struct output_device *dev)
  890. {
  891. if (dev->ints_enabled)
  892. interrupt_disable(dev);
  893. dev->ints_enabled = 1;
  894. /*  TODO: Enable interrupts on the device  */
  895. dev->tlnode.function = NULL; /* NULL indicates h/w interrupts */
  896. if (dev->irq == 0)
  897. {
  898. init_timer(&dev->tlnode);
  899. dev->tlnode.function = 
  900. (void(*)(unsigned long))interrupt_handler;
  901. dev->tlnode.data = (unsigned long)dev;
  902. dev->tlnode.expires = jiffies + HZ/100;
  903. add_timer(&dev->tlnode);
  904. }
  905. debug_msg("%s interrupts enabledn",
  906.   dev->tlnode.function?"Polled":"Hardware");
  907. }
  908. /*
  909.  *
  910.  * M E M O R Y   M A P P I N G
  911.  *
  912.  */
  913. static struct stream_buffer *
  914. mmap_stream_buffer_from_offset(struct output_device *dev,
  915.        unsigned long offset)
  916. {
  917. int i;
  918. for (i = 0; i < MAX_OUTPUT_BUFFERS; ++i)
  919. if (offset == dev->stream_buf[i].vidbuf.offset)
  920. return &dev->stream_buf[i];
  921. return NULL;
  922. }
  923. static int
  924. mmap_request_buffers(struct output_device *dev,
  925.      struct v4l2_requestbuffers *req)
  926. {
  927. int i;
  928. u32 buflen;
  929. if (dev->stream_buffers_mapped)
  930. return 0;/* can't make requests if buffers are mapped */
  931. if (req->count < 1)
  932. req->count = 1;
  933. if (req->count > MAX_OUTPUT_BUFFERS)
  934. req->count = MAX_OUTPUT_BUFFERS;
  935. req->type = V4L2_BUF_TYPE_VIDEOOUT; /* only kind I know */
  936. /*  The buffer length needs to be a multiple of the page size  */
  937. buflen = (dev->clientfmt.sizeimage + PAGE_SIZE - 1)
  938. & ~(PAGE_SIZE - 1);
  939. debug_msg("Granting %d buffersn",req->count);
  940. /*  Now initialize the buffer structures. Don't allocate the */
  941. /*  buffers until they're mapped. */
  942. for (i = 0; i < req->count; ++i)
  943. {
  944. dev->stream_buf[i].requested = 1;
  945. dev->stream_buf[i].vidbuf.index = i;
  946. dev->stream_buf[i].vidbuf.type = req->type;
  947. dev->stream_buf[i].vidbuf.offset = 4*i;/* anything unique */
  948. dev->stream_buf[i].vidbuf.length = buflen;
  949. dev->stream_buf[i].vidbuf.bytesused = 0;
  950. dev->stream_buf[i].vidbuf.timestamp.tv_sec = 0;
  951. dev->stream_buf[i].vidbuf.timestamp.tv_usec = 0;
  952. dev->stream_buf[i].vidbuf.flags = 0;
  953. }
  954. for (i = req->count; i < MAX_OUTPUT_BUFFERS; ++i)
  955. dev->stream_buf[i].requested = 0;
  956. return 1;
  957. }
  958. static void
  959. mmap_unrequest_buffers(struct output_device *dev)
  960. {
  961. int i;
  962. for (i = 0; i < MAX_OUTPUT_BUFFERS; ++i)
  963. dev->stream_buf[i].requested = 0;
  964. }
  965. static void
  966. mmap_vma_open(struct vm_area_struct *vma)
  967. {
  968. struct output_device *dev =
  969. output_device_from_file(vma->vm_file);
  970. if (dev == NULL)
  971. return;
  972. //debug_msg("vma_open calledn");
  973. ++dev->stream_buffers_mapped;
  974. //MOD_INC_USE_COUNT;
  975. }
  976. static void
  977. mmap_vma_close(struct vm_area_struct *vma)
  978. {
  979. struct output_device *dev =
  980. output_device_from_file(vma->vm_file);
  981. struct stream_buffer *buf =
  982. mmap_stream_buffer_from_offset(dev, vma->vm_offset);
  983. if (dev->streaming)
  984. {
  985. info_msg("Warning- munmap() called while streamingn");
  986. hwoutput_streamoff(dev, buf->vidbuf.type);
  987. }
  988. v4l2_q_yank_node(&dev->stream_q_output, &buf->qnode);
  989. v4l2_q_yank_node(&dev->stream_q_done, &buf->qnode);
  990. if (buf->vaddress != NULL)
  991. vfree(buf->vaddress);
  992. buf->vaddress = NULL;
  993. if (buf->dma_list)
  994. free_page((unsigned long)buf->dma_list);
  995. buf->dma_list = NULL;
  996. buf->vidbuf.flags = 0;
  997. //debug_msg("Buffer %d deallocatedn",(int)vma->vm_offset/4);
  998. if (dev->stream_buffers_mapped > 0)
  999. --dev->stream_buffers_mapped;
  1000. //MOD_DEC_USE_COUNT;
  1001. }
  1002. static unsigned long
  1003. mmap_vma_nopage(struct vm_area_struct *vma,
  1004. unsigned long address, int write)
  1005. {
  1006. struct output_device *dev;
  1007. struct stream_buffer *buf;
  1008. unsigned long offset_into_buffer;
  1009. unsigned long page;
  1010. dev = output_device_from_file(vma->vm_file);
  1011. if (dev == NULL)
  1012. return 0;
  1013. buf = mmap_stream_buffer_from_offset(dev, vma->vm_offset);
  1014. if (buf == NULL)
  1015. return 0;
  1016. offset_into_buffer = address - vma->vm_start;
  1017. if (offset_into_buffer >= buf->vidbuf.length)
  1018. {
  1019. err_msg("Attempt to read past end of mmap() buffern");
  1020. return 0;
  1021. }
  1022. page = v4l2_vmalloc_to_page(buf->vaddress + offset_into_buffer);
  1023. if (page == 0)
  1024. return 0;
  1025. atomic_inc(&mem_map[MAP_NR(page)].count);
  1026. return page;
  1027. }
  1028. static struct vm_operations_struct hwoutput_vma_operations =
  1029. {
  1030. mmap_vma_open, mmap_vma_close, NULL, NULL, NULL, NULL,
  1031. mmap_vma_nopage,
  1032. };
  1033. /*
  1034.  *
  1035.  * V I D E O   F O R   L I N U X   I N T E R F A C I N G
  1036.  *
  1037.  */
  1038. static int
  1039. v4l2_open(struct v4l2_device *v, int flags, void **idptr)
  1040. {
  1041. struct output_device *dev = (struct output_device *)v;
  1042. int i, n;
  1043. int io;
  1044. for (i = 0, n = -1, io = 0; i < MAX_OPENS; ++i)
  1045. {
  1046. if (!dev->open_data[i].isopen)
  1047. n = i;/* available open_data structure */
  1048. else if (!dev->open_data[i].noio)
  1049. io = 1;/* another open is already operating */
  1050. }
  1051. if (n == -1)/* No available open_data structures */
  1052. {
  1053. debug_msg("No more opens on this devicen");
  1054. return -EBUSY;
  1055. }
  1056. if (flags & O_NOIO)/*  no-I/O open */
  1057. dev->open_data[n].noio = 1;
  1058. else if (io)
  1059. {
  1060. debug_msg("No more I/O opens on this devicen");
  1061. return -EBUSY;
  1062. }
  1063. else
  1064. {
  1065. dev->open_data[n].noio = 0;
  1066. /*  Keep track of whether there is an I/O open  */
  1067. ++dev->io_opens;
  1068. dev->perf.frames = 0;
  1069. dev->perf.framesdropped = 0;
  1070. dev->perf.bytesout = 0;
  1071. }
  1072. //MOD_INC_USE_COUNT;
  1073. ++dev->open_count;
  1074. dev->open_data[n].isopen = 1;
  1075. dev->open_data[n].dev = dev;
  1076. *idptr = &dev->open_data[n];
  1077. if (dev->open_count == 1)
  1078. {
  1079. if (dev->pci && dev->irq == 0)
  1080. {
  1081. dev->irq = dev->pci->irq;
  1082. if (request_irq(dev->irq, interrupt_hw, SA_SHIRQ,
  1083. dev->shortname, dev) < 0)
  1084. {
  1085. err_msg("Denied IRQ %dn", dev->irq);
  1086. dev->irq = 0;
  1087. }
  1088. }
  1089. dev->ready_to_output = 0;/* benchmark changes parameters! */
  1090. dev->hwoutput_completed = 0;
  1091. dev->hwoutput_enabled = 0;
  1092. v4l2_q_init(&dev->stream_q_output);
  1093. v4l2_q_init(&dev->stream_q_done);
  1094. }
  1095. debug_msg("Open succeededn");
  1096. return 0;
  1097. }
  1098. static void
  1099. v4l2_close(void *id)
  1100. {
  1101. struct device_open *o = (struct device_open *)id;
  1102. struct output_device *dev = o->dev;
  1103. if (!o->noio)
  1104. {
  1105. --dev->io_opens;
  1106. debug_msg("Closen");
  1107. }
  1108. o->isopen = 0;
  1109.         --dev->open_count;
  1110. if (dev->open_count == 0)
  1111. {
  1112. interrupt_disable(dev);
  1113. hwoutput_close(dev);
  1114. if (dev->irq)
  1115. free_irq(dev->irq, dev);
  1116. dev->irq = 0;
  1117. }
  1118. //MOD_DEC_USE_COUNT;
  1119. }
  1120. /*  The arguments are already copied into kernel memory, so don't use
  1121.     copy_from_user() or copy_to_user() on arg.  */
  1122. static int
  1123. v4l2_ioctl(void *id,
  1124.    unsigned int cmd,
  1125.    void *arg)
  1126. {
  1127. struct device_open *o = (struct device_open *)id;
  1128. struct output_device *dev = o->dev;
  1129. // debug_msg("ioctl %dn", _IOC_NR(cmd));
  1130. switch(cmd)
  1131. {
  1132. case VIDIOC_QUERYCAP:
  1133. {
  1134. struct v4l2_capability *b = arg;
  1135. strcpy(b->name, dev->v.name);
  1136. b->type = V4L2_TYPE_OUTPUT;
  1137. b->flags = V4L2_FLAG_WRITE |
  1138. V4L2_FLAG_STREAMING |
  1139. V4L2_FLAG_SELECT;
  1140. b->outputs = dev->viden.num_outputs;
  1141. b->inputs = 0;
  1142. b->audios = 0;
  1143. b->maxwidth = MAX_WIDTH;
  1144. b->maxheight = MAX_HEIGHT;
  1145. b->minwidth = MIN_WIDTH;
  1146. b->minheight = MIN_HEIGHT;
  1147. b->maxframerate = 30;
  1148. return 0;
  1149. }
  1150. case VIDIOC_ENUM_OUTFMT:
  1151. {
  1152. struct v4l2_fmtdesc *f = arg;
  1153. if (f->index < 0 || f->index >= NUM_OUTFMT)
  1154. return -EINVAL;
  1155. *f = outfmt[f->index];
  1156. return 0;
  1157. }
  1158. case VIDIOC_G_FMT:
  1159. {
  1160. memcpy(arg, &dev->clientfmt, sizeof(dev->clientfmt));
  1161. return 0;
  1162. }
  1163. case VIDIOC_S_FMT:
  1164. {
  1165. struct v4l2_format *fmt = arg;
  1166. if (o->noio)
  1167. {
  1168. debug_msg("S_FMT illegal in no-I/O openn");
  1169. return -EPERM;
  1170. }
  1171. if (dev->stream_buffers_mapped)
  1172. {
  1173. debug_msg("Can't set format if buffers are mappedn");
  1174. return -EPERM;
  1175. }
  1176. dev->clientfmt = *fmt;
  1177. hwoutput_new_format(dev);
  1178. mmap_unrequest_buffers(dev);
  1179. *fmt = dev->clientfmt;
  1180. return 0;
  1181. }
  1182. case VIDIOC_REQBUFS:
  1183. {
  1184. struct v4l2_requestbuffers *req = arg;
  1185. if (o->noio)
  1186. {
  1187. debug_msg("REQBUFS illegal in no-I/O openn");
  1188. return -EPERM;
  1189. }
  1190. if (dev->stream_buffers_mapped)
  1191. {
  1192. debug_msg("Can't request buffers if buffers are "
  1193.   "already mappedn");
  1194. return -EPERM;
  1195. }
  1196. hwoutput_begin(dev);
  1197. if (!mmap_request_buffers(dev, req))
  1198. return -EINVAL;
  1199. return 0;
  1200. }
  1201. case VIDIOC_QUERYBUF:
  1202. {
  1203. struct v4l2_buffer *buf = arg;
  1204. int i;
  1205. if (o->noio)
  1206. {
  1207. debug_msg("QUERYBUF illegal in no-I/O openn");
  1208. return -EPERM;
  1209. }
  1210. i = buf->index;
  1211. if (i < 0 || i >= MAX_OUTPUT_BUFFERS ||
  1212.     !dev->stream_buf[i].requested ||
  1213.     (buf->type & V4L2_BUF_TYPE_field) != 
  1214.     (dev->stream_buf[i].vidbuf.type & V4L2_BUF_TYPE_field))
  1215. {
  1216. debug_msg("QUERYBUF bad parametern");
  1217. return -EINVAL;
  1218. }
  1219. *buf = dev->stream_buf[i].vidbuf;
  1220. return 0;
  1221. }
  1222. case VIDIOC_QBUF:
  1223. {
  1224. struct v4l2_buffer *buf =arg;
  1225. if (o->noio)
  1226. {
  1227. debug_msg("QBUF illegal in no-I/O openn");
  1228. return -EPERM;
  1229. }
  1230. if (!dev->stream_buffers_mapped)
  1231. {
  1232. debug_msg("QBUF no buffers are mappedn");
  1233. return -EINVAL;
  1234. }
  1235. if (!hwoutput_queuebuffer(dev, buf))
  1236. return -EINVAL;
  1237. return 0;
  1238. }
  1239. case VIDIOC_DQBUF:
  1240. {
  1241. struct v4l2_buffer *buf = arg;
  1242. if (o->noio)
  1243. {
  1244. debug_msg("DQBUF illegal in no-I/O openn");
  1245. return -EPERM;
  1246. }
  1247. if (!hwoutput_dequeuebuffer(dev, buf))
  1248. return -EINVAL;
  1249. return 0;
  1250. }
  1251. case VIDIOC_STREAMON:
  1252. {
  1253. __u32 type = (__u32)arg;
  1254. if (o->noio)
  1255. {
  1256. debug_msg("STREAMON illegal in no-I/O openn");
  1257. return -EPERM;
  1258. }
  1259. if (!hwoutput_streamon(dev, type))
  1260. return -EINVAL;
  1261. return 0;
  1262. }
  1263. case VIDIOC_STREAMOFF:
  1264. {
  1265. __u32 type = (__u32)arg;
  1266. if (o->noio)
  1267. {
  1268. debug_msg("STREAMOFF illegal in no-I/O openn");
  1269. return -EPERM;
  1270. }
  1271. hwoutput_streamoff(dev, type);
  1272. return 0;
  1273. }
  1274. case VIDIOC_ENUM_FBUFFMT:
  1275.         {
  1276.                 struct v4l2_fmtdesc* fmt = (struct v4l2_fmtdesc*)arg;
  1277.                 strcpy( fmt->description, "Video Overlay" );
  1278.                 fmt->pixelformat = 0;
  1279.                 fmt->flags = 0;
  1280.                 fmt->depth = 0;
  1281.                 return 0;
  1282.         }
  1283. case VIDIOC_G_FBUF:
  1284.                 (struct v4l2_framebuffer*)arg = &dev->fbuf;
  1285.                 return 0;
  1286. case VIDIOC_S_FBUF: return -EINVAL;
  1287. case VIDIOC_G_WIN:
  1288.                 (struct v4l2_window*)arg = &dev->window;
  1289.                 return 0;
  1290. case VIDIOC_S_WIN:
  1291.         {
  1292.                 struct v4l2_window* win = (struct v4l2_window*)arg;
  1293.                 int red, green, blue;
  1294.                 if( ( win->clips != NULL ) || ( win->clipcount != 0 ) ) 
  1295.                         return -EINVAL;
  1296.                 memcpy( &dev->window, win, sizeof(dev->window) );
  1297.                 
  1298.                 /* set on hardware */
  1299.                 mgavideo_set_window( dev->mga, win->x, win->y,
  1300.                                      win->width, win->height );
  1301.                 red = (win->chromakey >> 16) & 0xff;
  1302.                 green = (win->chromakey >> 8) & 0xff;
  1303.                 blue = (win->chromakey >> 0) & 0xff;
  1304.                 mgavideo_set_colorkey( dev->mga, red, green, blue );
  1305.                 return 0;
  1306.         }
  1307. case VIDIOC_PREVIEW:
  1308.                 mgavideo_preview_enable( dev->mga, *(int*)arg );
  1309.                 return 0;
  1310. /*  TODO: Handle above if output is to frame buffer or
  1311.     graphics overlay  */
  1312. case VIDIOC_G_PERF:
  1313. {
  1314. memcpy(arg, &dev->perf, sizeof(dev->perf));
  1315. return 0;
  1316. }
  1317. case VIDIOC_G_OUTPUT:
  1318. {
  1319. memcpy(arg, &dev->output, sizeof(dev->output));
  1320. return 0;
  1321. }
  1322. case VIDIOC_S_OUTPUT:
  1323. {
  1324. int output = (int)arg;
  1325. if (output < 0 || output >= dev->viden.num_outputs)
  1326. {
  1327. debug_msg("Output out of range %dn", output);
  1328. return -EINVAL;
  1329. }
  1330. if (output != dev->output)
  1331. {
  1332. dev->output = output;
  1333. set_video_output(dev, output);
  1334. }
  1335. return 0;
  1336. }
  1337. case VIDIOC_G_OUTPARM:
  1338. {
  1339. memcpy(arg, &dev->outputparm, sizeof(dev->outputparm));
  1340. return 0;
  1341. }
  1342. case VIDIOC_S_OUTPARM:
  1343. {
  1344. struct v4l2_outputparm *vp = arg;
  1345. if (copy_from_user(&vp, arg, sizeof(vp)))
  1346. return -EFAULT;
  1347. if (vp->outputmode & ~dev->outputparm.capability)
  1348. {
  1349. debug_msg("OUTPARM unsupported capabilityn");
  1350. return -EINVAL;
  1351. }
  1352. if ((dev->outputparm.capability & V4L2_CAP_TIMEPERFRAME) &&
  1353.     vp->timeperframe < 10000)
  1354. {
  1355. debug_msg("OUTPARM time per frame out of range %ldn",
  1356.   vp->timeperframe);
  1357. return -EINVAL;
  1358. }
  1359. if (vp->outputmode != dev->outputparm.outputmode &&
  1360.     !o->noio && dev->streaming)
  1361. {
  1362. debug_msg("OUTPARM can't change mode while "
  1363.   "streamingn");
  1364. return -EINVAL;
  1365. }
  1366. if (o->noio)
  1367. return 0;
  1368. if (vp->outputmode != dev->outputparm.outputmode)
  1369. {
  1370. dev->outputparm.outputmode = vp->outputmode;
  1371. hwoutput_new_format(dev);
  1372. }
  1373. if ((vp->outputmode & V4L2_CAP_TIMEPERFRAME) &&
  1374.     vp->timeperframe >= dev->viden.frame_period)
  1375. dev->outputparm.timeperframe = vp->timeperframe;
  1376. else
  1377. dev->outputparm.timeperframe = dev->viden.frame_period;
  1378. return 0;
  1379. }
  1380. case VIDIOC_G_STD:
  1381. {
  1382. struct v4l2_standard *std = arg;
  1383. v4l2_video_std_construct(std, dev->viden.standard, 0);
  1384. return 0;
  1385. }
  1386. case VIDIOC_S_STD:
  1387. {
  1388. struct v4l2_standard *std = arg;
  1389. int id;
  1390. if ((o->noio && dev->io_opens) ||
  1391.     dev->stream_buffers_mapped)
  1392. return -EPERM;
  1393. id = v4l2_video_std_confirm(std);
  1394. if (!((1 << id) & dev->viden.standards))
  1395. {
  1396. debug_msg("Bad standard: %un", (unsigned)id);
  1397. return -EINVAL;
  1398. }
  1399. dev->viden.set_standard(dev, id);
  1400. return 0;
  1401. }
  1402. case VIDIOC_ENUMSTD:
  1403. {
  1404. struct v4l2_enumstd *estd = arg;
  1405. __u32 b, i;
  1406. if (estd->index < 0 || estd->index > 30)
  1407. return -EINVAL;
  1408. for (b = 1, i = 0; b < 32; ++b)
  1409. {
  1410. if (((1 << b) & dev->viden.standards) == 0)
  1411. continue;
  1412. if (i == estd->index)
  1413. {
  1414. v4l2_video_std_construct(&estd->std, b, 0);
  1415. estd->outputs = (__u32)-1; /* all outputs */
  1416. estd->inputs = 0;
  1417. return 0;
  1418. }
  1419. ++i;
  1420. }
  1421. return -EINVAL;
  1422. }
  1423. case VIDIOC_ENUMOUTPUT:
  1424. {
  1425. struct v4l2_output *vo = arg;
  1426. if (vo->index < 0 || vo->index >= dev->viden.num_outputs)
  1427. return -EINVAL;
  1428. *vo = dev->voutput[vo->index].output;
  1429. return 0;
  1430. }
  1431. case VIDIOC_QUERYCTRL:
  1432. {
  1433. struct v4l2_queryctrl *qc = arg;
  1434. int i;
  1435. i = find_vctrl(qc->id);
  1436. if (i < 0)
  1437. return i;
  1438. /*  V4L2 filled in category and catname, preserve them */
  1439. output_control[i].category = qc->category;
  1440. memcpy(output_control[i].catname, qc->catname, 
  1441.        sizeof(qc->catname));
  1442. *qc = output_control[i];
  1443. return 0;
  1444. }
  1445. case VIDIOC_G_CTRL:
  1446. {
  1447. struct v4l2_control *vc = arg;
  1448. int i;
  1449. i = find_vctrl(vc->id);
  1450. if (i < 0)
  1451. return i;
  1452. vc->value = dev->voutput[dev->output].control[i];
  1453. return 0;
  1454. }
  1455. case VIDIOC_S_CTRL:
  1456. {
  1457. struct v4l2_control *vc = arg;
  1458. int i;
  1459. i = find_vctrl(vc->id);
  1460. if (i < 0)
  1461. return i;
  1462. dev->voutput[dev->output].control[i] = vc->value;
  1463. device_tone_controls(dev);
  1464. return 0;
  1465. }
  1466. case VIDIOC_G_MODULATOR: return -EINVAL;
  1467. case VIDIOC_S_MODULATOR: return -EINVAL;
  1468. case VIDIOC_G_FREQ: return -EINVAL;
  1469. case VIDIOC_S_FREQ: return -EINVAL;
  1470. case VIDIOC_G_AUDIO: return -EINVAL;
  1471. case VIDIOC_S_AUDIO: return -EINVAL;
  1472. default:
  1473.         return I34_ioctl(dev->mga, cmd, arg);
  1474. }
  1475. return 0;
  1476. }
  1477. static int
  1478. v4l2_mmap(void *id,
  1479.   struct vm_area_struct *vma)
  1480. {
  1481. struct device_open *o   = (struct device_open *)id;
  1482. struct output_device *dev = o->dev;
  1483. struct stream_buffer *buf;
  1484. if (o->noio)
  1485. {
  1486. debug_msg("mmap() called on no-I/O openn");
  1487. return -ENODEV;
  1488. }
  1489. buf = mmap_stream_buffer_from_offset(dev, vma->vm_offset);
  1490. if (buf == NULL)
  1491. {
  1492. debug_msg("mmap() Invalid offset parametern");
  1493. return -EINVAL;/* no such buffer */
  1494. }
  1495. if (!buf->requested)
  1496. {
  1497. debug_msg("mmap() Buffer is not available for mappingn");
  1498. return -EINVAL;/* not requested */
  1499. }
  1500. if (buf->vidbuf.flags & V4L2_BUF_FLAG_MAPPED)
  1501. {
  1502. debug_msg("mmap() Buffer is already mappedn");
  1503. return -EINVAL;/* already mapped */
  1504. }
  1505. if (buf->vidbuf.length != vma->vm_end - vma->vm_start)
  1506. {
  1507. debug_msg("mmap() Wrong length parametern");
  1508. return -EINVAL;/* wrong length */
  1509. }
  1510. if (buf->vaddress != NULL)
  1511. vfree(buf->vaddress);
  1512. buf->vaddress = vmalloc(buf->vidbuf.length);
  1513. if (buf->vaddress == NULL)
  1514. {
  1515. err_msg("Could not allocate mmap() buffern");
  1516. return -ENODEV;
  1517. }
  1518. #if 0
  1519. if ((using DMA) &&
  1520.     !bm_build_gather_list(dev, buf->vaddress, &buf->dma_list))
  1521. return -ENODEV;
  1522. #endif
  1523. buf->vidbuf.flags |= V4L2_BUF_FLAG_MAPPED;
  1524. vma->vm_ops = &hwoutput_vma_operations;
  1525. if (vma->vm_ops->open)
  1526. vma->vm_ops->open(vma);
  1527. /*  Note: vma->vm_file will be set up by V4L2  */
  1528. return 0;
  1529. }
  1530. static int
  1531. v4l2_poll(void *id,
  1532.   struct file *file,
  1533.   poll_table *table)
  1534. {
  1535. struct device_open *o = (struct device_open *)id;
  1536. struct output_device *dev = o->dev;
  1537. if (o->noio)
  1538. {
  1539. debug_msg("poll() illegal in no-I/O openn");
  1540. return POLLERR;
  1541. }
  1542. if (dev->streaming)
  1543. {
  1544. void *node;
  1545. node = v4l2_q_peek_head(&dev->stream_q_done);
  1546. if (node != NULL)
  1547. return (POLLIN | POLLRDNORM);/* have done buffers */
  1548. node = v4l2_q_peek_head(&dev->stream_q_output);
  1549. if (node == NULL)
  1550. return POLLERR;  /* no buffers queued */
  1551. poll_wait(file, &dev->new_video_frame, table);
  1552. return 0;
  1553. }
  1554. /*  Output is through write() call */
  1555. if (dev->hwoutput_completed)/* ready for new data now */
  1556. return (POLLIN | POLLRDNORM);
  1557. if (!dev->ready_to_output)/* Not set up to accept data yet */
  1558. return POLLERR;
  1559. poll_wait(file, &dev->new_video_frame, table);
  1560. return 0;
  1561. }
  1562. static long
  1563. v4l2_read(void *id, 
  1564.   char *buf, 
  1565.   unsigned long count, 
  1566.   int noblock)
  1567. {
  1568. debug_msg("read() not handledn");
  1569. return -EINVAL;
  1570. }
  1571. static long
  1572. v4l2_write(void *id,
  1573.    const char *buf,
  1574.    unsigned long count,
  1575.    int noblock)
  1576. {
  1577. struct device_open *o = (struct device_open *)id;
  1578. struct output_device *dev = o->dev;
  1579. long len = 0;
  1580. long my_timeout;
  1581. if (o->noio)
  1582. {
  1583. debug_msg("write() illegal in no-I/O openn");
  1584. return -EPERM;
  1585. }
  1586. if (dev->streaming)
  1587. {
  1588. debug_msg("Can't write() when streaming is onn");
  1589. return -EPERM;
  1590. }
  1591. hwoutput_begin(dev);/* does nothing if device is already ready */
  1592. if (!dev->ready_to_output)
  1593. {
  1594. debug_msg("Can't send frames!n");
  1595. return 0;
  1596. }
  1597. my_timeout = HZ / 5;
  1598. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,127)
  1599. current->timeout = jiffies + my_timeout;
  1600. #endif
  1601. while (len == 0)
  1602. {
  1603. if (noblock)
  1604. {
  1605. /*  Is previous frame still in progress? */
  1606. if (!dev->hwoutput_completed)
  1607. return -EAGAIN;
  1608. }
  1609. else
  1610. {
  1611. /* watch out for race condition going to sleep! */
  1612. cli();
  1613. if (!dev->hwoutput_completed)
  1614. {
  1615. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,127)
  1616. interruptible_sleep_on(&dev->new_video_frame);
  1617. #else
  1618. my_timeout = interruptible_sleep_on_timeout(
  1619. &dev->new_video_frame, my_timeout);
  1620. #endif
  1621. }
  1622. sti();
  1623. }
  1624. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,127)
  1625. if (current->timeout <= jiffies)
  1626. #else
  1627. if (my_timeout == 0)
  1628. #endif
  1629. {
  1630. debug_msg("Timeout on readn");
  1631. break;
  1632. }
  1633. len = hwoutput_write(dev, buf, count);
  1634. }
  1635. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,127)
  1636. current->timeout = 0;
  1637. #endif
  1638. //debug_msg("read %dn", (int)len);
  1639. return len;
  1640. }
  1641. /*
  1642.  * Remaining initialization of video encoder etc. This is only
  1643.  * done when the device is successfully identified and registered.
  1644.  */
  1645. static int
  1646. v4l2_init_done(struct v4l2_device *v)
  1647. {
  1648. struct output_device *dev = (struct output_device *)v;
  1649. int i;
  1650. /*  Initialize video input array */
  1651. for (i = 0; i < VOUTPUT_COUNT; ++i)
  1652. {
  1653. dev->voutput[i].output.index = i;
  1654. dev->voutput[i].output.type = V4L2_OUTPUT_TYPE_ANALOG;
  1655. dev->voutput[i].output.capability = 0;
  1656. /*  Initialize video control properties */
  1657. dev->voutput[i].control[VCTRL_BRIGHTNESS] =
  1658. output_control[VCTRL_BRIGHTNESS].default_value;
  1659. dev->voutput[i].control[VCTRL_CONTRAST] =
  1660. output_control[VCTRL_CONTRAST].default_value;
  1661. dev->voutput[i].control[VCTRL_SATURATION] =
  1662. output_control[VCTRL_SATURATION].default_value;
  1663. /*  dev->voutput[i].control[VCTRL_HUE] = */
  1664. /*  output_control[VCTRL_HUE].default_value; */
  1665. }
  1666. strcpy(dev->voutput[VOUTPUT_COMP].output.name, "Composite");
  1667. strcpy(dev->voutput[VOUTPUT_SVIDEO].output.name, "S-Video");
  1668. /*  Initialize the video encoder hardware */
  1669. dev->viden.initialize(dev);
  1670. /*  BUG: get defaults from user somehow...  */
  1671. dev->viden.set_standard(dev, V4L2_STD_NTSC);
  1672. set_video_output(dev, VOUTPUT_COMP);
  1673. /*  Output mode parameters  */
  1674. dev->outputparm.capability = V4L2_CAP_TIMEPERFRAME;
  1675. dev->outputparm.outputmode = 0;
  1676. dev->outputparm.extendedmode = 0;
  1677. dev->outputparm.timeperframe = dev->viden.frame_period;
  1678. /*  Default image dimensions */
  1679. dev->clientfmt.width = 160;
  1680. dev->clientfmt.height = 120;
  1681. dev->clientfmt.depth = 16;
  1682. dev->clientfmt.pixelformat = V4L2_PIX_FMT_RGB565;
  1683. dev->clientfmt.flags = 0;
  1684. dev->clientfmt.bytesperline = 0;
  1685. dev->clientfmt.sizeimage = 0;
  1686. hwoutput_new_format(dev);
  1687. return 0;
  1688. }
  1689. /*  =====================================================================
  1690.  * The functions below this point are only called during loading
  1691.  * and unloading of the driver.
  1692.  */
  1693. /*
  1694.  * D E V I C E   I N I A L I Z A T I O N   R O U T I N E S
  1695.  *
  1696.  * These routines locate and enable the hardware, and initialize
  1697.  * the device structure. 
  1698.  */
  1699. #if 0
  1700. /* Variables for assigning resources via the command line
  1701.  */
  1702. /*  ISA non-PnP IO base overrides */
  1703. static int isa0_iobase = 0;
  1704. static int isa1_iobase = 0;
  1705. #ifdef MODULE_PARM
  1706. MODULE_PARM(isa0_iobase, "i");
  1707. MODULE_PARM(isa1_iobase, "i");
  1708. #endif
  1709. /*  ISA PnP IO base override */
  1710. static int pnp0_iobase = 0;
  1711. #ifdef MODULE_PARM
  1712. MODULE_PARM(pnp0_iobase, "i");
  1713. #endif
  1714. #endif
  1715. /*  Initialize v4l2_device fields */
  1716. static int
  1717. init_device_fields(struct output_device *dev)
  1718. {
  1719. int num = dev - outputdev;
  1720. sprintf(dev->v.name, "Matrox DVD Video Out Driver (%d)", num);
  1721. dev->v.type = V4L2_TYPE_OUTPUT;
  1722. dev->v.minor = unit_vout[num];
  1723. dev->v.open = v4l2_open;
  1724. dev->v.close = v4l2_close;
  1725. dev->v.read = v4l2_read;
  1726. dev->v.write = v4l2_write;
  1727. dev->v.ioctl = v4l2_ioctl;
  1728. dev->v.mmap = v4l2_mmap;
  1729. dev->v.poll = v4l2_poll;
  1730. dev->v.initialize = v4l2_init_done;
  1731. dev->v.priv = NULL;
  1732. return 1;/* OK */
  1733. }
  1734. static int
  1735. config_a_device(struct output_device *dev)
  1736. {
  1737. sprintf(dev->shortname, "videoout%d", dev - outputdev);
  1738. /*  TODO: Search for an unconfigured device, configure the  */
  1739. /*        I/O port  */
  1740. /* if (!(found another device)) */
  1741. /* return 0; */
  1742. if ((dev->mga = mgavideo_get()) == NULL)
  1743. return 0;
  1744. device_initialize(dev);
  1745. if (!init_device_fields(dev))
  1746. return 0;
  1747. if (!find_encoder(dev))
  1748. {
  1749. err_msg("Bad or unrecognized video encodern");
  1750. return 0;/* failed */
  1751. }
  1752. return 1;
  1753. }
  1754. static void
  1755. unconfig_a_device(struct output_device *dev)
  1756. {
  1757. interrupt_disable(dev);
  1758. hwoutput_close(dev);
  1759. /*  TODO: Unconfigure the device, free the I/O port, etc.  */
  1760. mgavideo_release(dev->mga);
  1761. if (dev->is_registered)
  1762. {
  1763. v4l2_unregister_device((struct v4l2_device *)dev);
  1764. info_msg("Removed device %sn", dev->shortname);
  1765. }
  1766. memset(dev, 0, sizeof(outputdev[0]));
  1767. }
  1768. /*
  1769.  * M O D U L E   I N I T   A N D   C L E A N U P
  1770.  */
  1771. int
  1772. init_module(void)
  1773. {
  1774. int i;
  1775. for (i = 0; i < NBOARDS; ++i)
  1776. {
  1777. memset(&outputdev[i], 0, sizeof(outputdev[0]));
  1778. if (!config_a_device(&outputdev[i]))
  1779. {
  1780. break;
  1781. }
  1782. if (v4l2_register_device(
  1783. (struct v4l2_device *)&outputdev[i]) != 0)
  1784. {
  1785. err_msg("Couldn't register the driver.n");
  1786. unconfig_a_device(&outputdev[i]);
  1787. return 0;
  1788. }
  1789. outputdev[i].is_registered = 1;
  1790. }
  1791. if (i == 0)
  1792. {
  1793. err_msg("No devices found.n");
  1794. return -ENODEV;/* cleanup will not be called */
  1795. }
  1796. return 0;
  1797. }
  1798. void
  1799. cleanup_module(void)
  1800. {
  1801. int i;
  1802. for (i = 0; i < NBOARDS; ++i)
  1803. unconfig_a_device(&outputdev[i]);
  1804. }