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