41 lines
920 B
C
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;
|
|
}
|
|
|