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 #ifndef _VIDEOBUF_CORE_H 17 #define _VIDEOBUF_CORE_H 18 19 #include <linux/poll.h> 20 #ifdef CONFIG_VIDEO_V4L1_COMPAT 21 #define __MIN_V4L1 22 #include <linux/videodev.h> 23 #endif 24 #include <linux/videodev2.h> 25 26 #define UNSET (-1U) 27 28 29 struct videobuf_buffer; 30 struct videobuf_queue; 31 32 /* --------------------------------------------------------------------- */ 33 34 /* 35 * A small set of helper functions to manage video4linux buffers. 36 * 37 * struct videobuf_buffer holds the data structures used by the helper 38 * functions, additionally some commonly used fields for v4l buffers 39 * (width, height, lists, waitqueue) are in there. That struct should 40 * be used as first element in the drivers buffer struct. 41 * 42 * about the mmap helpers (videobuf_mmap_*): 43 * 44 * The mmaper function allows to map any subset of contingous buffers. 45 * This includes one mmap() call for all buffers (which the original 46 * video4linux API uses) as well as one mmap() for every single buffer 47 * (which v4l2 uses). 48 * 49 * If there is a valid mapping for a buffer, buffer->baddr/bsize holds 50 * userspace address + size which can be feeded into the 51 * videobuf_dma_init_user function listed above. 52 * 53 */ 54 55 struct videobuf_mapping { 56 unsigned int count; 57 struct videobuf_queue *q; 58 }; 59 60 enum videobuf_state { 61 VIDEOBUF_NEEDS_INIT = 0, 62 VIDEOBUF_PREPARED = 1, 63 VIDEOBUF_QUEUED = 2, 64 VIDEOBUF_ACTIVE = 3, 65 VIDEOBUF_DONE = 4, 66 VIDEOBUF_ERROR = 5, 67 VIDEOBUF_IDLE = 6, 68 }; 69 70 struct videobuf_buffer { 71 unsigned int i; 72 u32 magic; 73 74 /* info about the buffer */ 75 unsigned int width; 76 unsigned int height; 77 unsigned int bytesperline; /* use only if != 0 */ 78 unsigned long size; 79 unsigned int input; 80 enum v4l2_field field; 81 enum videobuf_state state; 82 struct list_head stream; /* QBUF/DQBUF list */ 83 84 /* touched by irq handler */ 85 struct list_head queue; 86 wait_queue_head_t done; 87 unsigned int field_count; 88 struct timeval ts; 89 90 /* Memory type */ 91 enum v4l2_memory memory; 92 93 /* buffer size */ 94 size_t bsize; 95 96 /* buffer offset (mmap + overlay) */ 97 size_t boff; 98 99 /* buffer addr (userland ptr!) */ 100 unsigned long baddr; 101 102 /* for mmap'ed buffers */ 103 struct videobuf_mapping *map; 104 105 /* Private pointer to allow specific methods to store their data */ 106 int privsize; 107 void *priv; 108 }; 109 110 struct videobuf_queue_ops { 111 int (*buf_setup)(struct videobuf_queue *q, 112 unsigned int *count, unsigned int *size); 113 int (*buf_prepare)(struct videobuf_queue *q, 114 struct videobuf_buffer *vb, 115 enum v4l2_field field); 116 void (*buf_queue)(struct videobuf_queue *q, 117 struct videobuf_buffer *vb); 118 void (*buf_release)(struct videobuf_queue *q, 119 struct videobuf_buffer *vb); 120 }; 121 122 #define MAGIC_QTYPE_OPS 0x12261003 123 124 /* Helper operations - device type dependent */ 125 struct videobuf_qtype_ops { 126 u32 magic; 127 128 struct videobuf_buffer *(*alloc_vb)(size_t size); 129 void *(*vaddr) (struct videobuf_buffer *buf); 130 int (*iolock) (struct videobuf_queue *q, 131 struct videobuf_buffer *vb, 132 struct v4l2_framebuffer *fbuf); 133 int (*sync) (struct videobuf_queue *q, 134 struct videobuf_buffer *buf); 135 int (*mmap_mapper) (struct videobuf_queue *q, 136 struct videobuf_buffer *buf, 137 struct vm_area_struct *vma); 138 }; 139 140 struct videobuf_queue { 141 struct mutex vb_lock; 142 struct mutex *ext_lock; 143 spinlock_t *irqlock; 144 struct device *dev; 145 146 wait_queue_head_t wait; /* wait if queue is empty */ 147 148 enum v4l2_buf_type type; 149 unsigned int inputs; /* for V4L2_BUF_FLAG_INPUT */ 150 unsigned int msize; 151 enum v4l2_field field; 152 enum v4l2_field last; /* for field=V4L2_FIELD_ALTERNATE */ 153 struct videobuf_buffer *bufs[VIDEO_MAX_FRAME]; 154 const struct videobuf_queue_ops *ops; 155 struct videobuf_qtype_ops *int_ops; 156 157 unsigned int streaming:1; 158 unsigned int reading:1; 159 160 /* capture via mmap() + ioctl(QBUF/DQBUF) */ 161 struct list_head stream; 162 163 /* capture via read() */ 164 unsigned int read_off; 165 struct videobuf_buffer *read_buf; 166 167 /* driver private data */ 168 void *priv_data; 169 }; 170 171 static inline void videobuf_queue_lock(struct videobuf_queue *q) 172 { 173 if (!q->ext_lock) 174 mutex_lock(&q->vb_lock); 175 } 176 177 static inline void videobuf_queue_unlock(struct videobuf_queue *q) 178 { 179 if (!q->ext_lock) 180 mutex_unlock(&q->vb_lock); 181 } 182 183 int videobuf_waiton(struct videobuf_queue *q, struct videobuf_buffer *vb, 184 int non_blocking, int intr); 185 int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb, 186 struct v4l2_framebuffer *fbuf); 187 188 struct videobuf_buffer *videobuf_alloc_vb(struct videobuf_queue *q); 189 190 /* Used on videobuf-dvb */ 191 void *videobuf_queue_to_vaddr(struct videobuf_queue *q, 192 struct videobuf_buffer *buf); 193 194 void videobuf_queue_core_init(struct videobuf_queue *q, 195 const struct videobuf_queue_ops *ops, 196 struct device *dev, 197 spinlock_t *irqlock, 198 enum v4l2_buf_type type, 199 enum v4l2_field field, 200 unsigned int msize, 201 void *priv, 202 struct videobuf_qtype_ops *int_ops, 203 struct mutex *ext_lock); 204 int videobuf_queue_is_busy(struct videobuf_queue *q); 205 void videobuf_queue_cancel(struct videobuf_queue *q); 206 207 enum v4l2_field videobuf_next_field(struct videobuf_queue *q); 208 int videobuf_reqbufs(struct videobuf_queue *q, 209 struct v4l2_requestbuffers *req); 210 int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b); 211 int videobuf_qbuf(struct videobuf_queue *q, 212 struct v4l2_buffer *b); 213 int videobuf_dqbuf(struct videobuf_queue *q, 214 struct v4l2_buffer *b, int nonblocking); 215 #ifdef CONFIG_VIDEO_V4L1_COMPAT 216 int videobuf_cgmbuf(struct videobuf_queue *q, 217 struct video_mbuf *mbuf, int count); 218 #endif 219 int videobuf_streamon(struct videobuf_queue *q); 220 int videobuf_streamoff(struct videobuf_queue *q); 221 222 void videobuf_stop(struct videobuf_queue *q); 223 224 int videobuf_read_start(struct videobuf_queue *q); 225 void videobuf_read_stop(struct videobuf_queue *q); 226 ssize_t videobuf_read_stream(struct videobuf_queue *q, 227 char __user *data, size_t count, loff_t *ppos, 228 int vbihack, int nonblocking); 229 ssize_t videobuf_read_one(struct videobuf_queue *q, 230 char __user *data, size_t count, loff_t *ppos, 231 int nonblocking); 232 unsigned int videobuf_poll_stream(struct file *file, 233 struct videobuf_queue *q, 234 poll_table *wait); 235 236 int videobuf_mmap_setup(struct videobuf_queue *q, 237 unsigned int bcount, unsigned int bsize, 238 enum v4l2_memory memory); 239 int __videobuf_mmap_setup(struct videobuf_queue *q, 240 unsigned int bcount, unsigned int bsize, 241 enum v4l2_memory memory); 242 int videobuf_mmap_free(struct videobuf_queue *q); 243 int videobuf_mmap_mapper(struct videobuf_queue *q, 244 struct vm_area_struct *vma); 245 246 #endif 247