Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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