Fix 8b10b encoding running disparity issues.
This commit is contained in:
parent
3cba41f49f
commit
f21e9797a2
3 changed files with 53 additions and 29 deletions
|
|
@ -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<<K28_1) | (1<<K28_2) | (1<<K28_3) | (1<<K28_5) | (1<<K28_6);
|
||||
|
||||
|
||||
void xfr_8b10b_reset(struct state_8b10b_dec *st) {
|
||||
st->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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue