1 |
1275 |
phoenix |
/*
|
2 |
|
|
* dv1394-private.h - DV input/output over IEEE 1394 on OHCI chips
|
3 |
|
|
* Copyright (C)2001 Daniel Maas <dmaas@dcine.com>
|
4 |
|
|
* receive, proc_fs by Dan Dennedy <dan@dennedy.org>
|
5 |
|
|
*
|
6 |
|
|
* based on:
|
7 |
|
|
* video1394.h - driver for OHCI 1394 boards
|
8 |
|
|
* Copyright (C)1999,2000 Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>
|
9 |
|
|
* Peter Schlaile <udbz@rz.uni-karlsruhe.de>
|
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 of the License, or
|
14 |
|
|
* (at your option) any later version.
|
15 |
|
|
*
|
16 |
|
|
* This program is distributed in the hope that it will be useful,
|
17 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19 |
|
|
* GNU General Public License for more details.
|
20 |
|
|
*
|
21 |
|
|
* You should have received a copy of the GNU General Public License
|
22 |
|
|
* along with this program; if not, write to the Free Software Foundation,
|
23 |
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
24 |
|
|
*/
|
25 |
|
|
|
26 |
|
|
#ifndef _DV_1394_PRIVATE_H
|
27 |
|
|
#define _DV_1394_PRIVATE_H
|
28 |
|
|
|
29 |
|
|
#include "ieee1394.h"
|
30 |
|
|
#include "ohci1394.h"
|
31 |
|
|
#include "dma.h"
|
32 |
|
|
|
33 |
|
|
/* data structures private to the dv1394 driver */
|
34 |
|
|
/* none of this is exposed to user-space */
|
35 |
|
|
|
36 |
|
|
|
37 |
|
|
/*
|
38 |
|
|
the 8-byte CIP (Common Isochronous Packet) header that precedes
|
39 |
|
|
each packet of DV data.
|
40 |
|
|
|
41 |
|
|
See the IEC 61883 standard.
|
42 |
|
|
*/
|
43 |
|
|
|
44 |
|
|
struct CIP_header { unsigned char b[8]; };
|
45 |
|
|
|
46 |
|
|
static inline void fill_cip_header(struct CIP_header *cip,
|
47 |
|
|
unsigned char source_node_id,
|
48 |
|
|
unsigned long counter,
|
49 |
|
|
enum pal_or_ntsc format,
|
50 |
|
|
unsigned long timestamp)
|
51 |
|
|
{
|
52 |
|
|
cip->b[0] = source_node_id;
|
53 |
|
|
cip->b[1] = 0x78; /* packet size in quadlets (480/4) - even for empty packets! */
|
54 |
|
|
cip->b[2] = 0x00;
|
55 |
|
|
cip->b[3] = counter;
|
56 |
|
|
|
57 |
|
|
cip->b[4] = 0x80; /* const */
|
58 |
|
|
|
59 |
|
|
switch(format) {
|
60 |
|
|
case DV1394_PAL:
|
61 |
|
|
cip->b[5] = 0x80;
|
62 |
|
|
break;
|
63 |
|
|
case DV1394_NTSC:
|
64 |
|
|
cip->b[5] = 0x00;
|
65 |
|
|
break;
|
66 |
|
|
}
|
67 |
|
|
|
68 |
|
|
cip->b[6] = timestamp >> 8;
|
69 |
|
|
cip->b[7] = timestamp & 0xFF;
|
70 |
|
|
}
|
71 |
|
|
|
72 |
|
|
|
73 |
|
|
|
74 |
|
|
/*
|
75 |
|
|
DMA commands used to program the OHCI's DMA engine
|
76 |
|
|
|
77 |
|
|
See the Texas Instruments OHCI 1394 chipset documentation.
|
78 |
|
|
*/
|
79 |
|
|
|
80 |
|
|
struct output_more_immediate { u32 q[8]; };
|
81 |
|
|
struct output_more { u32 q[4]; };
|
82 |
|
|
struct output_last { u32 q[4]; };
|
83 |
|
|
struct input_more { u32 q[4]; };
|
84 |
|
|
struct input_last { u32 q[4]; };
|
85 |
|
|
|
86 |
|
|
/* outputs */
|
87 |
|
|
|
88 |
|
|
static inline void fill_output_more_immediate(struct output_more_immediate *omi,
|
89 |
|
|
unsigned char tag,
|
90 |
|
|
unsigned char channel,
|
91 |
|
|
unsigned char sync_tag,
|
92 |
|
|
unsigned int payload_size)
|
93 |
|
|
{
|
94 |
|
|
omi->q[0] = cpu_to_le32(0x02000000 | 8); /* OUTPUT_MORE_IMMEDIATE; 8 is the size of the IT header */
|
95 |
|
|
omi->q[1] = 0;
|
96 |
|
|
omi->q[2] = 0;
|
97 |
|
|
omi->q[3] = 0;
|
98 |
|
|
|
99 |
|
|
/* IT packet header */
|
100 |
|
|
omi->q[4] = cpu_to_le32( (0x0 << 16) /* IEEE1394_SPEED_100 */
|
101 |
|
|
| (tag << 14)
|
102 |
|
|
| (channel << 8)
|
103 |
|
|
| (TCODE_ISO_DATA << 4)
|
104 |
|
|
| (sync_tag) );
|
105 |
|
|
|
106 |
|
|
/* reserved field; mimic behavior of my Sony DSR-40 */
|
107 |
|
|
omi->q[5] = cpu_to_le32((payload_size << 16) | (0x7F << 8) | 0xA0);
|
108 |
|
|
|
109 |
|
|
omi->q[6] = 0;
|
110 |
|
|
omi->q[7] = 0;
|
111 |
|
|
}
|
112 |
|
|
|
113 |
|
|
static inline void fill_output_more(struct output_more *om,
|
114 |
|
|
unsigned int data_size,
|
115 |
|
|
unsigned long data_phys_addr)
|
116 |
|
|
{
|
117 |
|
|
om->q[0] = cpu_to_le32(data_size);
|
118 |
|
|
om->q[1] = cpu_to_le32(data_phys_addr);
|
119 |
|
|
om->q[2] = 0;
|
120 |
|
|
om->q[3] = 0;
|
121 |
|
|
}
|
122 |
|
|
|
123 |
|
|
static inline void fill_output_last(struct output_last *ol,
|
124 |
|
|
int want_timestamp,
|
125 |
|
|
int want_interrupt,
|
126 |
|
|
unsigned int data_size,
|
127 |
|
|
unsigned long data_phys_addr)
|
128 |
|
|
{
|
129 |
|
|
u32 temp = 0;
|
130 |
|
|
temp |= 1 << 28; /* OUTPUT_LAST */
|
131 |
|
|
|
132 |
|
|
if (want_timestamp) /* controller will update timestamp at DMA time */
|
133 |
|
|
temp |= 1 << 27;
|
134 |
|
|
|
135 |
|
|
if (want_interrupt)
|
136 |
|
|
temp |= 3 << 20;
|
137 |
|
|
|
138 |
|
|
temp |= 3 << 18; /* must take branch */
|
139 |
|
|
temp |= data_size;
|
140 |
|
|
|
141 |
|
|
ol->q[0] = cpu_to_le32(temp);
|
142 |
|
|
ol->q[1] = cpu_to_le32(data_phys_addr);
|
143 |
|
|
ol->q[2] = 0;
|
144 |
|
|
ol->q[3] = 0;
|
145 |
|
|
}
|
146 |
|
|
|
147 |
|
|
/* inputs */
|
148 |
|
|
|
149 |
|
|
static inline void fill_input_more(struct input_more *im,
|
150 |
|
|
int want_interrupt,
|
151 |
|
|
unsigned int data_size,
|
152 |
|
|
unsigned long data_phys_addr)
|
153 |
|
|
{
|
154 |
|
|
u32 temp = 2 << 28; /* INPUT_MORE */
|
155 |
|
|
temp |= 8 << 24; /* s = 1, update xferStatus and resCount */
|
156 |
|
|
if (want_interrupt)
|
157 |
|
|
temp |= 0 << 20; /* interrupts, i=0 in packet-per-buffer mode */
|
158 |
|
|
temp |= 0x0 << 16; /* disable branch to address for packet-per-buffer mode */
|
159 |
|
|
/* disable wait on sync field, not used in DV :-( */
|
160 |
|
|
temp |= data_size;
|
161 |
|
|
|
162 |
|
|
im->q[0] = cpu_to_le32(temp);
|
163 |
|
|
im->q[1] = cpu_to_le32(data_phys_addr);
|
164 |
|
|
im->q[2] = 0; /* branchAddress and Z not use in packet-per-buffer mode */
|
165 |
|
|
im->q[3] = 0; /* xferStatus & resCount, resCount must be initialize to data_size */
|
166 |
|
|
}
|
167 |
|
|
|
168 |
|
|
static inline void fill_input_last(struct input_last *il,
|
169 |
|
|
int want_interrupt,
|
170 |
|
|
unsigned int data_size,
|
171 |
|
|
unsigned long data_phys_addr)
|
172 |
|
|
{
|
173 |
|
|
u32 temp = 3 << 28; /* INPUT_LAST */
|
174 |
|
|
temp |= 8 << 24; /* s = 1, update xferStatus and resCount */
|
175 |
|
|
if (want_interrupt)
|
176 |
|
|
temp |= 3 << 20; /* enable interrupts */
|
177 |
|
|
temp |= 0xC << 16; /* enable branch to address */
|
178 |
|
|
/* disable wait on sync field, not used in DV :-( */
|
179 |
|
|
temp |= data_size;
|
180 |
|
|
|
181 |
|
|
il->q[0] = cpu_to_le32(temp);
|
182 |
|
|
il->q[1] = cpu_to_le32(data_phys_addr);
|
183 |
|
|
il->q[2] = cpu_to_le32(1); /* branchAddress (filled in later) and Z = 1 descriptor in next block */
|
184 |
|
|
il->q[3] = cpu_to_le32(data_size); /* xferStatus & resCount, resCount must be initialize to data_size */
|
185 |
|
|
}
|
186 |
|
|
|
187 |
|
|
|
188 |
|
|
|
189 |
|
|
/*
|
190 |
|
|
A "DMA descriptor block" consists of several contiguous DMA commands.
|
191 |
|
|
struct DMA_descriptor_block encapsulates all of the commands necessary
|
192 |
|
|
to send one packet of DV data.
|
193 |
|
|
|
194 |
|
|
There are three different types of these blocks:
|
195 |
|
|
|
196 |
|
|
1) command to send an empty packet (CIP header only, no DV data):
|
197 |
|
|
|
198 |
|
|
OUTPUT_MORE-Immediate <-- contains the iso header in-line
|
199 |
|
|
OUTPUT_LAST <-- points to the CIP header
|
200 |
|
|
|
201 |
|
|
2) command to send a full packet when the DV data payload does NOT
|
202 |
|
|
cross a page boundary:
|
203 |
|
|
|
204 |
|
|
OUTPUT_MORE-Immediate <-- contains the iso header in-line
|
205 |
|
|
OUTPUT_MORE <-- points to the CIP header
|
206 |
|
|
OUTPUT_LAST <-- points to entire DV data payload
|
207 |
|
|
|
208 |
|
|
3) command to send a full packet when the DV payload DOES cross
|
209 |
|
|
a page boundary:
|
210 |
|
|
|
211 |
|
|
OUTPUT_MORE-Immediate <-- contains the iso header in-line
|
212 |
|
|
OUTPUT_MORE <-- points to the CIP header
|
213 |
|
|
OUTPUT_MORE <-- points to first part of DV data payload
|
214 |
|
|
OUTPUT_LAST <-- points to second part of DV data payload
|
215 |
|
|
|
216 |
|
|
This struct describes all three block types using unions.
|
217 |
|
|
|
218 |
|
|
!!! It is vital that an even number of these descriptor blocks fit on one
|
219 |
|
|
page of memory, since a block cannot cross a page boundary !!!
|
220 |
|
|
|
221 |
|
|
*/
|
222 |
|
|
|
223 |
|
|
struct DMA_descriptor_block {
|
224 |
|
|
|
225 |
|
|
union {
|
226 |
|
|
struct {
|
227 |
|
|
/* iso header, common to all output block types */
|
228 |
|
|
struct output_more_immediate omi;
|
229 |
|
|
|
230 |
|
|
union {
|
231 |
|
|
/* empty packet */
|
232 |
|
|
struct {
|
233 |
|
|
struct output_last ol; /* CIP header */
|
234 |
|
|
} empty;
|
235 |
|
|
|
236 |
|
|
/* full packet */
|
237 |
|
|
struct {
|
238 |
|
|
struct output_more om; /* CIP header */
|
239 |
|
|
|
240 |
|
|
union {
|
241 |
|
|
/* payload does not cross page boundary */
|
242 |
|
|
struct {
|
243 |
|
|
struct output_last ol; /* data payload */
|
244 |
|
|
} nocross;
|
245 |
|
|
|
246 |
|
|
/* payload crosses page boundary */
|
247 |
|
|
struct {
|
248 |
|
|
struct output_more om; /* data payload */
|
249 |
|
|
struct output_last ol; /* data payload */
|
250 |
|
|
} cross;
|
251 |
|
|
} u;
|
252 |
|
|
|
253 |
|
|
} full;
|
254 |
|
|
} u;
|
255 |
|
|
} out;
|
256 |
|
|
|
257 |
|
|
struct {
|
258 |
|
|
struct input_last il;
|
259 |
|
|
} in;
|
260 |
|
|
|
261 |
|
|
} u;
|
262 |
|
|
|
263 |
|
|
/* ensure that PAGE_SIZE % sizeof(struct DMA_descriptor_block) == 0
|
264 |
|
|
by padding out to 128 bytes */
|
265 |
|
|
u32 __pad__[12];
|
266 |
|
|
};
|
267 |
|
|
|
268 |
|
|
|
269 |
|
|
/* struct frame contains all data associated with one frame in the
|
270 |
|
|
ringbuffer these are allocated when the DMA context is initialized
|
271 |
|
|
do_dv1394_init(). They are re-used after the card finishes
|
272 |
|
|
transmitting the frame. */
|
273 |
|
|
|
274 |
|
|
struct video_card; /* forward declaration */
|
275 |
|
|
|
276 |
|
|
struct frame {
|
277 |
|
|
|
278 |
|
|
/* points to the struct video_card that owns this frame */
|
279 |
|
|
struct video_card *video;
|
280 |
|
|
|
281 |
|
|
/* index of this frame in video_card->frames[] */
|
282 |
|
|
unsigned int frame_num;
|
283 |
|
|
|
284 |
|
|
/* FRAME_CLEAR - DMA program not set up, waiting for data
|
285 |
|
|
FRAME_READY - DMA program written, ready to transmit
|
286 |
|
|
|
287 |
|
|
Changes to these should be locked against the interrupt
|
288 |
|
|
*/
|
289 |
|
|
enum {
|
290 |
|
|
FRAME_CLEAR = 0,
|
291 |
|
|
FRAME_READY
|
292 |
|
|
} state;
|
293 |
|
|
|
294 |
|
|
/* whether this frame has been DMA'ed already; used only from
|
295 |
|
|
the IRQ handler to determine whether the frame can be reset */
|
296 |
|
|
int done;
|
297 |
|
|
|
298 |
|
|
|
299 |
|
|
/* kernel virtual pointer to the start of this frame's data in
|
300 |
|
|
the user ringbuffer. Use only for CPU access; to get the DMA
|
301 |
|
|
bus address you must go through the video->user_dma mapping */
|
302 |
|
|
unsigned long data;
|
303 |
|
|
|
304 |
|
|
/* Max # of packets per frame */
|
305 |
|
|
#define MAX_PACKETS 500
|
306 |
|
|
|
307 |
|
|
|
308 |
|
|
/* a PAGE_SIZE memory pool for allocating CIP headers
|
309 |
|
|
!header_pool must be aligned to PAGE_SIZE! */
|
310 |
|
|
struct CIP_header *header_pool;
|
311 |
|
|
dma_addr_t header_pool_dma;
|
312 |
|
|
|
313 |
|
|
|
314 |
|
|
/* a physically contiguous memory pool for allocating DMA
|
315 |
|
|
descriptor blocks; usually around 64KB in size
|
316 |
|
|
!descriptor_pool must be aligned to PAGE_SIZE! */
|
317 |
|
|
struct DMA_descriptor_block *descriptor_pool;
|
318 |
|
|
dma_addr_t descriptor_pool_dma;
|
319 |
|
|
unsigned long descriptor_pool_size;
|
320 |
|
|
|
321 |
|
|
|
322 |
|
|
/* # of packets allocated for this frame */
|
323 |
|
|
unsigned int n_packets;
|
324 |
|
|
|
325 |
|
|
|
326 |
|
|
/* below are several pointers (kernel virtual addresses, not
|
327 |
|
|
DMA bus addresses) to parts of the DMA program. These are
|
328 |
|
|
set each time the DMA program is written in
|
329 |
|
|
frame_prepare(). They are used later on, e.g. from the
|
330 |
|
|
interrupt handler, to check the status of the frame */
|
331 |
|
|
|
332 |
|
|
/* points to status/timestamp field of first DMA packet */
|
333 |
|
|
/* (we'll check it later to monitor timestamp accuracy) */
|
334 |
|
|
u32 *frame_begin_timestamp;
|
335 |
|
|
|
336 |
|
|
/* the timestamp we assigned to the first packet in the frame */
|
337 |
|
|
u32 assigned_timestamp;
|
338 |
|
|
|
339 |
|
|
/* pointer to the first packet's CIP header (where the timestamp goes) */
|
340 |
|
|
struct CIP_header *cip_syt1;
|
341 |
|
|
|
342 |
|
|
/* pointer to the second packet's CIP header
|
343 |
|
|
(only set if the first packet was empty) */
|
344 |
|
|
struct CIP_header *cip_syt2;
|
345 |
|
|
|
346 |
|
|
/* in order to figure out what caused an interrupt,
|
347 |
|
|
store pointers to the status fields of the two packets
|
348 |
|
|
that can cause interrupts. We'll check these from the
|
349 |
|
|
interrupt handler.
|
350 |
|
|
*/
|
351 |
|
|
u32 *mid_frame_timestamp;
|
352 |
|
|
u32 *frame_end_timestamp;
|
353 |
|
|
|
354 |
|
|
/* branch address field of final packet. This is effectively
|
355 |
|
|
the "tail" in the chain of DMA descriptor blocks.
|
356 |
|
|
We will fill it with the address of the first DMA descriptor
|
357 |
|
|
block in the subsequent frame, once it is ready.
|
358 |
|
|
*/
|
359 |
|
|
u32 *frame_end_branch;
|
360 |
|
|
|
361 |
|
|
/* the number of descriptors in the first descriptor block
|
362 |
|
|
of the frame. Needed to start DMA */
|
363 |
|
|
int first_n_descriptors;
|
364 |
|
|
};
|
365 |
|
|
|
366 |
|
|
|
367 |
|
|
struct packet {
|
368 |
|
|
u16 timestamp;
|
369 |
|
|
u16 invalid;
|
370 |
|
|
u16 iso_header;
|
371 |
|
|
u16 data_length;
|
372 |
|
|
u32 cip_h1;
|
373 |
|
|
u32 cip_h2;
|
374 |
|
|
unsigned char data[480];
|
375 |
|
|
unsigned char padding[16]; /* force struct size =512 for page alignment */
|
376 |
|
|
};
|
377 |
|
|
|
378 |
|
|
|
379 |
|
|
/* allocate/free a frame */
|
380 |
|
|
static struct frame* frame_new(unsigned int frame_num, struct video_card *video);
|
381 |
|
|
static void frame_delete(struct frame *f);
|
382 |
|
|
|
383 |
|
|
/* reset f so that it can be used again */
|
384 |
|
|
static void frame_reset(struct frame *f);
|
385 |
|
|
|
386 |
|
|
/* struct video_card contains all data associated with one instance
|
387 |
|
|
of the dv1394 driver
|
388 |
|
|
*/
|
389 |
|
|
enum modes {
|
390 |
|
|
MODE_RECEIVE,
|
391 |
|
|
MODE_TRANSMIT
|
392 |
|
|
};
|
393 |
|
|
|
394 |
|
|
struct video_card {
|
395 |
|
|
|
396 |
|
|
/* ohci card to which this instance corresponds */
|
397 |
|
|
struct ti_ohci *ohci;
|
398 |
|
|
|
399 |
|
|
/* OHCI card id; the link between the VFS inode and a specific video_card
|
400 |
|
|
(essentially the device minor number) */
|
401 |
|
|
int id;
|
402 |
|
|
|
403 |
|
|
/* entry in dv1394_cards */
|
404 |
|
|
struct list_head list;
|
405 |
|
|
|
406 |
|
|
/* handle to /dev/ieee1394/dv/N, NULL if devfs not in use */
|
407 |
|
|
devfs_handle_t devfs_handle;
|
408 |
|
|
|
409 |
|
|
/* OHCI card IT DMA context number, -1 if not in use */
|
410 |
|
|
int ohci_it_ctx;
|
411 |
|
|
struct ohci1394_iso_tasklet it_tasklet;
|
412 |
|
|
|
413 |
|
|
/* register offsets for current IT DMA context, 0 if not in use */
|
414 |
|
|
u32 ohci_IsoXmitContextControlSet;
|
415 |
|
|
u32 ohci_IsoXmitContextControlClear;
|
416 |
|
|
u32 ohci_IsoXmitCommandPtr;
|
417 |
|
|
|
418 |
|
|
/* OHCI card IR DMA context number, -1 if not in use */
|
419 |
|
|
struct ohci1394_iso_tasklet ir_tasklet;
|
420 |
|
|
int ohci_ir_ctx;
|
421 |
|
|
|
422 |
|
|
/* register offsets for current IR DMA context, 0 if not in use */
|
423 |
|
|
u32 ohci_IsoRcvContextControlSet;
|
424 |
|
|
u32 ohci_IsoRcvContextControlClear;
|
425 |
|
|
u32 ohci_IsoRcvCommandPtr;
|
426 |
|
|
u32 ohci_IsoRcvContextMatch;
|
427 |
|
|
|
428 |
|
|
|
429 |
|
|
/* CONCURRENCY CONTROL */
|
430 |
|
|
|
431 |
|
|
/* there are THREE levels of locking associated with video_card. */
|
432 |
|
|
|
433 |
|
|
/*
|
434 |
|
|
1) the 'open' flag - this prevents more than one process from
|
435 |
|
|
opening the device. (the driver currently assumes only one opener).
|
436 |
|
|
This is a regular int, but use test_and_set_bit() (on bit zero)
|
437 |
|
|
for atomicity.
|
438 |
|
|
*/
|
439 |
|
|
unsigned long open;
|
440 |
|
|
|
441 |
|
|
/*
|
442 |
|
|
2) the spinlock - this provides mutual exclusion between the interrupt
|
443 |
|
|
handler and process-context operations. Generally you must take the
|
444 |
|
|
spinlock under the following conditions:
|
445 |
|
|
1) DMA (and hence the interrupt handler) may be running
|
446 |
|
|
AND
|
447 |
|
|
2) you need to operate on the video_card, especially active_frame
|
448 |
|
|
|
449 |
|
|
It is OK to play with video_card without taking the spinlock if
|
450 |
|
|
you are certain that DMA is not running. Even if DMA is running,
|
451 |
|
|
it is OK to *read* active_frame with the lock, then drop it
|
452 |
|
|
immediately. This is safe because the interrupt handler will never
|
453 |
|
|
advance active_frame onto a frame that is not READY (and the spinlock
|
454 |
|
|
must be held while marking a frame READY).
|
455 |
|
|
|
456 |
|
|
spinlock is also used to protect ohci_it_ctx and ohci_ir_ctx,
|
457 |
|
|
which can be accessed from both process and interrupt context
|
458 |
|
|
*/
|
459 |
|
|
spinlock_t spinlock;
|
460 |
|
|
|
461 |
|
|
/* flag to prevent spurious interrupts (which OHCI seems to
|
462 |
|
|
generate a lot :) from accessing the struct */
|
463 |
|
|
int dma_running;
|
464 |
|
|
|
465 |
|
|
/*
|
466 |
|
|
3) the sleeping semaphore 'sem' - this is used from process context only,
|
467 |
|
|
to serialize various operations on the video_card. Even though only one
|
468 |
|
|
open() is allowed, we still need to prevent multiple threads of execution
|
469 |
|
|
from entering calls like read, write, ioctl, etc.
|
470 |
|
|
|
471 |
|
|
I honestly can't think of a good reason to use dv1394 from several threads
|
472 |
|
|
at once, but we need to serialize anyway to prevent oopses =).
|
473 |
|
|
|
474 |
|
|
NOTE: if you need both spinlock and sem, take sem first to avoid deadlock!
|
475 |
|
|
*/
|
476 |
|
|
struct semaphore sem;
|
477 |
|
|
|
478 |
|
|
/* people waiting for buffer space, please form a line here... */
|
479 |
|
|
wait_queue_head_t waitq;
|
480 |
|
|
|
481 |
|
|
/* support asynchronous I/O signals (SIGIO) */
|
482 |
|
|
struct fasync_struct *fasync;
|
483 |
|
|
|
484 |
|
|
/* the large, non-contiguous (rvmalloc()) ringbuffer for DV
|
485 |
|
|
data, exposed to user-space via mmap() */
|
486 |
|
|
unsigned long dv_buf_size;
|
487 |
|
|
struct dma_region dv_buf;
|
488 |
|
|
|
489 |
|
|
/* next byte in the ringbuffer that a write() call will fill */
|
490 |
|
|
size_t write_off;
|
491 |
|
|
|
492 |
|
|
struct frame *frames[DV1394_MAX_FRAMES];
|
493 |
|
|
|
494 |
|
|
/* n_frames also serves as an indicator that this struct video_card is
|
495 |
|
|
initialized and ready to run DMA buffers */
|
496 |
|
|
|
497 |
|
|
int n_frames;
|
498 |
|
|
|
499 |
|
|
/* this is the frame that is currently "owned" by the OHCI DMA controller
|
500 |
|
|
(set to -1 iff DMA is not running)
|
501 |
|
|
|
502 |
|
|
! must lock against the interrupt handler when accessing it !
|
503 |
|
|
|
504 |
|
|
RULES:
|
505 |
|
|
|
506 |
|
|
Only the interrupt handler may change active_frame if DMA
|
507 |
|
|
is running; if not, process may change it
|
508 |
|
|
|
509 |
|
|
If the next frame is READY, the interrupt handler will advance
|
510 |
|
|
active_frame when the current frame is finished.
|
511 |
|
|
|
512 |
|
|
If the next frame is CLEAR, the interrupt handler will re-transmit
|
513 |
|
|
the current frame, and the dropped_frames counter will be incremented.
|
514 |
|
|
|
515 |
|
|
The interrupt handler will NEVER advance active_frame to a
|
516 |
|
|
frame that is not READY.
|
517 |
|
|
|
518 |
|
|
*/
|
519 |
|
|
int active_frame;
|
520 |
|
|
int first_run;
|
521 |
|
|
|
522 |
|
|
/* the same locking rules apply to these three fields also: */
|
523 |
|
|
|
524 |
|
|
/* altered ONLY from process context. Must check first_clear_frame->state;
|
525 |
|
|
if it's READY, that means the ringbuffer is full with READY frames;
|
526 |
|
|
if it's CLEAR, that means one or more ringbuffer frames are CLEAR */
|
527 |
|
|
unsigned int first_clear_frame;
|
528 |
|
|
|
529 |
|
|
/* altered both by process and interrupt */
|
530 |
|
|
unsigned int n_clear_frames;
|
531 |
|
|
|
532 |
|
|
/* only altered by the interrupt */
|
533 |
|
|
unsigned int dropped_frames;
|
534 |
|
|
|
535 |
|
|
|
536 |
|
|
|
537 |
|
|
/* the CIP accumulator and continuity counter are properties
|
538 |
|
|
of the DMA stream as a whole (not a single frame), so they
|
539 |
|
|
are stored here in the video_card */
|
540 |
|
|
|
541 |
|
|
unsigned long cip_accum;
|
542 |
|
|
unsigned long cip_n, cip_d;
|
543 |
|
|
unsigned int syt_offset;
|
544 |
|
|
unsigned int continuity_counter;
|
545 |
|
|
|
546 |
|
|
enum pal_or_ntsc pal_or_ntsc;
|
547 |
|
|
|
548 |
|
|
/* redundant, but simplifies the code somewhat */
|
549 |
|
|
unsigned int frame_size; /* in bytes */
|
550 |
|
|
|
551 |
|
|
/* the isochronous channel to use, -1 if video card is inactive */
|
552 |
|
|
int channel;
|
553 |
|
|
|
554 |
|
|
|
555 |
|
|
/* physically contiguous packet ringbuffer for receive */
|
556 |
|
|
struct dma_region packet_buf;
|
557 |
|
|
unsigned long packet_buf_size;
|
558 |
|
|
|
559 |
|
|
unsigned int current_packet;
|
560 |
|
|
int first_frame; /* received first start frame marker? */
|
561 |
|
|
enum modes mode;
|
562 |
|
|
};
|
563 |
|
|
|
564 |
|
|
/*
|
565 |
|
|
if the video_card is not initialized, then the ONLY fields that are valid are:
|
566 |
|
|
ohci
|
567 |
|
|
open
|
568 |
|
|
n_frames
|
569 |
|
|
*/
|
570 |
|
|
|
571 |
|
|
static inline int video_card_initialized(struct video_card *v)
|
572 |
|
|
{
|
573 |
|
|
return v->n_frames > 0;
|
574 |
|
|
}
|
575 |
|
|
|
576 |
|
|
static int do_dv1394_init(struct video_card *video, struct dv1394_init *init);
|
577 |
|
|
static int do_dv1394_init_default(struct video_card *video);
|
578 |
|
|
static void do_dv1394_shutdown(struct video_card *video, int free_user_buf);
|
579 |
|
|
|
580 |
|
|
|
581 |
|
|
/* NTSC empty packet rate accurate to within 0.01%,
|
582 |
|
|
calibrated against a Sony DSR-40 DVCAM deck */
|
583 |
|
|
|
584 |
|
|
#define CIP_N_NTSC 68000000
|
585 |
|
|
#define CIP_D_NTSC 1068000000
|
586 |
|
|
|
587 |
|
|
#define CIP_N_PAL 1
|
588 |
|
|
#define CIP_D_PAL 16
|
589 |
|
|
|
590 |
|
|
#endif /* _DV_1394_PRIVATE_H */
|
591 |
|
|
|