xref: /OK3568_Linux_fs/u-boot/tools/envcrc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2001
3*4882a593Smuzhiyun  * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <errno.h>
9*4882a593Smuzhiyun #include <stdio.h>
10*4882a593Smuzhiyun #include <stdint.h>
11*4882a593Smuzhiyun #include <stdlib.h>
12*4882a593Smuzhiyun #include <string.h>
13*4882a593Smuzhiyun #include <unistd.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <linux/kconfig.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef __ASSEMBLY__
18*4882a593Smuzhiyun #define	__ASSEMBLY__			/* Dirty trick to get only #defines	*/
19*4882a593Smuzhiyun #endif
20*4882a593Smuzhiyun #define	__ASM_STUB_PROCESSOR_H__	/* don't include asm/processor.		*/
21*4882a593Smuzhiyun #include <config.h>
22*4882a593Smuzhiyun #undef	__ASSEMBLY__
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #if defined(CONFIG_ENV_IS_IN_FLASH)
25*4882a593Smuzhiyun # ifndef  CONFIG_ENV_ADDR
26*4882a593Smuzhiyun #  define CONFIG_ENV_ADDR	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
27*4882a593Smuzhiyun # endif
28*4882a593Smuzhiyun # ifndef  CONFIG_ENV_OFFSET
29*4882a593Smuzhiyun #  define CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
30*4882a593Smuzhiyun # endif
31*4882a593Smuzhiyun # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
32*4882a593Smuzhiyun #  define CONFIG_ENV_ADDR_REDUND	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
33*4882a593Smuzhiyun # endif
34*4882a593Smuzhiyun # ifndef  CONFIG_ENV_SIZE
35*4882a593Smuzhiyun #  define CONFIG_ENV_SIZE	CONFIG_ENV_SECT_SIZE
36*4882a593Smuzhiyun # endif
37*4882a593Smuzhiyun # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
38*4882a593Smuzhiyun #  define CONFIG_ENV_SIZE_REDUND	CONFIG_ENV_SIZE
39*4882a593Smuzhiyun # endif
40*4882a593Smuzhiyun # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) && \
41*4882a593Smuzhiyun      ((CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN))
42*4882a593Smuzhiyun #  define ENV_IS_EMBEDDED
43*4882a593Smuzhiyun # endif
44*4882a593Smuzhiyun # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
45*4882a593Smuzhiyun #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
46*4882a593Smuzhiyun # endif
47*4882a593Smuzhiyun #endif	/* CONFIG_ENV_IS_IN_FLASH */
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #if defined(ENV_IS_EMBEDDED) && !defined(CONFIG_BUILD_ENVCRC)
50*4882a593Smuzhiyun # define CONFIG_BUILD_ENVCRC
51*4882a593Smuzhiyun #endif
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
54*4882a593Smuzhiyun # define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
55*4882a593Smuzhiyun #else
56*4882a593Smuzhiyun # define ENV_HEADER_SIZE	(sizeof(uint32_t))
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #ifdef CONFIG_BUILD_ENVCRC
63*4882a593Smuzhiyun # include <environment.h>
64*4882a593Smuzhiyun extern unsigned int env_size;
65*4882a593Smuzhiyun extern env_t environment;
66*4882a593Smuzhiyun #endif	/* CONFIG_BUILD_ENVCRC */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun extern uint32_t crc32 (uint32_t, const unsigned char *, unsigned int);
69*4882a593Smuzhiyun 
main(int argc,char ** argv)70*4882a593Smuzhiyun int main (int argc, char **argv)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun #ifdef CONFIG_BUILD_ENVCRC
73*4882a593Smuzhiyun 	unsigned char pad = 0x00;
74*4882a593Smuzhiyun 	uint32_t crc;
75*4882a593Smuzhiyun 	unsigned char *envptr = (unsigned char *)&environment,
76*4882a593Smuzhiyun 		*dataptr = envptr + ENV_HEADER_SIZE;
77*4882a593Smuzhiyun 	unsigned int datasize = ENV_SIZE;
78*4882a593Smuzhiyun 	unsigned int eoe;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	if (argv[1] && !strncmp(argv[1], "--binary", 8)) {
81*4882a593Smuzhiyun 		int ipad = 0xff;
82*4882a593Smuzhiyun 		if (argv[1][8] == '=')
83*4882a593Smuzhiyun 			sscanf(argv[1] + 9, "%i", &ipad);
84*4882a593Smuzhiyun 		pad = ipad;
85*4882a593Smuzhiyun 	}
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	if (pad) {
88*4882a593Smuzhiyun 		/* find the end of env */
89*4882a593Smuzhiyun 		for (eoe = 0; eoe < datasize - 1; ++eoe)
90*4882a593Smuzhiyun 			if (!dataptr[eoe] && !dataptr[eoe+1]) {
91*4882a593Smuzhiyun 				eoe += 2;
92*4882a593Smuzhiyun 				break;
93*4882a593Smuzhiyun 			}
94*4882a593Smuzhiyun 		if (eoe < datasize - 1)
95*4882a593Smuzhiyun 			memset(dataptr + eoe, pad, datasize - eoe);
96*4882a593Smuzhiyun 	}
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	crc = crc32 (0, dataptr, datasize);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	/* Check if verbose mode is activated passing a parameter to the program */
101*4882a593Smuzhiyun 	if (argc > 1) {
102*4882a593Smuzhiyun 		if (!strncmp(argv[1], "--binary", 8)) {
103*4882a593Smuzhiyun 			int le = (argc > 2 ? !strcmp(argv[2], "le") : 1);
104*4882a593Smuzhiyun 			size_t i, start, end, step;
105*4882a593Smuzhiyun 			if (le) {
106*4882a593Smuzhiyun 				start = 0;
107*4882a593Smuzhiyun 				end = ENV_HEADER_SIZE;
108*4882a593Smuzhiyun 				step = 1;
109*4882a593Smuzhiyun 			} else {
110*4882a593Smuzhiyun 				start = ENV_HEADER_SIZE - 1;
111*4882a593Smuzhiyun 				end = -1;
112*4882a593Smuzhiyun 				step = -1;
113*4882a593Smuzhiyun 			}
114*4882a593Smuzhiyun 			for (i = start; i != end; i += step)
115*4882a593Smuzhiyun 				printf("%c", (crc & (0xFF << (i * 8))) >> (i * 8));
116*4882a593Smuzhiyun 			if (fwrite(dataptr, 1, datasize, stdout) != datasize)
117*4882a593Smuzhiyun 				fprintf(stderr, "fwrite() failed: %s\n", strerror(errno));
118*4882a593Smuzhiyun 		} else {
119*4882a593Smuzhiyun 			printf("CRC32 from offset %08X to %08X of environment = %08X\n",
120*4882a593Smuzhiyun 				(unsigned int) (dataptr - envptr),
121*4882a593Smuzhiyun 				(unsigned int) (dataptr - envptr) + datasize,
122*4882a593Smuzhiyun 				crc);
123*4882a593Smuzhiyun 		}
124*4882a593Smuzhiyun 	} else {
125*4882a593Smuzhiyun 		printf ("0x%08X\n", crc);
126*4882a593Smuzhiyun 	}
127*4882a593Smuzhiyun #else
128*4882a593Smuzhiyun 	printf ("0\n");
129*4882a593Smuzhiyun #endif
130*4882a593Smuzhiyun 	return EXIT_SUCCESS;
131*4882a593Smuzhiyun }
132