0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/init.h>
0010 #include <linux/string.h>
0011 #include <linux/slab.h>
0012
0013 #include <media/dvb_frontend.h>
0014 #include "dvb_dummy_fe.h"
0015
0016
0017 struct dvb_dummy_fe_state {
0018 struct dvb_frontend frontend;
0019 };
0020
0021
0022 static int dvb_dummy_fe_read_status(struct dvb_frontend *fe,
0023 enum fe_status *status)
0024 {
0025 *status = FE_HAS_SIGNAL
0026 | FE_HAS_CARRIER
0027 | FE_HAS_VITERBI
0028 | FE_HAS_SYNC
0029 | FE_HAS_LOCK;
0030
0031 return 0;
0032 }
0033
0034 static int dvb_dummy_fe_read_ber(struct dvb_frontend *fe, u32 *ber)
0035 {
0036 *ber = 0;
0037 return 0;
0038 }
0039
0040 static int dvb_dummy_fe_read_signal_strength(struct dvb_frontend *fe,
0041 u16 *strength)
0042 {
0043 *strength = 0;
0044 return 0;
0045 }
0046
0047 static int dvb_dummy_fe_read_snr(struct dvb_frontend *fe, u16 *snr)
0048 {
0049 *snr = 0;
0050 return 0;
0051 }
0052
0053 static int dvb_dummy_fe_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
0054 {
0055 *ucblocks = 0;
0056 return 0;
0057 }
0058
0059
0060
0061
0062
0063
0064 static int dvb_dummy_fe_get_frontend(struct dvb_frontend *fe,
0065 struct dtv_frontend_properties *p)
0066 {
0067 return 0;
0068 }
0069
0070 static int dvb_dummy_fe_set_frontend(struct dvb_frontend *fe)
0071 {
0072 if (fe->ops.tuner_ops.set_params) {
0073 fe->ops.tuner_ops.set_params(fe);
0074 if (fe->ops.i2c_gate_ctrl)
0075 fe->ops.i2c_gate_ctrl(fe, 0);
0076 }
0077
0078 return 0;
0079 }
0080
0081 static int dvb_dummy_fe_sleep(struct dvb_frontend *fe)
0082 {
0083 return 0;
0084 }
0085
0086 static int dvb_dummy_fe_init(struct dvb_frontend *fe)
0087 {
0088 return 0;
0089 }
0090
0091 static int dvb_dummy_fe_set_tone(struct dvb_frontend *fe,
0092 enum fe_sec_tone_mode tone)
0093 {
0094 return 0;
0095 }
0096
0097 static int dvb_dummy_fe_set_voltage(struct dvb_frontend *fe,
0098 enum fe_sec_voltage voltage)
0099 {
0100 return 0;
0101 }
0102
0103 static void dvb_dummy_fe_release(struct dvb_frontend *fe)
0104 {
0105 struct dvb_dummy_fe_state *state = fe->demodulator_priv;
0106
0107 kfree(state);
0108 }
0109
0110 static const struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops;
0111
0112 struct dvb_frontend *dvb_dummy_fe_ofdm_attach(void)
0113 {
0114 struct dvb_dummy_fe_state *state = NULL;
0115
0116
0117 state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
0118 if (!state)
0119 return NULL;
0120
0121
0122 memcpy(&state->frontend.ops,
0123 &dvb_dummy_fe_ofdm_ops,
0124 sizeof(struct dvb_frontend_ops));
0125
0126 state->frontend.demodulator_priv = state;
0127 return &state->frontend;
0128 }
0129 EXPORT_SYMBOL(dvb_dummy_fe_ofdm_attach);
0130
0131 static const struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops;
0132
0133 struct dvb_frontend *dvb_dummy_fe_qpsk_attach(void)
0134 {
0135 struct dvb_dummy_fe_state *state = NULL;
0136
0137
0138 state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
0139 if (!state)
0140 return NULL;
0141
0142
0143 memcpy(&state->frontend.ops,
0144 &dvb_dummy_fe_qpsk_ops,
0145 sizeof(struct dvb_frontend_ops));
0146
0147 state->frontend.demodulator_priv = state;
0148 return &state->frontend;
0149 }
0150 EXPORT_SYMBOL(dvb_dummy_fe_qpsk_attach);
0151
0152 static const struct dvb_frontend_ops dvb_dummy_fe_qam_ops;
0153
0154 struct dvb_frontend *dvb_dummy_fe_qam_attach(void)
0155 {
0156 struct dvb_dummy_fe_state *state = NULL;
0157
0158
0159 state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
0160 if (!state)
0161 return NULL;
0162
0163
0164 memcpy(&state->frontend.ops,
0165 &dvb_dummy_fe_qam_ops,
0166 sizeof(struct dvb_frontend_ops));
0167
0168 state->frontend.demodulator_priv = state;
0169 return &state->frontend;
0170 }
0171 EXPORT_SYMBOL(dvb_dummy_fe_qam_attach);
0172
0173 static const struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops = {
0174 .delsys = { SYS_DVBT },
0175 .info = {
0176 .name = "Dummy DVB-T",
0177 .frequency_min_hz = 0,
0178 .frequency_max_hz = 863250 * kHz,
0179 .frequency_stepsize_hz = 62500,
0180 .caps = FE_CAN_FEC_1_2 |
0181 FE_CAN_FEC_2_3 |
0182 FE_CAN_FEC_3_4 |
0183 FE_CAN_FEC_4_5 |
0184 FE_CAN_FEC_5_6 |
0185 FE_CAN_FEC_6_7 |
0186 FE_CAN_FEC_7_8 |
0187 FE_CAN_FEC_8_9 |
0188 FE_CAN_FEC_AUTO |
0189 FE_CAN_QAM_16 |
0190 FE_CAN_QAM_64 |
0191 FE_CAN_QAM_AUTO |
0192 FE_CAN_TRANSMISSION_MODE_AUTO |
0193 FE_CAN_GUARD_INTERVAL_AUTO |
0194 FE_CAN_HIERARCHY_AUTO,
0195 },
0196
0197 .release = dvb_dummy_fe_release,
0198
0199 .init = dvb_dummy_fe_init,
0200 .sleep = dvb_dummy_fe_sleep,
0201
0202 .set_frontend = dvb_dummy_fe_set_frontend,
0203 .get_frontend = dvb_dummy_fe_get_frontend,
0204
0205 .read_status = dvb_dummy_fe_read_status,
0206 .read_ber = dvb_dummy_fe_read_ber,
0207 .read_signal_strength = dvb_dummy_fe_read_signal_strength,
0208 .read_snr = dvb_dummy_fe_read_snr,
0209 .read_ucblocks = dvb_dummy_fe_read_ucblocks,
0210 };
0211
0212 static const struct dvb_frontend_ops dvb_dummy_fe_qam_ops = {
0213 .delsys = { SYS_DVBC_ANNEX_A },
0214 .info = {
0215 .name = "Dummy DVB-C",
0216 .frequency_min_hz = 51 * MHz,
0217 .frequency_max_hz = 858 * MHz,
0218 .frequency_stepsize_hz = 62500,
0219
0220 .symbol_rate_min = (57840000 / 2) / 64,
0221 .symbol_rate_max = (57840000 / 2) / 4,
0222 .caps = FE_CAN_QAM_16 |
0223 FE_CAN_QAM_32 |
0224 FE_CAN_QAM_64 |
0225 FE_CAN_QAM_128 |
0226 FE_CAN_QAM_256 |
0227 FE_CAN_FEC_AUTO |
0228 FE_CAN_INVERSION_AUTO
0229 },
0230
0231 .release = dvb_dummy_fe_release,
0232
0233 .init = dvb_dummy_fe_init,
0234 .sleep = dvb_dummy_fe_sleep,
0235
0236 .set_frontend = dvb_dummy_fe_set_frontend,
0237 .get_frontend = dvb_dummy_fe_get_frontend,
0238
0239 .read_status = dvb_dummy_fe_read_status,
0240 .read_ber = dvb_dummy_fe_read_ber,
0241 .read_signal_strength = dvb_dummy_fe_read_signal_strength,
0242 .read_snr = dvb_dummy_fe_read_snr,
0243 .read_ucblocks = dvb_dummy_fe_read_ucblocks,
0244 };
0245
0246 static const struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops = {
0247 .delsys = { SYS_DVBS },
0248 .info = {
0249 .name = "Dummy DVB-S",
0250 .frequency_min_hz = 950 * MHz,
0251 .frequency_max_hz = 2150 * MHz,
0252 .frequency_stepsize_hz = 250 * kHz,
0253 .frequency_tolerance_hz = 29500 * kHz,
0254 .symbol_rate_min = 1000000,
0255 .symbol_rate_max = 45000000,
0256 .caps = FE_CAN_INVERSION_AUTO |
0257 FE_CAN_FEC_1_2 |
0258 FE_CAN_FEC_2_3 |
0259 FE_CAN_FEC_3_4 |
0260 FE_CAN_FEC_5_6 |
0261 FE_CAN_FEC_7_8 |
0262 FE_CAN_FEC_AUTO |
0263 FE_CAN_QPSK
0264 },
0265
0266 .release = dvb_dummy_fe_release,
0267
0268 .init = dvb_dummy_fe_init,
0269 .sleep = dvb_dummy_fe_sleep,
0270
0271 .set_frontend = dvb_dummy_fe_set_frontend,
0272 .get_frontend = dvb_dummy_fe_get_frontend,
0273
0274 .read_status = dvb_dummy_fe_read_status,
0275 .read_ber = dvb_dummy_fe_read_ber,
0276 .read_signal_strength = dvb_dummy_fe_read_signal_strength,
0277 .read_snr = dvb_dummy_fe_read_snr,
0278 .read_ucblocks = dvb_dummy_fe_read_ucblocks,
0279
0280 .set_voltage = dvb_dummy_fe_set_voltage,
0281 .set_tone = dvb_dummy_fe_set_tone,
0282 };
0283
0284 MODULE_DESCRIPTION("DVB DUMMY Frontend");
0285 MODULE_AUTHOR("Emard");
0286 MODULE_LICENSE("GPL");