#include "8b10b.h" static const struct entry_5b6b map_5b6b[32] = { {0b100111, 0b011000}, /* D.00 */ {0b011101, 0b100010}, /* D.01 */ {0b101101, 0b010010}, /* D.02 */ {0b110001, 0b110001}, /* D.03 */ {0b110101, 0b001010}, /* D.04 */ {0b101001, 0b101001}, /* D.05 */ {0b011001, 0b011001}, /* D.06 */ {0b111000, 0b000111}, /* D.07 */ {0b111001, 0b000110}, /* D.08 */ {0b100101, 0b100101}, /* D.09 */ {0b010101, 0b010101}, /* D.10 */ {0b110100, 0b110100}, /* D.11 */ {0b001101, 0b001101}, /* D.12 */ {0b101100, 0b101100}, /* D.13 */ {0b011100, 0b011100}, /* D.14 */ {0b010111, 0b101000}, /* D.15 */ {0b011011, 0b100100}, /* D.16 */ {0b100011, 0b100011}, /* D.17 */ {0b010011, 0b010011}, /* D.18 */ {0b110010, 0b110010}, /* D.19 */ {0b001011, 0b001011}, /* D.20 */ {0b101010, 0b101010}, /* D.21 */ {0b011010, 0b011010}, /* D.22 */ {0b111010, 0b000101}, /* D.23 */ {0b110011, 0b001100}, /* D.24 */ {0b100110, 0b100110}, /* D.25 */ {0b010110, 0b010110}, /* D.26 */ {0b110110, 0b001001}, /* D.27 */ {0b001110, 0b001110}, /* D.28 */ {0b101110, 0b010001}, /* D.29 */ {0b011110, 0b100001}, /* D.30 */ {0b101011, 0b010100} /* D.31 */ }; static const int8_t map_6b5b[64] = { [0b000101] = 23, /* rd = +1 */ [0b000110] = 8, /* rd = +1 */ [0b000111] = 7, /* rd = +1 */ [0b001001] = 27, /* rd = +1 */ [0b001010] = 4, /* rd = +1 */ [0b001011] = 20, /* rd = +1 */ [0b001100] = 24, /* rd = +1 */ [0b001101] = 12, /* rd = +1 */ [0b001101] = 12, /* rd = -1 */ [0b001110] = 28, /* rd = +1 */ [0b010001] = 29, /* rd = +1 */ [0b010010] = 2, /* rd = +1 */ [0b010011] = 18, /* rd = +1 */ [0b010100] = 31, /* rd = +1 */ [0b010101] = 10, /* rd = +1 */ [0b010101] = 10, /* rd = -1 */ [0b010110] = 26, /* rd = +1 */ [0b010111] = 15, /* rd = -1 */ [0b011000] = -1, /* rd = +1 */ [0b011001] = 6, /* rd = +1 */ [0b011010] = 22, /* rd = +1 */ [0b011011] = 16, /* rd = -1 */ [0b011100] = 14, /* rd = -1 */ [0b011101] = 1, /* rd = -1 */ [0b011110] = 30, /* rd = -1 */ [0b100001] = 30, /* rd = +1 */ [0b100010] = 1, /* rd = +1 */ [0b100011] = 17, /* rd = -1 */ [0b100100] = 16, /* rd = +1 */ [0b100101] = 9, /* rd = -1 */ [0b100110] = 25, /* rd = -1 */ [0b100111] = -1, /* rd = -1 */ [0b101000] = 15, /* rd = +1 */ [0b101001] = 5, /* rd = -1 */ [0b101010] = 21, /* rd = -1 */ [0b101011] = 31, /* rd = -1 */ [0b101100] = 13, /* rd = -1 */ [0b101101] = 2, /* rd = -1 */ [0b101110] = 29, /* rd = -1 */ [0b110001] = 3, /* rd = -1 */ [0b110010] = 19, /* rd = -1 */ [0b110011] = 24, /* rd = -1 */ [0b110100] = 11, /* rd = -1 */ [0b110101] = 4, /* rd = -1 */ [0b110110] = 27, /* rd = -1 */ [0b111000] = 7, /* rd = -1 */ [0b111001] = 8, /* rd = -1 */ [0b111010] = 23 /* rd = -1 */ }; static const struct entry_5b6b K28 = {0b001111, 0b110000}; static const struct entry_3b4b map_d_3b4b[7] = { {0b1011, 0b0100}, /* D.x.0 */ {0b1001, 0b1001}, /* D.x.1 */ {0b0101, 0b0101}, /* D.x.2 */ {0b1100, 0b0011}, /* D.x.3 */ {0b1101, 0b0010}, /* D.x.4 */ {0b1010, 0b1010}, /* D.x.5 */ {0b0110, 0b0110} /* D.x.6 */ }; static const struct entry_3b4b Dx_P7 = {0b1110, 0b0001}, Dx_A7 = {0b0111, 0b1000}; static const struct entry_3b4b map_3b4b_k[8] = { {0b1011, 0b0100}, /* K.x.0 */ {0b0110, 0b1001}, /* K.x.1 */ {0b1010, 0b0101}, /* K.x.2 */ {0b1100, 0b0011}, /* K.x.3 */ {0b1101, 0b0010}, /* K.x.4 */ {0b0101, 0b1010}, /* K.x.5 */ {0b1001, 0b0110}, /* K.x.6 */ {0b0111, 0b1000} /* K.x.7 */ }; static const int8_t map_4b3b[16] = { [0b0001] = 7, /* DxP7 rd = +1 */ [0b0010] = 4, /* rd = +1 */ [0b0011] = 3, /* rd = +1 */ [0b0100] = -1, /* rd = +1 */ [0b0101] = 2, /* rd = -1 */ [0b0110] = 6, /* rd = -1 */ [0b0111] = 7, /* DxA7 rd = -1 */ [0b1000] = 7, /* DxA7 rd = +1 */ [0b1001] = 1, /* rd = -1 */ [0b1010] = 5, /* rd = -1 */ [0b1011] = -1, /* rd = -1 */ [0b1100] = 3, /* rd = -1 */ [0b1101] = 4, /* rd = -1 */ [0b1110] = 7, /* DxP7 rd = -1 */ [0b1111] = 0, /* invalid */ [0b0000] = 0 /* invalid */ }; static const uint16_t k_sym_map[K_CODES_LAST] = { [K28_0] = 0b0011110100, [K28_1] = 0b0011111001, [K28_2] = 0b0011110101, [K28_3] = 0b0011110011, [K28_4] = 0b0011110010, [K28_5] = 0b0011111010, [K28_6] = 0b0011110110, [K28_7] = 0b0011111000, [K23_7] = 0b1110101000, [K27_7] = 0b1101101000, [K29_7] = 0b1011101000, [K30_7] = 0b0111101000 }; void xfr_8b10b_reset(struct state_8b10b *st) { st->rx = 0; st->bit_ctr = 0; /* unsynchronized */ } int xfr_8b10b_feed_bit(struct state_8b10b *st, int bit) { uint32_t pattern = st->rx = (st->rx<<1 | !!bit) & 0x3ff; uint16_t comma = k_sym_map[K28_1]; if (pattern == comma || pattern == ((~comma)&0x3ff)) { st->bit_ctr = 1; return -K28_1; } if (st->bit_ctr == 10) { st->bit_ctr = 1; for (int i=1; i> 4]; if (p3b == 0 || p5b == 0) return -DECODING_ERROR; p3b = (p3b == -1) ? 0 : p3b; p5b = (p5b == -1) ? 0 : p5b; return p3b<<5 | p5b; } else if (st->bit_ctr > 0) { st->bit_ctr++; } /* else we do not have sync yet */ return -DECODING_IN_PROGRESS; } bool xfr_8b10b_has_sync(struct state_8b10b *st) { return st->bit_ctr != 0; }