19aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*
2e86da6f07ed6deebc199368bd0a47b3671829b80Janne Grunau * Hauppauge HD PVR USB driver
39aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *
49aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau * Copyright (C) 2008      Janne Grunau (j@jannau.net)
59aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *
69aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *	This program is free software; you can redistribute it and/or
79aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *	modify it under the terms of the GNU General Public License as
89aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *	published by the Free Software Foundation, version 2.
99aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *
109aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau */
119aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
129aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#include <linux/usb.h>
139aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#include <linux/i2c.h>
149aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#include <linux/mutex.h>
159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#include <linux/workqueue.h>
169aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#include <linux/videodev2.h>
179aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1806630aec92d6a71658ac1538e2a65af5cfc5f2afJanne Grunau#include <media/v4l2-device.h>
1999c77aa4281c41fab255a4eb25ccc36a8c2e113dHans Verkuil#include <media/v4l2-ctrls.h>
20ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls#include <media/ir-kbd-i2c.h>
2106630aec92d6a71658ac1538e2a65af5cfc5f2afJanne Grunau
229aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HDPVR_MAX 8
23559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson#define HDPVR_I2C_MAX_SIZE 128
249aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
259aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* Define these values to match your devices */
269aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HD_PVR_VENDOR_ID	0x2040
279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HD_PVR_PRODUCT_ID	0x4900
289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HD_PVR_PRODUCT_ID1	0x4901
299aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HD_PVR_PRODUCT_ID2	0x4902
30e902a68b06e145ddd0bb5228739fdae606d851a1Janne Grunau#define HD_PVR_PRODUCT_ID4	0x4903
31c22425ffa10792e2e8aba321dded98a5867d2a86Janne Grunau#define HD_PVR_PRODUCT_ID3	0x4982
329aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
339aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define UNSET    (-1U)
349aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
359aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define NUM_BUFFERS 64
369aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3735b53664d5d0331c8ec2ef44e74eaf4d18f00c06Janne Grunau#define HDPVR_FIRMWARE_VERSION		0x08
3835b53664d5d0331c8ec2ef44e74eaf4d18f00c06Janne Grunau#define HDPVR_FIRMWARE_VERSION_AC3	0x0d
3935b53664d5d0331c8ec2ef44e74eaf4d18f00c06Janne Grunau#define HDPVR_FIRMWARE_VERSION_0X12	0x12
4035b53664d5d0331c8ec2ef44e74eaf4d18f00c06Janne Grunau#define HDPVR_FIRMWARE_VERSION_0X15	0x15
41c7a2c84af549572c454a8d79011c7fac72b3e53dHans Verkuil#define HDPVR_FIRMWARE_VERSION_0X1E	0x1e
429aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
439aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* #define HDPVR_DEBUG */
449aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
459aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauextern int hdpvr_debug;
469aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
479aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define MSG_INFO	1
489aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define MSG_BUFFER	2
499aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
509aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_options {
519aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	video_std;
529aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	video_input;
539aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	audio_input;
549aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	bitrate;	/* in 100kbps */
559aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	peak_bitrate;	/* in 100kbps */
569aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	bitrate_mode;
579aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	gop_mode;
589aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	enum v4l2_mpeg_audio_encoding	audio_codec;
599aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	brightness;
609aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	contrast;
619aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	hue;
629aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	saturation;
639aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	sharpness;
649aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
659aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
669aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* Structure to hold all of our device specific stuff */
679aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_device {
689aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* the v4l device for this device */
699aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct video_device	*video_dev;
7099c77aa4281c41fab255a4eb25ccc36a8c2e113dHans Verkuil	/* the control handler for this device */
7199c77aa4281c41fab255a4eb25ccc36a8c2e113dHans Verkuil	struct v4l2_ctrl_handler hdl;
729aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* the usb device for this device */
739aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct usb_device	*udev;
7406630aec92d6a71658ac1538e2a65af5cfc5f2afJanne Grunau	/* v4l2-device unused */
7506630aec92d6a71658ac1538e2a65af5cfc5f2afJanne Grunau	struct v4l2_device	v4l2_dev;
7699c77aa4281c41fab255a4eb25ccc36a8c2e113dHans Verkuil	struct { /* video mode/bitrate control cluster */
7799c77aa4281c41fab255a4eb25ccc36a8c2e113dHans Verkuil		struct v4l2_ctrl *video_mode;
7899c77aa4281c41fab255a4eb25ccc36a8c2e113dHans Verkuil		struct v4l2_ctrl *video_bitrate;
7999c77aa4281c41fab255a4eb25ccc36a8c2e113dHans Verkuil		struct v4l2_ctrl *video_bitrate_peak;
8099c77aa4281c41fab255a4eb25ccc36a8c2e113dHans Verkuil	};
818f69da955873f5e33b60ff117856a2bf1309a336Hans Verkuil	/* v4l2 format */
828f69da955873f5e33b60ff117856a2bf1309a336Hans Verkuil	uint width, height;
839aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
849aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* the max packet size of the bulk endpoint */
859aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	size_t			bulk_in_size;
869aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* the address of the bulk in endpoint */
879aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	__u8			bulk_in_endpointAddr;
889aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
899aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* holds the current device status */
909aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	__u8			status;
919aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
928f69da955873f5e33b60ff117856a2bf1309a336Hans Verkuil	/* holds the current set options */
939aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct hdpvr_options	options;
948f69da955873f5e33b60ff117856a2bf1309a336Hans Verkuil	v4l2_std_id		cur_std;
953315c59a45d5314c935a7dd82ab3c324c0d01343Hans Verkuil	struct v4l2_dv_timings	cur_dv_timings;
969aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
979aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	uint			flags;
989aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
999aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* synchronize I/O */
1009aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct mutex		io_mutex;
1019aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* available buffers */
1029aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct list_head	free_buff_list;
1039aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* in progress buffers */
1049aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct list_head	rec_buff_list;
1059aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* waitqueue for buffers */
1069aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	wait_queue_head_t	wait_buffer;
1079aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* waitqueue for data */
1089aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	wait_queue_head_t	wait_data;
1099aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/**/
1109aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct workqueue_struct	*workqueue;
1119aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/**/
1129aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct work_struct	worker;
113ede197aac0c64021a0b2139d19edd8fa066530c2Hans Verkuil	/* current stream owner */
114ede197aac0c64021a0b2139d19edd8fa066530c2Hans Verkuil	struct v4l2_fh		*owner;
1159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1169aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* I2C adapter */
117324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	struct i2c_adapter	i2c_adapter;
1189aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* I2C lock */
1199aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct mutex		i2c_mutex;
120559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson	/* I2C message buffer space */
121559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson	char			i2c_buf[HDPVR_I2C_MAX_SIZE];
1229aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
123ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls	/* For passing data to ir-kbd-i2c */
124ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls	struct IR_i2c_init_data	ir_i2c_init_data;
125ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
1269aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* usb control transfer buffer and lock */
1279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct mutex		usbc_mutex;
1289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8			*usbc_buf;
1298423c0cf3a56cb83d09a84b5e2e37ca4c2920783Taylor Ralph	u8			fw_ver;
1309aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1319aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
132f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuilstatic inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev)
133f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuil{
134f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuil	return container_of(v4l2_dev, struct hdpvr_device, v4l2_dev);
135f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuil}
136f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuil
1379aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1389aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* buffer one bulk urb of data */
1399aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_buffer {
1409aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct list_head	buff_list;
1419aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1429aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct urb		*urb;
1439aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1449aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct hdpvr_device	*dev;
1459aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1469aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	uint			pos;
1479aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1489aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	__u8			status;
1499aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1509aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1519aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* */
1529aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1539aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_video_info {
1549aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u16	width;
1559aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u16	height;
1569aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	fps;
1575f454d82e5958e59c16580b9b4531f4bbc7231f7Hans Verkuil	bool	valid;
1589aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1599aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1609aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum {
1619aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_UNINITIALIZED	= 0,
1629aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_IDLE,
1639aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_STARTING,
1649aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_SHUTTING_DOWN,
1659aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_STREAMING,
1669aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_ERROR,
1679aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_DISCONNECTED,
1689aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1699aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1709aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum {
1719aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_FLAG_AC3_CAP = 1,
1729aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1739aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1749aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum {
1759aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	BUFSTAT_UNINITIALIZED = 0,
1769aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	BUFSTAT_AVAILABLE,
1779aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	BUFSTAT_INPROGRESS,
1789aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	BUFSTAT_READY,
1799aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1809aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1819aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_START_STREAMING_VALUE	0x0700
1829aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_STOP_STREAMING_VALUE	0x0800
1839aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_BITRATE_VALUE		0x1000
1849aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_BITRATE_MODE_VALUE		0x1200
1859aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_GOP_MODE_VALUE		0x1300
1869aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_VIDEO_INPUT_VALUE		0x1500
1879aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_VIDEO_STD_TYPE		0x1700
1889aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_AUDIO_INPUT_VALUE		0x2500
1899aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_BRIGHTNESS			0x2900
1909aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_CONTRAST			0x2a00
1919aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_HUE			0x2b00
1929aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_SATURATION			0x2c00
1939aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_SHARPNESS			0x2d00
1949aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_LOW_PASS_FILTER_VALUE	0x3100
1959aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1969aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_DEFAULT_INDEX		0x0003
1979aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1989aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1999aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 1000 0003 0004 4 = 0a00ca00
2009aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * BITRATE SETTING
2019aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   1st and 2nd byte (little endian): average bitrate in 100 000 bit/s
2029aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *                                     min: 1 mbit/s, max: 13.5 mbit/s
2039aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   3rd and 4th byte (little endian): peak bitrate in 100 000 bit/s
2049aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *                                     min: average + 100kbit/s,
2059aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *                                      max: 20.2 mbit/s
2069aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2079aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2089aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 1200 0003 0001 1 = 02
2099aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * BIT RATE MODE
2109aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *  constant = 1, variable (peak) = 2, variable (average) = 3
2119aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2129aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2139aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 1300 0003 0001 1 = 03
2149aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * GOP MODE (2 bit)
2159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *    low bit 0/1: advanced/simple GOP
2169aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   high bit 0/1: IDR(4/32/128) / no IDR (4/32/0)
2179aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2189aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2199aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 1700 0003 0001 1 = 00
2209aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * VIDEO STANDARD or FREQUNCY 0 = 60hz, 1 = 50hz
2219aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2229aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2239aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 3100 0003 0004 4 = 03030000
2249aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * FILTER CONTROL
2259aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   1st byte luma low pass filter strength,
2269aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   2nd byte chroma low pass filter strength,
2279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   3rd byte MF enable chroma, min=0, max=1
2289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   4th byte n
2299aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2309aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2319aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2329aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 b9 0001 0000 0000 0 */
2339aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2349aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2359aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2369aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* :0 s 38 d3 0000 0000 0001 1 = 00 */
2379aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 		ret = usb_control_msg(dev->udev, */
2389aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      usb_sndctrlpipe(dev->udev, 0), */
2399aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      0xd3, 0x38, */
2409aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      0, 0, */
2419aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      "\0", 1, */
2429aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      1000); */
2439aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2449aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 		info("control request returned %d", ret); */
2459aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 		msleep(5000); */
2469aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2479aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2489aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s b8 81 1400 0003 0005 5 <
2499aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * :0 0 5 = d0024002 19
2509aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * QUERY FRAME SIZE AND RATE
2519aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   1st and 2nd byte (little endian): horizontal resolution
2529aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   3rd and 4th byte (little endian): vertical resolution
2539aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   5th byte: frame rate
2549aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2559aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2569aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s b8 81 1800 0003 0003 3 <
2579aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * :0 0 3 = 030104
2589aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * QUERY SIGNAL AND DETECTED LINES, maybe INPUT
2599aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2609aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2619aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_video_std {
2629aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_60HZ = 0,
2639aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_50HZ,
2649aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2659aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2669aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_video_input {
2679aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_COMPONENT = 0,
2689aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_SVIDEO,
2699aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_COMPOSITE,
2709aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_VIDEO_INPUTS
2719aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2729aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2739aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_audio_inputs {
2749aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_RCA_BACK = 0,
2759aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_RCA_FRONT,
2769aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_SPDIF,
2779aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_AUDIO_INPUTS
2789aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2799aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2809aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_bitrate_mode {
2819aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_CONSTANT = 1,
2829aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_VARIABLE_PEAK,
2839aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_VARIABLE_AVERAGE,
2849aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2859aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2869aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_gop_mode {
2879aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_ADVANCED_IDR_GOP = 0,
2889aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_SIMPLE_IDR_GOP,
2899aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_ADVANCED_NOIDR_GOP,
2909aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_SIMPLE_NOIDR_GOP,
2919aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2929aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2939aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauvoid hdpvr_delete(struct hdpvr_device *dev);
2949aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2959aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*========================================================================*/
2969aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* hardware control functions */
2979aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_set_options(struct hdpvr_device *dev);
2989aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2999aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_set_bitrate(struct hdpvr_device *dev);
3009aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3019aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_set_audio(struct hdpvr_device *dev, u8 input,
3029aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		    enum v4l2_mpeg_audio_encoding codec);
3039aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3049aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_config_call(struct hdpvr_device *dev, uint value,
3059aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		      unsigned char valbuf);
3069aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3074d601c4ca272959ba837b8279f4873b55caaf619Leonid Kegulskiyint get_video_info(struct hdpvr_device *dev, struct hdpvr_video_info *vid_info);
3089aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3099aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* :0 s b8 81 1800 0003 0003 3 < */
3109aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* :0 0 3 = 0301ff */
3119aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint get_input_lines_info(struct hdpvr_device *dev);
3129aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3139aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3149aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*========================================================================*/
3159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* v4l2 registration */
316a50ab29185a9ec31e5a6999e53add0508653e889Janne Grunauint hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
317a50ab29185a9ec31e5a6999e53add0508653e889Janne Grunau			    int devnumber);
3189aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3199aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_cancel_queue(struct hdpvr_device *dev);
3209aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3219aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*========================================================================*/
3229aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* i2c adapter registration */
3239aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_register_i2c_adapter(struct hdpvr_device *dev);
3249aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3257f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilsonstruct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev);
3267f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilsonstruct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev);
327ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
3289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*========================================================================*/
3299aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* buffer management */
3309aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_free_buffers(struct hdpvr_device *dev);
3319aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count);
332