summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Sweeny <scott.sweeny@timesys.com>2009-04-30 10:54:08 -0400
committerScott Sweeny <scott.sweeny@timesys.com>2009-04-30 10:54:08 -0400
commit344bdaa5e02611cbe7b10b41b6c686ee5b0a4eab (patch)
tree9cc58fb0b00bf659089a3f19a3c7c19b7f91ef4a
parentabaf510ad26830e68ddcf2885397a5384c4d428f (diff)
Create environment in MTD (NAND)
This patch originally from LogicPD OMAP35x Release 1.5.0 Original Patch Name: u-boot-1.1.4-omap3430-lv-som-24-create-fw_printenv.patch
-rw-r--r--tools/Makefile10
-rw-r--r--tools/env/fw_env.c13
-rw-r--r--tools/env/mtd-abi.h121
-rw-r--r--tools/env/mtd-user.h20
4 files changed, 157 insertions, 7 deletions
diff --git a/tools/Makefile b/tools/Makefile
index d3dcc7d86e..a73743b1cd 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -56,7 +56,7 @@ HOSTARCH := $(shell uname -m | \
HOSTOS := $(shell uname -s | tr A-Z a-z | \
sed -e 's/\(cygwin\).*/cygwin/')
-TOOLSUBDIRS =
+TOOLSUBDIRS = env
#
# Mac OS X / Darwin's C preprocessor is Apple specific. It
@@ -110,10 +110,10 @@ include $(TOPDIR)/config.mk
# Use native tools and options
#
CPPFLAGS = -idirafter ../include -DTEXT_BASE=$(TEXT_BASE) -DUSE_HOSTCC
-CFLAGS = $(HOST_CFLAGS) $(CPPFLAGS) -O
-AFLAGS = -D__ASSEMBLY__ $(CPPFLAGS)
-CC = $(HOSTCC)
-STRIP = $(HOSTSTRIP)
+# CFLAGS = $(HOST_CFLAGS) $(CPPFLAGS) -O
+# AFLAGS = -D__ASSEMBLY__ $(CPPFLAGS)
+# CC = $(HOSTCC)
+# STRIP = $(HOSTSTRIP)
MAKEDEPEND = makedepend
all: .depend $(BINS) $(LOGO_H) subdirs
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index f723b5bca1..6512820ec2 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -31,7 +31,11 @@
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <unistd.h>
+#if 1
+#include "mtd-user.h"
+#else
#include <linux/mtd/mtd.h>
+#endif
#include "fw_env.h"
typedef unsigned char uchar;
@@ -166,6 +170,7 @@ static inline ulong getenvsize (void)
{
ulong rc = CFG_ENV_SIZE - sizeof (long);
+ // fprintf(stderr, "%s: env_size %d HaveRedundEnv %d\n", __FUNCTION__, CFG_ENV_SIZE, HaveRedundEnv);
if (HaveRedundEnv)
rc -= sizeof (char);
return rc;
@@ -611,11 +616,15 @@ static int env_init (void)
crc1_ok = ((crc1 = crc32 (0, environment.data, ENV_SIZE))
== environment.crc);
if (!HaveRedundEnv) {
+#if 1
+ // PWB!!! Hack! CRC doesn't match, just accept the data
+#else
if (!crc1_ok) {
fprintf (stderr,
- "Warning: Bad CRC, using default environment\n");
+ "Warning1: Bad CRC(%08x != %08x), using default environment\n", crc1, environment.crc);
memcpy(environment.data, default_environment, sizeof default_environment);
}
+#endif
} else {
flag1 = environment.flags;
@@ -650,7 +659,7 @@ static int env_init (void)
free (addr1);
} else if (!crc1_ok && !crc2_ok) {
fprintf (stderr,
- "Warning: Bad CRC, using default environment\n");
+ "Warning1: Bad CRC, using default environment\n");
memcpy(environment.data, default_environment, sizeof default_environment);
curdev = 0;
free (addr1);
diff --git a/tools/env/mtd-abi.h b/tools/env/mtd-abi.h
new file mode 100644
index 0000000000..b5994ea56a
--- /dev/null
+++ b/tools/env/mtd-abi.h
@@ -0,0 +1,121 @@
+/*
+ * $Id: mtd-abi.h,v 1.13 2005/11/07 11:14:56 gleixner Exp $
+ *
+ * Portions of MTD ABI definition which are shared by kernel and user space
+ */
+
+#ifndef __MTD_ABI_H__
+#define __MTD_ABI_H__
+
+#ifndef __KERNEL__ /* Urgh. The whole point of splitting this out into
+ separate files was to avoid #ifdef __KERNEL__ */
+#define __user
+#endif
+
+struct erase_info_user {
+ uint32_t start;
+ uint32_t length;
+};
+
+struct mtd_oob_buf {
+ uint32_t start;
+ uint32_t length;
+ unsigned char __user *ptr;
+};
+
+#define MTD_ABSENT 0
+#define MTD_RAM 1
+#define MTD_ROM 2
+#define MTD_NORFLASH 3
+#define MTD_NANDFLASH 4
+#define MTD_PEROM 5
+#define MTD_DATAFLASH 6
+#define MTD_OTHER 14
+#define MTD_UNKNOWN 15
+
+#define MTD_CLEAR_BITS 1 // Bits can be cleared (flash)
+#define MTD_SET_BITS 2 // Bits can be set
+#define MTD_ERASEABLE 4 // Has an erase function
+#define MTD_WRITEB_WRITEABLE 8 // Direct IO is possible
+#define MTD_VOLATILE 16 // Set for RAMs
+#define MTD_XIP 32 // eXecute-In-Place possible
+#define MTD_OOB 64 // Out-of-band data (NAND flash)
+#define MTD_ECC 128 // Device capable of automatic ECC
+#define MTD_NO_VIRTBLOCKS 256 // Virtual blocks not allowed
+#define MTD_PROGRAM_REGIONS 512 // Configurable Programming Regions
+
+// Some common devices / combinations of capabilities
+#define MTD_CAP_ROM 0
+#define MTD_CAP_RAM (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEB_WRITEABLE)
+#define MTD_CAP_NORFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE)
+#define MTD_CAP_NANDFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE|MTD_OOB)
+#define MTD_WRITEABLE (MTD_CLEAR_BITS|MTD_SET_BITS)
+
+
+// Types of automatic ECC/Checksum available
+#define MTD_ECC_NONE 0 // No automatic ECC available
+#define MTD_ECC_RS_DiskOnChip 1 // Automatic ECC on DiskOnChip
+#define MTD_ECC_SW 2 // SW ECC for Toshiba & Samsung devices
+
+/* ECC byte placement */
+#define MTD_NANDECC_OFF 0 // Switch off ECC (Not recommended)
+#define MTD_NANDECC_PLACE 1 // Use the given placement in the structure (YAFFS1 legacy mode)
+#define MTD_NANDECC_AUTOPLACE 2 // Use the default placement scheme
+#define MTD_NANDECC_PLACEONLY 3 // Use the given placement in the structure (Do not store ecc result on read)
+#define MTD_NANDECC_AUTOPL_USR 4 // Use the given autoplacement scheme rather than using the default
+
+/* OTP mode selection */
+#define MTD_OTP_OFF 0
+#define MTD_OTP_FACTORY 1
+#define MTD_OTP_USER 2
+
+struct mtd_info_user {
+ uint8_t type;
+ uint32_t flags;
+ uint32_t size; // Total size of the MTD
+ uint32_t erasesize;
+ uint32_t oobblock; // Size of OOB blocks (e.g. 512)
+ uint32_t oobsize; // Amount of OOB data per block (e.g. 16)
+ uint32_t ecctype;
+ uint32_t eccsize;
+};
+
+struct region_info_user {
+ uint32_t offset; /* At which this region starts,
+ * from the beginning of the MTD */
+ uint32_t erasesize; /* For this region */
+ uint32_t numblocks; /* Number of blocks in this region */
+ uint32_t regionindex;
+};
+
+struct otp_info {
+ uint32_t start;
+ uint32_t length;
+ uint32_t locked;
+};
+
+#define MEMGETINFO _IOR('M', 1, struct mtd_info_user)
+#define MEMERASE _IOW('M', 2, struct erase_info_user)
+#define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf)
+#define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf)
+#define MEMLOCK _IOW('M', 5, struct erase_info_user)
+#define MEMUNLOCK _IOW('M', 6, struct erase_info_user)
+#define MEMGETREGIONCOUNT _IOR('M', 7, int)
+#define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user)
+#define MEMSETOOBSEL _IOW('M', 9, struct nand_oobinfo)
+#define MEMGETOOBSEL _IOR('M', 10, struct nand_oobinfo)
+#define MEMGETBADBLOCK _IOW('M', 11, loff_t)
+#define MEMSETBADBLOCK _IOW('M', 12, loff_t)
+#define OTPSELECT _IOR('M', 13, int)
+#define OTPGETREGIONCOUNT _IOW('M', 14, int)
+#define OTPGETREGIONINFO _IOW('M', 15, struct otp_info)
+#define OTPLOCK _IOR('M', 16, struct otp_info)
+
+struct nand_oobinfo {
+ uint32_t useecc;
+ uint32_t eccbytes;
+ uint32_t oobfree[8][2];
+ uint32_t eccpos[32];
+};
+
+#endif /* __MTD_ABI_H__ */
diff --git a/tools/env/mtd-user.h b/tools/env/mtd-user.h
new file mode 100644
index 0000000000..d9d2ca65e5
--- /dev/null
+++ b/tools/env/mtd-user.h
@@ -0,0 +1,20 @@
+/*
+ * $Id: mtd-user.h,v 1.2 2004/05/05 14:44:57 dwmw2 Exp $
+ *
+ * MTD ABI header for use by user space only.
+ */
+
+#ifndef __MTD_USER_H__
+#define __MTD_USER_H__
+
+#include <stdint.h>
+
+/* This file is blessed for inclusion by userspace */
+#include "mtd-abi.h"
+
+typedef struct mtd_info_user mtd_info_t;
+typedef struct erase_info_user erase_info_t;
+typedef struct region_info_user region_info_t;
+typedef struct nand_oobinfo nand_oobinfo_t;
+
+#endif /* __MTD_USER_H__ */