8b10b issues
This commit is contained in:
parent
67e30fa91e
commit
c8623eb4c6
24 changed files with 1105 additions and 968 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue