Blame view

tools/envcrc.c 3.43 KB
fe57bb19b   wdenk   Initial revision
1
2
3
4
  /*
   * (C) Copyright 2001
   * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
fe57bb19b   wdenk   Initial revision
6
   */
f67066b6b   Mike Frysinger   envcrc: check ret...
7
  #include <errno.h>
fe57bb19b   wdenk   Initial revision
8
  #include <stdio.h>
89cdab788   Mike Frysinger   crc32: use uint32...
9
  #include <stdint.h>
fe57bb19b   wdenk   Initial revision
10
  #include <stdlib.h>
837db3d87   Mike Frysinger   tools/envcrc: add...
11
  #include <string.h>
fe57bb19b   wdenk   Initial revision
12
  #include <unistd.h>
f33f3e07f   York Sun   tools/env: Correc...
13
  #include <linux/kconfig.h>
dc17fb6dc   Wolfgang Denk   Cleanup build pro...
14
15
16
17
  #ifndef __ASSEMBLY__
  #define	__ASSEMBLY__			/* Dirty trick to get only #defines	*/
  #endif
  #define	__ASM_STUB_PROCESSOR_H__	/* don't include asm/processor.		*/
fe57bb19b   wdenk   Initial revision
18
19
  #include <config.h>
  #undef	__ASSEMBLY__
5a1aceb06   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV_IS...
20
  #if defined(CONFIG_ENV_IS_IN_FLASH)
0e8d15866   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV ma...
21
  # ifndef  CONFIG_ENV_ADDR
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
22
  #  define CONFIG_ENV_ADDR	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
fe57bb19b   wdenk   Initial revision
23
  # endif
0e8d15866   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV ma...
24
  # ifndef  CONFIG_ENV_OFFSET
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
25
  #  define CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
fe57bb19b   wdenk   Initial revision
26
  # endif
0e8d15866   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV ma...
27
  # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
28
  #  define CONFIG_ENV_ADDR_REDUND	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
43d9616cf   wdenk   * Patch by Robert...
29
  # endif
0e8d15866   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV ma...
30
31
  # ifndef  CONFIG_ENV_SIZE
  #  define CONFIG_ENV_SIZE	CONFIG_ENV_SECT_SIZE
fe57bb19b   wdenk   Initial revision
32
  # endif
0e8d15866   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV ma...
33
34
  # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
  #  define CONFIG_ENV_SIZE_REDUND	CONFIG_ENV_SIZE
43d9616cf   wdenk   * Patch by Robert...
35
  # endif
a747a7f31   Wolfgang Denk   Revert "env: only...
36
37
  # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) && \
       ((CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN))
6f403bad8   Igor Grinberg   env: remove value...
38
  #  define ENV_IS_EMBEDDED
a747a7f31   Wolfgang Denk   Revert "env: only...
39
  # endif
0e8d15866   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV ma...
40
  # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
6f403bad8   Igor Grinberg   env: remove value...
41
  #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
fe57bb19b   wdenk   Initial revision
42
  # endif
5a1aceb06   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV_IS...
43
  #endif	/* CONFIG_ENV_IS_IN_FLASH */
fe57bb19b   wdenk   Initial revision
44

c3eb3fe49   Mike Frysinger   env: allow people...
45
  #if defined(ENV_IS_EMBEDDED) && !defined(CONFIG_BUILD_ENVCRC)
6f403bad8   Igor Grinberg   env: remove value...
46
  # define CONFIG_BUILD_ENVCRC
c3eb3fe49   Mike Frysinger   env: allow people...
47
  #endif
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
48
  #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
89cdab788   Mike Frysinger   crc32: use uint32...
49
  # define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
43d9616cf   wdenk   * Patch by Robert...
50
  #else
89cdab788   Mike Frysinger   crc32: use uint32...
51
  # define ENV_HEADER_SIZE	(sizeof(uint32_t))
43d9616cf   wdenk   * Patch by Robert...
52
  #endif
0e8d15866   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ENV ma...
53
  #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
43d9616cf   wdenk   * Patch by Robert...
54

c3eb3fe49   Mike Frysinger   env: allow people...
55
  #ifdef CONFIG_BUILD_ENVCRC
