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