2025-12-23 10:56:59 +01:00

41 lines
920 B
C

#include "system/task_crc.h"
#include "system/data_channel.h"
#include "system/float_word.h"
#define CRC32_POLY 0xEDB88320
#define CRC32_INIT 0xFFFFFFFF
#define DATA_CHANNEL_DEPTH 1024
static uint32_t crc32_update(uint32_t crc, uint32_t data) {
int i;
crc ^= data;
for (i = 0; i < 32; i++) {
if (crc & 1) {
crc = (crc >> 1) ^ CRC32_POLY;
} else {
crc >>= 1;
}
}
return crc;
}
int task_crc_run(void *task) {
crc_config *config = (crc_config *)task;
uint32_t source_base = config->base.sources[0];
uint32_t sink_base = config->base.sink;
uint32_t crc = CRC32_INIT;
uint32_t value;
for (uint32_t i = 0; i < DATA_CHANNEL_DEPTH; i++) {
data_channel_read(source_base, &value);
crc = crc32_update(crc, value);
}
crc ^= 0xFFFFFFFF;
data_channel_write(sink_base, crc);
return 0;
}