mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-30 19:48:19 +00:00 
			
		
		
		
	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>
		
			
				
	
	
		
			33 lines
		
	
	
		
			492 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			492 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2013 Google, Inc
 | |
|  *
 | |
|  * SPDX-License-Identifier:	GPL-2.0+
 | |
|  */
 | |
| 
 | |
| #include "linux/crc8.h"
 | |
| 
 | |
| #define POLY	(0x1070U << 3)
 | |
| 
 | |
| static unsigned char _crc8(unsigned short data)
 | |
| {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i = 0; i < 8; i++) {
 | |
| 		if (data & 0x8000)
 | |
| 			data = data ^ POLY;
 | |
| 		data = data << 1;
 | |
| 	}
 | |
| 
 | |
| 	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;
 | |
| }
 |