summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorStefan Roese <sr@denx.de>2016-04-08 15:56:29 +0200
committerTom Rini <trini@konsulko.com>2016-04-11 20:48:26 -0400
commit456ecd08ec026e67a17a77baa3778c9f1b8e474d (patch)
tree300fa2792b8a7e1b958c08e4b1b4d92c48baf50d /lib
parent5b2beab5cdf6209e5b4027312d8f9e2a13f1ce46 (diff)
downloadu-boot-imx-456ecd08ec026e67a17a77baa3778c9f1b8e474d.zip
u-boot-imx-456ecd08ec026e67a17a77baa3778c9f1b8e474d.tar.gz
u-boot-imx-456ecd08ec026e67a17a77baa3778c9f1b8e474d.tar.bz2
lib/crc8: Add crc start value
To make the usage of this function more flexible, lets add the CRC start value as parameter to this function. This way it can be used by other functions requiring different start values than 0 as well. For non-zero CRC start values to work, I've reworked the function a bit. The new implementation is copied from the Linux version in drivers/i2c/i2c-core.c / i2c_smbus_pec(). Which supports non-zero CRC stating values. I've double-checked that the results for zero starting values are identical to the results from the original version of this function. Signed-off-by: Stefan Roese <sr@denx.de> Cc: Simon Glass <sjg@chromium.org> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/crc8.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/lib/crc8.c b/lib/crc8.c
index 8b68a29..51d540f 100644
--- a/lib/crc8.c
+++ b/lib/crc8.c
@@ -6,20 +6,27 @@
#include "linux/crc8.h"
-unsigned int crc8(const unsigned char *vptr, int len)
+#define POLY (0x1070U << 3)
+
+static unsigned char _crc8(unsigned short data)
{
- const unsigned char *data = vptr;
- unsigned int crc = 0;
- int i, j;
-
- for (j = len; j; j--, data++) {
- crc ^= (*data << 8);
- for (i = 8; i; i--) {
- if (crc & 0x8000)
- crc ^= (0x1070 << 3);
- crc <<= 1;
- }
+ int i;
+
+ for (i = 0; i < 8; i++) {
+ if (data & 0x8000)
+ data = data ^ POLY;
+ data = data << 1;
}
- return (crc >> 8) & 0xff;
+ return (unsigned char)(data >> 8);
+}
+
+unsigned int crc8(unsigned int crc, const unsigned char *vptr, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++)
+ crc = _crc8((crc ^ vptr[i]) << 8);
+
+ return crc;
}