dst.c
来自「trident tm5600的linux驱动」· C语言 代码 · 共 1,866 行 · 第 1/4 页
C
1,866 行
if (state->type_flags & DST_TYPE_HAS_SYMDIV) { sval = srate; sval <<= 20; do_div(sval, 88000); symcalc = (u32) sval; dprintk(verbose, DST_INFO, 1, "set symcalc %u", symcalc); state->tx_tuna[5] = (u8) (symcalc >> 12); state->tx_tuna[6] = (u8) (symcalc >> 4); state->tx_tuna[7] = (u8) (symcalc << 4); } else { state->tx_tuna[5] = (u8) (srate >> 16) & 0x7f; state->tx_tuna[6] = (u8) (srate >> 8); state->tx_tuna[7] = (u8) srate; } state->tx_tuna[8] &= ~0x20; if (state->type_flags & DST_TYPE_HAS_OBS_REGS) { if (srate > 8000) state->tx_tuna[8] |= 0x20; } } else if (state->dst_type == DST_TYPE_IS_CABLE) { dprintk(verbose, DST_DEBUG, 1, "%s", state->fw_name); if (!strncmp(state->fw_name, "DCTNEW", 6)) { state->tx_tuna[5] = (u8) (srate >> 8); state->tx_tuna[6] = (u8) srate; state->tx_tuna[7] = 0x00; } else if (!strncmp(state->fw_name, "DCT-CI", 6)) { state->tx_tuna[5] = 0x00; state->tx_tuna[6] = (u8) (srate >> 8); state->tx_tuna[7] = (u8) srate; } } return 0;}static int dst_set_modulation(struct dst_state *state, fe_modulation_t modulation){ if (state->dst_type != DST_TYPE_IS_CABLE) return -EOPNOTSUPP; state->modulation = modulation; switch (modulation) { case QAM_16: state->tx_tuna[8] = 0x10; break; case QAM_32: state->tx_tuna[8] = 0x20; break; case QAM_64: state->tx_tuna[8] = 0x40; break; case QAM_128: state->tx_tuna[8] = 0x80; break; case QAM_256: if (!strncmp(state->fw_name, "DCTNEW", 6)) state->tx_tuna[8] = 0xff; else if (!strncmp(state->fw_name, "DCT-CI", 6)) state->tx_tuna[8] = 0x00; break; case QPSK: case QAM_AUTO: case VSB_8: case VSB_16: default: return -EINVAL; } return 0;}static fe_modulation_t dst_get_modulation(struct dst_state *state){ return state->modulation;}u8 dst_check_sum(u8 *buf, u32 len){ u32 i; u8 val = 0; if (!len) return 0; for (i = 0; i < len; i++) { val += buf[i]; } return ((~val) + 1);}EXPORT_SYMBOL(dst_check_sum);static void dst_type_flags_print(struct dst_state *state){ u32 type_flags = state->type_flags; dprintk(verbose, DST_ERROR, 0, "DST type flags :"); if (type_flags & DST_TYPE_HAS_TS188) dprintk(verbose, DST_ERROR, 0, " 0x%x newtuner", DST_TYPE_HAS_TS188); if (type_flags & DST_TYPE_HAS_NEWTUNE_2) dprintk(verbose, DST_ERROR, 0, " 0x%x newtuner 2", DST_TYPE_HAS_NEWTUNE_2); if (type_flags & DST_TYPE_HAS_TS204) dprintk(verbose, DST_ERROR, 0, " 0x%x ts204", DST_TYPE_HAS_TS204); if (type_flags & DST_TYPE_HAS_VLF) dprintk(verbose, DST_ERROR, 0, " 0x%x VLF", DST_TYPE_HAS_VLF); if (type_flags & DST_TYPE_HAS_SYMDIV) dprintk(verbose, DST_ERROR, 0, " 0x%x symdiv", DST_TYPE_HAS_SYMDIV); if (type_flags & DST_TYPE_HAS_FW_1) dprintk(verbose, DST_ERROR, 0, " 0x%x firmware version = 1", DST_TYPE_HAS_FW_1); if (type_flags & DST_TYPE_HAS_FW_2) dprintk(verbose, DST_ERROR, 0, " 0x%x firmware version = 2", DST_TYPE_HAS_FW_2); if (type_flags & DST_TYPE_HAS_FW_3) dprintk(verbose, DST_ERROR, 0, " 0x%x firmware version = 3", DST_TYPE_HAS_FW_3); dprintk(verbose, DST_ERROR, 0, "\n");}static int dst_type_print(struct dst_state *state, u8 type){ char *otype; switch (type) { case DST_TYPE_IS_SAT: otype = "satellite"; break; case DST_TYPE_IS_TERR: otype = "terrestrial"; break; case DST_TYPE_IS_CABLE: otype = "cable"; break; case DST_TYPE_IS_ATSC: otype = "atsc"; break; default: dprintk(verbose, DST_INFO, 1, "invalid dst type %d", type); return -EINVAL; } dprintk(verbose, DST_INFO, 1, "DST type: %s", otype); return 0;}static struct tuner_types tuner_list[] = { { .tuner_type = TUNER_TYPE_L64724, .tuner_name = "L 64724", .board_name = "UNKNOWN", .fw_name = "UNKNOWN" }, { .tuner_type = TUNER_TYPE_STV0299, .tuner_name = "STV 0299", .board_name = "VP1020", .fw_name = "DST-MOT" }, { .tuner_type = TUNER_TYPE_STV0299, .tuner_name = "STV 0299", .board_name = "VP1020", .fw_name = "DST-03T" }, { .tuner_type = TUNER_TYPE_MB86A15, .tuner_name = "MB 86A15", .board_name = "VP1022", .fw_name = "DST-03T" }, { .tuner_type = TUNER_TYPE_MB86A15, .tuner_name = "MB 86A15", .board_name = "VP1025", .fw_name = "DST-03T" }, { .tuner_type = TUNER_TYPE_STV0299, .tuner_name = "STV 0299", .board_name = "VP1030", .fw_name = "DST-CI" }, { .tuner_type = TUNER_TYPE_STV0299, .tuner_name = "STV 0299", .board_name = "VP1030", .fw_name = "DSTMCI" }, { .tuner_type = TUNER_TYPE_UNKNOWN, .tuner_name = "UNKNOWN", .board_name = "VP2021", .fw_name = "DCTNEW" }, { .tuner_type = TUNER_TYPE_UNKNOWN, .tuner_name = "UNKNOWN", .board_name = "VP2030", .fw_name = "DCT-CI" }, { .tuner_type = TUNER_TYPE_UNKNOWN, .tuner_name = "UNKNOWN", .board_name = "VP2031", .fw_name = "DCT-CI" }, { .tuner_type = TUNER_TYPE_UNKNOWN, .tuner_name = "UNKNOWN", .board_name = "VP2040", .fw_name = "DCT-CI" }, { .tuner_type = TUNER_TYPE_UNKNOWN, .tuner_name = "UNKNOWN", .board_name = "VP3020", .fw_name = "DTTFTA" }, { .tuner_type = TUNER_TYPE_UNKNOWN, .tuner_name = "UNKNOWN", .board_name = "VP3021", .fw_name = "DTTFTA" }, { .tuner_type = TUNER_TYPE_TDA10046, .tuner_name = "TDA10046", .board_name = "VP3040", .fw_name = "DTT-CI" }, { .tuner_type = TUNER_TYPE_UNKNOWN, .tuner_name = "UNKNOWN", .board_name = "VP3051", .fw_name = "DTTNXT" }, { .tuner_type = TUNER_TYPE_NXT200x, .tuner_name = "NXT200x", .board_name = "VP3220", .fw_name = "ATSCDI" }, { .tuner_type = TUNER_TYPE_NXT200x, .tuner_name = "NXT200x", .board_name = "VP3250", .fw_name = "ATSCAD" },};/* Known cards list Satellite ------------------- 200103A VP-1020 DST-MOT LG(old), TS=188 VP-1020 DST-03T LG(new), TS=204 VP-1022 DST-03T LG(new), TS=204 VP-1025 DST-03T LG(new), TS=204 VP-1030 DSTMCI, LG(new), TS=188 VP-1032 DSTMCI, LG(new), TS=188 Cable ------------------- VP-2030 DCT-CI, Samsung, TS=204 VP-2021 DCT-CI, Unknown, TS=204 VP-2031 DCT-CI, Philips, TS=188 VP-2040 DCT-CI, Philips, TS=188, with CA daughter board VP-2040 DCT-CI, Philips, TS=204, without CA daughter board Terrestrial ------------------- VP-3050 DTTNXT TS=188 VP-3040 DTT-CI, Philips, TS=188 VP-3040 DTT-CI, Philips, TS=204 ATSC ------------------- VP-3220 ATSCDI, TS=188 VP-3250 ATSCAD, TS=188*/static struct dst_types dst_tlist[] = { { .device_id = "200103A", .offset = 0, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1 | DST_TYPE_HAS_OBS_REGS, .dst_feature = 0, .tuner_type = 0 }, /* obsolete */ { .device_id = "DST-020", .offset = 0, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1, .dst_feature = 0, .tuner_type = 0 }, /* obsolete */ { .device_id = "DST-030", .offset = 0, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_1, .dst_feature = 0, .tuner_type = 0 }, /* obsolete */ { .device_id = "DST-03T", .offset = 0, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2, .dst_feature = DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 | DST_TYPE_HAS_DISEQC5 | DST_TYPE_HAS_MAC | DST_TYPE_HAS_MOTO, .tuner_type = TUNER_TYPE_MULTI }, { .device_id = "DST-MOT", .offset = 0, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1, .dst_feature = 0, .tuner_type = 0 }, /* obsolete */ { .device_id = "DST-CI", .offset = 1, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_1, .dst_feature = DST_TYPE_HAS_CA, .tuner_type = 0 }, /* An OEM board */ { .device_id = "DSTMCI", .offset = 1, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_INC_COUNT | DST_TYPE_HAS_VLF, .dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC, .tuner_type = TUNER_TYPE_MULTI }, { .device_id = "DSTFCI", .offset = 1, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_1, .dst_feature = 0, .tuner_type = 0 }, /* unknown to vendor */ { .device_id = "DCT-CI", .offset = 1, .dst_type = DST_TYPE_IS_CABLE, .type_flags = DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_FW_1 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_VLF, .dst_feature = DST_TYPE_HAS_CA, .tuner_type = 0 }, { .device_id = "DCTNEW", .offset = 1, .dst_type = DST_TYPE_IS_CABLE, .type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_3 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_MULTI_FE, .dst_feature = 0, .tuner_type = 0 }, { .device_id = "DTT-CI", .offset = 1, .dst_type = DST_TYPE_IS_TERR, .type_flags = DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_VLF, .dst_feature = DST_TYPE_HAS_CA, .tuner_type = 0 }, { .device_id = "DTTDIG", .offset = 1, .dst_type = DST_TYPE_IS_TERR, .type_flags = DST_TYPE_HAS_FW_2, .dst_feature = 0, .tuner_type = 0 }, { .device_id = "DTTNXT", .offset = 1, .dst_type = DST_TYPE_IS_TERR, .type_flags = DST_TYPE_HAS_FW_2, .dst_feature = DST_TYPE_HAS_ANALOG, .tuner_type = 0 }, { .device_id = "ATSCDI", .offset = 1, .dst_type = DST_TYPE_IS_ATSC, .type_flags = DST_TYPE_HAS_FW_2, .dst_feature = 0, .tuner_type = 0 }, { .device_id = "ATSCAD", .offset = 1, .dst_type = DST_TYPE_IS_ATSC, .type_flags = DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD, .dst_feature = DST_TYPE_HAS_MAC | DST_TYPE_HAS_ANALOG, .tuner_type = 0 }, { }};static int dst_get_mac(struct dst_state *state){ u8 get_mac[] = { 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; get_mac[7] = dst_check_sum(get_mac, 7); if (dst_command(state, get_mac, 8) < 0) { dprintk(verbose, DST_INFO, 1, "Unsupported Command"); return -1; } memset(&state->mac_address, '\0', 8); memcpy(&state->mac_address, &state->rxbuffer, 6); dprintk(verbose, DST_ERROR, 1, "MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]", state->mac_address[0], state->mac_address[1], state->mac_address[2], state->mac_address[4], state->mac_address[5], state->mac_address[6]); return 0;}static int dst_fw_ver(struct dst_state *state){ u8 get_ver[] = { 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; get_ver[7] = dst_check_sum(get_ver, 7); if (dst_command(state, get_ver, 8) < 0) { dprintk(verbose, DST_INFO, 1, "Unsupported Command"); return -1; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?