[U-Boot] [PATCH 1/2] mkimage : Split out and clean pbl_crc32 for use by other image types

Stefano Babic sbabic at denx.de
Tue May 6 10:10:13 CEST 2014


Hi Charles,

On 06/05/2014 00:46, Charles Manning wrote:
> The crc32 used by pblimgae is NOT the same as zlib crc32.
> 
> The pbl_crc32 is useful for other purposes in mkimage so split it out.
> 
> While we are about it, clean up redundant and confusing code.
> 
> Signed-off-by: Charles Manning <cdhmanning at gmail.com>
> ---
>  tools/Makefile    |    1 +
>  tools/pbl_crc32.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tools/pbl_crc32.h |   13 +++++++++++++
>  tools/pblimage.c  |   47 +-------------------------------------------
>  4 files changed, 71 insertions(+), 46 deletions(-)
>  create mode 100644 tools/pbl_crc32.c
>  create mode 100644 tools/pbl_crc32.h
> 
> diff --git a/tools/Makefile b/tools/Makefile
> index c34df4f..2f30749 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -86,6 +86,7 @@ dumpimage-mkimage-objs := aisimage.o \
>  			omapimage.o \
>  			os_support.o \
>  			pblimage.o \
> +			pbl_crc32.o \
>  			sha1.o \
>  			sha256.o \
>  			ublimage.o \
> diff --git a/tools/pbl_crc32.c b/tools/pbl_crc32.c
> new file mode 100644
> index 0000000..6e6735a
> --- /dev/null
> +++ b/tools/pbl_crc32.c
> @@ -0,0 +1,56 @@
> +/*
> + * Copyright 2012 Freescale Semiconductor, Inc.
> + *
> + * Cleaned up and refactored by Charles Manning.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +#include "pblimage.h"
> +
> +static uint32_t crc_table[256];
> +static int crc_table_valid;
> +
> +static void make_crc_table(void)
> +{
> +	uint32_t mask;
> +	int i, j;
> +	uint32_t poly; /* polynomial exclusive-or pattern */
> +
> +	if (crc_table_valid)
> +		return;
> +
> +	/*
> +	 * the polynomial used by PBL is 1 + x1 + x2 + x4 + x5 + x7 + x8 + x10
> +	 * + x11 + x12 + x16 + x22 + x23 + x26 + x32.
> +	 */
> +	poly = 0x04c11db7;
> +
> +	for (i = 0; i < 256; i++) {
> +		mask = i << 24;
> +		for (j = 0; j < 8; j++) {
> +			if (mask & 0x80000000)
> +				mask = (mask << 1) ^ poly;
> +			else
> +				mask <<= 1;
> +		}
> +		crc_table[i] = mask;
> +	}
> +
> +	crc_table_valid = 1;
> +}
> +
> +uint32_t pbl_crc32(uint32_t in_crc, const char *buf, uint32_t len)
> +{
> +	uint32_t crc32_val;
> +	int i;
> +
> +	make_crc_table();
> +
> +	crc32_val = ~in_crc;
> +
> +	for (i = 0; i < len; i++)
> +		crc32_val = (crc32_val << 8) ^
> +			crc_table[(crc32_val >> 24) ^ (*buf++ & 0xff)];
> +
> +	return crc32_val;
> +}
> diff --git a/tools/pbl_crc32.h b/tools/pbl_crc32.h
> new file mode 100644
> index 0000000..4ab55ee
> --- /dev/null
> +++ b/tools/pbl_crc32.h
> @@ -0,0 +1,13 @@
> +/*
> + * Copyright 2012 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#ifndef PBLCRC32_H
> +#define PBLCRC32_H
> +
> +#include <stdint.h>
> +uint32_t pbl_crc32(uint32_t in_crc, const char *buf, uint32_t len);
> +
> +#endif
> diff --git a/tools/pblimage.c b/tools/pblimage.c
> index ef3d7f6..6e6e801 100644
> --- a/tools/pblimage.c
> +++ b/tools/pblimage.c
> @@ -6,6 +6,7 @@
>  #include "imagetool.h"
>  #include <image.h>
>  #include "pblimage.h"
> +#include "pbl_crc32.h"
>  
>  /*
>   * Initialize to an invalid value.
> @@ -137,52 +138,6 @@ static void pbl_parser(char *name)
>  	fclose(fd);
>  }
>  
> -static uint32_t crc_table[256];
> -
> -static void make_crc_table(void)
> -{
> -	uint32_t mask;
> -	int i, j;
> -	uint32_t poly; /* polynomial exclusive-or pattern */
> -
> -	/*
> -	 * the polynomial used by PBL is 1 + x1 + x2 + x4 + x5 + x7 + x8 + x10
> -	 * + x11 + x12 + x16 + x22 + x23 + x26 + x32.
> -	 */
> -	poly = 0x04c11db7;
> -
> -	for (i = 0; i < 256; i++) {
> -		mask = i << 24;
> -		for (j = 0; j < 8; j++) {
> -			if (mask & 0x80000000)
> -				mask = (mask << 1) ^ poly;
> -			else
> -				mask <<= 1;
> -		}
> -		crc_table[i] = mask;
> -	}
> -}
> -
> -unsigned long pbl_crc32(unsigned long crc, const char *buf, uint32_t len)
> -{
> -	uint32_t crc32_val = 0xffffffff;
> -	uint32_t xor = 0x0;
> -	int i;
> -
> -	make_crc_table();
> -
> -	for (i = 0; i < len; i++)
> -		crc32_val = (crc32_val << 8) ^
> -			crc_table[(crc32_val >> 24) ^ (*buf++ & 0xff)];
> -
> -	crc32_val = crc32_val ^ xor;
> -	if (crc32_val < 0) {
> -		crc32_val += 0xffffffff;
> -		crc32_val += 1;
> -	}
> -	return crc32_val;
> -}
> -
>  static uint32_t reverse_byte(uint32_t val)
>  {
>  	uint32_t temp;
> 

Acked-by: Stefano Babic <sbabic at denx.de>

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list