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