1019
static int ds3000_tune(struct dvb_frontend *fe,
951
static int ds3000_set_carrier_offset(struct dvb_frontend *fe,
952
s32 carrier_offset_khz)
954
struct ds3000_state *state = fe->demodulator_priv;
957
tmp = carrier_offset_khz;
959
tmp = (2 * tmp + DS3000_SAMPLE_RATE) / (2 * DS3000_SAMPLE_RATE);
964
ds3000_writereg(state, 0x5f, tmp >> 8);
965
ds3000_writereg(state, 0x5e, tmp & 0xff);
970
static int ds3000_set_frontend(struct dvb_frontend *fe,
1020
971
struct dvb_frontend_parameters *p)
1022
973
struct ds3000_state *state = fe->demodulator_priv;
1023
974
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1025
int ret = 0, retune, i;
1026
u8 status, mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf;
978
u8 mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf, div4;
1027
980
u16 value, ndiv;
1030
983
dprintk("%s() ", __func__);
1032
/* Load the firmware if required */
1033
ret = ds3000_firmware_ondemand(fe);
1035
printk(KERN_ERR "%s: Unable initialise the firmware\n",
1040
state->dnxt.delivery = c->modulation;
1041
state->dnxt.frequency = c->frequency;
1042
state->dnxt.rolloff = 2; /* fixme */
1043
state->dnxt.fec = c->fec_inner;
1045
ret = ds3000_set_inversion(state, p->inversion);
1049
ret = ds3000_set_symbolrate(state, c->symbol_rate);
1053
/* discard the 'current' tuning parameters and prepare to tune */
1054
ds3000_clone_params(fe);
1056
retune = 1; /* try 1 times */
1057
dprintk("%s: retune = %d\n", __func__, retune);
1058
dprintk("%s: frequency = %d\n", __func__, state->dcur.frequency);
1059
dprintk("%s: symbol_rate = %d\n", __func__, state->dcur.symbol_rate);
1060
dprintk("%s: FEC = %d \n", __func__,
1062
dprintk("%s: Inversion = %d\n", __func__, state->dcur.inversion);
1065
/* Reset status register */
1069
ds3000_tuner_writereg(state, 0x42, 0x73);
1070
ds3000_tuner_writereg(state, 0x05, 0x01);
1071
ds3000_tuner_writereg(state, 0x62, 0xf5);
1073
ds3000_tuner_writereg(state, 0x07, 0x02);
1074
ds3000_tuner_writereg(state, 0x10, 0x00);
1075
ds3000_tuner_writereg(state, 0x60, 0x79);
1076
ds3000_tuner_writereg(state, 0x08, 0x01);
1077
ds3000_tuner_writereg(state, 0x00, 0x01);
1078
/* calculate and set freq divider */
1079
if (state->dcur.frequency < 1146000) {
1080
ds3000_tuner_writereg(state, 0x10, 0x11);
1081
ndiv = ((state->dcur.frequency * (6 + 8) * 4) +
1082
(DS3000_XTAL_FREQ / 2)) /
1083
DS3000_XTAL_FREQ - 1024;
1085
ds3000_tuner_writereg(state, 0x10, 0x01);
1086
ndiv = ((state->dcur.frequency * (6 + 8) * 2) +
1087
(DS3000_XTAL_FREQ / 2)) /
1088
DS3000_XTAL_FREQ - 1024;
1091
ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8);
1092
ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff);
1095
ds3000_tuner_writereg(state, 0x03, 0x06);
1096
ds3000_tuner_writereg(state, 0x51, 0x0f);
1097
ds3000_tuner_writereg(state, 0x51, 0x1f);
1098
ds3000_tuner_writereg(state, 0x50, 0x10);
1099
ds3000_tuner_writereg(state, 0x50, 0x00);
1103
ds3000_tuner_writereg(state, 0x51, 0x17);
1104
ds3000_tuner_writereg(state, 0x51, 0x1f);
1105
ds3000_tuner_writereg(state, 0x50, 0x08);
1106
ds3000_tuner_writereg(state, 0x50, 0x00);
1109
value = ds3000_tuner_readreg(state, 0x3d);
1111
if ((value > 4) && (value < 15)) {
1115
value = ((value << 3) | 0x01) & 0x79;
1118
ds3000_tuner_writereg(state, 0x60, value);
1119
ds3000_tuner_writereg(state, 0x51, 0x17);
1120
ds3000_tuner_writereg(state, 0x51, 0x1f);
1121
ds3000_tuner_writereg(state, 0x50, 0x08);
1122
ds3000_tuner_writereg(state, 0x50, 0x00);
1124
/* set low-pass filter period */
1125
ds3000_tuner_writereg(state, 0x04, 0x2e);
1126
ds3000_tuner_writereg(state, 0x51, 0x1b);
1127
ds3000_tuner_writereg(state, 0x51, 0x1f);
1128
ds3000_tuner_writereg(state, 0x50, 0x04);
1129
ds3000_tuner_writereg(state, 0x50, 0x00);
1132
f3db = ((state->dcur.symbol_rate / 1000) << 2) / 5 + 2000;
1133
if ((state->dcur.symbol_rate / 1000) < 5000)
1140
/* set low-pass filter baseband */
1141
value = ds3000_tuner_readreg(state, 0x26);
1142
mlpf = 0x2e * 207 / ((value << 1) + 151);
1143
mlpf_max = mlpf * 135 / 100;
1144
mlpf_min = mlpf * 78 / 100;
1148
/* rounded to the closest integer */
1149
nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2))
1150
/ (2766 * DS3000_XTAL_FREQ);
1156
/* rounded to the closest integer */
985
if (state->config->set_ts_params)
986
state->config->set_ts_params(fe, 0);
989
ds3000_tuner_writereg(state, 0x07, 0x02);
990
ds3000_tuner_writereg(state, 0x10, 0x00);
991
ds3000_tuner_writereg(state, 0x60, 0x79);
992
ds3000_tuner_writereg(state, 0x08, 0x01);
993
ds3000_tuner_writereg(state, 0x00, 0x01);
996
/* calculate and set freq divider */
997
if (p->frequency < 1146000) {
998
ds3000_tuner_writereg(state, 0x10, 0x11);
1000
ndiv = ((p->frequency * (6 + 8) * 4) +
1001
(DS3000_XTAL_FREQ / 2)) /
1002
DS3000_XTAL_FREQ - 1024;
1004
ds3000_tuner_writereg(state, 0x10, 0x01);
1005
ndiv = ((p->frequency * (6 + 8) * 2) +
1006
(DS3000_XTAL_FREQ / 2)) /
1007
DS3000_XTAL_FREQ - 1024;
1010
ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8);
1011
ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff);
1014
ds3000_tuner_writereg(state, 0x03, 0x06);
1015
ds3000_tuner_writereg(state, 0x51, 0x0f);
1016
ds3000_tuner_writereg(state, 0x51, 0x1f);
1017
ds3000_tuner_writereg(state, 0x50, 0x10);
1018
ds3000_tuner_writereg(state, 0x50, 0x00);
1022
ds3000_tuner_writereg(state, 0x51, 0x17);
1023
ds3000_tuner_writereg(state, 0x51, 0x1f);
1024
ds3000_tuner_writereg(state, 0x50, 0x08);
1025
ds3000_tuner_writereg(state, 0x50, 0x00);
1028
value = ds3000_tuner_readreg(state, 0x3d);
1030
if ((value > 4) && (value < 15)) {
1034
value = ((value << 3) | 0x01) & 0x79;
1037
ds3000_tuner_writereg(state, 0x60, value);
1038
ds3000_tuner_writereg(state, 0x51, 0x17);
1039
ds3000_tuner_writereg(state, 0x51, 0x1f);
1040
ds3000_tuner_writereg(state, 0x50, 0x08);
1041
ds3000_tuner_writereg(state, 0x50, 0x00);
1043
/* set low-pass filter period */
1044
ds3000_tuner_writereg(state, 0x04, 0x2e);
1045
ds3000_tuner_writereg(state, 0x51, 0x1b);
1046
ds3000_tuner_writereg(state, 0x51, 0x1f);
1047
ds3000_tuner_writereg(state, 0x50, 0x04);
1048
ds3000_tuner_writereg(state, 0x50, 0x00);
1051
f3db = ((c->symbol_rate / 1000) << 2) / 5 + 2000;
1052
if ((c->symbol_rate / 1000) < 5000)
1059
/* set low-pass filter baseband */
1060
value = ds3000_tuner_readreg(state, 0x26);
1061
mlpf = 0x2e * 207 / ((value << 1) + 151);
1062
mlpf_max = mlpf * 135 / 100;
1063
mlpf_min = mlpf * 78 / 100;
1067
/* rounded to the closest integer */
1068
nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2))
1069
/ (2766 * DS3000_XTAL_FREQ);
1075
/* rounded to the closest integer */
1076
mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
1077
(1000 * f3db / 2)) / (1000 * f3db);
1079
if (mlpf_new < mlpf_min) {
1157
1081
mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
1158
1082
(1000 * f3db / 2)) / (1000 * f3db);
1160
if (mlpf_new < mlpf_min) {
1162
mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
1163
(1000 * f3db / 2)) / (1000 * f3db);
1166
if (mlpf_new > mlpf_max)
1167
mlpf_new = mlpf_max;
1169
ds3000_tuner_writereg(state, 0x04, mlpf_new);
1170
ds3000_tuner_writereg(state, 0x06, nlpf);
1171
ds3000_tuner_writereg(state, 0x51, 0x1b);
1172
ds3000_tuner_writereg(state, 0x51, 0x1f);
1173
ds3000_tuner_writereg(state, 0x50, 0x04);
1174
ds3000_tuner_writereg(state, 0x50, 0x00);
1178
ds3000_tuner_writereg(state, 0x51, 0x1e);
1179
ds3000_tuner_writereg(state, 0x51, 0x1f);
1180
ds3000_tuner_writereg(state, 0x50, 0x01);
1181
ds3000_tuner_writereg(state, 0x50, 0x00);
1184
/* ds3000 global reset */
1185
ds3000_writereg(state, 0x07, 0x80);
1186
ds3000_writereg(state, 0x07, 0x00);
1187
/* ds3000 build-in uC reset */
1188
ds3000_writereg(state, 0xb2, 0x01);
1189
/* ds3000 software reset */
1190
ds3000_writereg(state, 0x00, 0x01);
1085
if (mlpf_new > mlpf_max)
1086
mlpf_new = mlpf_max;
1088
ds3000_tuner_writereg(state, 0x04, mlpf_new);
1089
ds3000_tuner_writereg(state, 0x06, nlpf);
1090
ds3000_tuner_writereg(state, 0x51, 0x1b);
1091
ds3000_tuner_writereg(state, 0x51, 0x1f);
1092
ds3000_tuner_writereg(state, 0x50, 0x04);
1093
ds3000_tuner_writereg(state, 0x50, 0x00);
1097
ds3000_tuner_writereg(state, 0x51, 0x1e);
1098
ds3000_tuner_writereg(state, 0x51, 0x1f);
1099
ds3000_tuner_writereg(state, 0x50, 0x01);
1100
ds3000_tuner_writereg(state, 0x50, 0x00);
1103
offset_khz = (ndiv - ndiv % 2 + 1024) * DS3000_XTAL_FREQ
1104
/ (6 + 8) / (div4 + 1) / 2 - p->frequency;
1106
/* ds3000 global reset */
1107
ds3000_writereg(state, 0x07, 0x80);
1108
ds3000_writereg(state, 0x07, 0x00);
1109
/* ds3000 build-in uC reset */
1110
ds3000_writereg(state, 0xb2, 0x01);
1111
/* ds3000 software reset */
1112
ds3000_writereg(state, 0x00, 0x01);
1114
switch (c->delivery_system) {
1116
/* initialise the demod in DVB-S mode */
1117
for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2)
1118
ds3000_writereg(state,
1119
ds3000_dvbs_init_tab[i],
1120
ds3000_dvbs_init_tab[i + 1]);
1121
value = ds3000_readreg(state, 0xfe);
1124
ds3000_writereg(state, 0xfe, value);
1127
/* initialise the demod in DVB-S2 mode */
1128
for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2)
1129
ds3000_writereg(state,
1130
ds3000_dvbs2_init_tab[i],
1131
ds3000_dvbs2_init_tab[i + 1]);
1132
ds3000_writereg(state, 0xfe, 0x98);
1138
/* enable 27MHz clock output */
1139
ds3000_writereg(state, 0x29, 0x80);
1140
/* enable ac coupling */
1141
ds3000_writereg(state, 0x25, 0x8a);
1143
/* enhance symbol rate performance */
1144
if ((c->symbol_rate / 1000) <= 5000) {
1145
value = 29777 / (c->symbol_rate / 1000) + 1;
1148
ds3000_writereg(state, 0xc3, 0x0d);
1149
ds3000_writereg(state, 0xc8, value);
1150
ds3000_writereg(state, 0xc4, 0x10);
1151
ds3000_writereg(state, 0xc7, 0x0e);
1152
} else if ((c->symbol_rate / 1000) <= 10000) {
1153
value = 92166 / (c->symbol_rate / 1000) + 1;
1156
ds3000_writereg(state, 0xc3, 0x07);
1157
ds3000_writereg(state, 0xc8, value);
1158
ds3000_writereg(state, 0xc4, 0x09);
1159
ds3000_writereg(state, 0xc7, 0x12);
1160
} else if ((c->symbol_rate / 1000) <= 20000) {
1161
value = 64516 / (c->symbol_rate / 1000) + 1;
1162
ds3000_writereg(state, 0xc3, value);
1163
ds3000_writereg(state, 0xc8, 0x0e);
1164
ds3000_writereg(state, 0xc4, 0x07);
1165
ds3000_writereg(state, 0xc7, 0x18);
1167
value = 129032 / (c->symbol_rate / 1000) + 1;
1168
ds3000_writereg(state, 0xc3, value);
1169
ds3000_writereg(state, 0xc8, 0x0a);
1170
ds3000_writereg(state, 0xc4, 0x05);
1171
ds3000_writereg(state, 0xc7, 0x24);
1174
/* normalized symbol rate rounded to the closest integer */
1175
value = (((c->symbol_rate / 1000) << 16) +
1176
(DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE;
1177
ds3000_writereg(state, 0x61, value & 0x00ff);
1178
ds3000_writereg(state, 0x62, (value & 0xff00) >> 8);
1180
/* co-channel interference cancellation disabled */
1181
ds3000_writereg(state, 0x56, 0x00);
1183
/* equalizer disabled */
1184
ds3000_writereg(state, 0x76, 0x00);
1186
/*ds3000_writereg(state, 0x08, 0x03);
1187
ds3000_writereg(state, 0xfd, 0x22);
1188
ds3000_writereg(state, 0x08, 0x07);
1189
ds3000_writereg(state, 0xfd, 0x42);
1190
ds3000_writereg(state, 0x08, 0x07);*/
1192
if (state->config->ci_mode) {
1192
1193
switch (c->delivery_system) {
1194
/* initialise the demod in DVB-S mode */
1195
for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2)
1196
ds3000_writereg(state,
1197
ds3000_dvbs_init_tab[i],
1198
ds3000_dvbs_init_tab[i + 1]);
1199
value = ds3000_readreg(state, 0xfe);
1202
ds3000_writereg(state, 0xfe, value);
1196
ds3000_writereg(state, 0xfd, 0x80);
1204
1198
case SYS_DVBS2:
1205
/* initialise the demod in DVB-S2 mode */
1206
for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2)
1207
ds3000_writereg(state,
1208
ds3000_dvbs2_init_tab[i],
1209
ds3000_dvbs2_init_tab[i + 1]);
1210
ds3000_writereg(state, 0xfe, 0x54);
1216
/* enable 27MHz clock output */
1217
ds3000_writereg(state, 0x29, 0x80);
1218
/* enable ac coupling */
1219
ds3000_writereg(state, 0x25, 0x8a);
1221
/* enhance symbol rate performance */
1222
if ((state->dcur.symbol_rate / 1000) <= 5000) {
1223
value = 29777 / (state->dcur.symbol_rate / 1000) + 1;
1226
ds3000_writereg(state, 0xc3, 0x0d);
1227
ds3000_writereg(state, 0xc8, value);
1228
ds3000_writereg(state, 0xc4, 0x10);
1229
ds3000_writereg(state, 0xc7, 0x0e);
1230
} else if ((state->dcur.symbol_rate / 1000) <= 10000) {
1231
value = 92166 / (state->dcur.symbol_rate / 1000) + 1;
1234
ds3000_writereg(state, 0xc3, 0x07);
1235
ds3000_writereg(state, 0xc8, value);
1236
ds3000_writereg(state, 0xc4, 0x09);
1237
ds3000_writereg(state, 0xc7, 0x12);
1238
} else if ((state->dcur.symbol_rate / 1000) <= 20000) {
1239
value = 64516 / (state->dcur.symbol_rate / 1000) + 1;
1240
ds3000_writereg(state, 0xc3, value);
1241
ds3000_writereg(state, 0xc8, 0x0e);
1242
ds3000_writereg(state, 0xc4, 0x07);
1243
ds3000_writereg(state, 0xc7, 0x18);
1245
value = 129032 / (state->dcur.symbol_rate / 1000) + 1;
1246
ds3000_writereg(state, 0xc3, value);
1247
ds3000_writereg(state, 0xc8, 0x0a);
1248
ds3000_writereg(state, 0xc4, 0x05);
1249
ds3000_writereg(state, 0xc7, 0x24);
1252
/* normalized symbol rate rounded to the closest integer */
1253
value = (((state->dcur.symbol_rate / 1000) << 16) +
1254
(DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE;
1255
ds3000_writereg(state, 0x61, value & 0x00ff);
1256
ds3000_writereg(state, 0x62, (value & 0xff00) >> 8);
1258
/* co-channel interference cancellation disabled */
1259
ds3000_writereg(state, 0x56, 0x00);
1261
/* equalizer disabled */
1262
ds3000_writereg(state, 0x76, 0x00);
1264
/*ds3000_writereg(state, 0x08, 0x03);
1265
ds3000_writereg(state, 0xfd, 0x22);
1266
ds3000_writereg(state, 0x08, 0x07);
1267
ds3000_writereg(state, 0xfd, 0x42);
1268
ds3000_writereg(state, 0x08, 0x07);*/
1270
/* ds3000 out of software reset */
1271
ds3000_writereg(state, 0x00, 0x00);
1272
/* start ds3000 build-in uC */
1273
ds3000_writereg(state, 0xb2, 0x00);
1275
/* TODO: calculate and set carrier offset */
1277
/* wait before retrying */
1278
for (i = 0; i < 30 ; i++) {
1279
if (ds3000_is_tuned(fe)) {
1280
dprintk("%s: Tuned\n", __func__);
1281
ds3000_dump_registers(fe);
1287
dprintk("%s: Not tuned\n", __func__);
1288
ds3000_dump_registers(fe);
1199
ds3000_writereg(state, 0xfd, 0x01);
1204
/* ds3000 out of software reset */
1205
ds3000_writereg(state, 0x00, 0x00);
1206
/* start ds3000 build-in uC */
1207
ds3000_writereg(state, 0xb2, 0x00);
1209
ds3000_set_carrier_offset(fe, offset_khz);
1211
for (i = 0; i < 30 ; i++) {
1212
ds3000_read_status(fe, &status);
1213
if (status && FE_HAS_LOCK)
1222
static int ds3000_tune(struct dvb_frontend *fe,
1223
struct dvb_frontend_parameters *p,
1224
unsigned int mode_flags,
1225
unsigned int *delay,
1226
fe_status_t *status)
1229
int ret = ds3000_set_frontend(fe, p);
1236
return ds3000_read_status(fe, status);
1296
1239
static enum dvbfe_algo ds3000_get_algo(struct dvb_frontend *fe)
1298
1241
dprintk("%s()\n", __func__);
1299
return DVBFE_ALGO_SW;
1242
return DVBFE_ALGO_HW;