summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/shared
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-24 07:17:46 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-24 10:24:22 +0200
commit2101f54bef0daab3cadb1013d18f139240e723c3 (patch)
tree80da9bf1b50b17993e0bf5c1137706a47995ee53 /bsps/powerpc/shared
parentbsps/powerpc: Move bootloader to bsps (diff)
downloadrtems-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.c74
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) */