8b10b issues

This commit is contained in:
jaseg 2023-10-02 01:23:31 +02:00
parent 67e30fa91e
commit c8623eb4c6
24 changed files with 1105 additions and 968 deletions

View file

@ -2,6 +2,9 @@
#include <global.h>
#include <string.h>
#include "8b10b.h"
#include "crc32.h"
#include "xorshift.h"
#include "protocol.h"
#include "generated/waveform_tables.h"
volatile uint64_t sys_time_us;
@ -12,23 +15,27 @@ static void set_status_leds(uint32_t leds);
static void dma_tx_constant(size_t table_size, uint16_t constant);
static void dma_tx_waveform(size_t table_size, const uint16_t *table);
static int tx_datagram[33] = {
/* FIXME test data */
/*
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa};
*/
-K28_1,
0x00, 0xff, 0xAA, 0x55, 0xfe, 0x18, 0xcc, 0x10,
0x00, 0xff, 0xAA, 0x55, 0xfe, 0x18, 0xcc, 0x10,
0x00, 0xff, 0xAA, 0x55, 0xfe, 0x18, 0xcc, 0x10,
0x00, 0xff, 0xAA, 0x55, 0xfe, 0x18, 0xcc, 0x10 };
#define SYNC_INTERVAL 2
static size_t time_to_sync = 0;
static size_t tx_bitpos = 0;
static size_t tx_sympos = 0;
static int tx_last_bit = 0;
static struct state_8b10b_enc encoder_state_8b10b;
static uint32_t packet_rng_state;
union tx_buf_union {
struct data_packet packet;
uint8_t bytes[sizeof(struct data_packet)];
};
static union tx_buf_union tx_buf[3];
static union tx_buf_union *tx_buf_read = &tx_buf[0];
static union tx_buf_union *tx_buf_idle = &tx_buf[1];
static union tx_buf_union *tx_buf_write = &tx_buf[2];
static bool idle_buf_ready = false;
void update_tx_buf(void);
int main(void) {
@ -169,6 +176,16 @@ int main(void) {
NVIC_SetPriority(DMA1_Channel1_IRQn, 0);
dma_tx_constant(COUNT_OF(waveform_zero_one), 0x00);
xfr_8b10b_encode_reset(&encoder_state_8b10b);
memset(tx_buf_write, 0, sizeof(*tx_buf_write));
for (size_t i=0; i<COUNT_OF(tx_buf_write->packet.channels); i++) {
tx_buf_write->packet.channels[i] = 0x33;
}
for (size_t i=0; i<COUNT_OF(tx_buf_write->packet.brightness); i++) {
tx_buf_write->packet.brightness[i] = 0xff;
}
update_tx_buf();
int i = 0;
int j = 0;
while (23) {
@ -204,10 +221,14 @@ void dma_tx_constant(size_t table_size, uint16_t constant) {
int8_t bit_arr[4096];
size_t bit_pos = 0;
int16_t sym_arr[512];
size_t sym_pos = 0;
uint16_t cnd_arr[512];
size_t cnd_pos = 0;
void DMA1_Channel1_IRQHandler() {
static int transfer_errors = 0;
static int current_symbol = 0x2aa;
static int current_symbol = 0;
if (DMA1->ISR & DMA_ISR_TEIF1) {
transfer_errors ++;
@ -233,16 +254,65 @@ void DMA1_Channel1_IRQHandler() {
if (tx_bitpos == 0) {
tx_bitpos = 9;
current_symbol = xfr_8b10b_encode(&encoder_state_8b10b, tx_datagram[tx_sympos]);
tx_sympos ++;
if (tx_sympos >= COUNT_OF(tx_datagram)) {
sym_arr[sym_pos] = -255;
if (tx_sympos == sizeof(struct data_packet)) {
if (time_to_sync > 0) {
current_symbol = xfr_8b10b_encode(&encoder_state_8b10b, -K27_7);
sym_arr[sym_pos] = current_symbol;
time_to_sync--;
} else {
current_symbol = xfr_8b10b_encode(&encoder_state_8b10b, -K28_1);
sym_arr[sym_pos] = current_symbol;
packet_rng_state = xorshift32(1);
time_to_sync = SYNC_INTERVAL;
}
if (idle_buf_ready) {
union tx_buf_union *tmp = tx_buf_idle;
tx_buf_idle = tx_buf_read;
tx_buf_read = tmp;
idle_buf_ready = false;
}
tx_sympos = 0;
} else {
uint8_t b = tx_buf_read->bytes[tx_sympos];
packet_rng_state = xorshift32(packet_rng_state);
//b ^= packet_rng_state; FIXME DEBUG
current_symbol = xfr_8b10b_encode(&encoder_state_8b10b, b);
sym_arr[sym_pos] = current_symbol;
tx_sympos ++;
}
sym_pos++;
if (sym_pos == COUNT_OF(sym_arr)) {
sym_pos = 0;
}
} else {
tx_bitpos --;
}
}
void update_tx_buf() {
uint32_t crc = crc32_reset();
for (size_t i=0; i<offsetof(struct data_packet, crc); i++) {
crc = crc32_update(crc, tx_buf_write->bytes[i]);
}
tx_buf_write->packet.crc = crc32_finalize(crc);
__disable_irq();
union tx_buf_union *tmp = tx_buf_idle;
tx_buf_idle = tx_buf_write;
tx_buf_write = tmp;
idle_buf_ready = true;
__enable_irq();
}
uint32_t read_fuse_monitor() {
uint32_t idr_a = GPIOA->IDR;
uint32_t idr_c = GPIOC->IDR;