73f94ed40   Igor Grinberg   tools/envcrc: fix...
56
  # include <environment.h>
fe57bb19b   wdenk   Initial revision
57
  extern unsigned int env_size;
994bc671c   Igor Grinberg   env: move extern ...
58
  extern env_t environment;
c3eb3fe49   Mike Frysinger   env: allow people...
59
  #endif	/* CONFIG_BUILD_ENVCRC */
fe57bb19b   wdenk   Initial revision
60

73f94ed40   Igor Grinberg   tools/envcrc: fix...
61
  extern uint32_t crc32 (uint32_t, const unsigned char *, unsigned int);
fe57bb19b   wdenk   Initial revision
62
63
  int main (int argc, char **argv)
  {
c3eb3fe49   Mike Frysinger   env: allow people...
64
  #ifdef CONFIG_BUILD_ENVCRC
837db3d87   Mike Frysinger   tools/envcrc: add...
65
  	unsigned char pad = 0x00;
89cdab788   Mike Frysinger   crc32: use uint32...
66
  	uint32_t crc;
994bc671c   Igor Grinberg   env: move extern ...
67
  	unsigned char *envptr = (unsigned char *)&environment,
dc17fb6dc   Wolfgang Denk   Cleanup build pro...
68
69
  		*dataptr = envptr + ENV_HEADER_SIZE;
  	unsigned int datasize = ENV_SIZE;
837db3d87   Mike Frysinger   tools/envcrc: add...
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  	unsigned int eoe;
  
  	if (argv[1] && !strncmp(argv[1], "--binary", 8)) {
  		int ipad = 0xff;
  		if (argv[1][8] == '=')
  			sscanf(argv[1] + 9, "%i", &ipad);
  		pad = ipad;
  	}
  
  	if (pad) {
  		/* find the end of env */
  		for (eoe = 0; eoe < datasize - 1; ++eoe)
  			if (!dataptr[eoe] && !dataptr[eoe+1]) {
  				eoe += 2;
  				break;
  			}
  		if (eoe < datasize - 1)
  			memset(dataptr + eoe, pad, datasize - eoe);
  	}
fe57bb19b   wdenk   Initial revision
89

dc17fb6dc   Wolfgang Denk   Cleanup build pro...
90
  	crc = crc32 (0, dataptr, datasize);
fe57bb19b   wdenk   Initial revision
91

dc17fb6dc   Wolfgang Denk   Cleanup build pro...
92
93
  	/* Check if verbose mode is activated passing a parameter to the program */
  	if (argc > 1) {
837db3d87   Mike Frysinger   tools/envcrc: add...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  		if (!strncmp(argv[1], "--binary", 8)) {
  			int le = (argc > 2 ? !strcmp(argv[2], "le") : 1);
  			size_t i, start, end, step;
  			if (le) {
  				start = 0;
  				end = ENV_HEADER_SIZE;
  				step = 1;
  			} else {
  				start = ENV_HEADER_SIZE - 1;
  				end = -1;
  				step = -1;
  			}
  			for (i = start; i != end; i += step)
  				printf("%c", (crc & (0xFF << (i * 8))) >> (i * 8));
f67066b6b   Mike Frysinger   envcrc: check ret...
108
109
110
  			if (fwrite(dataptr, 1, datasize, stdout) != datasize)
  				fprintf(stderr, "fwrite() failed: %s
  ", strerror(errno));
837db3d87   Mike Frysinger   tools/envcrc: add...
111
112
113
114
115
116
117
  		} else {
  			printf("CRC32 from offset %08X to %08X of environment = %08X
  ",
  				(unsigned int) (dataptr - envptr),
  				(unsigned int) (dataptr - envptr) + datasize,
  				crc);
  		}
dc17fb6dc   Wolfgang Denk   Cleanup build pro...
118
119
120
121
  	} else {
  		printf ("0x%08X
  ", crc);
  	}
a747a7f31   Wolfgang Denk   Revert "env: only...
122
123
124
125
  #else
  	printf ("0
  ");
  #endif
dc17fb6dc   Wolfgang Denk   Cleanup build pro...
126
  	return EXIT_SUCCESS;
fe57bb19b   wdenk   Initial revision
127
  }