[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: Taylor Ralph <tralph@mythtv.org> Thanks-to: Devin Heitmueller <dheitmueller@kernellabs.com> Acked-by: Jarod Wilson <jarod@redhat.com> Reviewed-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Родитель
2e2ba5d1e2
Коммит
8423c0cf3a
|
@ -154,10 +154,20 @@ static int device_authorization(struct hdpvr_device *dev)
|
|||
}
|
||||
#endif
|
||||
|
||||
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[1];
|
||||
|
||||
switch (dev->usbc_buf[1]) {
|
||||
v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n",
|
||||
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->fw_ver) {
|
||||
case HDPVR_FIRMWARE_VERSION:
|
||||
dev->flags &= ~HDPVR_FLAG_AC3_CAP;
|
||||
break;
|
||||
|
@ -169,7 +179,7 @@ static int device_authorization(struct hdpvr_device *dev)
|
|||
default:
|
||||
v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might"
|
||||
" 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;
|
||||
else
|
||||
dev->flags &= ~HDPVR_FLAG_AC3_CAP;
|
||||
|
@ -270,6 +280,8 @@ static const struct hdpvr_options hdpvr_default_options = {
|
|||
.bitrate_mode = HDPVR_CONSTANT,
|
||||
.gop_mode = HDPVR_SIMPLE_IDR_GOP,
|
||||
.audio_codec = V4L2_MPEG_AUDIO_ENCODING_AAC,
|
||||
/* original picture controls for firmware version <= 0x15 */
|
||||
/* updated in device_authorization() for newer firmware */
|
||||
.brightness = 0x86,
|
||||
.contrast = 0x80,
|
||||
.hue = 0x80,
|
||||
|
|
|
@ -722,21 +722,39 @@ static const s32 supported_v4l2_ctrls[] = {
|
|||
};
|
||||
|
||||
static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc,
|
||||
int ac3)
|
||||
int ac3, int fw_ver)
|
||||
{
|
||||
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) {
|
||||
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:
|
||||
return v4l2_ctrl_query_fill(
|
||||
qc, V4L2_MPEG_AUDIO_ENCODING_AAC,
|
||||
|
@ -794,7 +812,8 @@ static int vidioc_queryctrl(struct file *file, void *private_data,
|
|||
|
||||
if (qc->id == supported_v4l2_ctrls[i])
|
||||
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])
|
||||
break;
|
||||
|
|
|
@ -113,6 +113,7 @@ struct hdpvr_device {
|
|||
/* usb control transfer buffer and lock */
|
||||
struct mutex usbc_mutex;
|
||||
u8 *usbc_buf;
|
||||
u8 fw_ver;
|
||||
};
|
||||
|
||||
static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev)
|
||||
|
|
Загрузка…
Ссылка в новой задаче