Root/
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 | enum v4l2_field field; |
76 | enum videobuf_state state; |
77 | struct list_head stream; /* QBUF/DQBUF list */ |
78 | |
79 | /* touched by irq handler */ |
80 | struct list_head queue; |
81 | wait_queue_head_t done; |
82 | unsigned int field_count; |
83 | struct timeval ts; |
84 | |
85 | /* Memory type */ |
86 | enum v4l2_memory memory; |
87 | |
88 | /* buffer size */ |
89 | size_t bsize; |
90 | |
91 | /* buffer offset (mmap + overlay) */ |
92 | size_t boff; |
93 | |
94 | /* buffer addr (userland ptr!) */ |
95 | unsigned long baddr; |
96 | |
97 | /* for mmap'ed buffers */ |
98 | struct videobuf_mapping *map; |
99 | |
100 | /* Private pointer to allow specific methods to store their data */ |
101 | int privsize; |
102 | void *priv; |
103 | }; |
104 | |
105 | struct videobuf_queue_ops { |
106 | int (*buf_setup)(struct videobuf_queue *q, |
107 | unsigned int *count, unsigned int *size); |
108 | int (*buf_prepare)(struct videobuf_queue *q, |
109 | struct videobuf_buffer *vb, |
110 | enum v4l2_field field); |
111 | void (*buf_queue)(struct videobuf_queue *q, |
112 | struct videobuf_buffer *vb); |
113 | void (*buf_release)(struct videobuf_queue *q, |
114 | struct videobuf_buffer *vb); |
115 | }; |
116 | |
117 | #define MAGIC_QTYPE_OPS 0x12261003 |
118 | |
119 | /* Helper operations - device type dependent */ |
120 | struct videobuf_qtype_ops { |
121 | u32 magic; |
122 | |
123 | struct videobuf_buffer *(*alloc_vb)(size_t size); |
124 | void *(*vaddr) (struct videobuf_buffer *buf); |
125 | int (*iolock) (struct videobuf_queue *q, |
126 | struct videobuf_buffer *vb, |
127 | struct v4l2_framebuffer *fbuf); |
128 | int (*sync) (struct videobuf_queue *q, |
129 | struct videobuf_buffer *buf); |
130 | int (*mmap_mapper) (struct videobuf_queue *q, |
131 | struct videobuf_buffer *buf, |
132 | struct vm_area_struct *vma); |
133 | }; |
134 | |
135 | struct videobuf_queue { |
136 | struct mutex vb_lock; |
137 | struct mutex *ext_lock; |
138 | spinlock_t *irqlock; |
139 | struct device *dev; |
140 | |
141 | wait_queue_head_t wait; /* wait if queue is empty */ |
142 | |
143 | enum v4l2_buf_type type; |
144 | unsigned int msize; |
145 | enum v4l2_field field; |
146 | enum v4l2_field last; /* for field=V4L2_FIELD_ALTERNATE */ |
147 | struct videobuf_buffer *bufs[VIDEO_MAX_FRAME]; |
148 | const struct videobuf_queue_ops *ops; |
149 | struct videobuf_qtype_ops *int_ops; |
150 | |
151 | unsigned int streaming:1; |
152 | unsigned int reading:1; |
153 | |
154 | /* capture via mmap() + ioctl(QBUF/DQBUF) */ |
155 | struct list_head stream; |
156 | |
157 | /* capture via read() */ |
158 | unsigned int read_off; |
159 | struct videobuf_buffer *read_buf; |
160 | |
161 | /* driver private data */ |
162 | void *priv_data; |
163 | }; |
164 | |
165 | static inline void videobuf_queue_lock(struct videobuf_queue *q) |
166 | { |
167 | if (!q->ext_lock) |
168 | mutex_lock(&q->vb_lock); |
169 | } |
170 | |
171 | static inline void videobuf_queue_unlock(struct videobuf_queue *q) |
172 | { |
173 | if (!q->ext_lock) |
174 | mutex_unlock(&q->vb_lock); |
175 | } |
176 | |
177 | int videobuf_waiton(struct videobuf_queue *q, struct videobuf_buffer *vb, |
178 | int non_blocking, int intr); |
179 | int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb, |
180 | struct v4l2_framebuffer *fbuf); |
181 | |
182 | struct videobuf_buffer *videobuf_alloc_vb(struct videobuf_queue *q); |
183 | |
184 | /* Used on videobuf-dvb */ |
185 | void *videobuf_queue_to_vaddr(struct videobuf_queue *q, |
186 | struct videobuf_buffer *buf); |
187 | |
188 | void videobuf_queue_core_init(struct videobuf_queue *q, |
189 | const struct videobuf_queue_ops *ops, |
190 | struct device *dev, |
191 | spinlock_t *irqlock, |
192 | enum v4l2_buf_type type, |
193 | enum v4l2_field field, |
194 | unsigned int msize, |
195 | void *priv, |
196 | struct videobuf_qtype_ops *int_ops, |
197 | struct mutex *ext_lock); |
198 | int videobuf_queue_is_busy(struct videobuf_queue *q); |
199 | void videobuf_queue_cancel(struct videobuf_queue *q); |
200 | |
201 | enum v4l2_field videobuf_next_field(struct videobuf_queue *q); |
202 | int videobuf_reqbufs(struct videobuf_queue *q, |
203 | struct v4l2_requestbuffers *req); |
204 | int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b); |
205 | int videobuf_qbuf(struct videobuf_queue *q, |
206 | struct v4l2_buffer *b); |
207 | int videobuf_dqbuf(struct videobuf_queue *q, |
208 | struct v4l2_buffer *b, int nonblocking); |
209 | int videobuf_streamon(struct videobuf_queue *q); |
210 | int videobuf_streamoff(struct videobuf_queue *q); |
211 | |
212 | void videobuf_stop(struct videobuf_queue *q); |
213 | |
214 | int videobuf_read_start(struct videobuf_queue *q); |
215 | void videobuf_read_stop(struct videobuf_queue *q); |
216 | ssize_t videobuf_read_stream(struct videobuf_queue *q, |
217 | char __user *data, size_t count, loff_t *ppos, |
218 | int vbihack, int nonblocking); |
219 | ssize_t videobuf_read_one(struct videobuf_queue *q, |
220 | char __user *data, size_t count, loff_t *ppos, |
221 | int nonblocking); |
222 | unsigned int videobuf_poll_stream(struct file *file, |
223 | struct videobuf_queue *q, |
224 | poll_table *wait); |
225 | |
226 | int videobuf_mmap_setup(struct videobuf_queue *q, |
227 | unsigned int bcount, unsigned int bsize, |
228 | enum v4l2_memory memory); |
229 | int __videobuf_mmap_setup(struct videobuf_queue *q, |
230 | unsigned int bcount, unsigned int bsize, |
231 | enum v4l2_memory memory); |
232 | int videobuf_mmap_free(struct videobuf_queue *q); |
233 | int videobuf_mmap_mapper(struct videobuf_queue *q, |
234 | struct vm_area_struct *vma); |
235 | |
236 | #endif |
237 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9