1 /* 2 * Support for the Broadcom BCM3510 ATSC demodulator (1st generation Air2PC) 3 * 4 * Copyright (C) 2001-5, B2C2 inc. 5 * 6 * GPL/Linux driver written by Patrick Boettcher <patrick.boettcher@desy.de> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 */ 22 #ifndef __BCM3510_PRIV_H__ 23 #define __BCM3510_PRIV_H__ 24 25 #define PACKED __attribute__((packed)) 26 27 #undef err 28 #define err(format, arg...) printk(KERN_ERR "bcm3510: " format "\n" , ## arg) 29 #undef info 30 #define info(format, arg...) printk(KERN_INFO "bcm3510: " format "\n" , ## arg) 31 #undef warn 32 #define warn(format, arg...) printk(KERN_WARNING "bcm3510: " format "\n" , ## arg) 33 34 35 #define PANASONIC_FIRST_IF_BASE_IN_KHz 1407500 36 #define BCM3510_SYMBOL_RATE 5381000 37 38 typedef union { 39 u8 raw; 40 41 struct { 42 u8 CTL :8; 43 } TSTCTL_2e; 44 45 u8 LDCERC_4e; 46 u8 LDUERC_4f; 47 u8 LD_BER0_65; 48 u8 LD_BER1_66; 49 u8 LD_BER2_67; 50 u8 LD_BER3_68; 51 52 struct { 53 u8 RESET :1; 54 u8 IDLE :1; 55 u8 STOP :1; 56 u8 HIRQ0 :1; 57 u8 HIRQ1 :1; 58 u8 na0 :1; 59 u8 HABAV :1; 60 u8 na1 :1; 61 } HCTL1_a0; 62 63 struct { 64 u8 na0 :1; 65 u8 IDLMSK :1; 66 u8 STMSK :1; 67 u8 I0MSK :1; 68 u8 I1MSK :1; 69 u8 na1 :1; 70 u8 HABMSK :1; 71 u8 na2 :1; 72 } HCTLMSK_a1; 73 74 struct { 75 u8 RESET :1; 76 u8 IDLE :1; 77 u8 STOP :1; 78 u8 RUN :1; 79 u8 HABAV :1; 80 u8 MEMAV :1; 81 u8 ALDONE :1; 82 u8 REIRQ :1; 83 } APSTAT1_a2; 84 85 struct { 86 u8 RSTMSK :1; 87 u8 IMSK :1; 88 u8 SMSK :1; 89 u8 RMSK :1; 90 u8 HABMSK :1; 91 u8 MAVMSK :1; 92 u8 ALDMSK :1; 93 u8 REMSK :1; 94 } APMSK1_a3; 95 96 u8 APSTAT2_a4; 97 u8 APMSK2_a5; 98 99 struct { 100 u8 HABADR :7; 101 u8 na :1; 102 } HABADR_a6; 103 104 u8 HABDATA_a7; 105 106 struct { 107 u8 HABR :1; 108 u8 LDHABR :1; 109 u8 APMSK :1; 110 u8 HMSK :1; 111 u8 LDMSK :1; 112 u8 na :3; 113 } HABSTAT_a8; 114 115 u8 MADRH_a9; 116 u8 MADRL_aa; 117 u8 MDATA_ab; 118 119 struct { 120 #define JDEC_WAIT_AT_RAM 0x7 121 #define JDEC_EEPROM_LOAD_WAIT 0x4 122 u8 JDEC :3; 123 u8 na :5; 124 } JDEC_ca; 125 126 struct { 127 u8 REV :4; 128 u8 LAYER :4; 129 } REVID_e0; 130 131 struct { 132 u8 unk0 :1; 133 u8 CNTCTL :1; 134 u8 BITCNT :1; 135 u8 unk1 :1; 136 u8 RESYNC :1; 137 u8 unk2 :3; 138 } BERCTL_fa; 139 140 struct { 141 u8 CSEL0 :1; 142 u8 CLKED0 :1; 143 u8 CSEL1 :1; 144 u8 CLKED1 :1; 145 u8 CLKLEV :1; 146 u8 SPIVAR :1; 147 u8 na :2; 148 } TUNSET_fc; 149 150 struct { 151 u8 CLK :1; 152 u8 DATA :1; 153 u8 CS0 :1; 154 u8 CS1 :1; 155 u8 AGCSEL :1; 156 u8 na0 :1; 157 u8 TUNSEL :1; 158 u8 na1 :1; 159 } TUNCTL_fd; 160 161 u8 TUNSEL0_fe; 162 u8 TUNSEL1_ff; 163 164 } bcm3510_register_value; 165 166 /* HAB commands */ 167 168 /* version */ 169 #define CMD_GET_VERSION_INFO 0x3D 170 #define MSGID_GET_VERSION_INFO 0x15 171 struct bcm3510_hab_cmd_get_version_info { 172 u8 microcode_version; 173 u8 script_version; 174 u8 config_version; 175 u8 demod_version; 176 } PACKED; 177 178 #define BCM3510_DEF_MICROCODE_VERSION 0x0E 179 #define BCM3510_DEF_SCRIPT_VERSION 0x06 180 #define BCM3510_DEF_CONFIG_VERSION 0x01 181 #define BCM3510_DEF_DEMOD_VERSION 0xB1 182 183 /* acquire */ 184 #define CMD_ACQUIRE 0x38 185 186 #define MSGID_EXT_TUNER_ACQUIRE 0x0A 187 struct bcm3510_hab_cmd_ext_acquire { 188 struct { 189 u8 MODE :4; 190 u8 BW :1; 191 u8 FA :1; 192 u8 NTSCSWEEP :1; 193 u8 OFFSET :1; 194 } PACKED ACQUIRE0; /* control_byte */ 195 196 struct { 197 u8 IF_FREQ :3; 198 u8 zero0 :1; 199 u8 SYM_RATE :3; 200 u8 zero1 :1; 201 } PACKED ACQUIRE1; /* sym_if */ 202 203 u8 IF_OFFSET0; /* IF_Offset_10hz */ 204 u8 IF_OFFSET1; 205 u8 SYM_OFFSET0; /* SymbolRateOffset */ 206 u8 SYM_OFFSET1; 207 u8 NTSC_OFFSET0; /* NTSC_Offset_10hz */ 208 u8 NTSC_OFFSET1; 209 } PACKED; 210 211 #define MSGID_INT_TUNER_ACQUIRE 0x0B 212 struct bcm3510_hab_cmd_int_acquire { 213 struct { 214 u8 MODE :4; 215 u8 BW :1; 216 u8 FA :1; 217 u8 NTSCSWEEP :1; 218 u8 OFFSET :1; 219 } PACKED ACQUIRE0; /* control_byte */ 220 221 struct { 222 u8 IF_FREQ :3; 223 u8 zero0 :1; 224 u8 SYM_RATE :3; 225 u8 zero1 :1; 226 } PACKED ACQUIRE1; /* sym_if */ 227 228 u8 TUNER_FREQ0; 229 u8 TUNER_FREQ1; 230 u8 TUNER_FREQ2; 231 u8 TUNER_FREQ3; 232 u8 IF_OFFSET0; /* IF_Offset_10hz */ 233 u8 IF_OFFSET1; 234 u8 SYM_OFFSET0; /* SymbolRateOffset */ 235 u8 SYM_OFFSET1; 236 u8 NTSC_OFFSET0; /* NTSC_Offset_10hz */ 237 u8 NTSC_OFFSET1; 238 } PACKED; 239 240 /* modes */ 241 #define BCM3510_QAM16 = 0x01 242 #define BCM3510_QAM32 = 0x02 243 #define BCM3510_QAM64 = 0x03 244 #define BCM3510_QAM128 = 0x04 245 #define BCM3510_QAM256 = 0x05 246 #define BCM3510_8VSB = 0x0B 247 #define BCM3510_16VSB = 0x0D 248 249 /* IF_FREQS */ 250 #define BCM3510_IF_TERRESTRIAL 0x0 251 #define BCM3510_IF_CABLE 0x1 252 #define BCM3510_IF_USE_CMD 0x7 253 254 /* SYM_RATE */ 255 #define BCM3510_SR_8VSB 0x0 /* 5381119 s/sec */ 256 #define BCM3510_SR_256QAM 0x1 /* 5360537 s/sec */ 257 #define BCM3510_SR_16QAM 0x2 /* 5056971 s/sec */ 258 #define BCM3510_SR_MISC 0x3 /* 5000000 s/sec */ 259 #define BCM3510_SR_USE_CMD 0x7 260 261 /* special symbol rate */ 262 #define CMD_SET_VALUE_NOT_LISTED 0x2d 263 #define MSGID_SET_SYMBOL_RATE_NOT_LISTED 0x0c 264 struct bcm3510_hab_cmd_set_sr_not_listed { 265 u8 HOST_SYM_RATE0; 266 u8 HOST_SYM_RATE1; 267 u8 HOST_SYM_RATE2; 268 u8 HOST_SYM_RATE3; 269 } PACKED; 270 271 /* special IF */ 272 #define MSGID_SET_IF_FREQ_NOT_LISTED 0x0d 273 struct bcm3510_hab_cmd_set_if_freq_not_listed { 274 u8 HOST_IF_FREQ0; 275 u8 HOST_IF_FREQ1; 276 u8 HOST_IF_FREQ2; 277 u8 HOST_IF_FREQ3; 278 } PACKED; 279 280 /* auto reacquire */ 281 #define CMD_AUTO_PARAM 0x2a 282 #define MSGID_AUTO_REACQUIRE 0x0e 283 struct bcm3510_hab_cmd_auto_reacquire { 284 u8 ACQ :1; /* on/off*/ 285 u8 unused :7; 286 } PACKED; 287 288 #define MSGID_SET_RF_AGC_SEL 0x12 289 struct bcm3510_hab_cmd_set_agc { 290 u8 LVL :1; 291 u8 unused :6; 292 u8 SEL :1; 293 } PACKED; 294 295 #define MSGID_SET_AUTO_INVERSION 0x14 296 struct bcm3510_hab_cmd_auto_inversion { 297 u8 AI :1; 298 u8 unused :7; 299 } PACKED; 300 301 302 /* bert control */ 303 #define CMD_STATE_CONTROL 0x12 304 #define MSGID_BERT_CONTROL 0x0e 305 #define MSGID_BERT_SET 0xfa 306 struct bcm3510_hab_cmd_bert_control { 307 u8 BE :1; 308 u8 unused :7; 309 } PACKED; 310 311 #define MSGID_TRI_STATE 0x2e 312 struct bcm3510_hab_cmd_tri_state { 313 u8 RE :1; /* a/d ram port pins */ 314 u8 PE :1; /* baud clock pin */ 315 u8 AC :1; /* a/d clock pin */ 316 u8 BE :1; /* baud clock pin */ 317 u8 unused :4; 318 } PACKED; 319 320 321 /* tune */ 322 #define CMD_TUNE 0x38 323 #define MSGID_TUNE 0x16 324 struct bcm3510_hab_cmd_tune_ctrl_data_pair { 325 struct { 326 #define BITS_8 0x07 327 #define BITS_7 0x06 328 #define BITS_6 0x05 329 #define BITS_5 0x04 330 #define BITS_4 0x03 331 #define BITS_3 0x02 332 #define BITS_2 0x01 333 #define BITS_1 0x00 334 u8 size :3; 335 u8 unk :2; 336 u8 clk_off :1; 337 u8 cs0 :1; 338 u8 cs1 :1; 339 340 } PACKED ctrl; 341 342 u8 data; 343 } PACKED; 344 345 struct bcm3510_hab_cmd_tune { 346 u8 length; 347 u8 clock_width; 348 u8 misc; 349 u8 TUNCTL_state; 350 351 struct bcm3510_hab_cmd_tune_ctrl_data_pair ctl_dat[16]; 352 } PACKED; 353 354 #define CMD_STATUS 0x38 355 #define MSGID_STATUS1 0x08 356 struct bcm3510_hab_cmd_status1 { 357 struct { 358 u8 EQ_MODE :4; 359 u8 reserved :2; 360 u8 QRE :1; /* if QSE and the spectrum is inversed */ 361 u8 QSE :1; /* automatic spectral inversion */ 362 } PACKED STATUS0; 363 364 struct { 365 u8 RECEIVER_LOCK :1; 366 u8 FEC_LOCK :1; 367 u8 OUT_PLL_LOCK :1; 368 u8 reserved :5; 369 } PACKED STATUS1; 370 371 struct { 372 u8 reserved :2; 373 u8 BW :1; 374 u8 NTE :1; /* NTSC filter sweep enabled */ 375 u8 AQI :1; /* currently acquiring */ 376 u8 FA :1; /* fast acquisition */ 377 u8 ARI :1; /* auto reacquire */ 378 u8 TI :1; /* programming the tuner */ 379 } PACKED STATUS2; 380 u8 STATUS3; 381 u8 SNR_EST0; 382 u8 SNR_EST1; 383 u8 TUNER_FREQ0; 384 u8 TUNER_FREQ1; 385 u8 TUNER_FREQ2; 386 u8 TUNER_FREQ3; 387 u8 SYM_RATE0; 388 u8 SYM_RATE1; 389 u8 SYM_RATE2; 390 u8 SYM_RATE3; 391 u8 SYM_OFFSET0; 392 u8 SYM_OFFSET1; 393 u8 SYM_ERROR0; 394 u8 SYM_ERROR1; 395 u8 IF_FREQ0; 396 u8 IF_FREQ1; 397 u8 IF_FREQ2; 398 u8 IF_FREQ3; 399 u8 IF_OFFSET0; 400 u8 IF_OFFSET1; 401 u8 IF_ERROR0; 402 u8 IF_ERROR1; 403 u8 NTSC_FILTER0; 404 u8 NTSC_FILTER1; 405 u8 NTSC_FILTER2; 406 u8 NTSC_FILTER3; 407 u8 NTSC_OFFSET0; 408 u8 NTSC_OFFSET1; 409 u8 NTSC_ERROR0; 410 u8 NTSC_ERROR1; 411 u8 INT_AGC_LEVEL0; 412 u8 INT_AGC_LEVEL1; 413 u8 EXT_AGC_LEVEL0; 414 u8 EXT_AGC_LEVEL1; 415 } PACKED; 416 417 #define MSGID_STATUS2 0x14 418 struct bcm3510_hab_cmd_status2 { 419 struct { 420 u8 EQ_MODE :4; 421 u8 reserved :2; 422 u8 QRE :1; 423 u8 QSR :1; 424 } PACKED STATUS0; 425 struct { 426 u8 RL :1; 427 u8 FL :1; 428 u8 OL :1; 429 u8 reserved :5; 430 } PACKED STATUS1; 431 u8 SYMBOL_RATE0; 432 u8 SYMBOL_RATE1; 433 u8 SYMBOL_RATE2; 434 u8 SYMBOL_RATE3; 435 u8 LDCERC0; 436 u8 LDCERC1; 437 u8 LDCERC2; 438 u8 LDCERC3; 439 u8 LDUERC0; 440 u8 LDUERC1; 441 u8 LDUERC2; 442 u8 LDUERC3; 443 u8 LDBER0; 444 u8 LDBER1; 445 u8 LDBER2; 446 u8 LDBER3; 447 struct { 448 u8 MODE_TYPE :4; /* acquire mode 0 */ 449 u8 reservd :4; 450 } MODE_TYPE; 451 u8 SNR_EST0; 452 u8 SNR_EST1; 453 u8 SIGNAL; 454 } PACKED; 455 456 #define CMD_SET_RF_BW_NOT_LISTED 0x3f 457 #define MSGID_SET_RF_BW_NOT_LISTED 0x11 458 /* TODO */ 459 460 #endif 461