mirror of
https://github.com/OneOfEleven/uv-k5-firmware-custom.git
synced 2025-04-28 22:31:25 +03:00
MDC1200 CRC now done on the CPU :)
This commit is contained in:
parent
f3cf9b755f
commit
1c424492d9
16
driver/crc.c
16
driver/crc.c
@ -33,14 +33,14 @@ void CRC_Init(void)
|
|||||||
|
|
||||||
void CRC_InitReverse(void)
|
void CRC_InitReverse(void)
|
||||||
{
|
{
|
||||||
CRC_CR =
|
CRC_CR = 0
|
||||||
CRC_CR_CRC_EN_BITS_DISABLE |
|
| CRC_CR_CRC_EN_BITS_DISABLE
|
||||||
CRC_CR_INPUT_REV_BITS_REVERSED |
|
| CRC_CR_INPUT_REV_BITS_NORMAL
|
||||||
CRC_CR_INPUT_INV_BITS_NORMAL |
|
| CRC_CR_INPUT_INV_BITS_BIT_INVERTED
|
||||||
CRC_CR_OUTPUT_REV_BITS_REVERSED |
|
| CRC_CR_OUTPUT_REV_BITS_REVERSED
|
||||||
CRC_CR_OUTPUT_INV_BITS_NORMAL |
|
| CRC_CR_OUTPUT_INV_BITS_BIT_INVERTED
|
||||||
CRC_CR_DATA_WIDTH_BITS_8 |
|
| CRC_CR_DATA_WIDTH_BITS_8
|
||||||
CRC_CR_CRC_SEL_BITS_CRC_16_CCITT;
|
| CRC_CR_CRC_SEL_BITS_CRC_16_CCITT;
|
||||||
|
|
||||||
CRC_IV = 0;
|
CRC_IV = 0;
|
||||||
}
|
}
|
||||||
|
BIN
firmware.bin
BIN
firmware.bin
Binary file not shown.
Binary file not shown.
66
mdc1200.c
66
mdc1200.c
@ -58,33 +58,18 @@ uint32_t bit_reverse_32(uint32_t n)
|
|||||||
for (k = 8; k > 0; k--)
|
for (k = 8; k > 0; k--)
|
||||||
crc = (crc & 1u) ? (crc >> 1) ^ 0x8408 : crc >> 1;
|
crc = (crc & 1u) ? (crc >> 1) ^ 0x8408 : crc >> 1;
|
||||||
}
|
}
|
||||||
crc ^= 0xffff;
|
return crc ^ 0xffff;
|
||||||
return crc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif 1
|
#elif 1
|
||||||
|
|
||||||
uint16_t compute_crc(const uint8_t *data, const unsigned int data_len)
|
uint16_t compute_crc(const uint8_t *data, const unsigned int data_len)
|
||||||
{
|
{ // let the CPU do the crc for us :)
|
||||||
unsigned int i;
|
|
||||||
uint16_t crc;
|
uint16_t crc;
|
||||||
|
CRC_InitReverse();
|
||||||
// CRC_InitReverse();
|
crc = CRC_Calculate(data, data_len);
|
||||||
|
CRC_Init();
|
||||||
CRC_CR = (CRC_CR & ~CRC_CR_CRC_EN_MASK) | CRC_CR_CRC_EN_BITS_ENABLE;
|
return crc;
|
||||||
|
|
||||||
for (i = 0; i < data_len; i++)
|
|
||||||
//CRC_DATAIN = data[i];
|
|
||||||
CRC_DATAIN = bit_reverse_8(data[i]);
|
|
||||||
crc = CRC_DATAOUT;
|
|
||||||
|
|
||||||
CRC_CR = (CRC_CR & ~CRC_CR_CRC_EN_MASK) | CRC_CR_CRC_EN_BITS_DISABLE;
|
|
||||||
|
|
||||||
// CRC_Init();
|
|
||||||
|
|
||||||
// bit reverse and invert the final CRC
|
|
||||||
//return crc ^ 0xffff;
|
|
||||||
return bit_reverse_16(crc) ^ 0xffff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -123,7 +108,8 @@ uint32_t bit_reverse_32(uint32_t n)
|
|||||||
#define FEC_K 7
|
#define FEC_K 7
|
||||||
|
|
||||||
void error_correction(uint8_t *data)
|
void error_correction(uint8_t *data)
|
||||||
{
|
{ // can correct up to 3 or 4 corrupted bits (I think)
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
uint8_t shift_reg;
|
uint8_t shift_reg;
|
||||||
uint8_t syn;
|
uint8_t syn;
|
||||||
@ -147,7 +133,7 @@ void error_correction(uint8_t *data)
|
|||||||
if (syn & 0x02) k++;
|
if (syn & 0x02) k++;
|
||||||
|
|
||||||
if (k >= 3)
|
if (k >= 3)
|
||||||
{ // correct bit error
|
{ // correct a bit error
|
||||||
int ii = i;
|
int ii = i;
|
||||||
int bn = bit_num - 7;
|
int bn = bit_num - 7;
|
||||||
if (bn < 0)
|
if (bn < 0)
|
||||||
@ -156,7 +142,7 @@ void error_correction(uint8_t *data)
|
|||||||
ii--;
|
ii--;
|
||||||
}
|
}
|
||||||
if (ii >= 0)
|
if (ii >= 0)
|
||||||
data[ii] ^= 1u << bn;
|
data[ii] ^= 1u << bn; // do it
|
||||||
syn ^= 0xA6; // 10100110
|
syn ^= 0xA6; // 10100110
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -203,7 +189,7 @@ bool MDC1200_decode_data(uint8_t *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy the de-interleaved bits to the data buffer
|
// copy the de-interleaved bits back intoto the data buffer
|
||||||
for (i = 0, m = 0; i < (FEC_K * 2); i++)
|
for (i = 0, m = 0; i < (FEC_K * 2); i++)
|
||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
@ -215,19 +201,31 @@ bool MDC1200_decode_data(uint8_t *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// see if we can correct a couple of corrupted bits (if need be)
|
||||||
error_correction(data);
|
error_correction(data);
|
||||||
|
|
||||||
|
// rx'ed de-interleaved data (min 14 bytes) looks like this ..
|
||||||
|
//
|
||||||
|
// OP ARG ID CRC STATUS FEC bits
|
||||||
|
// 01 80 1234 2E3E 00 6580A862DD8808
|
||||||
|
|
||||||
crc1 = compute_crc(data, 4);
|
crc1 = compute_crc(data, 4);
|
||||||
crc2 = (data[5] << 8) | (data[4] << 0);
|
crc2 = ((uint16_t)data[5] << 8) | (data[4] << 0);
|
||||||
|
|
||||||
if (crc1 != crc2)
|
if (crc1 != crc2)
|
||||||
return false;
|
return false; // CRC error, even after using the FEC bits
|
||||||
|
|
||||||
// valid packet
|
// valid packet
|
||||||
|
|
||||||
|
// extract the info
|
||||||
|
//uint8_t op = data[0];
|
||||||
|
//uint8_t arg = data[1];
|
||||||
|
//uint16_t id = ((uint16_t)data[3] << 8) | (data[2] << 0);
|
||||||
|
|
||||||
|
|
||||||
// TODO: more stuff
|
|
||||||
|
|
||||||
|
// TODO: pass the above received radio details over to the display function
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -239,13 +237,7 @@ uint8_t * encode_data(uint8_t *data)
|
|||||||
{
|
{
|
||||||
// R=1/2 K=7 convolutional coder
|
// R=1/2 K=7 convolutional coder
|
||||||
//
|
//
|
||||||
// op 0x01
|
// OP ARG ID CRC STATUS FEC bits
|
||||||
// arg 0x80
|
|
||||||
// id 0x1234
|
|
||||||
// crc 0x2E3E
|
|
||||||
// status 0x00
|
|
||||||
// FEC 0x6580A862DD8808
|
|
||||||
//
|
|
||||||
// 01 80 1234 2E3E 00 6580A862DD8808
|
// 01 80 1234 2E3E 00 6580A862DD8808
|
||||||
//
|
//
|
||||||
// 1. reverse the bit order for each byte of the first 7 bytes (to undo the reversal performed for display, above)
|
// 1. reverse the bit order for each byte of the first 7 bytes (to undo the reversal performed for display, above)
|
||||||
@ -270,8 +262,8 @@ uint8_t * encode_data(uint8_t *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 01 80 00 23 31 FC 00 65 80 32 0F 99 86 23
|
// 01 00 00 23 DD F0 00 65 00 00 0F 45 1F 21
|
||||||
// 01 80 00 23 31 FC 00 65 80 32 0F 99 86 23
|
// 01 00 00 23 DD F0 00 65 00 00 0F 45 1F 21
|
||||||
|
|
||||||
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
|
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user