diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-04-24 07:17:46 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-04-24 10:24:22 +0200 |
commit | 2101f54bef0daab3cadb1013d18f139240e723c3 (patch) | |
tree | 80da9bf1b50b17993e0bf5c1137706a47995ee53 /bsps/powerpc/shared | |
parent | bsps/powerpc: Move bootloader to bsps (diff) | |
download | rtems-2101f54bef0daab3cadb1013d18f139240e723c3.tar.bz2 |
bsps: Move uboot_getenv.c to bsps
This patch is a part of the BSP source reorganization.
Update #3285.
Diffstat (limited to 'bsps/powerpc/shared')
-rw-r--r-- | bsps/powerpc/shared/u-boot/uboot_getenv.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/bsps/powerpc/shared/u-boot/uboot_getenv.c b/bsps/powerpc/shared/u-boot/uboot_getenv.c new file mode 100644 index 0000000000..43ef4af81b --- /dev/null +++ b/bsps/powerpc/shared/u-boot/uboot_getenv.c @@ -0,0 +1,74 @@ +/* + * COPYRIGHT (c) 1989-2008. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include <bsp.h> + +/* + * If the BSP variant does not have UBoot, then disable all contents + * of this file. + */ +#if defined(HAS_UBOOT) + +#include <stdint.h> +#include <string.h> + +/* Assumed to be provided by BSP */ +extern const uint8_t *uboot_environment; +extern const size_t uboot_environment_size; + +/* + * The U-Boot source code appears to use the CRC32 code from zlib. + * But I cannot find a way to get the crc32() in zlib code to + * generate the CRC found in the Flash on the Icecube board. + * So for now, always return TRUE. + */ +static int bsp_uboot_environ_check_crc(void) +{ +#if 0 + unsigned long crc; + unsigned long max; + + for (max=0 ; max <= 0x20000 ; max+=4 ) { + crc = crc32( 0, NULL, 0 ); + crc = crc32( crc, &uboot_environment[4], max); + printk( "crc=0x%08lx need %0x max=%d\n", crc, + *(int *)uboot_environment, max ); + } +#endif + return 1; +} + +const char *bsp_uboot_getenv( + const char *name +) +{ + char lhs[64]; + size_t i, j; + + if ( !bsp_uboot_environ_check_crc() ) + return NULL; + + for ( i=4 ; i<uboot_environment_size ; i++ ) { + memset( lhs, '\0', sizeof(lhs) ); + for( j=0 ; uboot_environment[i] != '=' && j<sizeof(lhs) ; i++, j++ ) { + lhs[j] = uboot_environment[i]; + } + if ( !strncmp( name, lhs, sizeof(lhs) ) ) { + return (const char *)&uboot_environment[i+1]; + } + + for ( i++ ; uboot_environment[i] && i<uboot_environment_size ; i++ ) + ; + if ( !uboot_environment[i+1] ) + return NULL; + } + return NULL; +} + +#endif /* defined(HAS_UBOOT) */ |