1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
/* $OpenBSD: utvfu.h,v 1.3 2016/06/13 19:52:21 mglocker Exp $ */
/*
* Copyright (c) 2013 Lubomir Rintel
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL").
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Fushicai USBTV007 Audio-Video Grabber Driver
*
* Product web site:
* http://www.fushicai.com/products_detail/&productId=d05449ee-b690-42f9-a661-aa7353894bed.html
*
* No physical hardware was harmed running Windows during the
* reverse-engineering activity
*/
#ifndef _UTVFU_H_
#define _UTVFU_H_
#include <sys/rwlock.h>
#include <sys/queue.h>
#include <sys/videoio.h>
/* Hardware. */
#define UTVFU_VIDEO_ENDP 0x81
#define UTVFU_AUDIO_ENDP 0x83
#define UTVFU_BASE 0xc000
#define UTVFU_REQUEST_REG 12
#define UTVFU_DFLT_IFACE_IDX 0
#define UTVFU_ALT_IFACE_IDX 1
/*
* Number of concurrent isochronous urbs submitted.
* Higher numbers was seen to overly saturate the USB bus.
*/
#define UTVFU_ISOC_TRANSFERS 16
#define UTVFU_ISOC_PACKETS 8
#define UTVFU_CHUNK_SIZE 256
#define UTVFU_CHUNK 240
#define UTVFU_AUDIO_URBSIZE 20480
#define UTVFU_AUDIO_HDRSIZE 4
#define UTVFU_AUDIO_BUFFER 65536
#define UTVFU_COMPOSITE_INPUT 0
#define UTVFU_SVIDEO_INPUT 1
/* Chunk header. */
#define UTVFU_MAGIC(hdr) (hdr & 0xff000000U)
#define UTVFU_MAGIC_OK(hdr) ((hdr & 0xff000000U) == 0x88000000U)
#define UTVFU_FRAME_ID(hdr) ((hdr & 0x00ff0000U) >> 16)
#define UTVFU_ODD(hdr) ((hdr & 0x0000f000U) >> 15)
#define UTVFU_CHUNK_NO(hdr) (hdr & 0x00000fffU)
#define UTVFU_TV_STD (V4L2_STD_525_60 | V4L2_STD_PAL)
/* parameters for supported TV norms */
struct utvfu_norm_params {
v4l2_std_id norm;
int cap_width;
int cap_height;
int frame_len;
};
#define UTVFU_MAX_BUFFERS 32
struct utvfu_mmap {
SIMPLEQ_ENTRY(utvfu_mmap) q_frames;
uint8_t *buf;
struct v4l2_buffer v4l2_buf;
};
typedef SIMPLEQ_HEAD(, utvfu_mmap) q_mmap;
struct utvfu_frame_buf {
uint off;
uint size;
uint16_t chunks_done;
uint8_t fid;
uint8_t last_odd;
uint8_t *buf;
};
#define UTVFU_NFRAMES_MAX 40
struct utvfu_isoc_xfer {
struct utvfu_softc *sc;
struct usbd_xfer *xfer;
uint16_t size[UTVFU_NFRAMES_MAX];
};
struct utvfu_vs_iface {
struct usbd_pipe *pipeh;
uint32_t psize;
struct utvfu_isoc_xfer ixfer[UTVFU_ISOC_TRANSFERS];
};
struct utvfu_as_iface {
struct usbd_pipe *pipeh;
struct usbd_xfer *xfer;
};
struct utvfu_audio_chan {
uint8_t *start;
uint8_t *end;
uint8_t *cur;
int blksize;
void *intr_arg;
void (*intr)(void *);
struct utvfu_as_iface iface;
struct rwlock rwlock;
};
/* Per-device structure. */
struct utvfu_softc {
struct device sc_dev;
struct usbd_device *sc_udev;
struct usbd_interface *sc_uifaceh;
/* audio & video device */
struct device *sc_audiodev;
struct device *sc_videodev;
int sc_flags;
#define UTVFU_FLAG_MMAP 0x01
#define UTVFU_FLAG_AS_RUNNING 0x02
int sc_normi;
int sc_nchunks;
int sc_input;
int sc_max_frame_sz;
int sc_nframes;
struct utvfu_vs_iface sc_iface;
struct utvfu_frame_buf sc_fb;
struct utvfu_audio_chan sc_audio;
/* mmap */
struct utvfu_mmap sc_mmap[UTVFU_MAX_BUFFERS];
uint8_t *sc_mmap_buffer;
q_mmap sc_mmap_q;
int sc_mmap_bufsz;
int sc_mmap_count;
/* uplayer */
void *sc_uplayer_arg;
int *sc_uplayer_fsize;
uint8_t *sc_uplayer_fbuffer;
void (*sc_uplayer_intr)(void *);
};
int utvfu_max_frame_size(void);
int utvfu_set_regs(struct utvfu_softc *, const uint16_t regs[][2], int);
void utvfu_image_chunk(struct utvfu_softc *, u_char *);
int utvfu_configure_for_norm(struct utvfu_softc *, v4l2_std_id);
int utvfu_start_capture(struct utvfu_softc *);
int utvfu_mmap_queue(struct utvfu_softc *, uint8_t *, int);
void utvfu_read(struct utvfu_softc *, uint8_t *, int);
void utvfu_audio_decode(struct utvfu_softc *, int);
int utvfu_audio_start(struct utvfu_softc *);
int utvfu_audio_stop(struct utvfu_softc *);
int utvfu_audio_start_chip(struct utvfu_softc *);
int utvfu_audio_stop_chip(struct utvfu_softc *);
#endif
|