Commit 8423c0cf authored by Taylor Ralph's avatar Taylor Ralph Committed by Mauro Carvalho Chehab

[media] hdpvr: update picture controls to support firmware versions > 0.15

Correctly sets the max/min/default values for the hdpvr picture
controls. The reason the current values didn't cause a problem until now
is because any firmware <= 0.15 didn't support them. The latest firmware
releases properly support picture controls and the values in the patch
are derived from the windows driver using SniffUSB2.0.

Thanks to Devin Heitmueller for helping me.
Signed-off-by: default avatarTaylor Ralph <tralph@mythtv.org>
Thanks-to: Devin Heitmueller <dheitmueller@kernellabs.com>
Acked-by: default avatarJarod Wilson <jarod@redhat.com>
Reviewed-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 2e2ba5d1
...@@ -154,10 +154,20 @@ static int device_authorization(struct hdpvr_device *dev) ...@@ -154,10 +154,20 @@ static int device_authorization(struct hdpvr_device *dev)
} }
#endif #endif
dev->fw_ver = dev->usbc_buf[1];
v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n", v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n",
dev->usbc_buf[1], &dev->usbc_buf[2]); dev->fw_ver, &dev->usbc_buf[2]);
if (dev->fw_ver > 0x15) {
dev->options.brightness = 0x80;
dev->options.contrast = 0x40;
dev->options.hue = 0xf;
dev->options.saturation = 0x40;
dev->options.sharpness = 0x80;
}
switch (dev->usbc_buf[1]) { switch (dev->fw_ver) {
case HDPVR_FIRMWARE_VERSION: case HDPVR_FIRMWARE_VERSION:
dev->flags &= ~HDPVR_FLAG_AC3_CAP; dev->flags &= ~HDPVR_FLAG_AC3_CAP;
break; break;
...@@ -169,7 +179,7 @@ static int device_authorization(struct hdpvr_device *dev) ...@@ -169,7 +179,7 @@ static int device_authorization(struct hdpvr_device *dev)
default: default:
v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might" v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might"
" not work.\n"); " not work.\n");
if (dev->usbc_buf[1] >= HDPVR_FIRMWARE_VERSION_AC3) if (dev->fw_ver >= HDPVR_FIRMWARE_VERSION_AC3)
dev->flags |= HDPVR_FLAG_AC3_CAP; dev->flags |= HDPVR_FLAG_AC3_CAP;
else else
dev->flags &= ~HDPVR_FLAG_AC3_CAP; dev->flags &= ~HDPVR_FLAG_AC3_CAP;
...@@ -270,6 +280,8 @@ static const struct hdpvr_options hdpvr_default_options = { ...@@ -270,6 +280,8 @@ static const struct hdpvr_options hdpvr_default_options = {
.bitrate_mode = HDPVR_CONSTANT, .bitrate_mode = HDPVR_CONSTANT,
.gop_mode = HDPVR_SIMPLE_IDR_GOP, .gop_mode = HDPVR_SIMPLE_IDR_GOP,
.audio_codec = V4L2_MPEG_AUDIO_ENCODING_AAC, .audio_codec = V4L2_MPEG_AUDIO_ENCODING_AAC,
/* original picture controls for firmware version <= 0x15 */
/* updated in device_authorization() for newer firmware */
.brightness = 0x86, .brightness = 0x86,
.contrast = 0x80, .contrast = 0x80,
.hue = 0x80, .hue = 0x80,
......
...@@ -722,21 +722,39 @@ static const s32 supported_v4l2_ctrls[] = { ...@@ -722,21 +722,39 @@ static const s32 supported_v4l2_ctrls[] = {
}; };
static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc, static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc,
int ac3) int ac3, int fw_ver)
{ {
int err; int err;
if (fw_ver > 0x15) {
switch (qc->id) {
case V4L2_CID_BRIGHTNESS:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
case V4L2_CID_CONTRAST:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x40);
case V4L2_CID_SATURATION:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x40);
case V4L2_CID_HUE:
return v4l2_ctrl_query_fill(qc, 0x0, 0x1e, 1, 0xf);
case V4L2_CID_SHARPNESS:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
}
} else {
switch (qc->id) {
case V4L2_CID_BRIGHTNESS:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x86);
case V4L2_CID_CONTRAST:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
case V4L2_CID_SATURATION:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
case V4L2_CID_HUE:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
case V4L2_CID_SHARPNESS:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
}
}
switch (qc->id) { switch (qc->id) {
case V4L2_CID_BRIGHTNESS:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x86);
case V4L2_CID_CONTRAST:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
case V4L2_CID_SATURATION:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
case V4L2_CID_HUE:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
case V4L2_CID_SHARPNESS:
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
case V4L2_CID_MPEG_AUDIO_ENCODING: case V4L2_CID_MPEG_AUDIO_ENCODING:
return v4l2_ctrl_query_fill( return v4l2_ctrl_query_fill(
qc, V4L2_MPEG_AUDIO_ENCODING_AAC, qc, V4L2_MPEG_AUDIO_ENCODING_AAC,
...@@ -794,7 +812,8 @@ static int vidioc_queryctrl(struct file *file, void *private_data, ...@@ -794,7 +812,8 @@ static int vidioc_queryctrl(struct file *file, void *private_data,
if (qc->id == supported_v4l2_ctrls[i]) if (qc->id == supported_v4l2_ctrls[i])
return fill_queryctrl(&dev->options, qc, return fill_queryctrl(&dev->options, qc,
dev->flags & HDPVR_FLAG_AC3_CAP); dev->flags & HDPVR_FLAG_AC3_CAP,
dev->fw_ver);
if (qc->id < supported_v4l2_ctrls[i]) if (qc->id < supported_v4l2_ctrls[i])
break; break;
......
...@@ -113,6 +113,7 @@ struct hdpvr_device { ...@@ -113,6 +113,7 @@ struct hdpvr_device {
/* usb control transfer buffer and lock */ /* usb control transfer buffer and lock */
struct mutex usbc_mutex; struct mutex usbc_mutex;
u8 *usbc_buf; u8 *usbc_buf;
u8 fw_ver;
}; };
static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev) static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment