1 /* 2 * generic helper functions for handling video4linux capture buffers 3 * 4 * (c) 2007 Mauro Carvalho Chehab, <mchehab@infradead.org> 5 * 6 * Highly based on video-buf written originally by: 7 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> 8 * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org> 9 * (c) 2006 Ted Walther and John Sokol 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 14 */ 15 16 #include <linux/poll.h> 17 #ifdef CONFIG_VIDEO_V4L1_COMPAT 18 #include <linux/videodev.h> 19 #endif 20 #include <linux/videodev2.h> 21 22 #define UNSET (-1U) 23 24 25 struct videobuf_buffer; 26 struct videobuf_queue; 27 28 /* --------------------------------------------------------------------- */ 29 30 /* 31 * A small set of helper functions to manage video4linux buffers. 32 * 33 * struct videobuf_buffer holds the data structures used by the helper 34 * functions, additionally some commonly used fields for v4l buffers 35 * (width, height, lists, waitqueue) are in there. That struct should 36 * be used as first element in the drivers buffer struct. 37 * 38 * about the mmap helpers (videobuf_mmap_*): 39 * 40 * The mmaper function allows to map any subset of contingous buffers. 41 * This includes one mmap() call for all buffers (which the original 42 * video4linux API uses) as well as one mmap() for every single buffer 43 * (which v4l2 uses). 44 * 45 * If there is a valid mapping for a buffer, buffer->baddr/bsize holds 46 * userspace address + size which can be feeded into the 47 * videobuf_dma_init_user function listed above. 48 * 49 */ 50 51 struct videobuf_mapping { 52 unsigned int count; 53 unsigned long start; 54 unsigned long end; 55 struct videobuf_queue *q; 56 }; 57 58 enum videobuf_state { 59 STATE_NEEDS_INIT = 0, 60 STATE_PREPARED = 1, 61 STATE_QUEUED = 2, 62 STATE_ACTIVE = 3, 63 STATE_DONE = 4, 64 STATE_ERROR = 5, 65 STATE_IDLE = 6, 66 }; 67 68 struct videobuf_buffer { 69 unsigned int i; 70 u32 magic; 71 72 /* info about the buffer */ 73 unsigned int width; 74 unsigned int height; 75 unsigned int bytesperline; /* use only if != 0 */ 76 unsigned long size; 77 unsigned int input; 78 enum v4l2_field field; 79 enum videobuf_state state; 80 struct list_head stream; /* QBUF/DQBUF list */ 81 82 /* touched by irq handler */ 83 struct list_head queue; 84 wait_queue_head_t done; 85 unsigned int field_count; 86 struct timeval ts; 87 88 /* Memory type */ 89 enum v4l2_memory memory; 90 91 /* buffer size */ 92 size_t bsize; 93 94 /* buffer offset (mmap + overlay) */ 95 size_t boff; 96 97 /* buffer addr (userland ptr!) */ 98 unsigned long baddr; 99 100 /* for mmap'ed buffers */ 101 struct videobuf_mapping *map; 102 103 /* Private pointer to allow specific methods to store their data */ 104 int privsize; 105 void *priv; 106 }; 107 108 struct videobuf_queue_ops { 109 int (*buf_setup)(struct videobuf_queue *q, 110 unsigned int *count, unsigned int *size); 111 int (*buf_prepare)(struct videobuf_queue *q, 112 struct videobuf_buffer *vb, 113 enum v4l2_field field); 114 void (*buf_queue)(struct videobuf_queue *q, 115 struct videobuf_buffer *vb); 116 void (*buf_release)(struct videobuf_queue *q, 117 struct videobuf_buffer *vb); 118 }; 119 120 #define MAGIC_QTYPE_OPS 0x12261003 121 122 /* Helper operations - device type dependent */ 123 struct videobuf_qtype_ops { 124 u32 magic; 125 126 void* (*alloc) (size_t size); 127 int (*iolock) (struct videobuf_queue* q, 128 struct videobuf_buffer *vb, 129 struct v4l2_framebuffer *fbuf); 130 int (*mmap) (struct videobuf_queue *q, 131 unsigned int *count, 132 unsigned int *size, 133 enum v4l2_memory memory); 134 int (*sync) (struct videobuf_queue* q, 135 struct videobuf_buffer *buf); 136 int (*video_copy_to_user)(struct videobuf_queue *q, 137 char __user *data, 138 size_t count, 139 int nonblocking); 140 int (*copy_stream) (struct videobuf_queue *q, 141 char __user *data, 142 size_t count, 143 size_t pos, 144 int vbihack, 145 int nonblocking); 146 int (*mmap_free) (struct videobuf_queue *q); 147 int (*mmap_mapper) (struct videobuf_queue *q, 148 struct vm_area_struct *vma); 149 }; 150 151 struct videobuf_queue { 152 struct mutex lock; 153 spinlock_t *irqlock; 154 void *dev; /* on pci, points to struct pci_dev */ 155 156 enum v4l2_buf_type type; 157 unsigned int inputs; /* for V4L2_BUF_FLAG_INPUT */ 158 unsigned int msize; 159 enum v4l2_field field; 160 enum v4l2_field last; /* for field=V4L2_FIELD_ALTERNATE */ 161 struct videobuf_buffer *bufs[VIDEO_MAX_FRAME]; 162 struct videobuf_queue_ops *ops; 163 struct videobuf_qtype_ops *int_ops; 164 165 /* capture via mmap() + ioctl(QBUF/DQBUF) */ 166 unsigned int streaming; 167 struct list_head stream; 168 169 /* capture via read() */ 170 unsigned int reading; 171 unsigned int read_off; 172 struct videobuf_buffer *read_buf; 173 174 /* driver private data */ 175 void *priv_data; 176 }; 177 178 int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr); 179 int videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb, 180 struct v4l2_framebuffer *fbuf); 181 182 void *videobuf_alloc(struct videobuf_queue* q); 183 184 void videobuf_queue_core_init(struct videobuf_queue *q, 185 struct videobuf_queue_ops *ops, 186 void *dev, 187 spinlock_t *irqlock, 188 enum v4l2_buf_type type, 189 enum v4l2_field field, 190 unsigned int msize, 191 void *priv, 192 struct videobuf_qtype_ops *int_ops); 193 int videobuf_queue_is_busy(struct videobuf_queue *q); 194 void videobuf_queue_cancel(struct videobuf_queue *q); 195 196 enum v4l2_field videobuf_next_field(struct videobuf_queue *q); 197 int videobuf_reqbufs(struct videobuf_queue *q, 198 struct v4l2_requestbuffers *req); 199 int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b); 200 int videobuf_qbuf(struct videobuf_queue *q, 201 struct v4l2_buffer *b); 202 int videobuf_dqbuf(struct videobuf_queue *q, 203 struct v4l2_buffer *b, int nonblocking); 204 #ifdef CONFIG_VIDEO_V4L1_COMPAT 205 int videobuf_cgmbuf(struct videobuf_queue *q, 206 struct video_mbuf *mbuf, int count); 207 #endif 208 int videobuf_streamon(struct videobuf_queue *q); 209 int videobuf_streamoff(struct videobuf_queue *q); 210 211 int videobuf_read_start(struct videobuf_queue *q); 212 void videobuf_read_stop(struct videobuf_queue *q); 213 ssize_t videobuf_read_stream(struct videobuf_queue *q, 214 char __user *data, size_t count, loff_t *ppos, 215 int vbihack, int nonblocking); 216 ssize_t videobuf_read_one(struct videobuf_queue *q, 217 char __user *data, size_t count, loff_t *ppos, 218 int nonblocking); 219 unsigned int videobuf_poll_stream(struct file *file, 220 struct videobuf_queue *q, 221 poll_table *wait); 222 223 int videobuf_mmap_setup(struct videobuf_queue *q, 224 unsigned int bcount, unsigned int bsize, 225 enum v4l2_memory memory); 226 int videobuf_mmap_free(struct videobuf_queue *q); 227 int videobuf_mmap_mapper(struct videobuf_queue *q, 228 struct vm_area_struct *vma); 229 230 /* --------------------------------------------------------------------- */ 231 232 /* 233 * Local variables: 234 * c-basic-offset: 8 235 * End: 236 */ 237