summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/crc8.c9
-rw-r--r--include/crc8.h14
2 files changed, 20 insertions, 3 deletions
diff --git a/common/crc8.c b/common/crc8.c
index b752698d14..ca32d5a19c 100644
--- a/common/crc8.c
+++ b/common/crc8.c
@@ -5,9 +5,14 @@
#include "common.h"
#include "crc8.h"
-uint8_t crc8(const uint8_t *data, int len)
+inline uint8_t crc8(const uint8_t *data, int len)
{
- unsigned crc = 0;
+ return crc8_arg(data, len, 0);
+}
+
+uint8_t crc8_arg(const uint8_t *data, int len, uint8_t previous_crc)
+{
+ unsigned crc = previous_crc << 8;
int i, j;
for (j = len; j; j--, data++) {
diff --git a/include/crc8.h b/include/crc8.h
index de0dc196f9..c98d65ce4d 100644
--- a/include/crc8.h
+++ b/include/crc8.h
@@ -13,9 +13,21 @@
* algorithm would be faster, but for only a few bytes it isn't worth the code
* size.
* @param data uint8_t *, input, a pointer to input data
- * @param len int, input, size of iput data in byte
+ * @param len int, input, size of input data in bytes
* @return the crc-8 of the input data.
*/
uint8_t crc8(const uint8_t *data, int len);
+/**
+ * crc8_arg
+ * Return CRC-8 of the data, based upon pre-calculated partial CRC of previous
+ * data.
+ * @param data uint8_t *, input, a pointer to input data
+ * @param len int, input, size of input data in bytes
+ * @param previous_crc uint8_t, input, pre-calculated CRC of previous data.
+ * Seed with zero for a new calculation (or use the result of crc8()).
+ * @return the crc-8 of the input data.
+ */
+uint8_t crc8_arg(const uint8_t *data, int len, uint8_t previous_crc);
+
#endif /* __CROS_EC_CRC8_H */