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 #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 struct videobuf_queue *q; 54 }; 55 56 enum videobuf_state { 57 VIDEOBUF_NEEDS_INIT = 0, 58 VIDEOBUF_PREPARED = 1, 59 VIDEOBUF_QUEUED = 2, 60 VIDEOBUF_ACTIVE = 3, 61 VIDEOBUF_DONE = 4, 62 VIDEOBUF_ERROR = 5, 63 VIDEOBUF_IDLE = 6, 64 }; 65 66 struct videobuf_buffer { 67 unsigned int i; 68 u32 magic; 69 70 /* info about the buffer */ 71 unsigned int width; 72 unsigned int height; 73 unsigned int bytesperline; /* use only if != 0 */ 74 unsigned long size; 75 unsigned int input; 76 enum v4l2_field field; 77 enum videobuf_state state; 78 struct list_head stream; /* QBUF/DQBUF list */ 79 80 /* touched by irq handler */ 81 struct list_head queue; 82 wait_queue_head_t done; 83 unsigned int field_count; 84 struct timeval ts; 85 86 /* Memory type */ 87 enum v4l2_memory memory; 88 89 /* buffer size */ 90 size_t bsize; 91 92 /* buffer offset (mmap + overlay) */ 93 size_t boff; 94 95 /* buffer addr (userland ptr!) */ 96 unsigned long baddr; 97 98 /* for mmap'ed buffers */ 99 struct videobuf_mapping *map; 100 101 /* Private pointer to allow specific methods to store their data */ 102 int privsize; 103 void *priv; 104 }; 105 106 struct videobuf_queue_ops { 107 int (*buf_setup)(struct videobuf_queue *q, 108 unsigned int *count, unsigned int *size); 109 int (*buf_prepare)(struct videobuf_queue *q, 110 struct videobuf_buffer *vb, 111 enum v4l2_field field); 112 void (*buf_queue)(struct videobuf_queue *q, 113 struct videobuf_buffer *vb); 114 void (*buf_release)(struct videobuf_queue *q, 115 struct videobuf_buffer *vb); 116 }; 117 118 #define MAGIC_QTYPE_OPS 0x12261003 119 120 /* Helper operations - device type dependent */ 121 struct videobuf_qtype_ops { 122 u32 magic; 123 124 struct videobuf_buffer *(*alloc_vb)(size_t size); 125 void *(*vaddr) (struct videobuf_buffer *buf); 126 int (*iolock) (struct videobuf_queue *q, 127 struct videobuf_buffer *vb, 128 struct v4l2_framebuffer *fbuf); 129 int (*sync) (struct videobuf_queue *q, 130 struct videobuf_buffer *buf); 131 int (*mmap_mapper) (struct videobuf_queue *q, 132 struct videobuf_buffer *buf, 133 struct vm_area_struct *vma); 134 }; 135 136 struct videobuf_queue { 137 struct mutex vb_lock; 138 struct mutex *ext_lock; 139 spinlock_t *irqlock; 140 struct device *dev; 141 142 wait_queue_head_t wait; /* wait if queue is empty */ 143 144 enum v4l2_buf_type type; 145 unsigned int inputs; /* for V4L2_BUF_FLAG_INPUT */ 146 unsigned int msize; 147 enum v4l2_field field; 148 enum v4l2_field last; /* for field=V4L2_FIELD_ALTERNATE */ 149 struct videobuf_buffer *bufs[VIDEO_MAX_FRAME]; 150 const struct videobuf_queue_ops *ops; 151 struct videobuf_qtype_ops *int_ops; 152 153 unsigned int streaming:1; 154 unsigned int reading:1; 155 156 /* capture via mmap() + ioctl(QBUF/DQBUF) */ 157 struct list_head stream; 158 159 /* capture via read() */ 160 unsigned int read_off; 161 struct videobuf_buffer *read_buf; 162 163 /* driver private data */ 164 void *priv_data; 165 }; 166 167 static inline void videobuf_queue_lock(struct videobuf_queue *q) 168 { 169 if (!q->ext_lock) 170 mutex_lock(&q->vb_lock); 171 } 172 173 static inline void videobuf_queue_unlock(struct videobuf_queue *q) 174 { 175 if (!q->ext_lock) 176 mutex_unlock(&q->vb_lock); 177 } 178 179 int videobuf_waiton(struct videobuf_queue *q, struct videobuf_buffer *vb, 180 int non_blocking, int intr); 181 int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb, 182 struct v4l2_framebuffer *fbuf); 183 184 struct videobuf_buffer *videobuf_alloc_vb(struct videobuf_queue *q); 185 186 /* Used on videobuf-dvb */ 187 void *videobuf_queue_to_vaddr(struct videobuf_queue *q, 188 struct videobuf_buffer *buf); 189 190 void videobuf_queue_core_init(struct videobuf_queue *q, 191 const struct videobuf_queue_ops *ops, 192 struct device *dev, 193 spinlock_t *irqlock, 194 enum v4l2_buf_type type, 195 enum v4l2_field field, 196 unsigned int msize, 197 void *priv, 198 struct videobuf_qtype_ops *int_ops, 199 struct mutex *ext_lock); 200 int videobuf_queue_is_busy(struct videobuf_queue *q); 201 void videobuf_queue_cancel(struct videobuf_queue *q); 202 203 enum v4l2_field videobuf_next_field(struct videobuf_queue *q); 204 int videobuf_reqbufs(struct videobuf_queue *q, 205 struct v4l2_requestbuffers *req); 206 int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b); 207 int videobuf_qbuf(struct videobuf_queue *q, 208 struct v4l2_buffer *b); 209 int videobuf_dqbuf(struct videobuf_queue *q, 210 struct v4l2_buffer *b, int nonblocking); 211 int videobuf_streamon(struct videobuf_queue *q); 212 int videobuf_streamoff(struct videobuf_queue *q); 213 214 void videobuf_stop(struct videobuf_queue *q); 215 216 int videobuf_read_start(struct videobuf_queue *q); 217 void videobuf_read_stop(struct videobuf_queue *q); 218 ssize_t videobuf_read_stream(struct videobuf_queue *q, 219 char __user *data, size_t count, loff_t *ppos, 220 int vbihack, int nonblocking); 221 ssize_t videobuf_read_one(struct videobuf_queue *q, 222 char __user *data, size_t count, loff_t *ppos, 223 int nonblocking); 224 unsigned int videobuf_poll_stream(struct file *file, 225 struct videobuf_queue *q, 226 poll_table *wait); 227 228 int videobuf_mmap_setup(struct videobuf_queue *q, 229 unsigned int bcount, unsigned int bsize, 230 enum v4l2_memory memory); 231 int __videobuf_mmap_setup(struct videobuf_queue *q, 232 unsigned int bcount, unsigned int bsize, 233 enum v4l2_memory memory); 234 int videobuf_mmap_free(struct videobuf_queue *q); 235 int videobuf_mmap_mapper(struct videobuf_queue *q, 236 struct vm_area_struct *vma); 237 238 #endif 239