FreeCalypso > hg > gsm-net-reveng
annotate d144/atrau-parse.c @ 64:0364d77aca58
d144: generate hex version of Nokia TCSM2 A-TRAU capture
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 25 Sep 2024 18:57:54 +0000 |
parents | 323a4b75a32d |
children |
rev | line source |
---|---|
57
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This program reads a binary file containing a capture of 64 kbit/s output |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * of a TRAU in 14.4 kbit/s data mode. Per GSM specs this output is supposed |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * to contain A-TRAU frames of TS 48.020 chapter 11 (RAA' function); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * this program looks for such frames and parses them. |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 */ |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <sys/types.h> |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdio.h> |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdint.h> |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <stdlib.h> |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 static void |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 decode_ra2(ts_bytes, frame_bits) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 uint8_t *ts_bytes, *frame_bits; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 uint8_t *ip, *op; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 unsigned n; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 ip = ts_bytes; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 op = frame_bits; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 for (n = 0; n < 160; n++) { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 *op++ = (*ip & 0x80) >> 7; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 *op++ = (*ip & 0x40) >> 6; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 ip++; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 static int |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 check_sync_zeros(frame_bits) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 uint8_t *frame_bits; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 int i; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 for (i = 0; i < 16; i++) { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 if (frame_bits[i]) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 return 0; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 return 1; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 static unsigned |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 gather_nibble(bits) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 uint8_t *bits; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 unsigned n, acc; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 acc = 0; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 for (n = 0; n < 4; n++) { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 acc <<= 1; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 acc |= *bits++; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 return acc; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 static void |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 dump_subframe(bits) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 uint8_t *bits; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 unsigned n, d; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 printf(" %u ", *bits++); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 for (n = 0; n < 9; n++) { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 d = gather_nibble(bits); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 printf("%x", d); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 bits += 4; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 putchar('\n'); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 static void |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 dump_frame(frame_bits) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 uint8_t *frame_bits; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 unsigned n; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 |
58
a7ede064f883
atrau-parse: check sync one bit
Mychaela Falconia <falcon@freecalypso.org>
parents:
57
diff
changeset
|
77 if (!check_sync_zeros(frame_bits) || !frame_bits[16]) |
57
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 printf(" Bad sync bits!\n"); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 printf(" C1-C5: %u%u%u%u%u\n", frame_bits[17], frame_bits[18], |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 frame_bits[19], frame_bits[20], frame_bits[21]); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 printf(" M1=%u M2=%u\n", frame_bits[22], frame_bits[23]); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 for (n = 0; n < 8; n++) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 dump_subframe(frame_bits + 24 + n * 37); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 main(argc, argv) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 char **argv; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 FILE *binf; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 uint8_t frame_in[160], frame_bits[320]; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 u_long file_offset; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 int cc; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 if (argc != 2) { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 fprintf(stderr, "usage: %s capture.bin\n", argv[0]); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 exit(1); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 binf = fopen(argv[1], "r"); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 if (!binf) { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 perror(argv[1]); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 exit(1); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 for (file_offset = 0; ; file_offset += 160) { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 cc = fread(frame_in, 1, 160, binf); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 if (cc <= 0) |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 break; |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 if (cc != 160) { |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 fprintf(stderr, |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 "error: %s is not a multiple of 160 bytes\n", |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 argv[1]); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 exit(1); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 printf("Frame at 0x%lx:\n", file_offset); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 decode_ra2(frame_in, frame_bits); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 dump_frame(frame_bits); |
59
323a4b75a32d
atrau-parse: add blank separator lines to output
Mychaela Falconia <falcon@freecalypso.org>
parents:
58
diff
changeset
|
116 putchar('\n'); |
57
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 } |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 exit(0); |
fe3cdbbc96f9
d144: new program atrau-parse
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 } |