blob: 5efc963f91646082fa4669c7c94a42a3a6dd4e9d [file] [log] [blame]
Janne Grunau9aba42e2009-03-18 18:10:04 -03001/*
Janne Grunaue86da6f2009-03-19 19:00:35 -03002 * Hauppauge HD PVR USB driver
Janne Grunau9aba42e2009-03-18 18:10:04 -03003 *
4 * Copyright (C) 2008 Janne Grunau (j@jannau.net)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, version 2.
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
Janne Grunau06630ae2009-03-27 20:01:40 -030018#include <media/v4l2-device.h>
19
Janne Grunau9aba42e2009-03-18 18:10:04 -030020#define HDPVR_MAJOR_VERSION 0
21#define HDPVR_MINOR_VERSION 2
22#define HDPVR_RELEASE 0
23#define HDPVR_VERSION \
24 KERNEL_VERSION(HDPVR_MAJOR_VERSION, HDPVR_MINOR_VERSION, HDPVR_RELEASE)
25
26#define HDPVR_MAX 8
27
28/* Define these values to match your devices */
29#define HD_PVR_VENDOR_ID 0x2040
30#define HD_PVR_PRODUCT_ID 0x4900
31#define HD_PVR_PRODUCT_ID1 0x4901
32#define HD_PVR_PRODUCT_ID2 0x4902
Janne Grunaue902a682010-10-11 10:29:36 -030033#define HD_PVR_PRODUCT_ID4 0x4903
Janne Grunauc22425f2010-02-03 15:51:23 +010034#define HD_PVR_PRODUCT_ID3 0x4982
Janne Grunau9aba42e2009-03-18 18:10:04 -030035
36#define UNSET (-1U)
37
38#define NUM_BUFFERS 64
39
Janne Grunau35b53662010-07-27 11:03:35 -030040#define HDPVR_FIRMWARE_VERSION 0x08
41#define HDPVR_FIRMWARE_VERSION_AC3 0x0d
42#define HDPVR_FIRMWARE_VERSION_0X12 0x12
43#define HDPVR_FIRMWARE_VERSION_0X15 0x15
Janne Grunau9aba42e2009-03-18 18:10:04 -030044
45/* #define HDPVR_DEBUG */
46
47extern int hdpvr_debug;
48
49#define MSG_INFO 1
50#define MSG_BUFFER 2
51
52struct hdpvr_options {
53 u8 video_std;
54 u8 video_input;
55 u8 audio_input;
56 u8 bitrate; /* in 100kbps */
57 u8 peak_bitrate; /* in 100kbps */
58 u8 bitrate_mode;
59 u8 gop_mode;
60 enum v4l2_mpeg_audio_encoding audio_codec;
61 u8 brightness;
62 u8 contrast;
63 u8 hue;
64 u8 saturation;
65 u8 sharpness;
66};
67
68/* Structure to hold all of our device specific stuff */
69struct hdpvr_device {
70 /* the v4l device for this device */
71 struct video_device *video_dev;
72 /* the usb device for this device */
73 struct usb_device *udev;
Janne Grunau06630ae2009-03-27 20:01:40 -030074 /* v4l2-device unused */
75 struct v4l2_device v4l2_dev;
Janne Grunau9aba42e2009-03-18 18:10:04 -030076
77 /* the max packet size of the bulk endpoint */
78 size_t bulk_in_size;
79 /* the address of the bulk in endpoint */
80 __u8 bulk_in_endpointAddr;
81
82 /* holds the current device status */
83 __u8 status;
84 /* count the number of openers */
85 uint open_count;
86
87 /* holds the cureent set options */
88 struct hdpvr_options options;
89
90 uint flags;
91
92 /* synchronize I/O */
93 struct mutex io_mutex;
94 /* available buffers */
95 struct list_head free_buff_list;
96 /* in progress buffers */
97 struct list_head rec_buff_list;
98 /* waitqueue for buffers */
99 wait_queue_head_t wait_buffer;
100 /* waitqueue for data */
101 wait_queue_head_t wait_data;
102 /**/
103 struct workqueue_struct *workqueue;
104 /**/
105 struct work_struct worker;
106
107 /* I2C adapter */
108 struct i2c_adapter *i2c_adapter;
109 /* I2C lock */
110 struct mutex i2c_mutex;
111
112 /* usb control transfer buffer and lock */
113 struct mutex usbc_mutex;
114 u8 *usbc_buf;
115};
116
Hans Verkuilf2b305c2010-05-02 08:01:04 -0300117static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev)
118{
119 return container_of(v4l2_dev, struct hdpvr_device, v4l2_dev);
120}
121
Janne Grunau9aba42e2009-03-18 18:10:04 -0300122
123/* buffer one bulk urb of data */
124struct hdpvr_buffer {
125 struct list_head buff_list;
126
127 struct urb *urb;
128
129 struct hdpvr_device *dev;
130
131 uint pos;
132
133 __u8 status;
134};
135
136/* */
137
138struct hdpvr_video_info {
139 u16 width;
140 u16 height;
141 u8 fps;
142};
143
144enum {
145 STATUS_UNINITIALIZED = 0,
146 STATUS_IDLE,
147 STATUS_STARTING,
148 STATUS_SHUTTING_DOWN,
149 STATUS_STREAMING,
150 STATUS_ERROR,
151 STATUS_DISCONNECTED,
152};
153
154enum {
155 HDPVR_FLAG_AC3_CAP = 1,
156};
157
158enum {
159 BUFSTAT_UNINITIALIZED = 0,
160 BUFSTAT_AVAILABLE,
161 BUFSTAT_INPROGRESS,
162 BUFSTAT_READY,
163};
164
165#define CTRL_START_STREAMING_VALUE 0x0700
166#define CTRL_STOP_STREAMING_VALUE 0x0800
167#define CTRL_BITRATE_VALUE 0x1000
168#define CTRL_BITRATE_MODE_VALUE 0x1200
169#define CTRL_GOP_MODE_VALUE 0x1300
170#define CTRL_VIDEO_INPUT_VALUE 0x1500
171#define CTRL_VIDEO_STD_TYPE 0x1700
172#define CTRL_AUDIO_INPUT_VALUE 0x2500
173#define CTRL_BRIGHTNESS 0x2900
174#define CTRL_CONTRAST 0x2a00
175#define CTRL_HUE 0x2b00
176#define CTRL_SATURATION 0x2c00
177#define CTRL_SHARPNESS 0x2d00
178#define CTRL_LOW_PASS_FILTER_VALUE 0x3100
179
180#define CTRL_DEFAULT_INDEX 0x0003
181
182
183 /* :0 s 38 01 1000 0003 0004 4 = 0a00ca00
184 * BITRATE SETTING
185 * 1st and 2nd byte (little endian): average bitrate in 100 000 bit/s
186 * min: 1 mbit/s, max: 13.5 mbit/s
187 * 3rd and 4th byte (little endian): peak bitrate in 100 000 bit/s
188 * min: average + 100kbit/s,
189 * max: 20.2 mbit/s
190 */
191
192 /* :0 s 38 01 1200 0003 0001 1 = 02
193 * BIT RATE MODE
194 * constant = 1, variable (peak) = 2, variable (average) = 3
195 */
196
197 /* :0 s 38 01 1300 0003 0001 1 = 03
198 * GOP MODE (2 bit)
199 * low bit 0/1: advanced/simple GOP
200 * high bit 0/1: IDR(4/32/128) / no IDR (4/32/0)
201 */
202
203 /* :0 s 38 01 1700 0003 0001 1 = 00
204 * VIDEO STANDARD or FREQUNCY 0 = 60hz, 1 = 50hz
205 */
206
207 /* :0 s 38 01 3100 0003 0004 4 = 03030000
208 * FILTER CONTROL
209 * 1st byte luma low pass filter strength,
210 * 2nd byte chroma low pass filter strength,
211 * 3rd byte MF enable chroma, min=0, max=1
212 * 4th byte n
213 */
214
215
216 /* :0 s 38 b9 0001 0000 0000 0 */
217
218
219
220/* :0 s 38 d3 0000 0000 0001 1 = 00 */
221/* ret = usb_control_msg(dev->udev, */
222/* usb_sndctrlpipe(dev->udev, 0), */
223/* 0xd3, 0x38, */
224/* 0, 0, */
225/* "\0", 1, */
226/* 1000); */
227
228/* info("control request returned %d", ret); */
229/* msleep(5000); */
230
231
232 /* :0 s b8 81 1400 0003 0005 5 <
233 * :0 0 5 = d0024002 19
234 * QUERY FRAME SIZE AND RATE
235 * 1st and 2nd byte (little endian): horizontal resolution
236 * 3rd and 4th byte (little endian): vertical resolution
237 * 5th byte: frame rate
238 */
239
240 /* :0 s b8 81 1800 0003 0003 3 <
241 * :0 0 3 = 030104
242 * QUERY SIGNAL AND DETECTED LINES, maybe INPUT
243 */
244
245enum hdpvr_video_std {
246 HDPVR_60HZ = 0,
247 HDPVR_50HZ,
248};
249
250enum hdpvr_video_input {
251 HDPVR_COMPONENT = 0,
252 HDPVR_SVIDEO,
253 HDPVR_COMPOSITE,
254 HDPVR_VIDEO_INPUTS
255};
256
257enum hdpvr_audio_inputs {
258 HDPVR_RCA_BACK = 0,
259 HDPVR_RCA_FRONT,
260 HDPVR_SPDIF,
261 HDPVR_AUDIO_INPUTS
262};
263
264enum hdpvr_bitrate_mode {
265 HDPVR_CONSTANT = 1,
266 HDPVR_VARIABLE_PEAK,
267 HDPVR_VARIABLE_AVERAGE,
268};
269
270enum hdpvr_gop_mode {
271 HDPVR_ADVANCED_IDR_GOP = 0,
272 HDPVR_SIMPLE_IDR_GOP,
273 HDPVR_ADVANCED_NOIDR_GOP,
274 HDPVR_SIMPLE_NOIDR_GOP,
275};
276
277void hdpvr_delete(struct hdpvr_device *dev);
278
279/*========================================================================*/
280/* hardware control functions */
281int hdpvr_set_options(struct hdpvr_device *dev);
282
283int hdpvr_set_bitrate(struct hdpvr_device *dev);
284
285int hdpvr_set_audio(struct hdpvr_device *dev, u8 input,
286 enum v4l2_mpeg_audio_encoding codec);
287
288int hdpvr_config_call(struct hdpvr_device *dev, uint value,
289 unsigned char valbuf);
290
291struct hdpvr_video_info *get_video_info(struct hdpvr_device *dev);
292
293/* :0 s b8 81 1800 0003 0003 3 < */
294/* :0 0 3 = 0301ff */
295int get_input_lines_info(struct hdpvr_device *dev);
296
297
298/*========================================================================*/
299/* v4l2 registration */
Janne Grunaua50ab292009-03-26 14:40:55 -0300300int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
301 int devnumber);
Janne Grunau9aba42e2009-03-18 18:10:04 -0300302
303int hdpvr_cancel_queue(struct hdpvr_device *dev);
304
305/*========================================================================*/
306/* i2c adapter registration */
307int hdpvr_register_i2c_adapter(struct hdpvr_device *dev);
308
309/*========================================================================*/
310/* buffer management */
311int hdpvr_free_buffers(struct hdpvr_device *dev);
312int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count);