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