| 1 | /*************************************************************** |
|---|
| 2 | ** |
|---|
| 3 | ** Broadcom Corp. Confidential |
|---|
| 4 | ** Copyright 2003-2008 Broadcom Corp. All Rights Reserved. |
|---|
| 5 | ** |
|---|
| 6 | ** THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED |
|---|
| 7 | ** SOFTWARE LICENSE AGREEMENT BETWEEN THE USER AND BROADCOM. |
|---|
| 8 | ** YOU HAVE NO RIGHT TO USE OR EXPLOIT THIS MATERIAL EXCEPT |
|---|
| 9 | ** SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. |
|---|
| 10 | ** |
|---|
| 11 | ** File: si_api_chanmap.c |
|---|
| 12 | ** Description: API function that for channel maps |
|---|
| 13 | ** |
|---|
| 14 | ** Created: 03/08/2001 |
|---|
| 15 | ** |
|---|
| 16 | ** REVISION: |
|---|
| 17 | ** |
|---|
| 18 | ** $Log: $ |
|---|
| 19 | ** |
|---|
| 20 | ** |
|---|
| 21 | ****************************************************************/ |
|---|
| 22 | |
|---|
| 23 | #include "si.h" |
|---|
| 24 | #include "si_os.h" |
|---|
| 25 | #include "si_dbg.h" |
|---|
| 26 | #include "si_util.h" |
|---|
| 27 | #include "si_list.h" |
|---|
| 28 | #include "si_vct.h" |
|---|
| 29 | #include "si_svct_vcm.h" |
|---|
| 30 | #include "si_svct.h" |
|---|
| 31 | #include "si_lvct.h" |
|---|
| 32 | #include "si_nit_mms.h" |
|---|
| 33 | #include "si_nit_cds.h" |
|---|
| 34 | #include "si_api_chanmap.h" |
|---|
| 35 | #include "si_descriptors.h" |
|---|
| 36 | |
|---|
| 37 | |
|---|
| 38 | static SI_API_CHAN_MAP *SI_Channel_Map = NULL; |
|---|
| 39 | extern struct svct_vcm_channel_list SVCT_VCM_channels; |
|---|
| 40 | extern unsigned long Total_SVCT_VCM_Channels; |
|---|
| 41 | extern SI_mutex m_svct_vcm; |
|---|
| 42 | |
|---|
| 43 | extern struct lvct_channel_list LVCT_channels; |
|---|
| 44 | extern unsigned long Total_LVCT_Channels; |
|---|
| 45 | extern SI_mutex m_lvct; |
|---|
| 46 | |
|---|
| 47 | extern NIT_MMS_RECORD NIT_MMS_Table[NIT_MMS_MAX_TABLE_SIZE]; |
|---|
| 48 | extern unsigned long NIT_CDS_Freq_KHZ_Table[NIT_CDS_MAX_NUM_OF_CARRIRE_INDEX]; |
|---|
| 49 | extern unsigned long Total_NIT_CDS_carriers; |
|---|
| 50 | extern unsigned long Total_NIT_MMS_entries; |
|---|
| 51 | |
|---|
| 52 | int SI_Api_Clear_Chan_Map(void) |
|---|
| 53 | { |
|---|
| 54 | Total_NIT_CDS_carriers = Total_NIT_MMS_entries = 0; |
|---|
| 55 | Total_SVCT_VCM_Channels = Total_LVCT_Channels = 0; |
|---|
| 56 | /*TODO:: SI_SVCT_VCM_Free_List(); etc.*/ |
|---|
| 57 | } |
|---|
| 58 | |
|---|
| 59 | |
|---|
| 60 | int SI_Api_Get_Chan_Map(SI_API_CHAN_MAP **chan, unsigned long *len) |
|---|
| 61 | { |
|---|
| 62 | unsigned long i = 0; |
|---|
| 63 | SI_SVCT_VCM_CHANNEL *svct; |
|---|
| 64 | SI_LVCT_CHANNEL *lvct; |
|---|
| 65 | unsigned long idx; |
|---|
| 66 | |
|---|
| 67 | if (SI_Channel_Map) |
|---|
| 68 | SI_free(SI_Channel_Map); |
|---|
| 69 | if (Total_NIT_CDS_carriers==0 || Total_NIT_MMS_entries==0) { |
|---|
| 70 | *len = 0; |
|---|
| 71 | return -1; |
|---|
| 72 | } |
|---|
| 73 | |
|---|
| 74 | *len = Total_SVCT_VCM_Channels + Total_LVCT_Channels; |
|---|
| 75 | |
|---|
| 76 | if (*len) |
|---|
| 77 | { |
|---|
| 78 | /* create the channel map vector. */ |
|---|
| 79 | SI_Channel_Map = (SI_API_CHAN_MAP *)SI_alloc(sizeof(SI_API_CHAN_MAP) * (*len)); |
|---|
| 80 | if (SI_Channel_Map == NULL) |
|---|
| 81 | { |
|---|
| 82 | SI_DBG_PRINT(E_SI_ERR_MSG,("Failed to allocate channel map!!!\n")); |
|---|
| 83 | return -1; |
|---|
| 84 | } |
|---|
| 85 | |
|---|
| 86 | /* start with svct. */ |
|---|
| 87 | SI_mutex_lock(m_svct_vcm); |
|---|
| 88 | svct = SI_LST_D_FIRST(&SVCT_VCM_channels); |
|---|
| 89 | while (svct && i<Total_SVCT_VCM_Channels) |
|---|
| 90 | { |
|---|
| 91 | if (svct->channel_type == NORMAL_CHAN) |
|---|
| 92 | { |
|---|
| 93 | SI_Channel_Map[i].num_mode = ((svct->vcn_mode==ONE_PART)?SI_API_ONE_PART:SI_API_TWO_PART); |
|---|
| 94 | SI_Channel_Map[i].channum1 = svct->channum1; |
|---|
| 95 | SI_Channel_Map[i].channum2 = svct->channum2; |
|---|
| 96 | SI_Channel_Map[i].source_id = svct->source_ID; |
|---|
| 97 | SI_Channel_Map[i].freq = NIT_CDS_Freq_KHZ_Table[svct->CDS_reference]*1000; /* in Hz */ |
|---|
| 98 | |
|---|
| 99 | if (svct->transport_type == MPEG2_XPORT) |
|---|
| 100 | { |
|---|
| 101 | SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG; |
|---|
| 102 | SI_Channel_Map[i].chan_parm.dig_parm.prog_num = svct->ChanPropUnion.mpeg_prop.prog_num; |
|---|
| 103 | idx = svct->ChanPropUnion.mpeg_prop.MMS_reference; |
|---|
| 104 | switch (NIT_MMS_Table[idx].transmission_system) |
|---|
| 105 | { |
|---|
| 106 | case ITU_T_ANNEX_B_TX_SYS: |
|---|
| 107 | SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ANNEX_B; |
|---|
| 108 | break; |
|---|
| 109 | |
|---|
| 110 | case ATSC_TX_SYS: |
|---|
| 111 | SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ATSC; |
|---|
| 112 | break; |
|---|
| 113 | |
|---|
| 114 | default: |
|---|
| 115 | /*SI_DBG_PRINT(E_SI_ERR_MSG,("Unknown transmission system from MMS table %d!!!\n", NIT_MMS_Table[idx].transmission_system));*/ |
|---|
| 116 | SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_TRANS_STANDARD_UNKNOWN; |
|---|
| 117 | break; |
|---|
| 118 | } |
|---|
| 119 | |
|---|
| 120 | switch (NIT_MMS_Table[idx].modulation_format) |
|---|
| 121 | { |
|---|
| 122 | case MOD_VSB8: |
|---|
| 123 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_VSB8; |
|---|
| 124 | break; |
|---|
| 125 | |
|---|
| 126 | case MOD_VSB16: |
|---|
| 127 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_VSB16; |
|---|
| 128 | break; |
|---|
| 129 | |
|---|
| 130 | case MOD_QAM64: |
|---|
| 131 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_QAM64; |
|---|
| 132 | break; |
|---|
| 133 | |
|---|
| 134 | case MOD_QAM256: |
|---|
| 135 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_QAM256; |
|---|
| 136 | break; |
|---|
| 137 | |
|---|
| 138 | default: |
|---|
| 139 | SI_DBG_PRINT(E_SI_ERR_MSG,("Unknown modulation format from MMS table %d!!!\n", NIT_MMS_Table[idx].modulation_format)); |
|---|
| 140 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_DIG_FORMAT_UNKNOWN; |
|---|
| 141 | break; |
|---|
| 142 | } |
|---|
| 143 | |
|---|
| 144 | SI_Channel_Map[i].chan_parm.dig_parm.symrate = NIT_MMS_Table[idx].symbol_rate; |
|---|
| 145 | if (SI_NTT_SNS_Find_SrcId(SI_Channel_Map[i].source_id ,&SI_Channel_Map[i].name, SI_API_CHAN_MAP_NAME_LEN)) |
|---|
| 146 | strcpy(SI_Channel_Map[i].name, "Info Unavailable"); |
|---|
| 147 | } |
|---|
| 148 | else |
|---|
| 149 | { |
|---|
| 150 | SI_Channel_Map[i].chan_type = SI_API_CHAN_ANALOG; |
|---|
| 151 | SI_Channel_Map[i].chan_parm.ana_parm.standard = (SI_API_ANA_STANDARD)svct->ChanPropUnion.nonmpeg_prop.video_standard; |
|---|
| 152 | } |
|---|
| 153 | } |
|---|
| 154 | |
|---|
| 155 | i++; |
|---|
| 156 | svct = SI_LST_D_NEXT(svct, chan_link); |
|---|
| 157 | } |
|---|
| 158 | if (svct || i!= Total_SVCT_VCM_Channels) |
|---|
| 159 | SI_DBG_PRINT(E_SI_WRN_MSG,("SVCT length does not agree with Total_SVCT_VCM_Channels!!!\n")); |
|---|
| 160 | |
|---|
| 161 | SI_mutex_unlock(m_svct_vcm); |
|---|
| 162 | |
|---|
| 163 | /* Now for lvct. */ |
|---|
| 164 | SI_mutex_lock(m_lvct); |
|---|
| 165 | lvct = SI_LST_D_FIRST(&LVCT_channels); |
|---|
| 166 | while (lvct && i<*len) |
|---|
| 167 | { |
|---|
| 168 | if (lvct->chanbits & LVCT_HIDDEN_MASK) |
|---|
| 169 | { |
|---|
| 170 | SI_Channel_Map[i].num_mode = ((lvct->vcn_mode==ONE_PART)?SI_API_ONE_PART:SI_API_TWO_PART); |
|---|
| 171 | SI_Channel_Map[i].channum1 = lvct->channum1; |
|---|
| 172 | SI_Channel_Map[i].channum2 = lvct->channum2; |
|---|
| 173 | SI_Channel_Map[i].source_id = lvct->source_ID; |
|---|
| 174 | SI_Channel_Map[i].freq = lvct->carrier_freq; /* in Hz */ |
|---|
| 175 | |
|---|
| 176 | switch (lvct->mod_mode) |
|---|
| 177 | { |
|---|
| 178 | case LVCT_MM_ANALOG: |
|---|
| 179 | SI_Channel_Map[i].chan_type = SI_API_CHAN_ANALOG; |
|---|
| 180 | SI_Channel_Map[i].chan_parm.ana_parm.standard = SI_API_NTSC; /* NTSC by default. */ |
|---|
| 181 | break; |
|---|
| 182 | |
|---|
| 183 | case LVCT_MM_SCTE1: |
|---|
| 184 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_QAM64; |
|---|
| 185 | SI_Channel_Map[i].chan_parm.dig_parm.symrate = 5056900; |
|---|
| 186 | SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ANNEX_B; |
|---|
| 187 | SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG; |
|---|
| 188 | SI_Channel_Map[i].chan_parm.dig_parm.prog_num = lvct->program_num; |
|---|
| 189 | break; |
|---|
| 190 | |
|---|
| 191 | case LVCT_MM_SCTE2: |
|---|
| 192 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_QAM256; |
|---|
| 193 | SI_Channel_Map[i].chan_parm.dig_parm.symrate = 5360500; |
|---|
| 194 | SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ANNEX_B; |
|---|
| 195 | SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG; |
|---|
| 196 | SI_Channel_Map[i].chan_parm.dig_parm.prog_num = lvct->program_num; |
|---|
| 197 | break; |
|---|
| 198 | |
|---|
| 199 | case LVCT_MM_8_VSB: |
|---|
| 200 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_VSB8; |
|---|
| 201 | SI_Channel_Map[i].chan_parm.dig_parm.symrate = 10762000;/* 10.76MB/s ??? */ |
|---|
| 202 | SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ATSC; |
|---|
| 203 | SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG; |
|---|
| 204 | SI_Channel_Map[i].chan_parm.dig_parm.prog_num = lvct->program_num; |
|---|
| 205 | break; |
|---|
| 206 | |
|---|
| 207 | case LVCT_MM_16_VSB: |
|---|
| 208 | SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_VSB16; |
|---|
| 209 | SI_Channel_Map[i].chan_parm.dig_parm.symrate = 10762000;/* ??? */ |
|---|
| 210 | SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ATSC; |
|---|
| 211 | SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG; |
|---|
| 212 | SI_Channel_Map[i].chan_parm.dig_parm.prog_num = lvct->program_num; |
|---|
| 213 | break; |
|---|
| 214 | |
|---|
| 215 | default: |
|---|
| 216 | SI_DBG_PRINT(E_SI_ERR_MSG,("Unknown modulation mode from LVCT table %d!!!\n", lvct->mod_mode)); |
|---|
| 217 | SI_Channel_Map[i].chan_type = SI_API_CHAN_UNKNOWN; |
|---|
| 218 | break; |
|---|
| 219 | } |
|---|
| 220 | } |
|---|
| 221 | i++; |
|---|
| 222 | lvct = SI_LST_D_NEXT(lvct, chan_link); |
|---|
| 223 | } |
|---|
| 224 | if (svct || i!= *len) |
|---|
| 225 | SI_DBG_PRINT(E_SI_WRN_MSG,("LVCT length does not agree with Total_LVCT_Channels!!!\n")); |
|---|
| 226 | |
|---|
| 227 | SI_mutex_unlock(m_lvct); |
|---|
| 228 | } |
|---|
| 229 | |
|---|
| 230 | *chan = SI_Channel_Map; |
|---|
| 231 | |
|---|
| 232 | return 0; |
|---|
| 233 | } |
|---|