*/
#include <linux/module.h>
-#include <linux/moduleparam.h>
#include <linux/init.h>
#include "dvb_frontend.h"
-#include "dvb_dummy_fe.h"
+static int sct = 0;
+
+
+/* depending on module parameter sct deliver different infos
+ */
+
+static struct dvb_frontend_info dvb_s_dummyfe_info = {
+ .name = "DVB-S dummy frontend",
+ .type = FE_QPSK,
+ .frequency_min = 950000,
+ .frequency_max = 2150000,
+ .frequency_stepsize = 250, /* kHz for QPSK frontends */
+ .frequency_tolerance = 29500,
+ .symbol_rate_min = 1000000,
+ .symbol_rate_max = 45000000,
+/* .symbol_rate_tolerance = ???,*/
+ .notifier_delay = 50, /* 1/20 s */
+ .caps = FE_CAN_INVERSION_AUTO |
+ FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+ FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
+ FE_CAN_QPSK
+};
+static struct dvb_frontend_info dvb_c_dummyfe_info = {
+ .name = "DVB-C dummy frontend",
+ .type = FE_QAM,
+ .frequency_stepsize = 62500,
+ .frequency_min = 51000000,
+ .frequency_max = 858000000,
+ .symbol_rate_min = (57840000/2)/64, /* SACLK/64 == (XIN/2)/64 */
+ .symbol_rate_max = (57840000/2)/4, /* SACLK/4 */
+#if 0
+ .frequency_tolerance = ???,
+ .symbol_rate_tolerance = ???, /* ppm */ /* == 8% (spec p. 5) */
+ .notifier_delay = ?,
+#endif
+ .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
+ FE_CAN_QAM_128 | FE_CAN_QAM_256 |
+ FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO
+};
-struct dvb_dummy_fe_state {
+static struct dvb_frontend_info dvb_t_dummyfe_info = {
+ .name = "DVB-T dummy frontend",
+ .type = FE_OFDM,
+ .frequency_min = 0,
+ .frequency_max = 863250000,
+ .frequency_stepsize = 62500,
+ /*.frequency_tolerance = */ /* FIXME: 12% of SR */
+ .symbol_rate_min = 0, /* FIXME */
+ .symbol_rate_max = 9360000, /* FIXME */
+ .symbol_rate_tolerance = 4000,
+ .notifier_delay = 0,
+ .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+ FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
+ FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
+ FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+ FE_CAN_TRANSMISSION_MODE_AUTO |
+ FE_CAN_GUARD_INTERVAL_AUTO |
+ FE_CAN_HIERARCHY_AUTO,
+};
- struct dvb_frontend_ops ops;
+struct dvb_frontend_info *frontend_info(void)
+{
+ switch(sct)
+ {
+ case 2:
+ return &dvb_t_dummyfe_info;
+ case 1:
+ return &dvb_c_dummyfe_info;
+ case 0:
+ default:
+ return &dvb_s_dummyfe_info;
+ }
+}
- struct dvb_frontend frontend;
-};
-static int dvb_dummy_fe_read_status(struct dvb_frontend* fe, fe_status_t* status)
+static int dvbdummyfe_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+ switch (cmd) {
+ case FE_GET_INFO:
+ memcpy (arg, frontend_info(),
+ sizeof(struct dvb_frontend_info));
+ break;
+
+ case FE_READ_STATUS:
{
+ fe_status_t *status = arg;
*status = FE_HAS_SIGNAL
| FE_HAS_CARRIER
| FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK;
-
- return 0;
+ break;
}
-static int dvb_dummy_fe_read_ber(struct dvb_frontend* fe, u32* ber)
+ case FE_READ_BER:
{
+ u32 *ber = (u32 *) arg;
*ber = 0;
- return 0;
+ break;
}
-static int dvb_dummy_fe_read_signal_strength(struct dvb_frontend* fe, u16* strength)
+ case FE_READ_SIGNAL_STRENGTH:
{
- *strength = 0;
- return 0;
+ u8 signal = 0xff;
+ *((u16*) arg) = (signal << 8) | signal;
+ break;
}
-static int dvb_dummy_fe_read_snr(struct dvb_frontend* fe, u16* snr)
+ case FE_READ_SNR:
{
- *snr = 0;
- return 0;
+ u8 snr = 0xf0;
+ *(u16*) arg = (snr << 8) | snr;
+ break;
}
-static int dvb_dummy_fe_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
-{
- *ucblocks = 0;
+ case FE_READ_UNCORRECTED_BLOCKS:
+ *(u32*) arg = 0;
+ break;
+
+ case FE_SET_FRONTEND:
+ break;
+
+ case FE_GET_FRONTEND:
+ break;
+
+ case FE_SLEEP:
return 0;
-}
-static int dvb_dummy_fe_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
-{
+ case FE_INIT:
return 0;
-}
-static int dvb_dummy_fe_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
-{
- return 0;
-}
+ case FE_SET_TONE:
+ return -EOPNOTSUPP;
-static int dvb_dummy_fe_sleep(struct dvb_frontend* fe)
-{
+ case FE_SET_VOLTAGE:
return 0;
-}
-static int dvb_dummy_fe_init(struct dvb_frontend* fe)
-{
- return 0;
+ default:
+ return -EOPNOTSUPP;
}
-
-static int dvb_dummy_fe_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
-{
return 0;
}
-static int dvb_dummy_fe_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
-{
- return 0;
-}
-static void dvb_dummy_fe_release(struct dvb_frontend* fe)
+static int dvbdummyfe_attach (struct dvb_i2c_bus *i2c, void **data)
{
- struct dvb_dummy_fe_state* state = (struct dvb_dummy_fe_state*) fe->demodulator_priv;
- kfree(state);
+ return dvb_register_frontend (dvbdummyfe_ioctl, i2c, NULL, frontend_info());
}
-static struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops;
-struct dvb_frontend* dvb_dummy_fe_ofdm_attach(void)
+static void dvbdummyfe_detach (struct dvb_i2c_bus *i2c, void *data)
{
- struct dvb_dummy_fe_state* state = NULL;
-
- /* allocate memory for the internal state */
- state = (struct dvb_dummy_fe_state*) kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
- if (state == NULL) goto error;
-
- /* setup the state */
- memcpy(&state->ops, &dvb_dummy_fe_ofdm_ops, sizeof(struct dvb_frontend_ops));
-
- /* create dvb_frontend */
- state->frontend.ops = &state->ops;
- state->frontend.demodulator_priv = state;
- return &state->frontend;
-
-error:
- if (state) kfree(state);
- return NULL;
+ dvb_unregister_frontend (dvbdummyfe_ioctl, i2c);
}
-static struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops;
-struct dvb_frontend* dvb_dummy_fe_qpsk_attach()
+static int __init init_dvbdummyfe (void)
{
- struct dvb_dummy_fe_state* state = NULL;
-
- /* allocate memory for the internal state */
- state = (struct dvb_dummy_fe_state*) kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
- if (state == NULL) goto error;
-
- /* setup the state */
- memcpy(&state->ops, &dvb_dummy_fe_qpsk_ops, sizeof(struct dvb_frontend_ops));
-
- /* create dvb_frontend */
- state->frontend.ops = &state->ops;
- state->frontend.demodulator_priv = state;
- return &state->frontend;
-
-error:
- if (state) kfree(state);
- return NULL;
+ return dvb_register_i2c_device (THIS_MODULE,
+ dvbdummyfe_attach,
+ dvbdummyfe_detach);
}
-static struct dvb_frontend_ops dvb_dummy_fe_qam_ops;
-struct dvb_frontend* dvb_dummy_fe_qam_attach()
+static void __exit exit_dvbdummyfe (void)
{
- struct dvb_dummy_fe_state* state = NULL;
-
- /* allocate memory for the internal state */
- state = (struct dvb_dummy_fe_state*) kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
- if (state == NULL) goto error;
-
- /* setup the state */
- memcpy(&state->ops, &dvb_dummy_fe_qam_ops, sizeof(struct dvb_frontend_ops));
-
- /* create dvb_frontend */
- state->frontend.ops = &state->ops;
- state->frontend.demodulator_priv = state;
- return &state->frontend;
-
-error:
- if (state) kfree(state);
- return NULL;
+ dvb_unregister_i2c_device (dvbdummyfe_attach);
}
-static struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops = {
-
- .info = {
- .name = "Dummy DVB-T",
- .type = FE_OFDM,
- .frequency_min = 0,
- .frequency_max = 863250000,
- .frequency_stepsize = 62500,
- .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
- FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
- FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
- FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
- FE_CAN_TRANSMISSION_MODE_AUTO |
- FE_CAN_GUARD_INTERVAL_AUTO |
- FE_CAN_HIERARCHY_AUTO,
- },
-
- .release = dvb_dummy_fe_release,
-
- .init = dvb_dummy_fe_init,
- .sleep = dvb_dummy_fe_sleep,
-
- .set_frontend = dvb_dummy_fe_set_frontend,
- .get_frontend = dvb_dummy_fe_get_frontend,
-
- .read_status = dvb_dummy_fe_read_status,
- .read_ber = dvb_dummy_fe_read_ber,
- .read_signal_strength = dvb_dummy_fe_read_signal_strength,
- .read_snr = dvb_dummy_fe_read_snr,
- .read_ucblocks = dvb_dummy_fe_read_ucblocks,
-};
-static struct dvb_frontend_ops dvb_dummy_fe_qam_ops = {
-
- .info = {
- .name = "Dummy DVB-C",
- .type = FE_QAM,
- .frequency_stepsize = 62500,
- .frequency_min = 51000000,
- .frequency_max = 858000000,
- .symbol_rate_min = (57840000/2)/64, /* SACLK/64 == (XIN/2)/64 */
- .symbol_rate_max = (57840000/2)/4, /* SACLK/4 */
- .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
- FE_CAN_QAM_128 | FE_CAN_QAM_256 |
- FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO
- },
-
- .release = dvb_dummy_fe_release,
-
- .init = dvb_dummy_fe_init,
- .sleep = dvb_dummy_fe_sleep,
-
- .set_frontend = dvb_dummy_fe_set_frontend,
- .get_frontend = dvb_dummy_fe_get_frontend,
-
- .read_status = dvb_dummy_fe_read_status,
- .read_ber = dvb_dummy_fe_read_ber,
- .read_signal_strength = dvb_dummy_fe_read_signal_strength,
- .read_snr = dvb_dummy_fe_read_snr,
- .read_ucblocks = dvb_dummy_fe_read_ucblocks,
-};
+module_init(init_dvbdummyfe);
+module_exit(exit_dvbdummyfe);
-static struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops = {
-
- .info = {
- .name = "Dummy DVB-S",
- .type = FE_QPSK,
- .frequency_min = 950000,
- .frequency_max = 2150000,
- .frequency_stepsize = 250, /* kHz for QPSK frontends */
- .frequency_tolerance = 29500,
- .symbol_rate_min = 1000000,
- .symbol_rate_max = 45000000,
- .caps = FE_CAN_INVERSION_AUTO |
- FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
- FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
- FE_CAN_QPSK
- },
-
- .release = dvb_dummy_fe_release,
-
- .init = dvb_dummy_fe_init,
- .sleep = dvb_dummy_fe_sleep,
-
- .set_frontend = dvb_dummy_fe_set_frontend,
- .get_frontend = dvb_dummy_fe_get_frontend,
-
- .read_status = dvb_dummy_fe_read_status,
- .read_ber = dvb_dummy_fe_read_ber,
- .read_signal_strength = dvb_dummy_fe_read_signal_strength,
- .read_snr = dvb_dummy_fe_read_snr,
- .read_ucblocks = dvb_dummy_fe_read_ucblocks,
-
- .set_voltage = dvb_dummy_fe_set_voltage,
- .set_tone = dvb_dummy_fe_set_tone,
-};
MODULE_DESCRIPTION("DVB DUMMY Frontend");
MODULE_AUTHOR("Emard");
MODULE_LICENSE("GPL");
-
-EXPORT_SYMBOL(dvb_dummy_fe_ofdm_attach);
-EXPORT_SYMBOL(dvb_dummy_fe_qam_attach);
-EXPORT_SYMBOL(dvb_dummy_fe_qpsk_attach);
+MODULE_PARM(sct, "i");