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>
19ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls#include <media/ir-kbd-i2c.h>
2006630aec92d6a71658ac1538e2a65af5cfc5f2afJanne Grunau
219aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HDPVR_MAX 8
22559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson#define HDPVR_I2C_MAX_SIZE 128
239aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
249aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* Define these values to match your devices */
259aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HD_PVR_VENDOR_ID	0x2040
269aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HD_PVR_PRODUCT_ID	0x4900
279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HD_PVR_PRODUCT_ID1	0x4901
289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define HD_PVR_PRODUCT_ID2	0x4902
29e902a68b06e145ddd0bb5228739fdae606d851a1Janne Grunau#define HD_PVR_PRODUCT_ID4	0x4903
30c22425ffa10792e2e8aba321dded98a5867d2a86Janne Grunau#define HD_PVR_PRODUCT_ID3	0x4982
319aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
329aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define UNSET    (-1U)
339aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
349aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define NUM_BUFFERS 64
359aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3635b53664d5d0331c8ec2ef44e74eaf4d18f00c06Janne Grunau#define HDPVR_FIRMWARE_VERSION		0x08
3735b53664d5d0331c8ec2ef44e74eaf4d18f00c06Janne Grunau#define HDPVR_FIRMWARE_VERSION_AC3	0x0d
3835b53664d5d0331c8ec2ef44e74eaf4d18f00c06Janne Grunau#define HDPVR_FIRMWARE_VERSION_0X12	0x12
3935b53664d5d0331c8ec2ef44e74eaf4d18f00c06Janne Grunau#define HDPVR_FIRMWARE_VERSION_0X15	0x15
409aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
419aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* #define HDPVR_DEBUG */
429aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
439aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauextern int hdpvr_debug;
449aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
459aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define MSG_INFO	1
469aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define MSG_BUFFER	2
479aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
489aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_options {
499aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	video_std;
509aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	video_input;
519aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	audio_input;
529aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	bitrate;	/* in 100kbps */
539aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	peak_bitrate;	/* in 100kbps */
549aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	bitrate_mode;
559aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	gop_mode;
569aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	enum v4l2_mpeg_audio_encoding	audio_codec;
579aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	brightness;
589aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	contrast;
599aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	hue;
609aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	saturation;
619aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	sharpness;
629aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
639aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
649aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* Structure to hold all of our device specific stuff */
659aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_device {
669aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* the v4l device for this device */
679aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct video_device	*video_dev;
689aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* the usb device for this device */
699aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct usb_device	*udev;
7006630aec92d6a71658ac1538e2a65af5cfc5f2afJanne Grunau	/* v4l2-device unused */
7106630aec92d6a71658ac1538e2a65af5cfc5f2afJanne Grunau	struct v4l2_device	v4l2_dev;
729aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
739aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* the max packet size of the bulk endpoint */
749aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	size_t			bulk_in_size;
759aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* the address of the bulk in endpoint */
769aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	__u8			bulk_in_endpointAddr;
779aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
789aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* holds the current device status */
799aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	__u8			status;
809aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* count the number of openers */
819aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	uint			open_count;
829aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
839aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* holds the cureent set options */
849aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct hdpvr_options	options;
859aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
869aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	uint			flags;
879aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
889aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* synchronize I/O */
899aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct mutex		io_mutex;
909aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* available buffers */
919aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct list_head	free_buff_list;
929aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* in progress buffers */
939aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct list_head	rec_buff_list;
949aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* waitqueue for buffers */
959aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	wait_queue_head_t	wait_buffer;
969aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* waitqueue for data */
979aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	wait_queue_head_t	wait_data;
989aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/**/
999aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct workqueue_struct	*workqueue;
1009aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/**/
1019aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct work_struct	worker;
1029aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1039aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* I2C adapter */
104324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	struct i2c_adapter	i2c_adapter;
1059aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* I2C lock */
1069aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct mutex		i2c_mutex;
107559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson	/* I2C message buffer space */
108559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson	char			i2c_buf[HDPVR_I2C_MAX_SIZE];
1099aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
110ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls	/* For passing data to ir-kbd-i2c */
111ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls	struct IR_i2c_init_data	ir_i2c_init_data;
112ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
1139aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* usb control transfer buffer and lock */
1149aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct mutex		usbc_mutex;
1159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8			*usbc_buf;
116fda27874de91d5a8b9a018b3bc74b14578994908Taylor Ralph	u8			fw_ver;
1179aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1189aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
119f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuilstatic inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev)
120f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuil{
121f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuil	return container_of(v4l2_dev, struct hdpvr_device, v4l2_dev);
122f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuil}
123f2b305cd6711b7b3ce30db93b50bc5d6312950c8Hans Verkuil
1249aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1259aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* buffer one bulk urb of data */
1269aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_buffer {
1279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct list_head	buff_list;
1289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1299aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct urb		*urb;
1309aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1319aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct hdpvr_device	*dev;
1329aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1339aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	uint			pos;
1349aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1359aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	__u8			status;
1369aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1379aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1389aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* */
1399aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1409aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_video_info {
1419aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u16	width;
1429aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u16	height;
1439aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	u8	fps;
1449aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1459aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1469aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum {
1479aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_UNINITIALIZED	= 0,
1489aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_IDLE,
1499aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_STARTING,
1509aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_SHUTTING_DOWN,
1519aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_STREAMING,
1529aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_ERROR,
1539aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	STATUS_DISCONNECTED,
1549aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1559aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1569aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum {
1579aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_FLAG_AC3_CAP = 1,
1589aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1599aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1609aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum {
1619aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	BUFSTAT_UNINITIALIZED = 0,
1629aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	BUFSTAT_AVAILABLE,
1639aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	BUFSTAT_INPROGRESS,
1649aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	BUFSTAT_READY,
1659aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1669aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1679aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_START_STREAMING_VALUE	0x0700
1689aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_STOP_STREAMING_VALUE	0x0800
1699aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_BITRATE_VALUE		0x1000
1709aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_BITRATE_MODE_VALUE		0x1200
1719aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_GOP_MODE_VALUE		0x1300
1729aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_VIDEO_INPUT_VALUE		0x1500
1739aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_VIDEO_STD_TYPE		0x1700
1749aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_AUDIO_INPUT_VALUE		0x2500
1759aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_BRIGHTNESS			0x2900
1769aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_CONTRAST			0x2a00
1779aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_HUE			0x2b00
1789aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_SATURATION			0x2c00
1799aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_SHARPNESS			0x2d00
1809aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_LOW_PASS_FILTER_VALUE	0x3100
1819aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1829aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_DEFAULT_INDEX		0x0003
1839aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1849aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1859aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 1000 0003 0004 4 = 0a00ca00
1869aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * BITRATE SETTING
1879aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   1st and 2nd byte (little endian): average bitrate in 100 000 bit/s
1889aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *                                     min: 1 mbit/s, max: 13.5 mbit/s
1899aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   3rd and 4th byte (little endian): peak bitrate in 100 000 bit/s
1909aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *                                     min: average + 100kbit/s,
1919aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *                                      max: 20.2 mbit/s
1929aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
1939aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1949aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 1200 0003 0001 1 = 02
1959aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * BIT RATE MODE
1969aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *  constant = 1, variable (peak) = 2, variable (average) = 3
1979aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
1989aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1999aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 1300 0003 0001 1 = 03
2009aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * GOP MODE (2 bit)
2019aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *    low bit 0/1: advanced/simple GOP
2029aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   high bit 0/1: IDR(4/32/128) / no IDR (4/32/0)
2039aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2049aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2059aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 1700 0003 0001 1 = 00
2069aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * VIDEO STANDARD or FREQUNCY 0 = 60hz, 1 = 50hz
2079aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2089aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2099aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 01 3100 0003 0004 4 = 03030000
2109aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * FILTER CONTROL
2119aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   1st byte luma low pass filter strength,
2129aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   2nd byte chroma low pass filter strength,
2139aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   3rd byte MF enable chroma, min=0, max=1
2149aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   4th byte n
2159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2169aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2179aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2189aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s 38 b9 0001 0000 0000 0 */
2199aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2209aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2219aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2229aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* :0 s 38 d3 0000 0000 0001 1 = 00 */
2239aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 		ret = usb_control_msg(dev->udev, */
2249aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      usb_sndctrlpipe(dev->udev, 0), */
2259aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      0xd3, 0x38, */
2269aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      0, 0, */
2279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      "\0", 1, */
2289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 				      1000); */
2299aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2309aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 		info("control request returned %d", ret); */
2319aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* 		msleep(5000); */
2329aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2339aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2349aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s b8 81 1400 0003 0005 5 <
2359aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * :0 0 5 = d0024002 19
2369aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * QUERY FRAME SIZE AND RATE
2379aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   1st and 2nd byte (little endian): horizontal resolution
2389aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   3rd and 4th byte (little endian): vertical resolution
2399aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 *   5th byte: frame rate
2409aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2419aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2429aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	/* :0 s b8 81 1800 0003 0003 3 <
2439aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * :0 0 3 = 030104
2449aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 * QUERY SIGNAL AND DETECTED LINES, maybe INPUT
2459aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	 */
2469aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2479aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_video_std {
2489aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_60HZ = 0,
2499aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_50HZ,
2509aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2519aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2529aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_video_input {
2539aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_COMPONENT = 0,
2549aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_SVIDEO,
2559aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_COMPOSITE,
2569aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_VIDEO_INPUTS
2579aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2589aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2599aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_audio_inputs {
2609aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_RCA_BACK = 0,
2619aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_RCA_FRONT,
2629aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_SPDIF,
2639aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_AUDIO_INPUTS
2649aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2659aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2669aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_bitrate_mode {
2679aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_CONSTANT = 1,
2689aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_VARIABLE_PEAK,
2699aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_VARIABLE_AVERAGE,
2709aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2719aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2729aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauenum hdpvr_gop_mode {
2739aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_ADVANCED_IDR_GOP = 0,
2749aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_SIMPLE_IDR_GOP,
2759aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_ADVANCED_NOIDR_GOP,
2769aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	HDPVR_SIMPLE_NOIDR_GOP,
2779aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
2789aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2799aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauvoid hdpvr_delete(struct hdpvr_device *dev);
2809aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2819aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*========================================================================*/
2829aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* hardware control functions */
2839aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_set_options(struct hdpvr_device *dev);
2849aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2859aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_set_bitrate(struct hdpvr_device *dev);
2869aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2879aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_set_audio(struct hdpvr_device *dev, u8 input,
2889aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		    enum v4l2_mpeg_audio_encoding codec);
2899aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2909aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_config_call(struct hdpvr_device *dev, uint value,
2919aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		      unsigned char valbuf);
2929aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2939aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustruct hdpvr_video_info *get_video_info(struct hdpvr_device *dev);
2949aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2959aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* :0 s b8 81 1800 0003 0003 3 < */
2969aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* :0 0 3 = 0301ff */
2979aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint get_input_lines_info(struct hdpvr_device *dev);
2989aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2999aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3009aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*========================================================================*/
3019aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* v4l2 registration */
302a50ab29185a9ec31e5a6999e53add0508653e889Janne Grunauint hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
303a50ab29185a9ec31e5a6999e53add0508653e889Janne Grunau			    int devnumber);
3049aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3059aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_cancel_queue(struct hdpvr_device *dev);
3069aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3079aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*========================================================================*/
3089aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* i2c adapter registration */
3099aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_register_i2c_adapter(struct hdpvr_device *dev);
3109aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
3117f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilsonstruct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev);
3127f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilsonstruct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev);
313ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
3149aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*========================================================================*/
3159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/* buffer management */
3169aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_free_buffers(struct hdpvr_device *dev);
3179aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count);
318