summaryrefslogtreecommitdiff
path: root/src/core/ao_fec.h
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-06-23 16:05:42 -0700
committerKeith Packard <keithp@keithp.com>2012-06-23 16:05:42 -0700
commitb292c14790fc225029cba3f80ce8ad6c5652bc4e (patch)
treeddb21788633f5a499dd7342fa41e3d74a696aaae /src/core/ao_fec.h
parent74f6a1a8c8fa9d5bb8d74c99782310b431dd4727 (diff)
altos: improve FEC apis to reduce data copying
Integrate interleaving and whitening into encode and decode steps. Add CRC checking function for receive. Make ao_fec_test program round-trip the data and verify correctness. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/core/ao_fec.h')
-rw-r--r--src/core/ao_fec.h26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/core/ao_fec.h b/src/core/ao_fec.h
index d4f64b74..f3f55fa8 100644
--- a/src/core/ao_fec.h
+++ b/src/core/ao_fec.h
@@ -24,13 +24,23 @@
#define AO_FEC_TRELLIS_TERMINATOR 0x0b
#define AO_FEC_PREPARE_EXTRA 4
+extern const uint8_t ao_fec_whiten_table[];
+
void
-ao_fec_dump_bytes(uint8_t *bytes, uint8_t len, char *name);
+ao_fec_dump_bytes(uint8_t *bytes, uint16_t len, char *name);
uint16_t
ao_fec_crc(uint8_t *bytes, uint8_t len);
/*
+ * 'len' is the length of the original data; 'bytes'
+ * must be four bytes longer than that, and the first
+ * two after 'len' must be the received crc
+ */
+uint8_t
+ao_fec_check_crc(uint8_t *bytes, uint8_t len);
+
+/*
* Append CRC and terminator bytes, returns resulting length.
* 'out' must be at least len + AO_FEC_PREPARE_EXTRA bytes long
*/
@@ -46,18 +56,12 @@ void
ao_fec_whiten(uint8_t *in, uint8_t len, uint8_t *out);
/*
- * Encode data. 'out' must be len*2 bytes long
+ * Encode and interleave data. 'out' must be len*2 bytes long
*/
uint8_t
ao_fec_encode(uint8_t *in, uint8_t len, uint8_t *out);
/*
- * Interleave data. 'out' must be 'len' bytes long
- */
-uint8_t
-ao_fec_interleave(uint8_t *in, uint8_t len, uint8_t *out);
-
-/*
* Decode data. 'in' is one byte per bit, soft decision
* 'out' must be len/8 bytes long
*/
@@ -65,4 +69,10 @@ ao_fec_interleave(uint8_t *in, uint8_t len, uint8_t *out);
uint8_t
ao_fec_decode(uint8_t *in, uint16_t in_len, uint8_t *out);
+/*
+ * Interleave data packed in bytes. 'out' must be 'len' bytes long.
+ */
+uint16_t
+ao_fec_interleave_bytes(uint8_t *in, uint16_t len, uint8_t *out);
+
#endif /* _AO_FEC_H_ */