blob: 172a7e45a6e69e5032bc79821c4cc1dc52a99579 [file] [log] [blame]
Yves Godin660709d2016-05-19 11:08:03 +02001/* NuRAN Wireless Litecell 1.5 L1 API related definitions */
2
3/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com>
4 * based on:
5 * sysmobts.c
6 * (C) 2011 by Harald Welte <laforge@gnumonks.org>
7 *
8 * All Rights Reserved
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU Affero General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU Affero General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 *
23 */
24
25#include <nrw/litecell15/litecell15.h>
26#include <nrw/litecell15/gsml1const.h>
27#include <nrw/litecell15/gsml1dbg.h>
28
29#include "lc15bts.h"
30
31enum l1prim_type lc15bts_get_l1prim_type(GsmL1_PrimId_t id)
32{
33 switch (id) {
34 case GsmL1_PrimId_MphInitReq: return L1P_T_REQ;
35 case GsmL1_PrimId_MphCloseReq: return L1P_T_REQ;
36 case GsmL1_PrimId_MphConnectReq: return L1P_T_REQ;
37 case GsmL1_PrimId_MphDisconnectReq: return L1P_T_REQ;
38 case GsmL1_PrimId_MphActivateReq: return L1P_T_REQ;
39 case GsmL1_PrimId_MphDeactivateReq: return L1P_T_REQ;
40 case GsmL1_PrimId_MphConfigReq: return L1P_T_REQ;
41 case GsmL1_PrimId_MphMeasureReq: return L1P_T_REQ;
42 case GsmL1_PrimId_MphInitCnf: return L1P_T_CONF;
43 case GsmL1_PrimId_MphCloseCnf: return L1P_T_CONF;
44 case GsmL1_PrimId_MphConnectCnf: return L1P_T_CONF;
45 case GsmL1_PrimId_MphDisconnectCnf: return L1P_T_CONF;
46 case GsmL1_PrimId_MphActivateCnf: return L1P_T_CONF;
47 case GsmL1_PrimId_MphDeactivateCnf: return L1P_T_CONF;
48 case GsmL1_PrimId_MphConfigCnf: return L1P_T_CONF;
49 case GsmL1_PrimId_MphMeasureCnf: return L1P_T_CONF;
50 case GsmL1_PrimId_PhEmptyFrameReq: return L1P_T_REQ;
51 case GsmL1_PrimId_PhDataReq: return L1P_T_REQ;
52 case GsmL1_PrimId_MphTimeInd: return L1P_T_IND;
53 case GsmL1_PrimId_MphSyncInd: return L1P_T_IND;
54 case GsmL1_PrimId_PhConnectInd: return L1P_T_IND;
55 case GsmL1_PrimId_PhReadyToSendInd: return L1P_T_IND;
56 case GsmL1_PrimId_PhDataInd: return L1P_T_IND;
57 case GsmL1_PrimId_PhRaInd: return L1P_T_IND;
58 default: return L1P_T_INVALID;
59 }
60}
61
62const struct value_string lc15bts_l1prim_names[GsmL1_PrimId_NUM+1] = {
63 { GsmL1_PrimId_MphInitReq, "MPH-INIT.req" },
64 { GsmL1_PrimId_MphCloseReq, "MPH-CLOSE.req" },
65 { GsmL1_PrimId_MphConnectReq, "MPH-CONNECT.req" },
66 { GsmL1_PrimId_MphDisconnectReq,"MPH-DISCONNECT.req" },
67 { GsmL1_PrimId_MphActivateReq, "MPH-ACTIVATE.req" },
68 { GsmL1_PrimId_MphDeactivateReq,"MPH-DEACTIVATE.req" },
69 { GsmL1_PrimId_MphConfigReq, "MPH-CONFIG.req" },
70 { GsmL1_PrimId_MphMeasureReq, "MPH-MEASURE.req" },
71 { GsmL1_PrimId_MphInitCnf, "MPH-INIT.conf" },
72 { GsmL1_PrimId_MphCloseCnf, "MPH-CLOSE.conf" },
73 { GsmL1_PrimId_MphConnectCnf, "MPH-CONNECT.conf" },
74 { GsmL1_PrimId_MphDisconnectCnf,"MPH-DISCONNECT.conf" },
75 { GsmL1_PrimId_MphActivateCnf, "MPH-ACTIVATE.conf" },
76 { GsmL1_PrimId_MphDeactivateCnf,"MPH-DEACTIVATE.conf" },
77 { GsmL1_PrimId_MphConfigCnf, "MPH-CONFIG.conf" },
78 { GsmL1_PrimId_MphMeasureCnf, "MPH-MEASURE.conf" },
79 { GsmL1_PrimId_MphTimeInd, "MPH-TIME.ind" },
80 { GsmL1_PrimId_MphSyncInd, "MPH-SYNC.ind" },
81 { GsmL1_PrimId_PhEmptyFrameReq, "PH-EMPTY_FRAME.req" },
82 { GsmL1_PrimId_PhDataReq, "PH-DATA.req" },
83 { GsmL1_PrimId_PhConnectInd, "PH-CONNECT.ind" },
84 { GsmL1_PrimId_PhReadyToSendInd,"PH-READY_TO_SEND.ind" },
85 { GsmL1_PrimId_PhDataInd, "PH-DATA.ind" },
86 { GsmL1_PrimId_PhRaInd, "PH-RA.ind" },
87 { 0, NULL }
88};
89
90GsmL1_PrimId_t lc15bts_get_l1prim_conf(GsmL1_PrimId_t id)
91{
92 switch (id) {
93 case GsmL1_PrimId_MphInitReq: return GsmL1_PrimId_MphInitCnf;
94 case GsmL1_PrimId_MphCloseReq: return GsmL1_PrimId_MphCloseCnf;
95 case GsmL1_PrimId_MphConnectReq: return GsmL1_PrimId_MphConnectCnf;
96 case GsmL1_PrimId_MphDisconnectReq: return GsmL1_PrimId_MphDisconnectCnf;
97 case GsmL1_PrimId_MphActivateReq: return GsmL1_PrimId_MphActivateCnf;
98 case GsmL1_PrimId_MphDeactivateReq: return GsmL1_PrimId_MphDeactivateCnf;
99 case GsmL1_PrimId_MphConfigReq: return GsmL1_PrimId_MphConfigCnf;
100 case GsmL1_PrimId_MphMeasureReq: return GsmL1_PrimId_MphMeasureCnf;
101 default: return -1; // Weak
102 }
103}
104
105enum l1prim_type lc15bts_get_sysprim_type(Litecell15_PrimId_t id)
106{
107 switch (id) {
108 case Litecell15_PrimId_SystemInfoReq: return L1P_T_REQ;
109 case Litecell15_PrimId_SystemInfoCnf: return L1P_T_CONF;
110 case Litecell15_PrimId_SystemFailureInd: return L1P_T_IND;
111 case Litecell15_PrimId_ActivateRfReq: return L1P_T_REQ;
112 case Litecell15_PrimId_ActivateRfCnf: return L1P_T_CONF;
113 case Litecell15_PrimId_DeactivateRfReq: return L1P_T_REQ;
114 case Litecell15_PrimId_DeactivateRfCnf: return L1P_T_CONF;
115 case Litecell15_PrimId_SetTraceFlagsReq: return L1P_T_REQ;
116 case Litecell15_PrimId_Layer1ResetReq: return L1P_T_REQ;
117 case Litecell15_PrimId_Layer1ResetCnf: return L1P_T_CONF;
118 case Litecell15_PrimId_SetCalibTblReq: return L1P_T_REQ;
119 case Litecell15_PrimId_SetCalibTblCnf: return L1P_T_CONF;
120 case Litecell15_PrimId_MuteRfReq: return L1P_T_REQ;
121 case Litecell15_PrimId_MuteRfCnf: return L1P_T_CONF;
122 case Litecell15_PrimId_SetRxAttenReq: return L1P_T_REQ;
123 case Litecell15_PrimId_SetRxAttenCnf: return L1P_T_CONF;
124 default: return L1P_T_INVALID;
125 }
126}
127
128const struct value_string lc15bts_sysprim_names[Litecell15_PrimId_NUM+1] = {
129 { Litecell15_PrimId_SystemInfoReq, "SYSTEM-INFO.req" },
130 { Litecell15_PrimId_SystemInfoCnf, "SYSTEM-INFO.conf" },
131 { Litecell15_PrimId_SystemFailureInd, "SYSTEM-FAILURE.ind" },
132 { Litecell15_PrimId_ActivateRfReq, "ACTIVATE-RF.req" },
133 { Litecell15_PrimId_ActivateRfCnf, "ACTIVATE-RF.conf" },
134 { Litecell15_PrimId_DeactivateRfReq, "DEACTIVATE-RF.req" },
135 { Litecell15_PrimId_DeactivateRfCnf, "DEACTIVATE-RF.conf" },
136 { Litecell15_PrimId_SetTraceFlagsReq, "SET-TRACE-FLAGS.req" },
137 { Litecell15_PrimId_Layer1ResetReq, "LAYER1-RESET.req" },
138 { Litecell15_PrimId_Layer1ResetCnf, "LAYER1-RESET.conf" },
139 { Litecell15_PrimId_SetCalibTblReq, "SET-CALIB.req" },
140 { Litecell15_PrimId_SetCalibTblCnf, "SET-CALIB.cnf" },
141 { Litecell15_PrimId_MuteRfReq, "MUTE-RF.req" },
142 { Litecell15_PrimId_MuteRfCnf, "MUTE-RF.cnf" },
143 { Litecell15_PrimId_SetRxAttenReq, "SET-RX-ATTEN.req" },
144 { Litecell15_PrimId_SetRxAttenCnf, "SET-RX-ATTEN-CNF.cnf" },
145 { 0, NULL }
146};
147
148Litecell15_PrimId_t lc15bts_get_sysprim_conf(Litecell15_PrimId_t id)
149{
150 switch (id) {
151 case Litecell15_PrimId_SystemInfoReq: return Litecell15_PrimId_SystemInfoCnf;
152 case Litecell15_PrimId_ActivateRfReq: return Litecell15_PrimId_ActivateRfCnf;
153 case Litecell15_PrimId_DeactivateRfReq: return Litecell15_PrimId_DeactivateRfCnf;
154 case Litecell15_PrimId_Layer1ResetReq: return Litecell15_PrimId_Layer1ResetCnf;
155 case Litecell15_PrimId_SetCalibTblReq: return Litecell15_PrimId_SetCalibTblCnf;
156 case Litecell15_PrimId_MuteRfReq: return Litecell15_PrimId_MuteRfCnf;
157 case Litecell15_PrimId_SetRxAttenReq: return Litecell15_PrimId_SetRxAttenCnf;
158 default: return -1; // Weak
159 }
160}
161
162const struct value_string lc15bts_l1sapi_names[GsmL1_Sapi_NUM+1] = {
163 { GsmL1_Sapi_Idle, "IDLE" },
164 { GsmL1_Sapi_Fcch, "FCCH" },
165 { GsmL1_Sapi_Sch, "SCH" },
166 { GsmL1_Sapi_Sacch, "SACCH" },
167 { GsmL1_Sapi_Sdcch, "SDCCH" },
168 { GsmL1_Sapi_Bcch, "BCCH" },
169 { GsmL1_Sapi_Pch, "PCH" },
170 { GsmL1_Sapi_Agch, "AGCH" },
171 { GsmL1_Sapi_Cbch, "CBCH" },
172 { GsmL1_Sapi_Rach, "RACH" },
173 { GsmL1_Sapi_TchF, "TCH/F" },
174 { GsmL1_Sapi_FacchF, "FACCH/F" },
175 { GsmL1_Sapi_TchH, "TCH/H" },
176 { GsmL1_Sapi_FacchH, "FACCH/H" },
177 { GsmL1_Sapi_Nch, "NCH" },
178 { GsmL1_Sapi_Pdtch, "PDTCH" },
179 { GsmL1_Sapi_Pacch, "PACCH" },
180 { GsmL1_Sapi_Pbcch, "PBCCH" },
181 { GsmL1_Sapi_Pagch, "PAGCH" },
182 { GsmL1_Sapi_Ppch, "PPCH" },
183 { GsmL1_Sapi_Pnch, "PNCH" },
184 { GsmL1_Sapi_Ptcch, "PTCCH" },
185 { GsmL1_Sapi_Prach, "PRACH" },
186 { 0, NULL }
187};
188
189const struct value_string lc15bts_l1status_names[GSML1_STATUS_NUM+1] = {
190 { GsmL1_Status_Success, "Success" },
191 { GsmL1_Status_Generic, "Generic error" },
192 { GsmL1_Status_NoMemory, "Not enough memory" },
193 { GsmL1_Status_Timeout, "Timeout" },
194 { GsmL1_Status_InvalidParam, "Invalid parameter" },
195 { GsmL1_Status_Busy, "Resource busy" },
196 { GsmL1_Status_NoRessource, "No more resources" },
197 { GsmL1_Status_Uninitialized, "Trying to use uninitialized resource" },
198 { GsmL1_Status_NullInterface, "Trying to call a NULL interface" },
199 { GsmL1_Status_NullFctnPtr, "Trying to call a NULL function ptr" },
200 { GsmL1_Status_BadCrc, "Bad CRC" },
201 { GsmL1_Status_BadUsf, "Bad USF" },
202 { GsmL1_Status_InvalidCPS, "Invalid CPS field" },
203 { GsmL1_Status_UnexpectedBurst, "Unexpected burst" },
204 { GsmL1_Status_UnavailCodec, "AMR codec is unavailable" },
205 { GsmL1_Status_CriticalError, "Critical error" },
206 { GsmL1_Status_OverheatError, "Overheat error" },
207 { GsmL1_Status_DeviceError, "Device error" },
208 { GsmL1_Status_FacchError, "FACCH / TCH order error" },
209 { GsmL1_Status_AlreadyDeactivated, "Lchan already deactivated" },
210 { GsmL1_Status_TxBurstFifoOvrn, "FIFO overrun" },
211 { GsmL1_Status_TxBurstFifoUndr, "FIFO underrun" },
212 { GsmL1_Status_NotSynchronized, "Not synchronized" },
213 { GsmL1_Status_Unsupported, "Unsupported feature" },
214 { GsmL1_Status_ClockError, "System clock error" },
215 { 0, NULL }
216};
217
218const struct value_string lc15bts_tracef_names[29] = {
219 { DBG_DEBUG, "DEBUG" },
220 { DBG_L1WARNING, "L1_WARNING" },
221 { DBG_ERROR, "ERROR" },
222 { DBG_L1RXMSG, "L1_RX_MSG" },
223 { DBG_L1RXMSGBYTE, "L1_RX_MSG_BYTE" },
224 { DBG_L1TXMSG, "L1_TX_MSG" },
225 { DBG_L1TXMSGBYTE, "L1_TX_MSG_BYTE" },
226 { DBG_MPHCNF, "MPH_CNF" },
227 { DBG_MPHIND, "MPH_IND" },
228 { DBG_MPHREQ, "MPH_REQ" },
229 { DBG_PHIND, "PH_IND" },
230 { DBG_PHREQ, "PH_REQ" },
231 { DBG_PHYRF, "PHY_RF" },
232 { DBG_PHYRFMSGBYTE, "PHY_MSG_BYTE" },
233 { DBG_MODE, "MODE" },
234 { DBG_TDMAINFO, "TDMA_INFO" },
235 { DBG_BADCRC, "BAD_CRC" },
236 { DBG_PHINDBYTE, "PH_IND_BYTE" },
237 { DBG_PHREQBYTE, "PH_REQ_BYTE" },
238 { DBG_DEVICEMSG, "DEVICE_MSG" },
239 { DBG_RACHINFO, "RACH_INFO" },
240 { DBG_LOGCHINFO, "LOG_CH_INFO" },
241 { DBG_MEMORY, "MEMORY" },
242 { DBG_PROFILING, "PROFILING" },
243 { DBG_TESTCOMMENT, "TEST_COMMENT" },
244 { DBG_TEST, "TEST" },
245 { DBG_STATUS, "STATUS" },
246 { 0, NULL }
247};
248
249const struct value_string lc15bts_tracef_docs[29] = {
250 { DBG_DEBUG, "Debug Region" },
251 { DBG_L1WARNING, "L1 Warning Region" },
252 { DBG_ERROR, "Error Region" },
253 { DBG_L1RXMSG, "L1_RX_MSG Region" },
254 { DBG_L1RXMSGBYTE, "L1_RX_MSG_BYTE Region" },
255 { DBG_L1TXMSG, "L1_TX_MSG Region" },
256 { DBG_L1TXMSGBYTE, "L1_TX_MSG_BYTE Region" },
257 { DBG_MPHCNF, "MphConfirmation Region" },
258 { DBG_MPHIND, "MphIndication Region" },
259 { DBG_MPHREQ, "MphRequest Region" },
260 { DBG_PHIND, "PhIndication Region" },
261 { DBG_PHREQ, "PhRequest Region" },
262 { DBG_PHYRF, "PhyRF Region" },
263 { DBG_PHYRFMSGBYTE, "PhyRF Message Region" },
264 { DBG_MODE, "Mode Region" },
265 { DBG_TDMAINFO, "TDMA Info Region" },
266 { DBG_BADCRC, "Bad CRC Region" },
267 { DBG_PHINDBYTE, "PH_IND_BYTE" },
268 { DBG_PHREQBYTE, "PH_REQ_BYTE" },
269 { DBG_DEVICEMSG, "Device Message Region" },
270 { DBG_RACHINFO, "RACH Info" },
271 { DBG_LOGCHINFO, "LOG_CH_INFO" },
272 { DBG_MEMORY, "Memory Region" },
273 { DBG_PROFILING, "Profiling Region" },
274 { DBG_TESTCOMMENT, "Test Comments" },
275 { DBG_TEST, "Test Region" },
276 { DBG_STATUS, "Status Region" },
277 { 0, NULL }
278};
279
280const struct value_string lc15bts_tch_pl_names[] = {
281 { GsmL1_TchPlType_NA, "N/A" },
282 { GsmL1_TchPlType_Fr, "FR" },
283 { GsmL1_TchPlType_Hr, "HR" },
284 { GsmL1_TchPlType_Efr, "EFR" },
285 { GsmL1_TchPlType_Amr, "AMR(IF2)" },
286 { GsmL1_TchPlType_Amr_SidBad, "AMR(SID BAD)" },
287 { GsmL1_TchPlType_Amr_Onset, "AMR(ONSET)" },
288 { GsmL1_TchPlType_Amr_Ratscch, "AMR(RATSCCH)" },
289 { GsmL1_TchPlType_Amr_SidUpdateInH, "AMR(SID_UPDATE INH)" },
290 { GsmL1_TchPlType_Amr_SidFirstP1, "AMR(SID_FIRST P1)" },
291 { GsmL1_TchPlType_Amr_SidFirstP2, "AMR(SID_FIRST P2)" },
292 { GsmL1_TchPlType_Amr_SidFirstInH, "AMR(SID_FIRST INH)" },
293 { GsmL1_TchPlType_Amr_RatscchMarker, "AMR(RATSCCH MARK)" },
294 { GsmL1_TchPlType_Amr_RatscchData, "AMR(RATSCCH DATA)" },
295 { 0, NULL }
296};
297
298const struct value_string lc15bts_dir_names[] = {
299 { GsmL1_Dir_TxDownlink, "TxDL" },
300 { GsmL1_Dir_TxUplink, "TxUL" },
301 { GsmL1_Dir_RxUplink, "RxUL" },
302 { GsmL1_Dir_RxDownlink, "RxDL" },
303 { GsmL1_Dir_TxDownlink|GsmL1_Dir_RxUplink, "BOTH" },
304 { 0, NULL }
305};
306
307const struct value_string lc15bts_chcomb_names[] = {
308 { GsmL1_LogChComb_0, "dummy" },
309 { GsmL1_LogChComb_I, "tch_f" },
310 { GsmL1_LogChComb_II, "tch_h" },
311 { GsmL1_LogChComb_IV, "ccch" },
312 { GsmL1_LogChComb_V, "ccch_sdcch4" },
313 { GsmL1_LogChComb_VII, "sdcch8" },
314 { GsmL1_LogChComb_XIII, "pdtch" },
315 { 0, NULL }
316};
317
318const uint8_t pdch_msu_size[_NUM_PDCH_CS] = {
319 [PDCH_CS_1] = 23,
320 [PDCH_CS_2] = 34,
321 [PDCH_CS_3] = 40,
322 [PDCH_CS_4] = 54,
323 [PDCH_MCS_1] = 27,
324 [PDCH_MCS_2] = 33,
325 [PDCH_MCS_3] = 42,
326 [PDCH_MCS_4] = 49,
327 [PDCH_MCS_5] = 60,
328 [PDCH_MCS_6] = 78,
329 [PDCH_MCS_7] = 118,
330 [PDCH_MCS_8] = 142,
331 [PDCH_MCS_9] = 154
332};