mirror of
https://github.com/torvalds/linux.git
synced 2024-12-03 17:41:22 +00:00
[media] vivid: SDR cap: add control for FM deviation
Add user control to adjust generated FM deviation. Default it to 75kHz like public FM radio broadcast. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
parent
655e9780ab
commit
f335c3f229
@ -451,6 +451,7 @@ struct vivid_dev {
|
||||
unsigned sdr_buffersize;
|
||||
unsigned sdr_adc_freq;
|
||||
unsigned sdr_fm_freq;
|
||||
unsigned sdr_fm_deviation;
|
||||
int sdr_fixp_src_phase;
|
||||
int sdr_fixp_mod_phase;
|
||||
|
||||
|
@ -99,6 +99,7 @@
|
||||
|
||||
#define VIVID_CID_RADIO_TX_RDS_BLOCKIO (VIVID_CID_VIVID_BASE + 94)
|
||||
|
||||
#define VIVID_CID_SDR_CAP_FM_DEVIATION (VIVID_CID_VIVID_BASE + 110)
|
||||
|
||||
/* General User Controls */
|
||||
|
||||
@ -1257,6 +1258,36 @@ static const struct v4l2_ctrl_config vivid_ctrl_radio_tx_rds_blockio = {
|
||||
};
|
||||
|
||||
|
||||
/* SDR Capture Controls */
|
||||
|
||||
static int vivid_sdr_cap_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_sdr_cap);
|
||||
|
||||
switch (ctrl->id) {
|
||||
case VIVID_CID_SDR_CAP_FM_DEVIATION:
|
||||
dev->sdr_fm_deviation = ctrl->val;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct v4l2_ctrl_ops vivid_sdr_cap_ctrl_ops = {
|
||||
.s_ctrl = vivid_sdr_cap_s_ctrl,
|
||||
};
|
||||
|
||||
static const struct v4l2_ctrl_config vivid_ctrl_sdr_cap_fm_deviation = {
|
||||
.ops = &vivid_sdr_cap_ctrl_ops,
|
||||
.id = VIVID_CID_SDR_CAP_FM_DEVIATION,
|
||||
.name = "FM Deviation",
|
||||
.type = V4L2_CTRL_TYPE_INTEGER,
|
||||
.min = 100,
|
||||
.max = 200000,
|
||||
.def = 75000,
|
||||
.step = 1,
|
||||
};
|
||||
|
||||
|
||||
static const struct v4l2_ctrl_config vivid_ctrl_class = {
|
||||
.ops = &vivid_user_gen_ctrl_ops,
|
||||
.flags = V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_WRITE_ONLY,
|
||||
@ -1314,7 +1345,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
|
||||
v4l2_ctrl_new_custom(hdl_radio_rx, &vivid_ctrl_class, NULL);
|
||||
v4l2_ctrl_handler_init(hdl_radio_tx, 17);
|
||||
v4l2_ctrl_new_custom(hdl_radio_tx, &vivid_ctrl_class, NULL);
|
||||
v4l2_ctrl_handler_init(hdl_sdr_cap, 18);
|
||||
v4l2_ctrl_handler_init(hdl_sdr_cap, 19);
|
||||
v4l2_ctrl_new_custom(hdl_sdr_cap, &vivid_ctrl_class, NULL);
|
||||
|
||||
/* User Controls */
|
||||
@ -1545,6 +1576,10 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
|
||||
&vivid_radio_tx_ctrl_ops,
|
||||
V4L2_CID_RDS_TX_MUSIC_SPEECH, 0, 1, 1, 1);
|
||||
}
|
||||
if (dev->has_sdr_cap) {
|
||||
v4l2_ctrl_new_custom(hdl_sdr_cap,
|
||||
&vivid_ctrl_sdr_cap_fm_deviation, NULL);
|
||||
}
|
||||
if (hdl_user_gen->error)
|
||||
return hdl_user_gen->error;
|
||||
if (hdl_user_vid->error)
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/freezer.h>
|
||||
#include <linux/math64.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/v4l2-dv-timings.h>
|
||||
#include <media/v4l2-common.h>
|
||||
@ -488,12 +489,14 @@ int vidioc_try_fmt_sdr_cap(struct file *file, void *fh, struct v4l2_format *f)
|
||||
#define FIXP_N (15)
|
||||
#define FIXP_FRAC (1 << FIXP_N)
|
||||
#define FIXP_2PI ((int)(2 * 3.141592653589 * FIXP_FRAC))
|
||||
#define M_100000PI (3.14159 * 100000)
|
||||
|
||||
void vivid_sdr_cap_process(struct vivid_dev *dev, struct vivid_buffer *buf)
|
||||
{
|
||||
u8 *vbuf = vb2_plane_vaddr(&buf->vb, 0);
|
||||
unsigned long i;
|
||||
unsigned long plane_size = vb2_plane_size(&buf->vb, 0);
|
||||
s64 s64tmp;
|
||||
s32 src_phase_step;
|
||||
s32 mod_phase_step;
|
||||
s32 fixp_i;
|
||||
@ -515,7 +518,8 @@ void vivid_sdr_cap_process(struct vivid_dev *dev, struct vivid_buffer *buf)
|
||||
FIXP_2PI) >> (31 - FIXP_N);
|
||||
|
||||
dev->sdr_fixp_src_phase += src_phase_step;
|
||||
dev->sdr_fixp_mod_phase += mod_phase_step / 4;
|
||||
s64tmp = (s64) mod_phase_step * dev->sdr_fm_deviation;
|
||||
dev->sdr_fixp_mod_phase += div_s64(s64tmp, M_100000PI);
|
||||
|
||||
/*
|
||||
* Transfer phases to [0 / 2xPI] in order to avoid variable
|
||||
|
Loading…
Reference in New Issue
Block a user