1
2
3
4
5
6
7
8
9
10
11
12#include <linux/usb.h>
13#include <linux/i2c.h>
14#include <linux/mutex.h>
15#include <linux/workqueue.h>
16#include <linux/videodev2.h>
17
18#include <media/v4l2-device.h>
19#include <media/v4l2-ctrls.h>
20#include <media/i2c/ir-kbd-i2c.h>
21
22#define HDPVR_MAX 8
23#define HDPVR_I2C_MAX_SIZE 128
24
25
26#define HD_PVR_VENDOR_ID 0x2040
27#define HD_PVR_PRODUCT_ID 0x4900
28#define HD_PVR_PRODUCT_ID1 0x4901
29#define HD_PVR_PRODUCT_ID2 0x4902
30#define HD_PVR_PRODUCT_ID4 0x4903
31#define HD_PVR_PRODUCT_ID3 0x4982
32
33#define UNSET (-1U)
34
35#define NUM_BUFFERS 64
36
37#define HDPVR_FIRMWARE_VERSION 0x08
38#define HDPVR_FIRMWARE_VERSION_AC3 0x0d
39#define HDPVR_FIRMWARE_VERSION_0X12 0x12
40#define HDPVR_FIRMWARE_VERSION_0X15 0x15
41#define HDPVR_FIRMWARE_VERSION_0X1E 0x1e
42
43
44
45extern int hdpvr_debug;
46
47#define MSG_INFO 1
48#define MSG_BUFFER 2
49
50struct hdpvr_options {
51 u8 video_std;
52 u8 video_input;
53 u8 audio_input;
54 u8 bitrate;
55 u8 peak_bitrate;
56 u8 bitrate_mode;
57 u8 gop_mode;
58 enum v4l2_mpeg_audio_encoding audio_codec;
59 u8 brightness;
60 u8 contrast;
61 u8 hue;
62 u8 saturation;
63 u8 sharpness;
64};
65
66
67struct hdpvr_device {
68
69 struct video_device video_dev;
70
71 struct v4l2_ctrl_handler hdl;
72
73 struct usb_device *udev;
74
75 struct v4l2_device v4l2_dev;
76 struct {
77 struct v4l2_ctrl *video_mode;
78 struct v4l2_ctrl *video_bitrate;
79 struct v4l2_ctrl *video_bitrate_peak;
80 };
81
82 uint width, height;
83
84
85 size_t bulk_in_size;
86
87 __u8 bulk_in_endpointAddr;
88
89
90 __u8 status;
91
92
93 struct hdpvr_options options;
94 v4l2_std_id cur_std;
95 struct v4l2_dv_timings cur_dv_timings;
96
97 uint flags;
98
99
100 struct mutex io_mutex;
101
102 struct list_head free_buff_list;
103
104 struct list_head rec_buff_list;
105
106 wait_queue_head_t wait_buffer;
107
108 wait_queue_head_t wait_data;
109
110 struct work_struct worker;
111
112 struct v4l2_fh *owner;
113
114
115 struct i2c_adapter i2c_adapter;
116
117 struct mutex i2c_mutex;
118
119 char i2c_buf[HDPVR_I2C_MAX_SIZE];
120
121
122 struct IR_i2c_init_data ir_i2c_init_data;
123
124
125 struct mutex usbc_mutex;
126 u8 *usbc_buf;
127 u8 fw_ver;
128};
129
130static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev)
131{
132 return container_of(v4l2_dev, struct hdpvr_device, v4l2_dev);
133}
134
135
136
137struct hdpvr_buffer {
138 struct list_head buff_list;
139
140 struct urb *urb;
141
142 struct hdpvr_device *dev;
143
144 uint pos;
145
146 __u8 status;
147};
148
149
150
151struct hdpvr_video_info {
152 u16 width;
153 u16 height;
154 u8 fps;
155 bool valid;
156};
157
158enum {
159 STATUS_UNINITIALIZED = 0,
160 STATUS_IDLE,
161 STATUS_STARTING,
162 STATUS_SHUTTING_DOWN,
163 STATUS_STREAMING,
164 STATUS_ERROR,
165 STATUS_DISCONNECTED,
166};
167
168enum {
169 HDPVR_FLAG_AC3_CAP = 1,
170};
171
172enum {
173 BUFSTAT_UNINITIALIZED = 0,
174 BUFSTAT_AVAILABLE,
175 BUFSTAT_INPROGRESS,
176 BUFSTAT_READY,
177};
178
179#define CTRL_START_STREAMING_VALUE 0x0700
180#define CTRL_STOP_STREAMING_VALUE 0x0800
181#define CTRL_BITRATE_VALUE 0x1000
182#define CTRL_BITRATE_MODE_VALUE 0x1200
183#define CTRL_GOP_MODE_VALUE 0x1300
184#define CTRL_VIDEO_INPUT_VALUE 0x1500
185#define CTRL_VIDEO_STD_TYPE 0x1700
186#define CTRL_AUDIO_INPUT_VALUE 0x2500
187#define CTRL_BRIGHTNESS 0x2900
188#define CTRL_CONTRAST 0x2a00
189#define CTRL_HUE 0x2b00
190#define CTRL_SATURATION 0x2c00
191#define CTRL_SHARPNESS 0x2d00
192#define CTRL_LOW_PASS_FILTER_VALUE 0x3100
193
194#define CTRL_DEFAULT_INDEX 0x0003
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259enum hdpvr_video_std {
260 HDPVR_60HZ = 0,
261 HDPVR_50HZ,
262};
263
264enum hdpvr_video_input {
265 HDPVR_COMPONENT = 0,
266 HDPVR_SVIDEO,
267 HDPVR_COMPOSITE,
268 HDPVR_VIDEO_INPUTS
269};
270
271enum hdpvr_audio_inputs {
272 HDPVR_RCA_BACK = 0,
273 HDPVR_RCA_FRONT,
274 HDPVR_SPDIF,
275 HDPVR_AUDIO_INPUTS
276};
277
278enum hdpvr_bitrate_mode {
279 HDPVR_CONSTANT = 1,
280 HDPVR_VARIABLE_PEAK,
281 HDPVR_VARIABLE_AVERAGE,
282};
283
284enum hdpvr_gop_mode {
285 HDPVR_ADVANCED_IDR_GOP = 0,
286 HDPVR_SIMPLE_IDR_GOP,
287 HDPVR_ADVANCED_NOIDR_GOP,
288 HDPVR_SIMPLE_NOIDR_GOP,
289};
290
291void hdpvr_delete(struct hdpvr_device *dev);
292
293
294
295int hdpvr_set_options(struct hdpvr_device *dev);
296
297int hdpvr_set_bitrate(struct hdpvr_device *dev);
298
299int hdpvr_set_audio(struct hdpvr_device *dev, u8 input,
300 enum v4l2_mpeg_audio_encoding codec);
301
302int hdpvr_config_call(struct hdpvr_device *dev, uint value,
303 unsigned char valbuf);
304
305int get_video_info(struct hdpvr_device *dev, struct hdpvr_video_info *vid_info);
306
307
308
309int get_input_lines_info(struct hdpvr_device *dev);
310
311
312
313
314int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
315 int devnumber);
316
317int hdpvr_cancel_queue(struct hdpvr_device *dev);
318
319
320
321int hdpvr_register_i2c_adapter(struct hdpvr_device *dev);
322
323struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev);
324struct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev);
325
326
327
328int hdpvr_free_buffers(struct hdpvr_device *dev);
329int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count);
330