From f21e9797a28b6f4eb84f6c3a74d3b64817abc42a Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 1 May 2022 17:24:19 +0200 Subject: Fix 8b10b encoding running disparity issues. --- common/8b10b.c | 39 +++++++++++++++++++++++++-------------- driver_fw/Makefile | 2 +- driver_fw/main.c | 41 +++++++++++++++++++++++++++-------------- 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/common/8b10b.c b/common/8b10b.c index a32b7f2..fd89e6f 100644 --- a/common/8b10b.c +++ b/common/8b10b.c @@ -139,20 +139,24 @@ static const int8_t map_4b3b[16] = { }; 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 + [K28_0] = 0b0011110100, /* rd = 0 */ + [K28_1] = 0b0011111001, /* rd = +2 */ + [K28_2] = 0b0011110101, /* rd = +2 */ + [K28_3] = 0b0011110011, /* rd = +2 */ + [K28_4] = 0b0011110010, /* rd = 0 */ + [K28_5] = 0b0011111010, /* rd = +2 */ + [K28_6] = 0b0011110110, /* rd = +2 */ + [K28_7] = 0b0011111000, /* rd = 0 */ + [K23_7] = 0b1110101000, /* rd = 0 */ + [K27_7] = 0b1101101000, /* rd = 0 */ + [K29_7] = 0b1011101000, /* rd = 0 */ + [K30_7] = 0b0111101000 /* rd = 0 */ }; +static const uint16_t k_sym_rd = + (1<rx = 0; st->bit_ctr = 0; /* unsynchronized */ @@ -199,11 +203,19 @@ void xfr_8b10b_encode_reset(struct state_8b10b_enc *st) { } int xfr_8b10b_encode(struct state_8b10b_enc *st, int data) { + if (st->rd != -1 && st->rd != 1) + return -EINVAL; + if (data < 0) { if (-data >= sizeof(k_sym_map)/sizeof(k_sym_map[0])) return -EINVAL; - return k_sym_map[-data]; + int sym = k_sym_map[-data]; + if (st->rd > 0) + sym = (~sym) & 0x3ff; + if ((k_sym_rd >> (-data)) & 0x1) + st->rd = -st->rd; + return sym; } if (data > 255) @@ -215,7 +227,6 @@ int xfr_8b10b_encode(struct state_8b10b_enc *st, int data) { int x5b = (st->rd == -1) ? map_5b6b[p5b].rd_neg : map_5b6b[p5b].rd_pos; st->rd -= map_5b6b[p5b].disp * st->rd; //fprintf(stderr, "\nnow: rd %d data %x p5b %d p3b %d\n", st->rd, data, p5b, p3b); - //assert(st->rd == -1 || st->rd == 1); int x3b = (st->rd == -1) ? map_3b4b_d[p3b].rd_neg : map_3b4b_d[p3b].rd_pos; if (p3b == 7) { diff --git a/driver_fw/Makefile b/driver_fw/Makefile index f6a20ae..85bc4c7 100644 --- a/driver_fw/Makefile +++ b/driver_fw/Makefile @@ -1,4 +1,4 @@ -CUBE_PATH ?= $(wildcard ~)/resource/STM32Cube_FW_F0_V1.9.0 +CUBE_PATH ?= $(wildcard ~)/ref/stm32cube/STM32CubeF0 CMSIS_PATH ?= $(CUBE_PATH)/Drivers/CMSIS CMSIS_DEV_PATH ?= $(CMSIS_PATH)/Device/ST/STM32F0xx HAL_PATH ?= $(CUBE_PATH)/Drivers/STM32F0xx_HAL_Driver diff --git a/driver_fw/main.c b/driver_fw/main.c index 30ff633..5123237 100644 --- a/driver_fw/main.c +++ b/driver_fw/main.c @@ -81,6 +81,20 @@ static void set_status_leds(uint8_t val) { *((volatile uint8_t *)&(SPI1->DR)) = val ^ 0x0f; /* Invert LEDs connected to VCC instead of GND */ } +static int flipbits10(int in) { + return + (in&0x200)>>9 | + (in&0x100)>>7 | + (in&0x080)>>5 | + (in&0x040)>>3 | + (in&0x020)>>1 | + (in&0x010)<<1 | + (in&0x008)<<3 | + (in&0x004)<<5 | + (in&0x002)<<7 | + (in&0x001)<<9; + +} int main(void) { /* Startup code */ @@ -194,7 +208,7 @@ int main(void) { /* Initialize AC protocol state machine in TIM3 ISR with the AC protocol comma */ xfr_8b10b_encode_reset(&txstate.st); - txstate.current_symbol = xfr_8b10b_encode(&txstate.st, K28_1) | 1<<10; + txstate.current_symbol = flipbits10(xfr_8b10b_encode(&txstate.st, K28_1)) | 1<<10; /* The timer is still stopped. Start it by manually triggering an update event. */ TIM3->EGR |= TIM_EGR_UG; @@ -219,22 +233,21 @@ int main(void) { } } -static int flipbits10(int in) { - return - (in&0x200)>>9 | - (in&0x100)>>7 | - (in&0x080)>>5 | - (in&0x040)>>3 | - (in&0x020)>>1 | - (in&0x010)<<1 | - (in&0x008)<<3 | - (in&0x004)<<5 | - (in&0x002)<<7 | - (in&0x001)<<9; +#define BACKCHANNEL_INTERVAL 10 +__attribute__((__noreturn__)) void __assert_func (const char *, int, const char *, const char *){ + asm volatile ("bkpt"); + while (1); } -#define BACKCHANNEL_INTERVAL 10 +int hamming_weight(int i) { + int r = 0; + for (int j = 0; j < 32; j ++) { + if (i < 0) r ++; + i <<= 1; + } + return r; +} void TIM3_IRQHandler() { static int txpos = -1; -- cgit