blob: 5ab63a696042e48dbc431d0768b6a340bb6a359e [file] [log] [blame]
Piotr Krysik70c25a12017-01-03 08:01:23 +01001/*
2 * Copyright (C) 2011-2016 Sylvain Munaut <tnt@246tNt.com>
3 * Copyright (C) 2016 sysmocom s.f.m.c. GmbH
4 *
5 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22#include <stdint.h>
23#include <osmocom/core/conv.h>
24
25static const uint8_t xcch_state[][2] = {
26 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
27 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
28 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
29 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
30};
31
32static const uint8_t xcch_output[][2] = {
33 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
34 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
35 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
36 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
37};
38
39/**
40 * xCCH convolutional code:
41 * 228 bits blocks, rate 1/2, k = 5
42 * G0 = 1 + D3 + D4
43 * G1 = 1 + D + D3 + D4
44 */
45const struct osmo_conv_code gsm0503_xcch = {
46 .N = 2,
47 .K = 5,
48 .len = 224,
49 .next_output = xcch_output,
50 .next_state = xcch_state,
51};
52
53static const uint8_t rach_state[][2] = {
54 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
55 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
56 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
57 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
58};
59
60static const uint8_t rach_output[][2] = {
61 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
62 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
63 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
64 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
65};
66
67/**
68 * RACH convolutional code
69 */
70const struct osmo_conv_code gsm0503_rach = {
71 .N = 2,
72 .K = 5,
73 .len = 14,
74 .next_output = rach_output,
75 .next_state = rach_state,
76};
77
78static const uint8_t sch_state[][2] = {
79 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
80 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
81 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
82 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
83};
84
85static const uint8_t sch_output[][2] = {
86 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
87 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
88 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
89 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
90};
91
92/**
93 * SCH convolutional code
94 */
95const struct osmo_conv_code gsm0503_sch = {
96 .N = 2,
97 .K = 5,
98 .len = 35,
99 .next_output = sch_output,
100 .next_state = sch_state,
101};
102
103static const uint8_t cs2_state[][2] = {
104 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
105 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
106 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
107 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
108};
109
110static const uint8_t cs2_output[][2] = {
111 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
112 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
113 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
114 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
115};
116
117static const int cs2_puncture[] = {
118 15, 19, 23, 27, 31, 35, 43, 47, 51, 55, 59, 63,
119 67, 71, 75, 79, 83, 91, 95, 99, 103, 107, 111, 115,
120 119, 123, 127, 131, 139, 143, 147, 151, 155, 159, 163, 167,
121 171, 175, 179, 187, 191, 195, 199, 203, 207, 211, 215, 219,
122 223, 227, 235, 239, 243, 247, 251, 255, 259, 263, 267, 271,
123 275, 283, 287, 291, 295, 299, 303, 307, 311, 315, 319, 323,
124 331, 335, 339, 343, 347, 351, 355, 359, 363, 367, 371, 379,
125 383, 387, 391, 395, 399, 403, 407, 411, 415, 419, 427, 431,
126 435, 439, 443, 447, 451, 455, 459, 463, 467, 475, 479, 483,
127 487, 491, 495, 499, 503, 507, 511, 515, 523, 527, 531, 535,
128 539, 543, 547, 551, 555, 559, 563, 571, 575, 579, 583, 587,
129 -1,
130};
131
132/**
133 * CS2 convolutional code:
134 * G0 = 1 + D3 + D4
135 * G1 = 1 + D + D3 + D4
136 */
137const struct osmo_conv_code gsm0503_cs2 = {
138 .N = 2,
139 .K = 5,
140 .len = 290,
141 .next_output = cs2_output,
142 .next_state = cs2_state,
143 .puncture = cs2_puncture,
144};
145
146static const uint8_t cs3_state[][2] = {
147 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
148 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
149 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
150 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
151};
152
153static const uint8_t cs3_output[][2] = {
154 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
155 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
156 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
157 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
158};
159
160static const int cs3_puncture[] = {
161 15, 17, 21, 23, 27, 29, 33, 35, 39, 41, 45, 47,
162 51, 53, 57, 59, 63, 65, 69, 71, 75, 77, 81, 83,
163 87, 89, 93, 95, 99, 101, 105, 107, 111, 113, 117, 119,
164 123, 125, 129, 131, 135, 137, 141, 143, 147, 149, 153, 155,
165 159, 161, 165, 167, 171, 173, 177, 179, 183, 185, 189, 191,
166 195, 197, 201, 203, 207, 209, 213, 215, 219, 221, 225, 227,
167 231, 233, 237, 239, 243, 245, 249, 251, 255, 257, 261, 263,
168 267, 269, 273, 275, 279, 281, 285, 287, 291, 293, 297, 299,
169 303, 305, 309, 311, 315, 317, 321, 323, 327, 329, 333, 335,
170 339, 341, 345, 347, 351, 353, 357, 359, 363, 365, 369, 371,
171 375, 377, 381, 383, 387, 389, 393, 395, 399, 401, 405, 407,
172 411, 413, 417, 419, 423, 425, 429, 431, 435, 437, 441, 443,
173 447, 449, 453, 455, 459, 461, 465, 467, 471, 473, 477, 479,
174 483, 485, 489, 491, 495, 497, 501, 503, 507, 509, 513, 515,
175 519, 521, 525, 527, 531, 533, 537, 539, 543, 545, 549, 551,
176 555, 557, 561, 563, 567, 569, 573, 575, 579, 581, 585, 587,
177 591, 593, 597, 599, 603, 605, 609, 611, 615, 617, 621, 623,
178 627, 629, 633, 635, 639, 641, 645, 647, 651, 653, 657, 659,
179 663, 665, 669, 671, -1,
180};
181
182/**
183 * CS3 convolutional code:
184 * G0 = 1 + D3 + D4
185 * G1 = 1 + D + D3 + D4
186 */
187const struct osmo_conv_code gsm0503_cs3 = {
188 .N = 2,
189 .K = 5,
190 .len = 334,
191 .next_output = cs3_output,
192 .next_state = cs3_state,
193 .puncture = cs3_puncture,
194};
195
196static const uint8_t tch_afs_12_2_state[][2] = {
197 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
198 { 9, 8 }, { 11, 10 }, { 13, 12 }, { 15, 14 },
199 { 1, 0 }, { 3, 2 }, { 5, 4 }, { 7, 6 },
200 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
201};
202
203static const uint8_t tch_afs_12_2_output[][2] = {
204 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
205 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
206 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
207 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
208};
209
210static const uint8_t tch_afs_12_2_term_state[] = {
211 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
212 8, 10, 12, 14,
213};
214
215static const uint8_t tch_afs_12_2_term_output[] = {
216 0, 1, 0, 1, 3, 2, 3, 2, 3, 2, 3, 2,
217 0, 1, 0, 1,
218};
219
220static const int tch_afs_12_2_puncture[] = {
221 321, 325, 329, 333, 337, 341, 345, 349, 353, 357, 361, 363,
222 365, 369, 373, 377, 379, 381, 385, 389, 393, 395, 397, 401,
223 405, 409, 411, 413, 417, 421, 425, 427, 429, 433, 437, 441,
224 443, 445, 449, 453, 457, 459, 461, 465, 469, 473, 475, 477,
225 481, 485, 489, 491, 493, 495, 497, 499, 501, 503, 505, 507,
226 -1,
227};
228
229/**
230 * TCH/AFS 12.2 kbits convolutional code:
231 * 250 bits block, rate 1/2, punctured
232 * G0/G0 = 1
233 * G1/G0 = 1 + D + D3 + D4 / 1 + D3 + D4
234 */
235const struct osmo_conv_code gsm0503_tch_afs_12_2 = {
236 .N = 2,
237 .K = 5,
238 .len = 250,
239 .next_output = tch_afs_12_2_output,
240 .next_state = tch_afs_12_2_state,
241 .next_term_output = tch_afs_12_2_term_output,
242 .next_term_state = tch_afs_12_2_term_state,
243 .puncture = tch_afs_12_2_puncture,
244};
245
246static const uint8_t tch_afs_10_2_state[][2] = {
247 { 0, 1 }, { 3, 2 }, { 5, 4 }, { 6, 7 },
248 { 9, 8 }, { 10, 11 }, { 12, 13 }, { 15, 14 },
249 { 1, 0 }, { 2, 3 }, { 4, 5 }, { 7, 6 },
250 { 8, 9 }, { 11, 10 }, { 13, 12 }, { 14, 15 },
251};
252
253static const uint8_t tch_afs_10_2_output[][2] = {
254 { 0, 7 }, { 2, 5 }, { 4, 3 }, { 6, 1 },
255 { 2, 5 }, { 0, 7 }, { 6, 1 }, { 4, 3 },
256 { 0, 7 }, { 2, 5 }, { 4, 3 }, { 6, 1 },
257 { 2, 5 }, { 0, 7 }, { 6, 1 }, { 4, 3 },
258};
259
260static const uint8_t tch_afs_10_2_term_state[] = {
261 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
262 8, 10, 12, 14,
263};
264
265static const uint8_t tch_afs_10_2_term_output[] = {
266 0, 5, 3, 6, 5, 0, 6, 3, 7, 2, 4, 1,
267 2, 7, 1, 4,
268};
269
270static const int tch_afs_10_2_puncture[] = {
271 1, 4, 7, 10, 16, 19, 22, 28, 31, 34, 40, 43,
272 46, 52, 55, 58, 64, 67, 70, 76, 79, 82, 88, 91,
273 94, 100, 103, 106, 112, 115, 118, 124, 127, 130, 136, 139,
274 142, 148, 151, 154, 160, 163, 166, 172, 175, 178, 184, 187,
275 190, 196, 199, 202, 208, 211, 214, 220, 223, 226, 232, 235,
276 238, 244, 247, 250, 256, 259, 262, 268, 271, 274, 280, 283,
277 286, 292, 295, 298, 304, 307, 310, 316, 319, 322, 325, 328,
278 331, 334, 337, 340, 343, 346, 349, 352, 355, 358, 361, 364,
279 367, 370, 373, 376, 379, 382, 385, 388, 391, 394, 397, 400,
280 403, 406, 409, 412, 415, 418, 421, 424, 427, 430, 433, 436,
281 439, 442, 445, 448, 451, 454, 457, 460, 463, 466, 469, 472,
282 475, 478, 481, 484, 487, 490, 493, 496, 499, 502, 505, 508,
283 511, 514, 517, 520, 523, 526, 529, 532, 535, 538, 541, 544,
284 547, 550, 553, 556, 559, 562, 565, 568, 571, 574, 577, 580,
285 583, 586, 589, 592, 595, 598, 601, 604, 607, 609, 610, 613,
286 616, 619, 621, 622, 625, 627, 628, 631, 633, 634, 636, 637,
287 639, 640, -1,
288};
289
290/**
291 * TCH/AFS 10.2 kbits convolutional code:
292 * G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
293 * G2/G3 = 1 + D2 + D4 / 1 + D + D2 + D3 + D4
294 * G3/G3 = 1
295 */
296const struct osmo_conv_code gsm0503_tch_afs_10_2 = {
297 .N = 3,
298 .K = 5,
299 .len = 210,
300 .next_output = tch_afs_10_2_output,
301 .next_state = tch_afs_10_2_state,
302 .next_term_output = tch_afs_10_2_term_output,
303 .next_term_state = tch_afs_10_2_term_state,
304 .puncture = tch_afs_10_2_puncture,
305};
306
307static const uint8_t tch_afs_7_95_state[][2] = {
308 { 0, 1 }, { 2, 3 }, { 5, 4 }, { 7, 6 },
309 { 9, 8 }, { 11, 10 }, { 12, 13 }, { 14, 15 },
310 { 16, 17 }, { 18, 19 }, { 21, 20 }, { 23, 22 },
311 { 25, 24 }, { 27, 26 }, { 28, 29 }, { 30, 31 },
312 { 33, 32 }, { 35, 34 }, { 36, 37 }, { 38, 39 },
313 { 40, 41 }, { 42, 43 }, { 45, 44 }, { 47, 46 },
314 { 49, 48 }, { 51, 50 }, { 52, 53 }, { 54, 55 },
315 { 56, 57 }, { 58, 59 }, { 61, 60 }, { 63, 62 },
316 { 1, 0 }, { 3, 2 }, { 4, 5 }, { 6, 7 },
317 { 8, 9 }, { 10, 11 }, { 13, 12 }, { 15, 14 },
318 { 17, 16 }, { 19, 18 }, { 20, 21 }, { 22, 23 },
319 { 24, 25 }, { 26, 27 }, { 29, 28 }, { 31, 30 },
320 { 32, 33 }, { 34, 35 }, { 37, 36 }, { 39, 38 },
321 { 41, 40 }, { 43, 42 }, { 44, 45 }, { 46, 47 },
322 { 48, 49 }, { 50, 51 }, { 53, 52 }, { 55, 54 },
323 { 57, 56 }, { 59, 58 }, { 60, 61 }, { 62, 63 },
324};
325
326static const uint8_t tch_afs_7_95_output[][2] = {
327 { 0, 7 }, { 3, 4 }, { 2, 5 }, { 1, 6 },
328 { 2, 5 }, { 1, 6 }, { 0, 7 }, { 3, 4 },
329 { 3, 4 }, { 0, 7 }, { 1, 6 }, { 2, 5 },
330 { 1, 6 }, { 2, 5 }, { 3, 4 }, { 0, 7 },
331 { 3, 4 }, { 0, 7 }, { 1, 6 }, { 2, 5 },
332 { 1, 6 }, { 2, 5 }, { 3, 4 }, { 0, 7 },
333 { 0, 7 }, { 3, 4 }, { 2, 5 }, { 1, 6 },
334 { 2, 5 }, { 1, 6 }, { 0, 7 }, { 3, 4 },
335 { 0, 7 }, { 3, 4 }, { 2, 5 }, { 1, 6 },
336 { 2, 5 }, { 1, 6 }, { 0, 7 }, { 3, 4 },
337 { 3, 4 }, { 0, 7 }, { 1, 6 }, { 2, 5 },
338 { 1, 6 }, { 2, 5 }, { 3, 4 }, { 0, 7 },
339 { 3, 4 }, { 0, 7 }, { 1, 6 }, { 2, 5 },
340 { 1, 6 }, { 2, 5 }, { 3, 4 }, { 0, 7 },
341 { 0, 7 }, { 3, 4 }, { 2, 5 }, { 1, 6 },
342 { 2, 5 }, { 1, 6 }, { 0, 7 }, { 3, 4 },
343};
344
345static const uint8_t tch_afs_7_95_term_state[] = {
346 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,
347 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
348 48, 50, 52, 54, 56, 58, 60, 62, 0, 2, 4, 6,
349 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
350 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
351 56, 58, 60, 62,
352};
353
354static const uint8_t tch_afs_7_95_term_output[] = {
355 0, 3, 5, 6, 5, 6, 0, 3, 3, 0, 6, 5,
356 6, 5, 3, 0, 4, 7, 1, 2, 1, 2, 4, 7,
357 7, 4, 2, 1, 2, 1, 7, 4, 7, 4, 2, 1,
358 2, 1, 7, 4, 4, 7, 1, 2, 1, 2, 4, 7,
359 3, 0, 6, 5, 6, 5, 3, 0, 0, 3, 5, 6,
360 5, 6, 0, 3,
361};
362
363static const int tch_afs_7_95_puncture[] = {
364 1, 2, 4, 5, 8, 22, 70, 118, 166, 214, 262, 310,
365 317, 319, 325, 332, 334, 341, 343, 349, 356, 358, 365, 367,
366 373, 380, 382, 385, 389, 391, 397, 404, 406, 409, 413, 415,
367 421, 428, 430, 433, 437, 439, 445, 452, 454, 457, 461, 463,
368 469, 476, 478, 481, 485, 487, 490, 493, 500, 502, 503, 505,
369 506, 508, 509, 511, 512, -1,
370};
371
372/**
373 * TCH/AFS 7.95 kbits convolutional code:
374 * G4/G4 = 1
375 * G5/G4 = 1 + D + D4 + D6 / 1 + D2 + D3 + D5 + D6
376 * G6/G4 = 1 + D + D2 + D3 + D4 + D6 / 1 + D2 + D3 + D5 + D6
377 */
378const struct osmo_conv_code gsm0503_tch_afs_7_95 = {
379 .N = 3,
380 .K = 7,
381 .len = 165,
382 .next_output = tch_afs_7_95_output,
383 .next_state = tch_afs_7_95_state,
384 .next_term_output = tch_afs_7_95_term_output,
385 .next_term_state = tch_afs_7_95_term_state,
386 .puncture = tch_afs_7_95_puncture,
387};
388
389static const uint8_t tch_afs_7_4_state[][2] = {
390 { 0, 1 }, { 3, 2 }, { 5, 4 }, { 6, 7 },
391 { 9, 8 }, { 10, 11 }, { 12, 13 }, { 15, 14 },
392 { 1, 0 }, { 2, 3 }, { 4, 5 }, { 7, 6 },
393 { 8, 9 }, { 11, 10 }, { 13, 12 }, { 14, 15 },
394};
395
396static const uint8_t tch_afs_7_4_output[][2] = {
397 { 0, 7 }, { 2, 5 }, { 4, 3 }, { 6, 1 },
398 { 2, 5 }, { 0, 7 }, { 6, 1 }, { 4, 3 },
399 { 0, 7 }, { 2, 5 }, { 4, 3 }, { 6, 1 },
400 { 2, 5 }, { 0, 7 }, { 6, 1 }, { 4, 3 },
401};
402
403static const uint8_t tch_afs_7_4_term_state[] = {
404 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
405 8, 10, 12, 14,
406};
407
408static const uint8_t tch_afs_7_4_term_output[] = {
409 0, 5, 3, 6, 5, 0, 6, 3, 7, 2, 4, 1,
410 2, 7, 1, 4,
411};
412
413static const int tch_afs_7_4_puncture[] = {
414 0, 355, 361, 367, 373, 379, 385, 391, 397, 403, 409, 415,
415 421, 427, 433, 439, 445, 451, 457, 460, 463, 466, 468, 469,
416 471, 472, -1,
417};
418
419/**
420 * TCH/AFS 7.4 kbits convolutional code:
421 * G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
422 * G2/G3 = 1 + D2 + D4 / 1 + D + D2 + D3 + D4
423 * G3/G3 = 1
424 */
425const struct osmo_conv_code gsm0503_tch_afs_7_4 = {
426 .N = 3,
427 .K = 5,
428 .len = 154,
429 .next_output = tch_afs_7_4_output,
430 .next_state = tch_afs_7_4_state,
431 .next_term_output = tch_afs_7_4_term_output,
432 .next_term_state = tch_afs_7_4_term_state,
433 .puncture = tch_afs_7_4_puncture,
434};
435
436static const uint8_t tch_afs_6_7_state[][2] = {
437 { 0, 1 }, { 3, 2 }, { 5, 4 }, { 6, 7 },
438 { 9, 8 }, { 10, 11 }, { 12, 13 }, { 15, 14 },
439 { 1, 0 }, { 2, 3 }, { 4, 5 }, { 7, 6 },
440 { 8, 9 }, { 11, 10 }, { 13, 12 }, { 14, 15 },
441};
442
443static const uint8_t tch_afs_6_7_output[][2] = {
444 { 0, 15 }, { 4, 11 }, { 8, 7 }, { 12, 3 },
445 { 4, 11 }, { 0, 15 }, { 12, 3 }, { 8, 7 },
446 { 0, 15 }, { 4, 11 }, { 8, 7 }, { 12, 3 },
447 { 4, 11 }, { 0, 15 }, { 12, 3 }, { 8, 7 },
448};
449
450static const uint8_t tch_afs_6_7_term_state[] = {
451 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
452 8, 10, 12, 14,
453};
454
455static const uint8_t tch_afs_6_7_term_output[] = {
456 0, 11, 7, 12, 11, 0, 12, 7, 15, 4, 8, 3,
457 4, 15, 3, 8,
458};
459
460static const int tch_afs_6_7_puncture[] = {
461 1, 3, 7, 11, 15, 27, 39, 55, 67, 79, 95, 107,
462 119, 135, 147, 159, 175, 187, 199, 215, 227, 239, 255, 267,
463 279, 287, 291, 295, 299, 303, 307, 311, 315, 319, 323, 327,
464 331, 335, 339, 343, 347, 351, 355, 359, 363, 367, 369, 371,
465 375, 377, 379, 383, 385, 387, 391, 393, 395, 399, 401, 403,
466 407, 409, 411, 415, 417, 419, 423, 425, 427, 431, 433, 435,
467 439, 441, 443, 447, 449, 451, 455, 457, 459, 463, 465, 467,
468 471, 473, 475, 479, 481, 483, 487, 489, 491, 495, 497, 499,
469 503, 505, 507, 511, 513, 515, 519, 521, 523, 527, 529, 531,
470 535, 537, 539, 543, 545, 547, 549, 551, 553, 555, 557, 559,
471 561, 563, 565, 567, 569, 571, 573, 575, -1,
472};
473
474/**
475 * TCH/AFS 6.7 kbits convolutional code:
476 * G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
477 * G2/G3 = 1 + D2 + D4 / 1 + D + D2 + D3 + D4
478 * G3/G3 = 1
479 * G3/G3 = 1
480 */
481const struct osmo_conv_code gsm0503_tch_afs_6_7 = {
482 .N = 4,
483 .K = 5,
484 .len = 140,
485 .next_output = tch_afs_6_7_output,
486 .next_state = tch_afs_6_7_state,
487 .next_term_output = tch_afs_6_7_term_output,
488 .next_term_state = tch_afs_6_7_term_state,
489 .puncture = tch_afs_6_7_puncture,
490};
491
492static const uint8_t tch_afs_5_9_state[][2] = {
493 { 0, 1 }, { 3, 2 }, { 5, 4 }, { 6, 7 },
494 { 9, 8 }, { 10, 11 }, { 12, 13 }, { 15, 14 },
495 { 17, 16 }, { 18, 19 }, { 20, 21 }, { 23, 22 },
496 { 24, 25 }, { 27, 26 }, { 29, 28 }, { 30, 31 },
497 { 32, 33 }, { 35, 34 }, { 37, 36 }, { 38, 39 },
498 { 41, 40 }, { 42, 43 }, { 44, 45 }, { 47, 46 },
499 { 49, 48 }, { 50, 51 }, { 52, 53 }, { 55, 54 },
500 { 56, 57 }, { 59, 58 }, { 61, 60 }, { 62, 63 },
501 { 1, 0 }, { 2, 3 }, { 4, 5 }, { 7, 6 },
502 { 8, 9 }, { 11, 10 }, { 13, 12 }, { 14, 15 },
503 { 16, 17 }, { 19, 18 }, { 21, 20 }, { 22, 23 },
504 { 25, 24 }, { 26, 27 }, { 28, 29 }, { 31, 30 },
505 { 33, 32 }, { 34, 35 }, { 36, 37 }, { 39, 38 },
506 { 40, 41 }, { 43, 42 }, { 45, 44 }, { 46, 47 },
507 { 48, 49 }, { 51, 50 }, { 53, 52 }, { 54, 55 },
508 { 57, 56 }, { 58, 59 }, { 60, 61 }, { 63, 62 },
509};
510
511static const uint8_t tch_afs_5_9_output[][2] = {
512 { 0, 15 }, { 8, 7 }, { 4, 11 }, { 12, 3 },
513 { 4, 11 }, { 12, 3 }, { 0, 15 }, { 8, 7 },
514 { 8, 7 }, { 0, 15 }, { 12, 3 }, { 4, 11 },
515 { 12, 3 }, { 4, 11 }, { 8, 7 }, { 0, 15 },
516 { 8, 7 }, { 0, 15 }, { 12, 3 }, { 4, 11 },
517 { 12, 3 }, { 4, 11 }, { 8, 7 }, { 0, 15 },
518 { 0, 15 }, { 8, 7 }, { 4, 11 }, { 12, 3 },
519 { 4, 11 }, { 12, 3 }, { 0, 15 }, { 8, 7 },
520 { 0, 15 }, { 8, 7 }, { 4, 11 }, { 12, 3 },
521 { 4, 11 }, { 12, 3 }, { 0, 15 }, { 8, 7 },
522 { 8, 7 }, { 0, 15 }, { 12, 3 }, { 4, 11 },
523 { 12, 3 }, { 4, 11 }, { 8, 7 }, { 0, 15 },
524 { 8, 7 }, { 0, 15 }, { 12, 3 }, { 4, 11 },
525 { 12, 3 }, { 4, 11 }, { 8, 7 }, { 0, 15 },
526 { 0, 15 }, { 8, 7 }, { 4, 11 }, { 12, 3 },
527 { 4, 11 }, { 12, 3 }, { 0, 15 }, { 8, 7 },
528};
529
530static const uint8_t tch_afs_5_9_term_state[] = {
531 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,
532 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
533 48, 50, 52, 54, 56, 58, 60, 62, 0, 2, 4, 6,
534 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
535 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
536 56, 58, 60, 62,
537};
538
539static const uint8_t tch_afs_5_9_term_output[] = {
540 0, 7, 11, 12, 11, 12, 0, 7, 7, 0, 12, 11,
541 12, 11, 7, 0, 8, 15, 3, 4, 3, 4, 8, 15,
542 15, 8, 4, 3, 4, 3, 15, 8, 15, 8, 4, 3,
543 4, 3, 15, 8, 8, 15, 3, 4, 3, 4, 8, 15,
544 7, 0, 12, 11, 12, 11, 7, 0, 0, 7, 11, 12,
545 11, 12, 0, 7,
546};
547
548static const int tch_afs_5_9_puncture[] = {
549 0, 1, 3, 5, 7, 11, 15, 31, 47, 63, 79, 95,
550 111, 127, 143, 159, 175, 191, 207, 223, 239, 255, 271, 287,
551 303, 319, 327, 331, 335, 343, 347, 351, 359, 363, 367, 375,
552 379, 383, 391, 395, 399, 407, 411, 415, 423, 427, 431, 439,
553 443, 447, 455, 459, 463, 467, 471, 475, 479, 483, 487, 491,
554 495, 499, 503, 507, 509, 511, 512, 513, 515, 516, 517, 519,
555 -1,
556};
557
558/**
559 * TCH/AFS 5.9 kbits convolutional code:
560 * 124 bits
561 * G4/G6 = 1 + D2 + D3 + D5 + D6 / 1 + D + D2 + D3 + D4 + D6
562 * G5/G6 = 1 + D + D4 + D6 / 1 + D + D2 + D3 + D4 + D6
563 * G6/G6 = 1
564 * G6/G6 = 1
565 */
566const struct osmo_conv_code gsm0503_tch_afs_5_9 = {
567 .N = 4,
568 .K = 7,
569 .len = 124,
570 .next_output = tch_afs_5_9_output,
571 .next_state = tch_afs_5_9_state,
572 .next_term_output = tch_afs_5_9_term_output,
573 .next_term_state = tch_afs_5_9_term_state,
574 .puncture = tch_afs_5_9_puncture,
575};
576
577static const uint8_t tch_afs_5_15_state[][2] = {
578 { 0, 1 }, { 3, 2 }, { 5, 4 }, { 6, 7 },
579 { 9, 8 }, { 10, 11 }, { 12, 13 }, { 15, 14 },
580 { 1, 0 }, { 2, 3 }, { 4, 5 }, { 7, 6 },
581 { 8, 9 }, { 11, 10 }, { 13, 12 }, { 14, 15 },
582};
583
584static const uint8_t tch_afs_5_15_output[][2] = {
585 { 0, 31 }, { 4, 27 }, { 24, 7 }, { 28, 3 },
586 { 4, 27 }, { 0, 31 }, { 28, 3 }, { 24, 7 },
587 { 0, 31 }, { 4, 27 }, { 24, 7 }, { 28, 3 },
588 { 4, 27 }, { 0, 31 }, { 28, 3 }, { 24, 7 },
589};
590
591static const uint8_t tch_afs_5_15_term_state[] = {
592 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
593 8, 10, 12, 14,
594};
595
596static const uint8_t tch_afs_5_15_term_output[] = {
597 0, 27, 7, 28, 27, 0, 28, 7, 31, 4, 24, 3,
598 4, 31, 3, 24,
599};
600
601static const int tch_afs_5_15_puncture[] = {
602 0, 4, 5, 9, 10, 14, 15, 20, 25, 30, 35, 40,
603 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160,
604 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280,
605 290, 300, 310, 315, 320, 325, 330, 334, 335, 340, 344, 345,
606 350, 354, 355, 360, 364, 365, 370, 374, 375, 380, 384, 385,
607 390, 394, 395, 400, 404, 405, 410, 414, 415, 420, 424, 425,
608 430, 434, 435, 440, 444, 445, 450, 454, 455, 460, 464, 465,
609 470, 474, 475, 480, 484, 485, 490, 494, 495, 500, 504, 505,
610 510, 514, 515, 520, 524, 525, 529, 530, 534, 535, 539, 540,
611 544, 545, 549, 550, 554, 555, 559, 560, 564, -1,
612};
613
614/**
615 * TCH/AFS 5.15 kbits convolutional code:
616 * G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
617 * G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
618 * G2/G3 = 1 + D2 + D4 / 1 + D + D2 + D3 + D4
619 * G3/G3 = 1
620 * G3/G3 = 1
621 */
622const struct osmo_conv_code gsm0503_tch_afs_5_15 = {
623 .N = 5,
624 .K = 5,
625 .len = 109,
626 .next_output = tch_afs_5_15_output,
627 .next_state = tch_afs_5_15_state,
628 .next_term_output = tch_afs_5_15_term_output,
629 .next_term_state = tch_afs_5_15_term_state,
630 .puncture = tch_afs_5_15_puncture,
631};
632
633static const uint8_t tch_afs_4_75_state[][2] = {
634 { 0, 1 }, { 3, 2 }, { 5, 4 }, { 6, 7 },
635 { 9, 8 }, { 10, 11 }, { 12, 13 }, { 15, 14 },
636 { 17, 16 }, { 18, 19 }, { 20, 21 }, { 23, 22 },
637 { 24, 25 }, { 27, 26 }, { 29, 28 }, { 30, 31 },
638 { 32, 33 }, { 35, 34 }, { 37, 36 }, { 38, 39 },
639 { 41, 40 }, { 42, 43 }, { 44, 45 }, { 47, 46 },
640 { 49, 48 }, { 50, 51 }, { 52, 53 }, { 55, 54 },
641 { 56, 57 }, { 59, 58 }, { 61, 60 }, { 62, 63 },
642 { 1, 0 }, { 2, 3 }, { 4, 5 }, { 7, 6 },
643 { 8, 9 }, { 11, 10 }, { 13, 12 }, { 14, 15 },
644 { 16, 17 }, { 19, 18 }, { 21, 20 }, { 22, 23 },
645 { 25, 24 }, { 26, 27 }, { 28, 29 }, { 31, 30 },
646 { 33, 32 }, { 34, 35 }, { 36, 37 }, { 39, 38 },
647 { 40, 41 }, { 43, 42 }, { 45, 44 }, { 46, 47 },
648 { 48, 49 }, { 51, 50 }, { 53, 52 }, { 54, 55 },
649 { 57, 56 }, { 58, 59 }, { 60, 61 }, { 63, 62 },
650};
651
652static const uint8_t tch_afs_4_75_output[][2] = {
653 { 0, 31 }, { 24, 7 }, { 4, 27 }, { 28, 3 },
654 { 4, 27 }, { 28, 3 }, { 0, 31 }, { 24, 7 },
655 { 24, 7 }, { 0, 31 }, { 28, 3 }, { 4, 27 },
656 { 28, 3 }, { 4, 27 }, { 24, 7 }, { 0, 31 },
657 { 24, 7 }, { 0, 31 }, { 28, 3 }, { 4, 27 },
658 { 28, 3 }, { 4, 27 }, { 24, 7 }, { 0, 31 },
659 { 0, 31 }, { 24, 7 }, { 4, 27 }, { 28, 3 },
660 { 4, 27 }, { 28, 3 }, { 0, 31 }, { 24, 7 },
661 { 0, 31 }, { 24, 7 }, { 4, 27 }, { 28, 3 },
662 { 4, 27 }, { 28, 3 }, { 0, 31 }, { 24, 7 },
663 { 24, 7 }, { 0, 31 }, { 28, 3 }, { 4, 27 },
664 { 28, 3 }, { 4, 27 }, { 24, 7 }, { 0, 31 },
665 { 24, 7 }, { 0, 31 }, { 28, 3 }, { 4, 27 },
666 { 28, 3 }, { 4, 27 }, { 24, 7 }, { 0, 31 },
667 { 0, 31 }, { 24, 7 }, { 4, 27 }, { 28, 3 },
668 { 4, 27 }, { 28, 3 }, { 0, 31 }, { 24, 7 },
669};
670
671static const uint8_t tch_afs_4_75_term_state[] = {
672 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,
673 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
674 48, 50, 52, 54, 56, 58, 60, 62, 0, 2, 4, 6,
675 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
676 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
677 56, 58, 60, 62,
678};
679
680static const uint8_t tch_afs_4_75_term_output[] = {
681 0, 7, 27, 28, 27, 28, 0, 7, 7, 0, 28, 27,
682 28, 27, 7, 0, 24, 31, 3, 4, 3, 4, 24, 31,
683 31, 24, 4, 3, 4, 3, 31, 24, 31, 24, 4, 3,
684 4, 3, 31, 24, 24, 31, 3, 4, 3, 4, 24, 31,
685 7, 0, 28, 27, 28, 27, 7, 0, 0, 7, 27, 28,
686 27, 28, 0, 7,
687};
688
689static const int tch_afs_4_75_puncture[] = {
690 0, 1, 2, 4, 5, 7, 9, 15, 25, 35, 45, 55,
691 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175,
692 185, 195, 205, 215, 225, 235, 245, 255, 265, 275, 285, 295,
693 305, 315, 325, 335, 345, 355, 365, 375, 385, 395, 400, 405,
694 410, 415, 420, 425, 430, 435, 440, 445, 450, 455, 459, 460,
695 465, 470, 475, 479, 480, 485, 490, 495, 499, 500, 505, 509,
696 510, 515, 517, 519, 520, 522, 524, 525, 526, 527, 529, 530,
697 531, 532, 534, -1,
698};
699
700/**
701 * TCH/AFS 4.75 kbits convolutional code:
702 * G4/G6 = 1 + D2 + D3 + D5 + D6 / 1 + D + D2 + D3 + D4 + D6
703 * G4/G6 = 1 + D2 + D3 + D5 + D6 / 1 + D + D2 + D3 + D4 + D6
704 * G5/G6 = 1 + D + D4 + D6 / 1 + D + D2 + D3 + D4 + D6
705 * G6/G6 = 1
706 * G6/G6 = 1
707 */
708const struct osmo_conv_code gsm0503_tch_afs_4_75 = {
709 .N = 5,
710 .K = 7,
711 .len = 101,
712 .next_output = tch_afs_4_75_output,
713 .next_state = tch_afs_4_75_state,
714 .next_term_output = tch_afs_4_75_term_output,
715 .next_term_state = tch_afs_4_75_term_state,
716 .puncture = tch_afs_4_75_puncture,
717};
718
719static const uint8_t tch_fr_state[][2] = {
720 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
721 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
722 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
723 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
724};
725
726static const uint8_t tch_fr_output[][2] = {
727 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
728 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
729 { 3, 0 }, { 2, 1 }, { 3, 0 }, { 2, 1 },
730 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
731};
732
733/**
734 * TCH/F convolutional code
735 */
736const struct osmo_conv_code gsm0503_tch_fr = {
737 .N = 2,
738 .K = 5,
739 .len = 185,
740 .next_output = tch_fr_output,
741 .next_state = tch_fr_state,
742};
743
744static const uint8_t tch_hr_state[][2] = {
745 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
746 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
747 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
748 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
749 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
750 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
751 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
752 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
753 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
754 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
755 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
756 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
757 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
758 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
759 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
760 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
761};
762
763static const uint8_t tch_hr_output[][2] = {
764 { 0, 7 }, { 3, 4 }, { 5, 2 }, { 6, 1 },
765 { 5, 2 }, { 6, 1 }, { 0, 7 }, { 3, 4 },
766 { 3, 4 }, { 0, 7 }, { 6, 1 }, { 5, 2 },
767 { 6, 1 }, { 5, 2 }, { 3, 4 }, { 0, 7 },
768 { 4, 3 }, { 7, 0 }, { 1, 6 }, { 2, 5 },
769 { 1, 6 }, { 2, 5 }, { 4, 3 }, { 7, 0 },
770 { 7, 0 }, { 4, 3 }, { 2, 5 }, { 1, 6 },
771 { 2, 5 }, { 1, 6 }, { 7, 0 }, { 4, 3 },
772 { 7, 0 }, { 4, 3 }, { 2, 5 }, { 1, 6 },
773 { 2, 5 }, { 1, 6 }, { 7, 0 }, { 4, 3 },
774 { 4, 3 }, { 7, 0 }, { 1, 6 }, { 2, 5 },
775 { 1, 6 }, { 2, 5 }, { 4, 3 }, { 7, 0 },
776 { 3, 4 }, { 0, 7 }, { 6, 1 }, { 5, 2 },
777 { 6, 1 }, { 5, 2 }, { 3, 4 }, { 0, 7 },
778 { 0, 7 }, { 3, 4 }, { 5, 2 }, { 6, 1 },
779 { 5, 2 }, { 6, 1 }, { 0, 7 }, { 3, 4 },
780};
781
782static const int tch_hr_puncture[] = {
783 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34,
784 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70,
785 73, 76, 79, 82, 85, 88, 91, 94, 97, 100, 103, 106,
786 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142,
787 145, 148, 151, 154, 157, 160, 163, 166, 169, 172, 175, 178,
788 181, 184, 187, 190, 193, 196, 199, 202, 205, 208, 211, 214,
789 217, 220, 223, 226, 229, 232, 235, 238, 241, 244, 247, 250,
790 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 295,
791 298, 301, 304, 307, 310, -1,
792};
793
794/**
795 * TCH/H convolutional code
796 */
797const struct osmo_conv_code gsm0503_tch_hr = {
798 .N = 3,
799 .K = 7,
800 .len = 98,
801 .next_output = tch_hr_output,
802 .next_state = tch_hr_state,
803 .puncture = tch_hr_puncture,
804};
805
806static const uint8_t tch_ahs_7_95_state[][2] = {
807 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
808 { 9, 8 }, { 11, 10 }, { 13, 12 }, { 15, 14 },
809 { 1, 0 }, { 3, 2 }, { 5, 4 }, { 7, 6 },
810 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
811};
812
813static const uint8_t tch_ahs_7_95_output[][2] = {
814 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
815 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
816 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
817 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
818};
819
820static const uint8_t tch_ahs_7_95_term_state[] = {
821 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
822 8, 10, 12, 14,
823};
824
825static const uint8_t tch_ahs_7_95_term_output[] = {
826 0, 1, 0, 1, 3, 2, 3, 2, 3, 2, 3, 2,
827 0, 1, 0, 1,
828};
829
830static const int tch_ahs_7_95_puncture[] = {
831 1, 3, 5, 7, 11, 15, 19, 23, 27, 31, 35, 43,
832 47, 51, 55, 59, 63, 67, 71, 79, 83, 87, 91, 95,
833 99, 103, 107, 115, 119, 123, 127, 131, 135, 139, 143, 151,
834 155, 159, 163, 167, 171, 175, 177, 179, 183, 185, 187, 191,
835 193, 195, 197, 199, 203, 205, 207, 211, 213, 215, 219, 221,
836 223, 227, 229, 231, 233, 235, 239, 241, 243, 247, 249, 251,
837 255, 257, 259, 261, 263, 265, -1,
838};
839
840/**
841 * TCH/AHS 7.95 kbits convolutional code
842 */
843const struct osmo_conv_code gsm0503_tch_ahs_7_95 = {
844 .N = 2,
845 .K = 5,
846 .len = 129,
847 .next_output = tch_ahs_7_95_output,
848 .next_state = tch_ahs_7_95_state,
849 .next_term_output = tch_ahs_7_95_term_output,
850 .next_term_state = tch_ahs_7_95_term_state,
851 .puncture = tch_ahs_7_95_puncture,
852};
853
854static const uint8_t tch_ahs_7_4_state[][2] = {
855 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
856 { 9, 8 }, { 11, 10 }, { 13, 12 }, { 15, 14 },
857 { 1, 0 }, { 3, 2 }, { 5, 4 }, { 7, 6 },
858 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
859};
860
861static const uint8_t tch_ahs_7_4_output[][2] = {
862 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
863 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
864 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
865 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
866};
867
868static const uint8_t tch_ahs_7_4_term_state[] = {
869 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
870 8, 10, 12, 14,
871};
872
873static const uint8_t tch_ahs_7_4_term_output[] = {
874 0, 1, 0, 1, 3, 2, 3, 2, 3, 2, 3, 2,
875 0, 1, 0, 1,
876};
877
878static const int tch_ahs_7_4_puncture[] = {
879 1, 3, 7, 11, 19, 23, 27, 35, 39, 43, 51, 55,
880 59, 67, 71, 75, 83, 87, 91, 99, 103, 107, 115, 119,
881 123, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171,
882 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219,
883 221, 223, 227, 229, 231, 235, 237, 239, 243, 245, 247, 251,
884 253, 255, 257, 259, -1,
885};
886
887/**
888 * TCH/AHS 7.4 kbits convolutional code
889 */
890const struct osmo_conv_code gsm0503_tch_ahs_7_4 = {
891 .N = 2,
892 .K = 5,
893 .len = 126,
894 .next_output = tch_ahs_7_4_output,
895 .next_state = tch_ahs_7_4_state,
896 .next_term_output = tch_ahs_7_4_term_output,
897 .next_term_state = tch_ahs_7_4_term_state,
898 .puncture = tch_ahs_7_4_puncture,
899};
900
901static const uint8_t tch_ahs_6_7_state[][2] = {
902 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
903 { 9, 8 }, { 11, 10 }, { 13, 12 }, { 15, 14 },
904 { 1, 0 }, { 3, 2 }, { 5, 4 }, { 7, 6 },
905 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
906};
907
908static const uint8_t tch_ahs_6_7_output[][2] = {
909 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
910 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
911 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
912 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
913};
914
915static const uint8_t tch_ahs_6_7_term_state[] = {
916 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
917 8, 10, 12, 14,
918};
919
920static const uint8_t tch_ahs_6_7_term_output[] = {
921 0, 1, 0, 1, 3, 2, 3, 2, 3, 2, 3, 2,
922 0, 1, 0, 1,
923};
924
925static const int tch_ahs_6_7_puncture[] = {
926 1, 3, 9, 19, 29, 39, 49, 59, 69, 79, 89, 99,
927 109, 119, 129, 139, 149, 159, 167, 169, 177, 179, 187, 189,
928 197, 199, 203, 207, 209, 213, 217, 219, 223, 227, 229, 231,
929 233, 235, 237, 239, -1,
930};
931
932/**
933 * TCH/AHS 6.7 kbits convolutional code
934 */
935const struct osmo_conv_code gsm0503_tch_ahs_6_7 = {
936 .N = 2,
937 .K = 5,
938 .len = 116,
939 .next_output = tch_ahs_6_7_output,
940 .next_state = tch_ahs_6_7_state,
941 .next_term_output = tch_ahs_6_7_term_output,
942 .next_term_state = tch_ahs_6_7_term_state,
943 .puncture = tch_ahs_6_7_puncture,
944};
945
946static const uint8_t tch_ahs_5_9_state[][2] = {
947 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
948 { 9, 8 }, { 11, 10 }, { 13, 12 }, { 15, 14 },
949 { 1, 0 }, { 3, 2 }, { 5, 4 }, { 7, 6 },
950 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
951};
952
953static const uint8_t tch_ahs_5_9_output[][2] = {
954 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
955 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
956 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
957 { 0, 3 }, { 1, 2 }, { 0, 3 }, { 1, 2 },
958};
959
960static const uint8_t tch_ahs_5_9_term_state[] = {
961 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
962 8, 10, 12, 14,
963};
964
965static const uint8_t tch_ahs_5_9_term_output[] = {
966 0, 1, 0, 1, 3, 2, 3, 2, 3, 2, 3, 2,
967 0, 1, 0, 1,
968};
969
970static const int tch_ahs_5_9_puncture[] = {
971 1, 15, 71, 127, 139, 151, 163, 175, 187, 195, 203, 211,
972 215, 219, 221, 223, -1,
973};
974
975/**
976 * TCH/AHS 5.9 kbits convolutional code
977 */
978const struct osmo_conv_code gsm0503_tch_ahs_5_9 = {
979 .N = 2,
980 .K = 5,
981 .len = 108,
982 .next_output = tch_ahs_5_9_output,
983 .next_state = tch_ahs_5_9_state,
984 .next_term_output = tch_ahs_5_9_term_output,
985 .next_term_state = tch_ahs_5_9_term_state,
986 .puncture = tch_ahs_5_9_puncture,
987};
988
989static const uint8_t tch_ahs_5_15_state[][2] = {
990 { 0, 1 }, { 3, 2 }, { 5, 4 }, { 6, 7 },
991 { 9, 8 }, { 10, 11 }, { 12, 13 }, { 15, 14 },
992 { 1, 0 }, { 2, 3 }, { 4, 5 }, { 7, 6 },
993 { 8, 9 }, { 11, 10 }, { 13, 12 }, { 14, 15 },
994};
995
996static const uint8_t tch_ahs_5_15_output[][2] = {
997 { 0, 7 }, { 2, 5 }, { 4, 3 }, { 6, 1 },
998 { 2, 5 }, { 0, 7 }, { 6, 1 }, { 4, 3 },
999 { 0, 7 }, { 2, 5 }, { 4, 3 }, { 6, 1 },
1000 { 2, 5 }, { 0, 7 }, { 6, 1 }, { 4, 3 },
1001};
1002
1003static const uint8_t tch_ahs_5_15_term_state[] = {
1004 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
1005 8, 10, 12, 14,
1006};
1007
1008static const uint8_t tch_ahs_5_15_term_output[] = {
1009 0, 5, 3, 6, 5, 0, 6, 3, 7, 2, 4, 1,
1010 2, 7, 1, 4,
1011};
1012
1013static const int tch_ahs_5_15_puncture[] = {
1014 0, 1, 3, 4, 6, 9, 12, 15, 18, 21, 27, 33,
1015 39, 45, 51, 54, 57, 63, 69, 75, 81, 87, 90, 93,
1016 99, 105, 111, 117, 123, 126, 129, 135, 141, 147, 153, 159,
1017 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195,
1018 198, 201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231,
1019 234, 237, 240, 243, 244, 246, 249, 252, 255, 256, 258, 261,
1020 264, 267, 268, 270, 273, 276, 279, 280, 282, 285, 288, 289,
1021 291, 294, 295, 297, 298, 300, 301, -1,
1022};
1023
1024/**
1025 * TCH/AHS 5.15 kbits convolutional code
1026 */
1027const struct osmo_conv_code gsm0503_tch_ahs_5_15 = {
1028 .N = 3,
1029 .K = 5,
1030 .len = 97,
1031 .next_output = tch_ahs_5_15_output,
1032 .next_state = tch_ahs_5_15_state,
1033 .next_term_output = tch_ahs_5_15_term_output,
1034 .next_term_state = tch_ahs_5_15_term_state,
1035 .puncture = tch_ahs_5_15_puncture,
1036};
1037
1038static const uint8_t tch_ahs_4_75_state[][2] = {
1039 { 0, 1 }, { 2, 3 }, { 5, 4 }, { 7, 6 },
1040 { 9, 8 }, { 11, 10 }, { 12, 13 }, { 14, 15 },
1041 { 16, 17 }, { 18, 19 }, { 21, 20 }, { 23, 22 },
1042 { 25, 24 }, { 27, 26 }, { 28, 29 }, { 30, 31 },
1043 { 33, 32 }, { 35, 34 }, { 36, 37 }, { 38, 39 },
1044 { 40, 41 }, { 42, 43 }, { 45, 44 }, { 47, 46 },
1045 { 49, 48 }, { 51, 50 }, { 52, 53 }, { 54, 55 },
1046 { 56, 57 }, { 58, 59 }, { 61, 60 }, { 63, 62 },
1047 { 1, 0 }, { 3, 2 }, { 4, 5 }, { 6, 7 },
1048 { 8, 9 }, { 10, 11 }, { 13, 12 }, { 15, 14 },
1049 { 17, 16 }, { 19, 18 }, { 20, 21 }, { 22, 23 },
1050 { 24, 25 }, { 26, 27 }, { 29, 28 }, { 31, 30 },
1051 { 32, 33 }, { 34, 35 }, { 37, 36 }, { 39, 38 },
1052 { 41, 40 }, { 43, 42 }, { 44, 45 }, { 46, 47 },
1053 { 48, 49 }, { 50, 51 }, { 53, 52 }, { 55, 54 },
1054 { 57, 56 }, { 59, 58 }, { 60, 61 }, { 62, 63 },
1055};
1056
1057static const uint8_t tch_ahs_4_75_output[][2] = {
1058 { 0, 7 }, { 3, 4 }, { 2, 5 }, { 1, 6 },
1059 { 2, 5 }, { 1, 6 }, { 0, 7 }, { 3, 4 },
1060 { 3, 4 }, { 0, 7 }, { 1, 6 }, { 2, 5 },
1061 { 1, 6 }, { 2, 5 }, { 3, 4 }, { 0, 7 },
1062 { 3, 4 }, { 0, 7 }, { 1, 6 }, { 2, 5 },
1063 { 1, 6 }, { 2, 5 }, { 3, 4 }, { 0, 7 },
1064 { 0, 7 }, { 3, 4 }, { 2, 5 }, { 1, 6 },
1065 { 2, 5 }, { 1, 6 }, { 0, 7 }, { 3, 4 },
1066 { 0, 7 }, { 3, 4 }, { 2, 5 }, { 1, 6 },
1067 { 2, 5 }, { 1, 6 }, { 0, 7 }, { 3, 4 },
1068 { 3, 4 }, { 0, 7 }, { 1, 6 }, { 2, 5 },
1069 { 1, 6 }, { 2, 5 }, { 3, 4 }, { 0, 7 },
1070 { 3, 4 }, { 0, 7 }, { 1, 6 }, { 2, 5 },
1071 { 1, 6 }, { 2, 5 }, { 3, 4 }, { 0, 7 },
1072 { 0, 7 }, { 3, 4 }, { 2, 5 }, { 1, 6 },
1073 { 2, 5 }, { 1, 6 }, { 0, 7 }, { 3, 4 },
1074};
1075
1076static const uint8_t tch_ahs_4_75_term_state[] = {
1077 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,
1078 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
1079 48, 50, 52, 54, 56, 58, 60, 62, 0, 2, 4, 6,
1080 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
1081 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
1082 56, 58, 60, 62,
1083};
1084
1085static const uint8_t tch_ahs_4_75_term_output[] = {
1086 0, 3, 5, 6, 5, 6, 0, 3, 3, 0, 6, 5,
1087 6, 5, 3, 0, 4, 7, 1, 2, 1, 2, 4, 7,
1088 7, 4, 2, 1, 2, 1, 7, 4, 7, 4, 2, 1,
1089 2, 1, 7, 4, 4, 7, 1, 2, 1, 2, 4, 7,
1090 3, 0, 6, 5, 6, 5, 3, 0, 0, 3, 5, 6,
1091 5, 6, 0, 3,
1092};
1093
1094static const int tch_ahs_4_75_puncture[] = {
1095 1, 2, 4, 5, 7, 8, 10, 13, 16, 22, 28, 34,
1096 40, 46, 52, 58, 64, 70, 76, 82, 88, 94, 100, 106,
1097 112, 118, 124, 130, 136, 142, 148, 151, 154, 160, 163, 166,
1098 172, 175, 178, 184, 187, 190, 196, 199, 202, 208, 211, 214,
1099 220, 223, 226, 232, 235, 238, 241, 244, 247, 250, 253, 256,
1100 259, 262, 265, 268, 271, 274, 275, 277, 278, 280, 281, 283,
1101 284, -1,
1102};
1103
1104/**
1105 * TCH/AHS 4.75 kbits convolutional code
1106 */
1107const struct osmo_conv_code gsm0503_tch_ahs_4_75 = {
1108 .N = 3,
1109 .K = 7,
1110 .len = 89,
1111 .next_output = tch_ahs_4_75_output,
1112 .next_state = tch_ahs_4_75_state,
1113 .next_term_output = tch_ahs_4_75_term_output,
1114 .next_term_state = tch_ahs_4_75_term_state,
1115 .puncture = tch_ahs_4_75_puncture,
1116};
1117
1118static const uint8_t mcs1_dl_hdr_state[][2] = {
1119 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1120 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1121 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1122 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1123 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1124 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1125 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1126 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1127 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1128 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1129 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1130 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1131 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1132 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1133 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1134 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1135};
1136
1137static const uint8_t mcs1_dl_hdr_output[][2] = {
1138 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1139 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1140 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1141 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1142 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1143 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1144 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1145 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1146 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1147 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1148 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1149 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1150 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1151 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1152 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1153 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1154};
1155
1156/**
1157 * EDGE MCS-1 DL header convolutional code:
1158 * 42 bits blocks, rate 1/3, k = 7
1159 * G4 = 1 + D2 + D3 + D5 + D6
1160 * G7 = 1 + D + D2 + D3 + D6
1161 * G5 = 1 + D + D4 + D6
1162 */
1163const struct osmo_conv_code gsm0503_mcs1_dl_hdr = {
1164 .N = 3,
1165 .K = 7,
1166 .len = 36,
1167 .next_output = mcs1_dl_hdr_output,
1168 .next_state = mcs1_dl_hdr_state,
1169 .term = CONV_TERM_TAIL_BITING,
1170};
1171
1172static const uint8_t mcs1_ul_hdr_state[][2] = {
1173 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1174 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1175 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1176 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1177 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1178 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1179 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1180 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1181 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1182 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1183 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1184 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1185 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1186 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1187 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1188 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1189};
1190
1191static const uint8_t mcs1_ul_hdr_output[][2] = {
1192 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1193 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1194 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1195 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1196 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1197 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1198 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1199 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1200 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1201 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1202 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1203 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1204 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1205 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1206 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1207 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1208};
1209
1210/**
1211 * EDGE MCS-1 UL header convolutional code:
1212 * 45 bits blocks, rate 1/3, k = 7
1213 * G4 = 1 + D2 + D3 + D5 + D6
1214 * G7 = 1 + D + D2 + D3 + D6
1215 * G5 = 1 + D + D4 + D6
1216 */
1217const struct osmo_conv_code gsm0503_mcs1_ul_hdr = {
1218 .N = 3,
1219 .K = 7,
1220 .len = 39,
1221 .next_output = mcs1_ul_hdr_output,
1222 .next_state = mcs1_ul_hdr_state,
1223 .term = CONV_TERM_TAIL_BITING,
1224};
1225
1226static const uint8_t mcs1_state[][2] = {
1227 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1228 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1229 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1230 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1231 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1232 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1233 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1234 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1235 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1236 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1237 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1238 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1239 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1240 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1241 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1242 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1243};
1244
1245static const uint8_t mcs1_output[][2] = {
1246 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1247 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1248 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1249 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1250 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1251 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1252 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1253 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1254 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1255 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1256 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1257 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1258 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1259 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1260 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1261 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1262};
1263
1264/**
1265 * EDGE MCS-1 data convolutional code:
1266 * 196 bits blocks, rate 1/3, k = 7
1267 * G4 = 1 + D2 + D3 + D5 + D6
1268 * G7 = 1 + D + D2 + D3 + D6
1269 * G5 = 1 + D + D4 + D6
1270 */
1271const struct osmo_conv_code gsm0503_mcs1 = {
1272 .N = 3,
1273 .K = 7,
1274 .len = 190,
1275 .next_output = mcs1_output,
1276 .next_state = mcs1_state,
1277};
1278
1279static const uint8_t mcs2_state[][2] = {
1280 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1281 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1282 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1283 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1284 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1285 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1286 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1287 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1288 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1289 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1290 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1291 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1292 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1293 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1294 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1295 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1296};
1297
1298static const uint8_t mcs2_output[][2] = {
1299 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1300 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1301 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1302 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1303 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1304 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1305 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1306 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1307 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1308 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1309 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1310 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1311 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1312 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1313 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1314 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1315};
1316
1317/**
1318 * EDGE MCS-2 data convolutional code:
1319 * 244 bits blocks, rate 1/3, k = 7
1320 * G4 = 1 + D2 + D3 + D5 + D6
1321 * G7 = 1 + D + D2 + D3 + D6
1322 * G5 = 1 + D + D4 + D6
1323 */
1324const struct osmo_conv_code gsm0503_mcs2 = {
1325 .N = 3,
1326 .K = 7,
1327 .len = 238,
1328 .next_output = mcs2_output,
1329 .next_state = mcs2_state,
1330};
1331
1332static const uint8_t mcs3_state[][2] = {
1333 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1334 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1335 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1336 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1337 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1338 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1339 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1340 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1341 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1342 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1343 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1344 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1345 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1346 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1347 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1348 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1349};
1350
1351static const uint8_t mcs3_output[][2] = {
1352 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1353 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1354 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1355 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1356 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1357 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1358 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1359 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1360 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1361 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1362 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1363 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1364 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1365 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1366 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1367 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1368};
1369
1370/**
1371 * EDGE MCS-3 data convolutional code:
1372 * 316 bits blocks, rate 1/3, k = 7
1373 * G4 = 1 + D2 + D3 + D5 + D6
1374 * G7 = 1 + D + D2 + D3 + D6
1375 * G5 = 1 + D + D4 + D6
1376 */
1377const struct osmo_conv_code gsm0503_mcs3 = {
1378 .N = 3,
1379 .K = 7,
1380 .len = 310,
1381 .next_output = mcs3_output,
1382 .next_state = mcs3_state,
1383};
1384
1385static const uint8_t mcs4_state[][2] = {
1386 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1387 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1388 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1389 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1390 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1391 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1392 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1393 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1394 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1395 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1396 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1397 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1398 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1399 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1400 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1401 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1402};
1403
1404static const uint8_t mcs4_output[][2] = {
1405 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1406 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1407 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1408 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1409 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1410 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1411 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1412 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1413 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1414 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1415 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1416 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1417 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1418 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1419 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1420 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1421};
1422
1423/**
1424 * EDGE MCS-4 data convolutional code:
1425 * 372 bits blocks, rate 1/3, k = 7
1426 * G4 = 1 + D2 + D3 + D5 + D6
1427 * G7 = 1 + D + D2 + D3 + D6
1428 * G5 = 1 + D + D4 + D6
1429 */
1430const struct osmo_conv_code gsm0503_mcs4 = {
1431 .N = 3,
1432 .K = 7,
1433 .len = 366,
1434 .next_output = mcs4_output,
1435 .next_state = mcs4_state,
1436};
1437
1438static const uint8_t mcs5_dl_hdr_state[][2] = {
1439 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1440 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1441 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1442 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1443 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1444 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1445 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1446 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1447 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1448 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1449 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1450 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1451 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1452 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1453 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1454 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1455};
1456
1457static const uint8_t mcs5_dl_hdr_output[][2] = {
1458 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1459 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1460 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1461 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1462 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1463 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1464 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1465 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1466 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1467 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1468 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1469 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1470 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1471 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1472 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1473 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1474};
1475
1476/**
1477 * EDGE MCS-5 DL header convolutional code:
1478 * 39 bits blocks, rate 1/3, k = 7
1479 * G4 = 1 + D2 + D3 + D5 + D6
1480 * G7 = 1 + D + D2 + D3 + D6
1481 * G5 = 1 + D + D4 + D6
1482 */
1483const struct osmo_conv_code gsm0503_mcs5_dl_hdr = {
1484 .N = 3,
1485 .K = 7,
1486 .len = 33,
1487 .next_output = mcs5_dl_hdr_output,
1488 .next_state = mcs5_dl_hdr_state,
1489 .term = CONV_TERM_TAIL_BITING,
1490};
1491
1492static const uint8_t mcs5_ul_hdr_state[][2] = {
1493 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1494 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1495 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1496 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1497 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1498 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1499 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1500 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1501 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1502 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1503 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1504 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1505 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1506 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1507 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1508 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1509};
1510
1511static const uint8_t mcs5_ul_hdr_output[][2] = {
1512 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1513 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1514 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1515 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1516 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1517 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1518 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1519 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1520 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1521 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1522 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1523 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1524 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1525 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1526 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1527 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1528};
1529
1530/**
1531 * EDGE MCS-5 UL header convolutional code:
1532 * 51 bits blocks, rate 1/3, k = 7
1533 * G4 = 1 + D2 + D3 + D5 + D6
1534 * G7 = 1 + D + D2 + D3 + D6
1535 * G5 = 1 + D + D4 + D6
1536 */
1537const struct osmo_conv_code gsm0503_mcs5_ul_hdr = {
1538 .N = 3,
1539 .K = 7,
1540 .len = 45,
1541 .next_output = mcs5_ul_hdr_output,
1542 .next_state = mcs5_ul_hdr_state,
1543 .term = CONV_TERM_TAIL_BITING,
1544};
1545
1546static const uint8_t mcs5_state[][2] = {
1547 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1548 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1549 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1550 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1551 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1552 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1553 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1554 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1555 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1556 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1557 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1558 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1559 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1560 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1561 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1562 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1563};
1564
1565static const uint8_t mcs5_output[][2] = {
1566 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1567 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1568 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1569 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1570 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1571 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1572 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1573 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1574 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1575 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1576 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1577 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1578 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1579 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1580 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1581 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1582};
1583
1584/**
1585 * EDGE MCS-5 data convolutional code:
1586 * 468 bits blocks, rate 1/3, k = 7
1587 * G4 = 1 + D2 + D3 + D5 + D6
1588 * G7 = 1 + D + D2 + D3 + D6
1589 * G5 = 1 + D + D4 + D6
1590 */
1591const struct osmo_conv_code gsm0503_mcs5 = {
1592 .N = 3,
1593 .K = 7,
1594 .len = 462,
1595 .next_output = mcs5_output,
1596 .next_state = mcs5_state,
1597};
1598
1599static const uint8_t mcs6_state[][2] = {
1600 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1601 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1602 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1603 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1604 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1605 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1606 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1607 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1608 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1609 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1610 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1611 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1612 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1613 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1614 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1615 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1616};
1617
1618static const uint8_t mcs6_output[][2] = {
1619 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1620 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1621 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1622 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1623 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1624 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1625 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1626 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1627 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1628 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1629 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1630 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1631 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1632 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1633 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1634 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1635};
1636
1637/**
1638 * EDGE MCS-6 data convolutional code:
1639 * 612 bits blocks, rate 1/3, k = 7
1640 * G4 = 1 + D2 + D3 + D5 + D6
1641 * G7 = 1 + D + D2 + D3 + D6
1642 * G5 = 1 + D + D4 + D6
1643 */
1644const struct osmo_conv_code gsm0503_mcs6 = {
1645 .N = 3,
1646 .K = 7,
1647 .len = 606,
1648 .next_output = mcs6_output,
1649 .next_state = mcs6_state,
1650};
1651
1652static const uint8_t mcs7_dl_hdr_state[][2] = {
1653 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1654 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1655 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1656 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1657 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1658 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1659 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1660 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1661 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1662 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1663 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1664 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1665 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1666 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1667 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1668 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1669};
1670
1671static const uint8_t mcs7_dl_hdr_output[][2] = {
1672 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1673 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1674 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1675 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1676 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1677 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1678 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1679 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1680 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1681 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1682 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1683 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1684 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1685 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1686 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1687 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1688};
1689
1690/**
1691 * EDGE MCS-7 DL header convolutional code:
1692 * 51 bits blocks, rate 1/3, k = 7
1693 * G4 = 1 + D2 + D3 + D5 + D6
1694 * G7 = 1 + D + D2 + D3 + D6
1695 * G5 = 1 + D + D4 + D6
1696 */
1697const struct osmo_conv_code gsm0503_mcs7_dl_hdr = {
1698 .N = 3,
1699 .K = 7,
1700 .len = 45,
1701 .next_output = mcs7_dl_hdr_output,
1702 .next_state = mcs7_dl_hdr_state,
1703 .term = CONV_TERM_TAIL_BITING,
1704};
1705
1706static const uint8_t mcs7_ul_hdr_state[][2] = {
1707 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1708 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1709 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1710 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1711 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1712 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1713 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1714 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1715 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1716 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1717 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1718 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1719 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1720 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1721 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1722 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1723};
1724
1725static const uint8_t mcs7_ul_hdr_output[][2] = {
1726 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1727 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1728 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1729 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1730 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1731 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1732 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1733 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1734 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1735 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1736 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1737 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1738 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1739 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1740 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1741 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1742};
1743
1744/**
1745 * EDGE MCS-7 UL header convolutional code:
1746 * 60 bits blocks, rate 1/3, k = 7
1747 * G4 = 1 + D2 + D3 + D5 + D6
1748 * G7 = 1 + D + D2 + D3 + D6
1749 * G5 = 1 + D + D4 + D6
1750 */
1751const struct osmo_conv_code gsm0503_mcs7_ul_hdr = {
1752 .N = 3,
1753 .K = 7,
1754 .len = 54,
1755 .next_output = mcs7_ul_hdr_output,
1756 .next_state = mcs7_ul_hdr_state,
1757 .term = CONV_TERM_TAIL_BITING,
1758};
1759
1760static const uint8_t mcs7_state[][2] = {
1761 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1762 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1763 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1764 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1765 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1766 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1767 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1768 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1769 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1770 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1771 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1772 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1773 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1774 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1775 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1776 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1777};
1778
1779static const uint8_t mcs7_output[][2] = {
1780 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1781 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1782 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1783 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1784 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1785 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1786 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1787 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1788 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1789 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1790 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1791 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1792 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1793 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1794 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1795 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1796};
1797
1798/**
1799 * EDGE MCS-7 data convolutional code:
1800 * 468 bits blocks, rate 1/3, k = 7
1801 * G4 = 1 + D2 + D3 + D5 + D6
1802 * G7 = 1 + D + D2 + D3 + D6
1803 * G5 = 1 + D + D4 + D6
1804 */
1805const struct osmo_conv_code gsm0503_mcs7 = {
1806 .N = 3,
1807 .K = 7,
1808 .len = 462,
1809 .next_output = mcs7_output,
1810 .next_state = mcs7_state,
1811};
1812
1813static const uint8_t mcs8_state[][2] = {
1814 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1815 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1816 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1817 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1818 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1819 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1820 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1821 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1822 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1823 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1824 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1825 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1826 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1827 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1828 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1829 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1830};
1831
1832static const uint8_t mcs8_output[][2] = {
1833 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1834 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1835 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1836 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1837 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1838 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1839 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1840 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1841 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1842 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1843 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1844 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1845 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1846 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1847 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1848 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1849};
1850
1851/**
1852 * EDGE MCS-8 data convolutional code:
1853 * 564 bits blocks, rate 1/3, k = 7
1854 * G4 = 1 + D2 + D3 + D5 + D6
1855 * G7 = 1 + D + D2 + D3 + D6
1856 * G5 = 1 + D + D4 + D6
1857 */
1858const struct osmo_conv_code gsm0503_mcs8 = {
1859 .N = 3,
1860 .K = 7,
1861 .len = 558,
1862 .next_output = mcs8_output,
1863 .next_state = mcs8_state,
1864};
1865
1866static const uint8_t mcs9_state[][2] = {
1867 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1868 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1869 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1870 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1871 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1872 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1873 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1874 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1875 { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
1876 { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
1877 { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
1878 { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
1879 { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
1880 { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
1881 { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
1882 { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
1883};
1884
1885static const uint8_t mcs9_output[][2] = {
1886 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1887 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1888 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1889 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1890 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1891 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1892 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1893 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1894 { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
1895 { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
1896 { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
1897 { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
1898 { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
1899 { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
1900 { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
1901 { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
1902};
1903
1904/**
1905 * EDGE MCS-9 data convolutional code:
1906 * 612 bits blocks, rate 1/3, k = 7
1907 * G4 = 1 + D2 + D3 + D5 + D6
1908 * G7 = 1 + D + D2 + D3 + D6
1909 * G5 = 1 + D + D4 + D6
1910 */
1911const struct osmo_conv_code gsm0503_mcs9 = {
1912 .N = 3,
1913 .K = 7,
1914 .len = 606,
1915 .next_output = mcs9_output,
1916 .next_state = mcs9_state,
1917};
1918