diff options
Diffstat (limited to 'src/af903x-tuner.c')
-rw-r--r-- | src/af903x-tuner.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/af903x-tuner.c b/src/af903x-tuner.c new file mode 100644 index 0000000..20b3a2a --- /dev/null +++ b/src/af903x-tuner.c @@ -0,0 +1,92 @@ +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/delay.h> +#include <linux/dvb/frontend.h> + +#include "dvb_frontend.h" +#include "af903x.h" + +#define IF2 36150 // IF2 frequency = 36.150 MHz +#define FREF 16000 // Quartz oscillator 16 MHz + +static int tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +{ + struct tuner_priv *priv=NULL; + DWORD dwError = Error_NO_ERROR; + DWORD freq = params->frequency ;// 1000; // Hz -> kHz + + priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0; + + deb_data("%s - freq : %d , bandwidth : %dn",__FUNCTION__, freq,priv->bandwidth); + + dwError =DL_Tuner_SetFreqBw(fe->dvb->num, freq,priv->bandwidth); + if (dwError) deb_data("tuner_set_params Fail !\n"); + + return 0; +} +static int tuner_get_frequency(struct dvb_frontend *fe, u32 *frequency) +{ + struct tuner_priv *priv = fe->tuner_priv; + *frequency = priv->frequency; + return 0; +} + +static int tuner_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) +{ + struct tuner_priv *priv = fe->tuner_priv; + *bandwidth = priv->bandwidth; + return 0; +} + +static int tuner_init(struct dvb_frontend *fe) +{ + + return 0; +} + +static int tuner_sleep(struct dvb_frontend *fe) +{ + return 0; +} + +static int tuner_release(struct dvb_frontend *fe) +{ + kfree(fe->tuner_priv); + fe->tuner_priv = NULL; + return 0; +} + +static const struct dvb_tuner_ops tuner_tuner_ops = { + .info = { + .name = "dvb_usb_tuner", + .frequency_min = 48000000, + .frequency_max = 860000000, + .frequency_step = 50000, + }, + + .release = tuner_release, + + .init = tuner_init, + .sleep = tuner_sleep, + + .set_params = tuner_set_params, + .get_frequency = tuner_get_frequency, + .get_bandwidth = tuner_get_bandwidth +}; + +/* This functions tries to identify a MT2060 tuner by reading the PART/REV register. This is hasty. */ +struct dvb_frontend * tuner_attach(struct dvb_frontend *fe) +{ + struct tuner_priv *priv = NULL; + + priv = kzalloc(sizeof(struct tuner_priv), GFP_KERNEL); + if (priv == NULL) + return NULL; + + memcpy(&fe->ops.tuner_ops, &tuner_tuner_ops, sizeof(struct dvb_tuner_ops)); + + fe->tuner_priv = priv; + + return fe; +} +EXPORT_SYMBOL(tuner_attach); |