Seperated driver interface from data format for nand/nor
authorMike Line <m-line1@ti.com>
Wed, 5 Jan 2011 23:50:21 +0000 (18:50 -0500)
committerMike Line <m-line1@ti.com>
Wed, 5 Jan 2011 23:50:21 +0000 (18:50 -0500)
The nand/nor data format was seperated from the interface. The
ibl configuration structure was changed to meet this
change.

57 files changed:
src/device/c6455/c6455.c
src/device/c6455/target.h
src/device/c6457/c6457.c
src/device/c6457/target.h
src/device/c6472/c6472.c
src/device/c6472/target.h
src/device/c6474/c6474.c
src/device/c6474/target.h
src/device/c64x/make/makefile
src/device/c661x/c661x.c
src/device/c661x/c661xinit.c
src/device/c661x/target.h
src/device/device.h
src/driver/c64x/make/makefile
src/driver/nand/nand.c
src/driver/nor/nor.c [new file with mode: 0644]
src/driver/nor/nor.h [new file with mode: 0644]
src/ethboot/ethboot.c
src/hw/c64x/make/makefile
src/hw/emif25/emif25.c [new file with mode: 0644]
src/hw/emif25/emif25.h [new file with mode: 0644]
src/hw/emif25/emif25_loc.h [new file with mode: 0644]
src/hw/nands/emif25/nandemif25.c
src/hw/nands/gpio/nandgpio.c
src/hw/nands/nandhwapi.h
src/hw/nands/spi/nandspi.c
src/hw/nors/emif25/noremif25.c [new file with mode: 0644]
src/hw/nors/nor_api.h [new file with mode: 0644]
src/hw/nors/spi/norspi.c [new file with mode: 0644]
src/ibl.h
src/main/c64x/make/makefile
src/main/iblinit.c
src/main/ibliniti2c.c
src/main/iblinitspinor.c
src/main/iblmain.c
src/make/Makefile
src/make/ibl_c6455/ibl_common.inc
src/make/ibl_c6455/ibl_init_objs_template.inc
src/make/ibl_c6455/ibl_objs_template.inc
src/make/ibl_c6457/ibl_common.inc
src/make/ibl_c6457/ibl_init_objs_template.inc
src/make/ibl_c6457/ibl_objs_template.inc
src/make/ibl_c6472/ibl_common.inc
src/make/ibl_c6472/ibl_init_objs_template.inc
src/make/ibl_c6472/ibl_objs_template.inc
src/make/ibl_c6474/ibl_common.inc
src/make/ibl_c6474/ibl_init_objs_template.inc
src/make/ibl_c6474/ibl_objs_template.inc
src/make/ibl_c661x/ibl_common.inc
src/make/ibl_c661x/ibl_objs_template.inc
src/make/makestg1
src/make/makestg2
src/nandboot/nandboot.c
src/nandboot/nandboot.h
src/norboot/c64x/make/makefile [new file with mode: 0644]
src/norboot/norboot.c [new file with mode: 0644]
src/norboot/norboot.h [moved from src/hw/nands/emif25/nandemif25_loc.h with 89% similarity]

index 1d6d9a17d281082dbe1328718c388ebf3ee7ca14..e103d48533a7be8ba8cd2f91bc2b3523dc968273 100644 (file)
@@ -189,7 +189,7 @@ int32 devicePowerPeriph (int32 modNum)
  *
  *  @details  
  */
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 int32 deviceConfigureForNand(void)
 {
     return (0);
@@ -215,7 +215,7 @@ void deviceLoadDefaultEthAddress (uint8 *maddr)
  *  @brief  Return the NAND interface call table. Only GPIO is supported on c6455
  */
 
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 nandCtbl_t nandCtbl =  {
 
     nandHwDriverInit,
index ab4d8893189f4a875e4f4706b98ea5f5522d11cc..2551d31aa0076b901c9fdfe167b5fd8621fc01c7 100644 (file)
  */
 #define TARGET_PWR_NAND     -1
 
+/**
+ *  @brief
+ *      The PSC number for GPIO. GPIO is in the always on domain
+ */
+#define TARGET_PWR_GPIO     -1
+
 
 /**
  *  @brief
 #define BOOT_SET_BITFIELD(z,f,x,y)  (((UINT32)z) & ~BOOTBITMASK(x,y)) | ( (((UINT32)f) << (y)) & BOOTBITMASK(x,y) )
 
 
+/**
+ *  @brief
+ *      The c6455 supports only booting the ibl from i2c
+ */
+#define deviceReadBootDevice()  BOOT_DEVICE_I2C
+
+
 
 
index 9701783678c8717d0c73d6f31beab19da0b5a4ff..084e35617934222dbe978dfc478bfb4325018569 100644 (file)
@@ -146,7 +146,7 @@ int32 devicePowerPeriph (int32 modNum)
  *  @details  On the evm the nand controller is enabled by setting 
  *            gpio 14 high
  */
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 int32 deviceConfigureForNand(void)
 {
        hwGpioSetDirection(NAND_MODE_GPIO, GPIO_OUT);
@@ -182,7 +182,7 @@ void deviceLoadDefaultEthAddress (uint8 *maddr)
  *  @brief  Return the NAND interface call table. Only GPIO is supported on c6457
  */
 
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 nandCtbl_t nandCtbl =  {
 
     nandHwDriverInit,
index 516056358b50875f98e37d87a1d678fbad7683df..81ead8494ca9d57c8e1a68a2459a80c3b2ab34f0 100644 (file)
  */
 #define TARGET_PWR_NAND     -1
 
+/**
+ *  @brief
+ *      The PSC number for GPIO. GPIO is in the always on domain
+ */
+#define TARGET_PWR_GPIO     -1
+
 /**
  * @brief
  *  Flag to indicate timer 0 power up requested. The time is always on in the 6474
 #define BOOT_SET_BITFIELD(z,f,x,y)  (((UINT32)z) & ~BOOTBITMASK(x,y)) | ( (((UINT32)f) << (y)) & BOOTBITMASK(x,y) )
 
 
+/**
+ *  @brief
+ *      The c6457 supports only booting the ibl from i2c
+ */
+#define deviceReadBootDevice()  BOOT_DEVICE_I2C
+
index accd7df46ce0644d5aeb62ee8d599513741d1fab..e5d78f690537e3894a7133ad3126ab7630e84251 100644 (file)
@@ -146,7 +146,7 @@ int32 devicePowerPeriph (int32 modNum)
  *  @details  On the evm the nand controller is enabled by setting 
  *            gpio 14 high
  */
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 int32 deviceConfigureForNand(void)
 {
        hwGpioSetDirection(NAND_MODE_GPIO, GPIO_OUT);
@@ -183,7 +183,7 @@ void deviceLoadDefaultEthAddress (uint8 *maddr)
  *  @brief  Return the NAND interface call table. Only GPIO is supported on c6472 
  */
 
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 nandCtbl_t nandCtbl =  {
 
     nandHwDriverInit,
index 3af48b3eb8ffe01b984052f72179dbc86245a761..7cdfc6cce296ac51e88b7dfa0c7e682078d677b8 100644 (file)
  */
 #define TARGET_PWR_NAND     -1
 
+/**
+ *  @brief
+ *      The PSC number for GPIO. GPIO is in the always on domain
+ */
+#define TARGET_PWR_GPIO     -1
+
+
 /**
  * @brief
  *  Flag to indicate timer 0 power up requested. The time is always on in the 6472
 #define BOOT_READ_BITFIELD(z,x,y)   (((UINT32)z) & BOOTBITMASK(x,y)) >> (y)
 #define BOOT_SET_BITFIELD(z,f,x,y)  (((UINT32)z) & ~BOOTBITMASK(x,y)) | ( (((UINT32)f) << (y)) & BOOTBITMASK(x,y) )
 
+/**
+ *  @brief
+ *      The c6472 supports only booting the ibl from i2c
+ */
+#define deviceReadBootDevice()  BOOT_DEVICE_I2C
 
index 3868040363b94c89264eacf9ce93c361faf55b40..3a4b05d0dcfe0423a1ded815f03124a53679f9ba 100644 (file)
@@ -146,7 +146,7 @@ int32 devicePowerPeriph (int32 modNum)
  *  @details  On the evm the nand controller is enabled by setting 
  *            gpio 14 high
  */
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 int32 deviceConfigureForNand(void)
 {
        hwGpioSetDirection(NAND_MODE_GPIO, GPIO_OUT);
@@ -181,7 +181,7 @@ void deviceLoadDefaultEthAddress (uint8 *maddr)
  *  @brief  Return the NAND interface call table. Only GPIO is supported on c6474 
  */
 
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 nandCtbl_t nandCtbl =  {
 
     nandHwDriverInit,
index 53eb54330565fede411ba169f7be01740274af9d..88b6f9d9474ac42e5d311fca21b7f2efc8608de8 100644 (file)
  */
 #define TARGET_PWR_NAND     -1
 
+/**
+ *  @brief
+ *      The PSC number for GPIO. GPIO is in the always on domain
+ */
+#define TARGET_PWR_GPIO     -1
+
+
 /**
  * @brief
  *  Flag to indicate timer 0 power up requested. The time is always on in the 6474
 #define BOOT_SET_BITFIELD(z,f,x,y)  (((UINT32)z) & ~BOOTBITMASK(x,y)) | ( (((UINT32)f) << (y)) & BOOTBITMASK(x,y) )
 
 
+/**
+ *  @brief
+ *      The c6474 supports only booting the ibl from i2c
+ */
+#define deviceReadBootDevice()  BOOT_DEVICE_I2C
+
index d1cb5b1c01f085a8175426a4d3e99d80b8087000..a4a7f603a026a8dfd51a7165677f9f25299a632a 100644 (file)
@@ -64,7 +64,7 @@ else
     CSRC= c6474l.c
    else
     ifeq ($(TARGET),c6457)
-     CSRC= c6457.c
+     CSRC= c6457.c c6457init.c
        else
         ifeq ($(TARGET),c661x)
          CSRC= c661x.c c661xinit.c c661xutil.c
@@ -98,6 +98,7 @@ C6X_C_DIR+= ;$(IBL_ROOT)/hw/cpdma
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/pa
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/serdes
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/nands
+C6X_C_DIR+= ;$(IBL_ROOT)/hw/nors
 C6X_C_DIR+= ;$(IBL_ROOT)/driver/eth
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/spi
 export C6X_C_DIR
index dd90497e7b14847a7af4b00b8033f137e16b9c3c..199e9545e0e017b82ac7a2e89d57ee0987431516 100644 (file)
 #include "serdes_api.h"
 #include "net.h"
 #include "nandhwapi.h"
+#include "nor_api.h"
 #include "spi_api.h"
 #include <string.h>
 
 extern cregister unsigned int DNUM;
 
-/* Excluding NAND exclused both SPI and EMIF nand */
-#ifdef EXCLUDE_NAND
- #define EXCLUDE_NAND_EMIF
- #define EXCLUDE_NAND_SPI
-#endif
-
 /**
  *  @brief Determine if an address is local
  *
@@ -168,55 +163,30 @@ int32 devicePowerPeriph (int32 modNum)
         
 }
 
-
 /**
- *  @brief  Enable EMIF25 or SPI interface to the NAND
- *
+ *  @brief return the PSC module number for SPI
  */
-#ifndef EXCLUDE_NAND
-int32 deviceConfigureForNand(void)
+int32 deviceSpiPscNum (void)
 {
+    uint32 v;
 
-#ifndef EXCLUDE_NAND_SPI
-
-    if (ibl.nandConfig.interface == ibl_NAND_IF_SPI)  {
-
-        spiConfig_t spiCfg;
-        uint32      v;
-        SINT16      ret;
-
-        /* SPI is module number 3 only on the c6618. On the c6616 the SPI is in the
-         * always on domain */
-        v = *((Uint32 *)DEVICE_JTAG_ID_REG);
-        if (v == DEVICE_C6618_JTAG_ID_VAL)
-            devicePowerPeriph (3);
-
-        /* Translate to the low level driver */
-        spiCfg.port      = 0;
-        spiCfg.mode      = ibl.spiConfig.mode;
-        spiCfg.addrWidth = ibl.spiConfig.addrWidth;
-        spiCfg.npin      = ibl.spiConfig.nPins;
-        spiCfg.csel      = ibl.spiConfig.csel;
-        spiCfg.c2tdelay  = ibl.spiConfig.c2tdelay;
-
-        /* On c661x devices the PLL module has a built in divide by 6, and the SPI
-         * has a maximum clock divider value of 0xff */
-        v = ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz / (DEVICE_SPI_MOD_DIVIDER * ibl.spiConfig.busFreqMHz);
-        if (v > 0xff)
-            v = 0xff;
+    /* SPI is module number 3 only on the c6618. On the c6616 the SPI is in the
+     * always on domain */
+    v = *((Uint32 *)DEVICE_JTAG_ID_REG);
+    if (v == DEVICE_C6618_JTAG_ID_VAL)
+        return (3);
 
-        spiCfg.clkdiv =  (UINT16) v;
+    return (-1);  /* A negative number indicates the always on domain */
+}
 
-        ret = hwSpiConfig (&spiCfg);
 
-        if (ret != 0)  {
-            iblStatus.iblFail = ibl_FAIL_CODE_SPI_PARAMS;
-            return (-1);
-        }
 
-    }
-
-#endif
+/**
+ *  @brief  Enable EMIF25 or SPI interface to the NAND
+ *
+ */
+int32 deviceConfigureForNand(void)
+{
 
     return (0);
 
@@ -224,9 +194,9 @@ int32 deviceConfigureForNand(void)
 
 /**
  *  @brief
- *      Return the base memory address for NAND in a given chip select space
+ *      Return the base memory address for emif25 in a given chip select space
  */
-uint32 deviceNandMemBase (int32 cs)
+uint32 deviceEmif25MemBase (int32 cs)
 {
     switch (cs)  {
 
@@ -244,17 +214,18 @@ uint32 deviceNandMemBase (int32 cs)
 
 }
 
+
 /**
  *  @brief
- *      Return the PSC number for NAND. Only 6618 has NAND
+ *      Return the PSC number for NAND/NOR through emif. Only 6618 has the emif
  */
-Int32 deviceNandPscNum (void)
+Int32 deviceEmifPscNum (void)
 {
     Uint32 v;
 
     v = *((Uint32 *)DEVICE_JTAG_ID_REG);
     if (v == DEVICE_C6618_JTAG_ID_VAL)
-        return (TARGET_PWR_NAND_C6618);
+        return (TARGET_PWR_EMIF_C6618);
 
     /* Return a negative number to indicate no PSC module is associated with NAND */
     return (-1);
@@ -262,8 +233,6 @@ Int32 deviceNandPscNum (void)
 }
 
 
-#endif
-
 
 /**
  *  @brief
@@ -604,13 +573,14 @@ nandCtbl_t *deviceGetNandCtbl (int32 interface)
 
 #ifndef EXCLUDE_NAND_SPI
 
-    if (interface == ibl_NAND_IF_SPI)
+    if (interface == ibl_PMEM_IF_SPI)
         return (&nandSpiCtbl);
 
 #endif
 
 #ifndef EXCLUDE_NAND_EMIF
-    if ((interface >= ibl_NAND_IF_CHIPSEL_2) && (interface <= ibl_NAND_IF_CHIPSEL_5))
+
+    if ((interface >= ibl_PMEM_IF_CHIPSEL_2) && (interface <= ibl_PMEM_IF_CHIPSEL_5))
         return (&nandEmifCtbl);
 
 #endif
@@ -619,6 +589,58 @@ nandCtbl_t *deviceGetNandCtbl (int32 interface)
 
 }
 
+
+/**
+ * @brief
+ *      Get the nor call table for the specified nor interface
+ */
+
+#ifndef EXCLUDE_NOR_EMIF
+norCtbl_t norEmifCtbl = {
+    
+    norHwEmifDriverInit,
+    norHwEmifDriverReadBytes,
+    norHwEmifDriverClose
+
+};
+
+#endif
+
+#ifndef EXCLUDE_NOR_SPI
+
+norCtbl_t norSpiCtbl = {
+    
+    norHwSpiDriverInit,
+    norHwSpiDriverReadBytes,
+    norHwSpiDriverClose
+
+};
+
+#endif
+
+norCtbl_t *deviceGetNorCtbl (int32 interface)
+{
+
+#ifndef EXCLUDE_NOR_SPI
+    
+    if (interface == ibl_PMEM_IF_SPI)
+        return (&norSpiCtbl);
+
+#endif
+
+#ifndef EXCLUDE_NOR_EMIF
+   
+    if ((interface >= ibl_PMEM_IF_CHIPSEL_2) && (interface <= ibl_PMEM_IF_CHIPSEL_5))
+        return (&norEmifCtbl);
+
+#endif
+
+    return (NULL);
+
+}
+    
+
+
     
 
 
index 5857e9ace1a70b0cc5cfc35fd5a837b3c63ced80..e2e77048ce16df0c8eccbbf2c05b5befe6f40be1 100644 (file)
 #include "spi_api.h"
 #include "tiboot_c661x.h"       
 
-#ifdef EXCLUDE_SPI
- #define EXCLUDE_NAND_SPI
- #define EXCLUDE_NOR_SPI
-#elif (defined(EXCLUDE_NAND_SPI) && defined(EXCLUDE_NOR_SPI))
- #define EXCLUDE_SPI
-#endif
-
-
 
 /**
  * @brief Configure the PLLs
@@ -133,7 +125,7 @@ int32 deviceReadBootDevice (void)
 }
 
 
-#ifndef EXCLUDE_SPI
+#if (!defined(EXCLUDE_NOR_SPI) || !defined(EXCLUDE_NAND_SPI))
 /**
  *  @brief
  *      Return the default hardware configuration for SPI. If this information
index 027f29ac028945af940a87a18b4106303fae0cec..968a8ec5085912adbd8c4331aea380a23e0925ef 100644 (file)
  *  @brief
  *    The PSC number for NAND depends on the device
  */
-#define TARGET_PWR_NAND         deviceNandPscNum()
-#define TARGET_PWR_NAND_C6618   3
+#define TARGET_PWR_EMIF         deviceEmifPscNum()
+#define TARGET_PWR_EMIF_C6618   3
 
 /*
  *  @brief
  */
 #define TARGET_PWR_SPI      deviceSpiPscNum()
 
+/**
+ *  @brief
+ *      The PSC number for GPIO. GPIO is in the always on domain
+ */
+#define TARGET_PWR_GPIO     -1
+
 /**
  * @brief
  *  Flag to indicate timer 0 power up requested. The time is always on in the 6472
@@ -327,5 +333,12 @@ Int32 targetMacRcv (void *ptr_device, UINT8 *buffer);
 #define ROM_BOOT_PARAMS_ADDR_C6618   0x873680
 #define ROM_BOOT_PARAMS_ADDR_C6616   0x8f3680
 
+/**
+ *  @brief
+ *      No device specific configuration required for NOR boot, so
+ *      the function call is defined to return success.
+ */
+#define deviceConfigureForNor()    0
+
 
 #endif /* _TARGET_H */
index 32d0d78464a4559914514a4ea992b12b4be7d52e..e80dd01393e163867f3dfe71643a2b02552365e8 100644 (file)
@@ -165,7 +165,7 @@ void chipDelay32 (uint32 nCycles);
  *
  *  @details
  *      Some devices support multiple NAND interface at once (EMIF25 and SPI).
- *      This function returns to the lower level driver the pointer to the
+ *      This function returns a pointer to the lower level function
  *      table to use. The table is selected in the ibl configuration.
  */
 typedef struct nandCtbl_s  {
@@ -182,9 +182,23 @@ nandCtbl_t *deviceGetNandCtbl (int32 interface);
 
 /**
  *  @brief
- *      Return the boot device for the second part of the loader
+ *      Return the NOR interface function table
+ *
+ *  @details
+ *      NOR is supported through both SPI and EMIF. This function returns a pointer
+ *      to the lower level function table to use during boot.
  */
-Int32 deviceReadBootDevice(void);
+typedef struct norCtbl_s  {
+
+    Int32 (*nct_driverInit)         (int32 cs);
+    Int32 (*nct_driverReadBytes)    (Uint8 *data, Uint32 nbytes, Uint32 address);
+    Int32 (*nct_driverClose)        (void);
+    
+} norCtbl_t;
+
+norCtbl_t *deviceGetNorCtbl (int32 interface);
+    
+
 
 /**
  *  @brief
index bb7d45e6ceb7141aa73d2c50cb032d205e3a8bdd..e9d2ae460cbe35c6d91b6bfdf0579d2e7bed1fe4 100644 (file)
@@ -63,7 +63,11 @@ TIMSRC= timer.c
 NANDDIR= nand
 NANDSRC= nand.c
 
-CSRC= $(ETHSRC) $(STRMSRC) $(TIMSRC) $(NANDSRC)
+# The nor dirver
+NORDIR= nor
+NORSRC= nor.c
+
+CSRC= $(ETHSRC) $(STRMSRC) $(TIMSRC) $(NANDSRC) $(NORSRC)
 
 
 .PHONY: driver
@@ -79,6 +83,7 @@ C6X_C_DIR+= ;$(STDINC)
 C6X_C_DIR+= ;$(IBL_ROOT)/driver/timer
 C6X_C_DIR+= ;$(IBL_ROOT)/driver/stream
 C6X_C_DIR+= ;$(IBL_ROOT)/driver/nand
+C6X_C_DIR+= ;$(IBL_ROOT)/driver/nor
 C6X_C_DIR+= ;$(IBL_ROOT)/cfg/$(TARGET)
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/timer
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/nands
@@ -86,7 +91,7 @@ C6X_C_DIR+= ;$(IBL_ROOT)/device
 C6X_C_DIR+= ;$(IBL_ROOT)/device/$(TARGET)
 export C6X_C_DIR
 
-vpath % $(subst ;,$(PATHSEP), $(ECODIR)/$(ETHDIR); $(ECODIR)/$(STRMDIR); $(ECODIR)/$(TIMDIR); $(ECODIR)/$(NANDDIR) )
+vpath % $(subst ;,$(PATHSEP), $(ECODIR)/$(ETHDIR); $(ECODIR)/$(STRMDIR); $(ECODIR)/$(TIMDIR); $(ECODIR)/$(NANDDIR); $(ECODIR)/$(NORDIR) )
 
 
 driver: gen_cdefdep makefile $(OBJS)
index 40528c588300a7748a6d6a75a3a3e34d39490c7a..f63f55650e08aa70cfe646a42d1c601750232558 100644 (file)
@@ -382,7 +382,9 @@ Int32 nand_query (void)
 Int32 nand_close (void)
 {
     if (nandmcb.nand_if != NULL)
-        nandHwDriverClose ();
+        (*nandmcb.nand_if->nct_driverClose)();
+
+    nandmcb.nand_if = NULL;
 
     return (nand_free_return (0));
 
diff --git a/src/driver/nor/nor.c b/src/driver/nor/nor.c
new file mode 100644 (file)
index 0000000..6eafe4c
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+/** 
+ *  @file nor.c
+ *
+ *  @brief The nor boot driver
+ */
+
+#include "types.h"
+#include "ibl.h"
+#include "iblloc.h"
+#include "device.h"
+#include "nor.h"
+#include <string.h>
+#include <stdlib.h>
+
+
+/**
+ *  @brief  The nor master control block which tracks the current nor boot information 
+ */
+typedef struct normcb_s
+{
+    uint32 fpos;        /**<  Current file position. This is an absolute address, not relative to startPos */
+    uint32 startPos;    /**<  Initial file position */
+
+    norCtbl_t *nor_if;  /**<  Low level interface driver */
+
+} normcb_t;
+
+normcb_t normcb;
+
+/**
+ *  @brief 
+ *      Set the current file position
+ */
+Int32 nor_seek (Int32 loc, Int32 from)
+{
+    /* Can't seek from the end of the file, since the end is not known */
+    if (from == 0)
+        normcb.fpos = normcb.startPos + loc;
+    else if (from == 1)
+        normcb.fpos += loc;
+    else
+        return (-1);
+
+    if (normcb.fpos < normcb.startPos)
+        normcb.fpos = normcb.startPos;
+
+    return (0);
+}
+    
+
+/**
+ *  @brief
+ *      Initialize the control structure. Note that the interface value was
+ *      previously verified in the top level nor boot control.
+ */
+Int32 nor_open (void *ptr_driver, void (*asyncComplete)(void *))
+{
+    iblNor_t *ibln = (iblNor_t *)ptr_driver;
+
+    normcb.startPos = normcb.fpos = ibln->bootAddress;
+    normcb.nor_if   = deviceGetNorCtbl (ibln->interface);
+
+    return (0);
+
+}
+
+/**
+ *  @brief
+ *      Read data from the current address. This function is used 
+ *      for peek as well as read.
+ */
+Int32 nor_read (Uint8 *ptr_buf, Uint32 num_bytes)
+{
+    Int32 ret;
+
+    if (normcb.nor_if == NULL)
+        return (-1);
+
+    
+    ret = (*normcb.nor_if->nct_driverReadBytes)(ptr_buf, num_bytes, normcb.fpos);
+
+    if (ret == 0)
+        normcb.fpos += num_bytes;
+
+    return (ret);
+
+}
+
+/**
+ *  @brief
+ *      Return the number of bytes available for current read. 
+ *      Always return 1k
+ */
+Int32 nor_query (void)
+{
+    return (0x400);
+
+}
+
+/**
+ *  @brief
+ *      Close the nor driver
+ */
+Int32 nor_close (void)
+{
+    if (normcb.nor_if != NULL)
+        (*normcb.nor_if->nct_driverClose)();
+
+    normcb.nor_if = NULL;
+    return (0);
+
+}
+
+/**
+ *  @brief
+ *      The global nor module function table
+ */
+BOOT_MODULE_FXN_TABLE nor_boot_module =
+{
+    nor_open,       /* Open  API */
+    nor_close,      /* Close API */
+    nor_read,       /* Read  API */
+    NULL,           /* Write API */
+    nor_read,       /* Peek  API */
+    nor_seek,       /* Seek  API */
+    nor_query       /* Query API */
+
+};
+
+
+
diff --git a/src/driver/nor/nor.h b/src/driver/nor/nor.h
new file mode 100644 (file)
index 0000000..5f3526a
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#ifndef _NOR_H
+#define _NOR_H
+
+/**
+ *  @file nor.h
+ *
+ *  @brief
+ *      Defines the API for the nor boot driver
+ */
+#include "iblloc.h"
+
+extern BOOT_MODULE_FXN_TABLE nor_boot_module;
+
+
+
+#endif  /* _NOR_H */
+
index 0388bf5107b683da617ab6b0859ae9ae4bc7f1ed..8042707b125f896ccecae54fa8e77d47f0a1cb0a 100644 (file)
@@ -117,7 +117,7 @@ void iblEthBoot (Int32 eIdx)
 
 
     /* Power up the device. No action is taken if the device is already powered up */
-    if (devicePowerPeriph (TARGET_PWR_ETH(ibl.ethConfig[eIdx].port)) < 0)
+    if (devicePowerPeriph (TARGET_PWR_ETH(ibl.bootModes[eIdx].port)) < 0)
         return;
 
     /* Do any mdio configuration */
@@ -128,15 +128,11 @@ void iblEthBoot (Int32 eIdx)
 
     /* SGMII configuration. If sgmii is not present this statement is defined
      * to void in target.h */
-    if (ibl.ethConfig[eIdx].port == ibl_PORT_SWITCH_ALL)  {
-        for (n = 0; n < TARGET_EMAC_N_PORTS; n++)
+    for (n = 0; n < ibl_N_ETH_PORTS; n++)  {
+        if (ibl.sgmiiConfig[eIdx].configure == TRUE)
             hwSgmiiConfig (n, &ibl.sgmiiConfig[n]);
-
-    }  else  {
-
-        hwSgmiiConfig (ibl.ethConfig[eIdx].port, &ibl.sgmiiConfig[eIdx]);
     }
-            
+
 
 #ifdef DEVICE_CPSW
     /* On chip switch configuration */
@@ -161,7 +157,7 @@ void iblEthBoot (Int32 eIdx)
 #ifdef DEVICE_PA
     /* Packet accelerator configuration. If PA is not present this statement is defined
      * to void in target.h */
-    targetPaConfig(ibl.ethConfig[eIdx].ethInfo.hwAddress);
+    targetPaConfig(ibl.bootModes[eIdx].u.ethBoot.ethInfo.hwAddress);
 #endif
 
 
@@ -171,27 +167,27 @@ void iblEthBoot (Int32 eIdx)
     hwConfigStreamingSwitch();
 #endif
 
-    nDevice.port_num = ibl.ethConfig[eIdx].port;
+    nDevice.port_num = ibl.bootModes[eIdx].port;
 
     /* Simple transation to initialize the driver */
-    netMemcpy (nDevice.mac_address, ibl.ethConfig[eIdx].ethInfo.hwAddress, sizeof(nDevice.mac_address));
+    netMemcpy (nDevice.mac_address, ibl.bootModes[eIdx].u.ethBoot.ethInfo.hwAddress, sizeof(nDevice.mac_address));
 
-    nl = FORM_IPN(ibl.ethConfig[eIdx].ethInfo.ipAddr);
-    if (ibl.ethConfig[eIdx].doBootp == TRUE)
+    nl = FORM_IPN(ibl.bootModes[eIdx].u.ethBoot.ethInfo.ipAddr);
+    if (ibl.bootModes[eIdx].u.ethBoot.doBootp == TRUE)
         nDevice.ip_address = 0;
     else
         nDevice.ip_address = htonl(nl);
 
-    nl = FORM_IPN(ibl.ethConfig[eIdx].ethInfo.netmask);
+    nl = FORM_IPN(ibl.bootModes[eIdx].u.ethBoot.ethInfo.netmask);
     nDevice.net_mask  = htonl(nl);
 
-    nl = FORM_IPN(ibl.ethConfig[eIdx].ethInfo.serverIp);
+    nl = FORM_IPN(ibl.bootModes[eIdx].u.ethBoot.ethInfo.serverIp);
     nDevice.server_ip           = htonl(nl);
-    nDevice.use_bootp_server_ip = ibl.ethConfig[eIdx].useBootpServerIp;
+    nDevice.use_bootp_server_ip = ibl.bootModes[eIdx].u.ethBoot.useBootpServerIp;
 
     /* Note - the file name structure in nDevice is only 64 bytes, but 128 in ethInfo */
-    netMemcpy (nDevice.file_name, ibl.ethConfig[eIdx].ethInfo.fileName, sizeof(nDevice.file_name));
-    nDevice.use_bootp_file_name = ibl.ethConfig[eIdx].useBootpFileName;
+    netMemcpy (nDevice.file_name, ibl.bootModes[eIdx].u.ethBoot.ethInfo.fileName, sizeof(nDevice.file_name));
+    nDevice.use_bootp_file_name = ibl.bootModes[eIdx].u.ethBoot.useBootpFileName;
 
 
     nDevice.start    = cpmac_drv_start;
@@ -219,7 +215,7 @@ void iblEthBoot (Int32 eIdx)
         }
     }
 
-    format = ibl.ethConfig[eIdx].bootFormat;
+    format = ibl.bootModes[eIdx].u.ethBoot.bootFormat;
 
     /* If the data format was based on the name extension, determine
      * the boot data format */
@@ -266,7 +262,7 @@ void iblEthBoot (Int32 eIdx)
     }
 
 
-    entry = iblBoot (&net_boot_module, format, &ibl.ethConfig[eIdx].blob);
+    entry = iblBoot (&net_boot_module, format, &ibl.bootModes[eIdx].u.ethBoot.blob);
 
 
     /* Before closing the module read any remaining data. In the coff boot mode the boot may
index 6e7540b880b856b8c0d2b805efa626a8fb0b65cd..1eb04f4f0b15193c5fc7e89e17ac865ed1a736be 100644 (file)
@@ -64,10 +64,10 @@ else
        else
         ifeq ($(TARGET),c661x)
          CSRC= t64.c pll.c cfgpll.c cfgpll2.c mdio.c i2c.c psc.c cpsw.c qm.c cpdma.c pa.c sgmii.c serdes.c gmacsl.c emif4.c
-         CSRC+= nandemif25.c spi.c nandspi.c
+         CSRC+= nandemif25.c spi.c nandspi.c noremif25.c norspi.c emif25.c
      else
       CSRC= t64.c cpmacdrv.c pll.c psc.c emif31.c mdio.c gpio.c nandgpio.c i2c.c nandwrgpio.c sgmii.c cfgpll.c cfgpll2.c
-         CSRC+= qm.c cpdma.c pa.c serdes.c gmacsl.c emif4.c nandemif25.c spi.c nandspi.c
+         CSRC+= qm.c cpdma.c pa.c serdes.c gmacsl.c emif4.c nandemif25.c spi.c nandspi.c noremif25.c norspi.c emif25.c
      endif
     endif
    endif
@@ -108,6 +108,8 @@ C6X_C_DIR+= ;$(IBL_ROOT)/hw/cpsw
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/cpdma
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/pa
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/spi
+C6X_C_DIR+= ;$(IBL_ROOT)/hw/nors
+C6X_C_DIR+= ;$(IBL_ROOT)/hw/emif25
 C6X_C_DIR+= ;$(IBL_ROOT)/ecc
 export C6X_C_DIR
 
@@ -187,6 +189,9 @@ ifeq ($(TARGET),c661x)
  vpath % $(ECODIR)/nands/emif25
  vpath % $(ECODIR)/nands/spi
  vpath % $(ECODIR)/spi
+ vpath % $(ECODIR)/nors/emif25
+ vpath % $(ECODIR)/nors/spi
+ vpath % $(ECODIR)/emif25
 endif
 
 
diff --git a/src/hw/emif25/emif25.c b/src/hw/emif25/emif25.c
new file mode 100644 (file)
index 0000000..48fd45c
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+/**
+ *  @file emif25.c
+ *
+ *  @brief
+ *             Emif25 driver
+ */
+
+#include "types.h"
+#include "target.h"
+#include "emif25.h"
+#include "emif25_loc.h"
+
+
+/**
+ *  @brief
+ *      Initialize the interface. 
+ */
+Int32 hwEmif25Init (int32 cs, int32 busWidth, bool wait, bool nand)
+{
+    Uint32 reg;
+    Uint32 v;
+
+    /* Bound check the chip select */
+    if ((cs < 2) || (cs > 5))
+        return (EMIF25_INVALID_CS);
+
+    /* Check for a valid bus width */
+    if (busWidth == 8) 
+        v = 0;
+    else if (busWidth == 16)
+        v = 1;
+    else if (busWidth -= 32)
+        v = 2;
+    else
+        return (EMIF25_INVALID_BUS_WIDTH);
+    
+    /* Setup the bus width. The macro uses the actual chip select value, 2-5 */
+    reg = DEVICE_REG32_R (DEVICE_EMIF25_BASE + EMIF25_ASYNC_CFG_REG(cs));
+    reg = EMIF25_SET_ASYNC_WID(reg, v);
+
+    /* Enable extended wait if requested */
+    if (wait)
+        v = 1;
+    else
+        v = 0;
+
+    reg = EMIF25_SET_ASYNC_WAIT(reg, v);
+
+    DEVICE_REG32_W (DEVICE_EMIF25_BASE + EMIF25_ASYNC_CFG_REG(cs), reg);
+
+    /* Nand enable */
+    if (nand)
+        v = 1;
+    else
+        v = 0;
+
+    reg = DEVICE_REG32_R (DEVICE_EMIF25_BASE + EMIF25_FLASH_CTL_REG);
+    reg = EMIF25_SET_FLASH_CTL_NAND_ENABLE(reg, v, cs);
+    DEVICE_REG32_W (DEVICE_EMIF25_BASE + EMIF25_FLASH_CTL_REG, reg);
+
+    return (0);
+
+}
+
+
diff --git a/src/hw/emif25/emif25.h b/src/hw/emif25/emif25.h
new file mode 100644 (file)
index 0000000..dd6436a
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#ifndef _EMIF25_H
+#define _EMIF25_H
+
+/**
+ *  @file emif25.h
+ *
+ *  @brief
+ *             Defines the emif25 api
+ */
+#include "types.h"
+Int32 hwEmif25Init (int32 cs, int32 busWidth, bool wait, bool nand);
+
+/* return values */
+#define EMIF25_INVALID_CS         -300
+#define EMIF25_INVALID_BUS_WIDTH  -301
+
+#endif /* _EMIF25_H */
diff --git a/src/hw/emif25/emif25_loc.h b/src/hw/emif25/emif25_loc.h
new file mode 100644 (file)
index 0000000..55591a4
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#ifndef _EMIF25_LOC_H
+#define _EMIF25_LOC_H
+
+/* Register offsets */
+#define EMIF25_ASYNC_CFG_REG(x)       (0x10 + (((x)-2)*4))
+#define EMIF25_FLASH_CTL_REG          0x60
+#define EMIF25_FLASH_ECC_REG(x)       (0xc0 + (((x)-2)*4))
+
+/* Setting the bus width in the async config register */
+#define EMIF25_SET_ASYNC_WID(x,v)     BOOT_SET_BITFIELD((x),(v),1,0)
+
+/* Setting the wait in the async config register */
+#define EMIF25_SET_ASYNC_WAIT(x,v)    BOOT_SET_BITFIELD((x),(v),30,30)
+
+/* Setting the nand enable/disable in the flash control register */
+#define EMIF25_SET_FLASH_CTL_NAND_ENABLE(x,v,cs)   BOOT_SET_BITFIELD((x),(v),((cs)-2),((cs)-2))
+
+
+
+
+#endif /* _EMIF25_LOCK_H */
index 878da613f4b2918a4667e50532404538edbc96c3..894065b1992809d3da63e96438a1a52bd99d935d 100644 (file)
 #include "ibl.h"
 #include "iblcfg.h"
 #include "nandhwapi.h"
-#include "nandemif25_loc.h"
+#include "emif25.h"
+#include "emif25_loc.h"
 #include "ecc.h"
 #include "target.h"
 
 int32          gCs;        /* The chip select space */
 uint32         memBase;    /* Base address in device memory map */
-nandDevInfo_t *hwDevInfo;  /* Pointer to the device configuraiton */
+nandDevInfo_t *hwDevInfo;  /* Pointer to the device configuration */
 
 /**
  *  @brief
  *      Initialize the Nand emif interface 
  */
-Int32 nandHwDriverInit (int32 cs, nandDevInfo_t *devInfo)
+Int32 nandHwDriverInit (int32 cs, void *vdevInfo)
 {
-    /* Bound check the chip select */
-    if ((cs < 2) || (cs > 5))
-        return (NAND_INVALID_CS);
-
-    /* Check the bus width */
-    if ((hwDevInfo->busWidthBits != 8) && (hwDevInfo->busWidthBits != 16))
-        return (NAND_INVALID_ADDR_SIZE);
-
+    nandDevInfo_t *devInfo = (nandDevInfo_t *)vdevInfo;
+    
     gCs       = cs;
     hwDevInfo = devInfo;
-
-    memBase = deviceNandMemBase (cs);
-
-    /* Enable NAND on the specified chip select, all other bits set to 0 */
-    DEVICE_REG32_W (DEVICE_EMIF25_BASE + NAND_FLASH_CTL_REG, (1 << (cs - 2)));
+    memBase   = deviceEmif25MemBase (cs);
 
     return (0);
 
@@ -151,17 +142,17 @@ Int32 nandHwDriverReadPage (Uint32 block, Uint32 page, Uint8 *data)
 
 
         /* Reset the hardware ECC correction by reading the ECC status register */
-        v = DEVICE_REG32_R (DEVICE_EMIF25_BASE + NAND_FLASH_ECC_REG(gCs));
+        v = DEVICE_REG32_R (DEVICE_EMIF25_BASE + EMIF25_FLASH_ECC_REG(gCs));
 
         /* Enable ECC */
-        v = DEVICE_REG32_R (DEVICE_EMIF25_BASE + NAND_FLASH_CTL_REG);
+        v = DEVICE_REG32_R (DEVICE_EMIF25_BASE + EMIF25_FLASH_CTL_REG);
         v = v | (1 << (gCs + 8 - 2));
-        DEVICE_REG32_W (DEVICE_EMIF25_BASE + NAND_FLASH_CTL_REG, v);
+        DEVICE_REG32_W (DEVICE_EMIF25_BASE + EMIF25_FLASH_CTL_REG, v);
 
         nandHwDriverReadBytes (block, page, i << 8, 256, blockp);
 
         /* Read the ECC value computed by the hardware */
-        v = DEVICE_REG32_R (DEVICE_EMIF25_BASE + NAND_FLASH_ECC_REG(gCs));
+        v = DEVICE_REG32_R (DEVICE_EMIF25_BASE + EMIF25_FLASH_ECC_REG(gCs));
 
         /* Format the ecc values to match what the software is looking for */
         nand_format_ecc (eccv, eccFlash);
@@ -187,7 +178,7 @@ Int32 nandHwDriverClose (void)
     int32 v;
 
     /* Simply read the ECC to clear the ECC calculation */
-    v = DEVICE_REG32_R (DEVICE_EMIF25_BASE + NAND_FLASH_ECC_REG(gCs));
+    v = DEVICE_REG32_R (DEVICE_EMIF25_BASE + EMIF25_FLASH_ECC_REG(gCs));
 
     return (0);
 
index f5acad6fe4052ca29718037a4d98a17fcaad593b..60e5227371225d913f2f0c06fa9c51dcc5e9d13d 100644 (file)
@@ -159,9 +159,10 @@ void ptNandConfig (void)
  *  @brief Initialize the driver
  *
  */
-Int32 nandHwDriverInit (int32 cs, nandDevInfo_t *devInfo)
+Int32 nandHwDriverInit (int32 cs, void *vdevInfo)
 {
        Uint32 cmd;
+    nandDevInfo_t *devInfo = (nandDevInfo_t *)vdevInfo;
 
     hwDevInfo = devInfo;
 
index 44ac03a9d9e406c19fddad40c269fab5fcf7738c..9f5fa5acfe6371c2bf9f910aae00809857d3baf5 100644 (file)
@@ -78,7 +78,7 @@ typedef struct nandProgramInfo_s
 
 
 /* Driver functions, EMIF and GPIO interface */
-Int32 nandHwDriverInit (int32 cs, nandDevInfo_t *devInfo);
+Int32 nandHwDriverInit (int32 cs, void *devInfo);
 Int32 nandHwDriverReadBytes (Uint32 block, Uint32 page, Uint32 byte, Uint32 nbytes, Uint8 *data);
 Int32 nandHwDriverReadPage(Uint32 block, Uint32 page, Uint8 *data);
 Int32 nandHwDriverClose (void);
@@ -87,7 +87,7 @@ Int32 nandHwDriverWritePage  (Uint32 block, Uint32 page, Uint8 *data, nandProgra
 Int32 nandHwDriverBlockErase (Uint32 uiBlockNumber, nandProgramInfo_t *winfo);
 
 /* Driver functions, SPI interface */
-Int32 nandHwSpiDriverInit (int32 cs, nandDevInfo_t *devInfo);
+Int32 nandHwSpiDriverInit (int32 cs, void *devInfo);
 Int32 nandHwSpiDriverReadBytes (Uint32 block, Uint32 page, Uint32 byte, Uint32 nbytes, Uint8 *data);
 Int32 nandHwSpiDriverReadPage(Uint32 block, Uint32 page, Uint8 *data);
 Int32 nandHwSpiDriverClose (void);
index ac5560cb0da26c22acfee44e34cacde1af21890f..03312d146da754b70bd648a8674e45909a580535 100644 (file)
@@ -48,9 +48,11 @@ nandDevInfo_t *hwSpiDevInfo;  /* Pointer to the NAND configuration */
  *      Initialize the NAND SPI configuration. The SPI interface
  *      must be initialized seperately at a higher level 
  */
-Int32 nandHwSpiDriverInit (int32 cs, nandDevInfo_t *devInfo)
+Int32 nandHwSpiDriverInit (int32 cs, void *vdevInfo)
 {
 
+    nandDevInfo_t *devInfo = (nandDevInfo_t *)vdevInfo;
+
     hwSpiDevInfo = devInfo;
 
     return (0);
diff --git a/src/hw/nors/emif25/noremif25.c b/src/hw/nors/emif25/noremif25.c
new file mode 100644 (file)
index 0000000..815aff4
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+/**
+ *  @file noremif25.c
+ *
+ *     @brief
+ *             This file implements a translation layer from the nor boot
+ *             to the emif driver. This is used to present a common api
+ *             for the nor reads for the SPI and EMIF access
+ */
+
+#include "types.h"
+#include "ibl.h"
+#include "iblcfg.h"
+#include "nor_api.h"
+#include "emif25.h"
+#include "emif25_loc.h"
+#include "target.h"
+
+
+uint32 nmemBase; /* The base address of the device in the memory map  */
+
+/**
+ *  @brief
+ *      Initialize the interface. 
+ */
+Int32 norHwEmifDriverInit (int32 cs)
+{
+
+    nmemBase = deviceEmif25MemBase (cs);
+    
+    return (0);
+
+}
+
+
+/**
+ *  @brief
+ *      Read bytes. Not using memcpy to avoid a second copy (along with iblinit).
+ */
+Int32 norHwEmifDriverReadBytes (Uint8 *data, Uint32 nbytes, Uint32 address)
+{
+
+    Int32 i;
+    Uint8 * restrict src;
+
+    src = (Uint8 *)(nmemBase + address);
+
+
+    for (i = 0; i < nbytes; i++)
+        data[i] = src[i];
+
+    return (0);
+
+}
+
+/**
+ *  @brief
+ *      Close the driver
+ */
+Int32 norHwEmifDriverClose (void)
+{
+    return (0);
+
+}
diff --git a/src/hw/nors/nor_api.h b/src/hw/nors/nor_api.h
new file mode 100644 (file)
index 0000000..34f6f54
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#ifndef _NOR_API_H
+#define _NOR_API_H
+
+/**
+ *  @file nor_api.h
+ *
+ *  @brief
+ *      Describes the API used to boot through nor
+ */
+#include "types.h"
+
+
+
+Int32 norHwEmifDriverInit (int32 cs);
+Int32 norHwEmifDriverReadBytes (Uint8 *data, Uint32 nbytes, Uint32 address);
+Int32 norHwEmifDriverClose (void);
+
+
+Int32 norHwSpiDriverInit (int32 cs);
+Int32 norHwSpiDriverReadBytes (uint8 *data, Uint32 nbytes, Uint32 address);
+Int32 norHwSpiDriverClose (void);
+
+#endif /* _NOR_API_H */
diff --git a/src/hw/nors/spi/norspi.c b/src/hw/nors/spi/norspi.c
new file mode 100644 (file)
index 0000000..0572cf6
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+/**
+ *  @file norspi.c
+ *
+ *  @brief This file implements a translation layer from the nor boot
+ *         to the SPI driver. This is used to present a common api
+ *         for nor reads for SPI and EMIF access.
+ */
+
+#include "types.h"
+#include "ibl.h"
+#include "iblcfg.h"
+#include "nor_api.h"
+#include "target.h"
+#include "spi_api.h"
+
+
+/**
+ *  @brief
+ *      No intermediate context must be stored, so this function just returns 0
+ */
+Int32 norHwSpiDriverInit (int32 cs)
+{
+    return (0);
+
+}
+
+
+/**
+ *  @brief
+ *      Read data from the SPI
+ */
+Int32 norHwSpiDriverReadBytes (uint8 *data, Uint32 nbytes, Uint32 address)
+{
+    if (hwSpiRead (address, nbytes, data) != 0)
+        return (-1);
+
+    return (0);
+
+}
+
+/**
+ *  @brief
+ *      Close the driver. Nothing to do
+ */
+Int32 norHwSpiDriverClose (void)
+{
+    return (0);
+
+}
+
index 2bd35cc348d3fab67e8d875394a5aec060cb2225..77d0b0fca820dffaa7884616cfd151b89525cd13 100644 (file)
--- a/src/ibl.h
+++ b/src/ibl.h
  */
 #define ibl_VERSION  ibl_MAKE_VERSION(1,0,0,0)
 
+
+/**
+ * @defgroup iblBootModes  Defines the boot modes supported by the IBL
+ *
+ * @ingroup iblBootModes
+ * @{
+ *
+ *  @def ibl_BOOT_MODE_TFTP */
+ #define ibl_BOOT_MODE_TFTP     10      /* Boot through a tftp interface */
+ /* @def ibl_BOOT_MODE_NAND */
+#define  ibl_BOOT_MODE_NAND     11      /* Boot through a nand interface */
+
+/* @def  ibl_BOOT_MODE_NOR */
+#define  ibl_BOOT_MODE_NOR      12      /* Boot through a nor (or flash) interface */
+
+/* @def  ibl_BOOT_MODE_NONE */
+#define  ibl_BOOT_MODE_NONE     13      /* Boot mode selection is inactive */
+
+/* @} */
+
+/**
+ *  @brief
+ *      Define the number of different boot modes which can be configured for
+ *      a single execution of the IBL.
+ */
+#define ibl_N_BOOT_MODES        2
+
 /* Information used to make generate a bootp request */
 /**
  * @brief
@@ -358,8 +387,6 @@ typedef struct iblBinBlob_s
  */
 typedef struct iblEth_s
 {
-    uint32   ethPriority;       /**< The ethernet boot priority. @ref iblPeriphPriority */
-    int32    port;              /**< The ethernet port to use, or @ref ibl_ETH_PORT_FROM_RBL */
     bool     doBootp;           /**< If true a bootp request is generated. If false the @ref iblEthBootInfo_t
                                      table must be populated before the ibl begins execution */
     bool     useBootpServerIp;  /**< If TRUE then the server IP received from the bootp server
@@ -384,11 +411,12 @@ typedef struct iblEth_s
  */
 typedef struct iblSgmii_s
 {
-    uint32  adviseAbility;      /**< The advise ability register */
-    uint32  control;            /**< The control register        */
-    uint32  txConfig;           /**< Serdes Tx config            */
-    uint32  rxConfig;           /**< Serdes Rx config            */
-    uint32  auxConfig;          /**< Serdes Aux config           */
+    bool    configure;          /**< Set to false to disable configuration */
+    uint32  adviseAbility;      /**< The advise ability register           */
+    uint32  control;            /**< The control register                  */
+    uint32  txConfig;           /**< Serdes Tx config                      */
+    uint32  rxConfig;           /**< Serdes Rx config                      */
+    uint32  auxConfig;          /**< Serdes Aux config                     */
   
 } iblSgmii_t;
 
@@ -464,9 +492,9 @@ typedef struct nandDevInfo_s
 typedef struct iblNand_s
 {
 
-    uint32   nandPriority;      /**< The nand boot priority. @ref iblPeriphPriority */
     int32    bootFormat;        /**< The format of the boot data file. @ref iblBootFormats */                            
-    int32    interface;         /**< The nand interface @ref iblNandIf */
+    uint32   bootAddress;       /**< The start address for booting */
+    int32    interface;         /**< The nand interface @ref iblPmemf */
     iblBinBlob_t blob;          /**< Used only if the format is ibl_BOOT_FORMAT_BBLOB */
     
     
@@ -475,32 +503,64 @@ typedef struct iblNand_s
 } iblNand_t;
 
 /**
- * @defgroup iblNandIf defines the interface used for NAND memory. Not all values
- *           are valid for all devices.
+ *  @brief
+ *      Nor boot configuration. 
+ */
+typedef struct iblNor_s
+{
+    int32   bootFormat;         /**<  The format of the boot data file. @ref iblBootFormats */
+    uint32  bootAddress;        /**<  The start address for booting */
+    int32   interface;          /**<  The nor interface. @ref iblPmemIf */
+    iblBinBlob_t blob;          /**<  Used only if the format is ibl_BOOT_FORMAT_BBLOB */
+    
+} iblNor_t;    
+
+/**
+ * @defgroup iblPmemIf defines the interfaces used for NOR memory. Not all values are
+ *           valid for all devices
  *
- * @ingroup iblNandIf
+ * @ingroup iblPmemIf
  * @{
  */
-/** @def ibl_NAND_IF_GPIO - GPIO interface */
-#define  ibl_NAND_IF_GPIO           0
+/** @def ibl_PMEM_IF_GPIO - GPIO interface */
+#define  ibl_PMEM_IF_GPIO         0
 
-/** @def ibl_NAND_IF_CHIPSEL_2 - EMIF interface using chip select 2 */
-#define  ibl_NAND_IF_CHIPSEL_2      2
+/** @def ibl_PMEM_IF_CHIPSEL_2 */
+#define  ibl_PMEM_IF_CHIPSEL_2    2   /* EMIF interface using chip select 2, no wait enabled */
 
-/** @def ibl_NAND_IF_CHIPSEL_3 - EMIF interface using chip select 3 */
-#define ibl_NAND_IF_CHIPSEL_3       3
+/** @def ibl_PMEM_IF_CHIPSEL_3 */
+#define  ibl_PMEM_IF_CHIPSEL_3    3   /* EMIF interface using chip select 3, no wait enabled */
 
-/** @def ibl_NAND_IF_CHIPSEL_4 - EMIF interface using chip select 4 */
-#define ibl_NAND_IF_CHIPSEL_4       4
+/** @def ibl_PMEM_IF_CHIPSEL_4 */
+#define  ibl_PMEM_IF_CHIPSEL_4    4   /* EMIF interface using chip select 4 */
 
-/** @def ibl_NAND_IF_CHIPSEL_5 - EMIF interface using chip select 5 */
-#define ibl_NAND_IF_CHIPSEL_5       5
+/** @def ibl_PMEM_IF_CHIPSEL_5 */
+#define  ibl_PMEM_IF_CHIPSEL_5    5   /* EMIF interface using chip select 5 */
 
-/** @def ibl_NAND_IF_SPI - NAND interface through SPI */
-#define  ibl_NAND_IF_SPI            100
+/** @def ibl_PMEM_IF_SPI */
+#define  ibl_PMEM_IF_SPI          100 /* Interface through SPI */
+    
+/* @} */    
+    
+    
+/**
+ *  @brief
+ *      EMIF (nand/nor) configuration
+ */
+typedef struct iblEmif_s {
 
+    int16  csSpace;           /**< Chip select space, @ref iblPmemIf */
+    int16  busWidth;          /**< Bus width, bits */
+    bool   waitEnable;        /**< Valid only for NOR devices */
+    
+} iblEmif_t;
 
-/* @} */
+/**
+ *  @brief
+ *      The maximum number of chip select spaces for emif boot (not ddr) configuration
+ */
+#define ibl_MAX_EMIF_PMEM   2
 
 
 /**
@@ -568,7 +628,34 @@ typedef struct iblPll_s  {
 /* @} */
     
 
+/**
+ *  @def iblBoot_t
+ *      Configures an ibl boot attempt
+ *
+ *  @details
+ *      The ibl allows for the configuration for multiple boot attempts. This structure is
+ *      used to configure the ibl boot attempt.
+ */    
+typedef struct iblBoot_s
+{
+
+    int32   bootMode;           /**< Identifies the boot mode @ref iblBootModes */
 
+    uint32  priority;           /**< The boot priority. @ref iblPeriphPriority */
+    int32   port;               /**< The port to use, or @ref ibl_PORT_FROM_RBL */
+    
+    union  {
+    
+        iblEth_t   ethBoot;      /**< Ethernet boot configuration. @ref iblEth_t */
+    
+        iblNand_t  nandBoot;     /**< NAND boot configuration @ref iblNand_t */
+    
+        iblNor_t   norBoot;      /**< NOR boot configuration  @ref iblNor_t */
+        
+    } u;
+    
+} iblBoot_t;
+    
 
 /**
  * @def ibl_MAGIC_VALUE
@@ -592,23 +679,23 @@ typedef struct iblPll_s  {
  */
 typedef struct ibl_s
 {
-    uint32   iblMagic;                       /**< @ref ibl_MAGIC_VALUE */
+    uint32     iblMagic;                      /**< @ref ibl_MAGIC_VALUE */
     
-    iblPll_t  pllConfig[ibl_N_PLL_CFGS];     /**< PLL Configuration. @ref iblPll_t */
+    iblPll_t   pllConfig[ibl_N_PLL_CFGS];     /**< PLL Configuration. @ref iblPll_t */
     
-    iblDdr_t  ddrConfig;                     /**< DDR configuration @ref iblDdr_t  */
+    iblDdr_t   ddrConfig;                     /**< DDR configuration @ref iblDdr_t  */
     
-    iblEth_t  ethConfig[ibl_N_ETH_PORTS];    /**< Ethernet boot configuration. @ref iblEth_t */
+    iblSgmii_t sgmiiConfig[ibl_N_ETH_PORTS];  /**< SGMII boot configuration. @ref iblSgmii_t */
     
-    iblSgmii_t sgmiiConfig[ibl_N_ETH_PORTS]; /**< SGMII boot configuration. @ref iblSgmii_t */
+    iblMdio_t  mdioConfig;                    /**< MDIO configuration. @ref iblMdio_t */
     
-    iblMdio_t mdioConfig;                    /**< MDIO configuration. @ref iblMdio_t */
+    iblSpi_t   spiConfig;                     /**< SPI configuration @ref iblSpi_s */
     
-    iblNand_t nandConfig;                    /**< NAND configuration @ref iblNand_t */
+    iblEmif_t  emifConfig[ibl_MAX_EMIF_PMEM]; /**< EMIF (nand/nor, not ddr) configuration. @ref iblEmif_t */
     
-    iblSpi_t  spiConfig;                     /**< SPI configuration @ref iblSpi_s */
+    iblBoot_t  bootModes[ibl_N_BOOT_MODES];   /**< Boot configuration */
     
-    uint16    chkSum;                        /**< Ones complement checksum over the whole config structure */
+    uint16     chkSum;                        /**< Ones complement checksum over the whole config structure */
     
     
      
@@ -618,30 +705,29 @@ typedef struct ibl_s
 extern ibl_t ibl;
 
 
-
 /**
- * @defgroup iblActivePeriph
+ * @defgroup iblActiveDevice
  *
- * @ingroup iblActivePeriph
+ * @ingroup iblActiveDevice
  * @{
- *    @def  ibl_ACTIVE_PERIPH_ETH
+ *    @def  ibl_ACTIVE_DEVICE_ETH
  */
-#define ibl_ACTIVE_PERIPH_ETH     100     /**< An ethernet boot in progress */
+#define ibl_ACTIVE_DEVICE_ETH     100     /**< Data received through an ethernet interface */
 
 /**
- *  @def ibl_ACTIVE_PERIPH_NAND
+ *  @def ibl_ACTIVE_DEVICE_EMIF
  */
-#define ibl_ACTIVE_PERIPH_NAND    101     /**< A nand boot in progress */
+#define ibl_ACTIVE_DEVICE_EMIF    101     /**< Data read through an EMIF interface */
 
 /**
- *  @def ibl_ACTIVE_PERIPH_I2C
+ *  @def ibl_ACTIVE_DEVICE_I2C
  */
-#define ibl_ACTIVE_PERIPH_I2C     102     /**< An i2c boot in progress */
+#define ibl_ACTIVE_DEVICE_I2C     102     /**< Data read through an I2C interface */
 
 /**
- *  @def ibl_ACTIVE_PERIPH_SPI
+ *  @def ibl_ACTIVE_DEVICE_SPI
  */
-#define ibl_ACTIVE_PERIPH_SPI     103     /**< An SPI boot in progress */
+#define ibl_ACTIVE_DEVICE_SPI     103     /**< Data read through an SPI interface */
 
 /* @} */
 
@@ -680,7 +766,27 @@ extern ibl_t ibl;
  *  @def ibl_FAIL_CODE_INVALID_SPI_ADDRESS
  */
 #define ibl_FAIL_CODE_INVALID_SPI_ADDRESS   705     /**< Invalid data address specified on SPI */
+
+/**
+ *  @def ibl_FAIL_CODE_PERIPH_POWER_UP
+ */
+#define ibl_FAIL_CODE_PERIPH_POWER_UP       706     /**< Boot peripheral failed to power up */
+
+/**
+ *  @def ibl_FAIL_CODE_INVALID_NAND_PERIPH
+ */
+#define ibl_FAIL_CODE_INVALID_NAND_PERIPH   707     /**< Invalid nand boot peripheral specified */
+
+/**
+ *  @def ibl_FAIL_CODE_NO_EMIF_CFG
+ */
+#define ibl_FAIL_CODE_NO_EMIF_CFG           708     /**< No emif configuration found to match specified cs space */
+
+/**
+ *  @def ibl_FAIL_CODE_EMIF_CFG_FAIL
+ */
+#define ibl_FAIL_CODE_EMIF_CFG_FAIL         709     /**< Hardware setup of emif failed */
+
  /* @} */
 
 
@@ -712,8 +818,9 @@ typedef struct iblStatus_s
     
     int32  heartBeat;       /**<  An increasing value as long as the boot code is running */
     
-    int32  activePeriph;    /**<  Describes the active boot peripheral @ref iblActivePeriph */
-    int32  activeFormat;    /**<  Describes the format being decoded */
+    int32  activeBoot;        /**<  Describes the active boot mode @ref iblBootModes */
+    int32  activeDevice;      /**<  Describes the active boot peripheral device @ref iblActiveDevice */
+    int32  activeFileFormat;  /**<  Describes the format being decoded */
     
     uint32  autoDetectFailCnt;      /**<  Counts the number of times an auto detect of the data format failed */
     uint32  nameDetectFailCnt;      /**<  Counts the number of times an name detect of the data format failed */
index e92a7d03a2d4fc8c2b685d3646aa56dc27d2a938..0d29e1a35a0d5642e8e2edaddad09bd899e2ea5c 100644 (file)
@@ -71,6 +71,7 @@ C6X_C_DIR+= ;$(IBL_ROOT)/device
 C6X_C_DIR+= ;$(IBL_ROOT)/device/$(TARGET)
 C6X_C_DIR+= ;$(IBL_ROOT)/ethboot
 C6X_C_DIR+= ;$(IBL_ROOT)/nandboot
+C6X_C_DIR+= ;$(IBL_ROOT)/norboot
 C6X_C_DIR+= ;$(IBL_ROOT)/driver/timer
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/i2c
 C6X_C_DIR+= ;$(IBL_ROOT)/hw/spi
index 75ef3ade5e028f26699064240406a5b52e8549f0..46b48fe67bbb7cb543bf7689815d70bc87bd0b49 100644 (file)
@@ -203,7 +203,6 @@ void iblSwap (void)
 
     ibl.ddrConfig.configDdr = swap16val (ibl.ddrConfig.configDdr);
 
-#define targetEmifType()   ibl_EMIF_TYPE_40
 
     if (targetEmifType() == ibl_EMIF_TYPE_31)  { 
         ibl.ddrConfig.uEmif.emif3p1.sdcfg  = swap32val(ibl.ddrConfig.uEmif.emif3p1.sdcfg);
@@ -239,25 +238,17 @@ void iblSwap (void)
         ibl.ddrConfig.uEmif.emif4p0.eccRange2             = swap32val(ibl.ddrConfig.uEmif.emif4p0.eccRange2);
         ibl.ddrConfig.uEmif.emif4p0.rdWrtExcThresh        = swap32val(ibl.ddrConfig.uEmif.emif4p0.rdWrtExcThresh);
     }
-    
+
 
     for (i = 0; i < ibl_N_ETH_PORTS; i++)  {
-        ibl.ethConfig[i].ethPriority        = swap32val (ibl.ethConfig[i].ethPriority);
-        ibl.ethConfig[i].port               = swap32val (ibl.ethConfig[i].port);
-        ibl.ethConfig[i].doBootp            = swap16val (ibl.ethConfig[i].doBootp);
-        ibl.ethConfig[i].useBootpServerIp   = swap16val (ibl.ethConfig[i].useBootpServerIp);
-        ibl.ethConfig[i].useBootpFileName   = swap16val (ibl.ethConfig[i].useBootpFileName);
-        ibl.ethConfig[i].bootFormat         = swap32val (ibl.ethConfig[i].bootFormat);
-        ibl.ethConfig[i].blob.startAddress  = swap32val (ibl.ethConfig[i].blob.startAddress);
-        ibl.ethConfig[i].blob.sizeBytes     = swap32val (ibl.ethConfig[i].blob.sizeBytes);
-        ibl.ethConfig[i].blob.branchAddress = swap32val (ibl.ethConfig[i].blob.branchAddress);
-
-        ibl.sgmiiConfig[i].adviseAbility = swap32val (ibl.sgmiiConfig[i].adviseAbility);
-        ibl.sgmiiConfig[i].control       = swap32val (ibl.sgmiiConfig[i].control);
-        ibl.sgmiiConfig[i].txConfig      = swap32val (ibl.sgmiiConfig[i].txConfig);
-        ibl.sgmiiConfig[i].rxConfig      = swap32val (ibl.sgmiiConfig[i].rxConfig);
-        ibl.sgmiiConfig[i].auxConfig     = swap32val (ibl.sgmiiConfig[i].auxConfig);
+        ibl.sgmiiConfig[i].configure     = swap32val(ibl.sgmiiConfig[i].configure);
+        ibl.sgmiiConfig[i].adviseAbility = swap32val(ibl.sgmiiConfig[i].adviseAbility);
+        ibl.sgmiiConfig[i].control       = swap32val(ibl.sgmiiConfig[i].control);
+        ibl.sgmiiConfig[i].txConfig      = swap32val(ibl.sgmiiConfig[i].txConfig);
+        ibl.sgmiiConfig[i].rxConfig      = swap32val(ibl.sgmiiConfig[i].rxConfig);
+        ibl.sgmiiConfig[i].auxConfig     = swap32val(ibl.sgmiiConfig[i].auxConfig);
     }
+    
 
     ibl.mdioConfig.nMdioOps   = swap16val (ibl.mdioConfig.nMdioOps);
     ibl.mdioConfig.mdioClkDiv = swap16val (ibl.mdioConfig.mdioClkDiv);
@@ -266,30 +257,65 @@ void iblSwap (void)
     for (i = 0; i < ibl_N_MDIO_CFGS; i++)
         ibl.mdioConfig.mdio[i] = swap32val (ibl.mdioConfig.mdio[i]);
 
-    ibl.nandConfig.nandPriority       = swap32val (ibl.nandConfig.nandPriority);
-    ibl.nandConfig.bootFormat         = swap32val (ibl.nandConfig.bootFormat);
-    ibl.nandConfig.interface          = swap32val (ibl.nandConfig.interface);
-    ibl.nandConfig.blob.startAddress  = swap32val (ibl.nandConfig.blob.startAddress);
-    ibl.nandConfig.blob.sizeBytes     = swap32val (ibl.nandConfig.blob.sizeBytes);
-    ibl.nandConfig.blob.branchAddress = swap32val (ibl.nandConfig.blob.branchAddress);
-
-    ibl.nandConfig.nandInfo.busWidthBits  = swap32val (ibl.nandConfig.nandInfo.busWidthBits);
-    ibl.nandConfig.nandInfo.pageSizeBytes = swap32val (ibl.nandConfig.nandInfo.pageSizeBytes);
-    ibl.nandConfig.nandInfo.pageEccBytes  = swap32val (ibl.nandConfig.nandInfo.pageEccBytes);
-    ibl.nandConfig.nandInfo.pagesPerBlock = swap32val (ibl.nandConfig.nandInfo.pagesPerBlock);
-    ibl.nandConfig.nandInfo.totalBlocks   = swap32val (ibl.nandConfig.nandInfo.totalBlocks);
-    ibl.nandConfig.nandInfo.addressBytes  = swap32val (ibl.nandConfig.nandInfo.addressBytes);
-    ibl.nandConfig.nandInfo.lsbFirst      = swap16val (ibl.nandConfig.nandInfo.lsbFirst);
-    ibl.nandConfig.nandInfo.blockOffset   = swap32val (ibl.nandConfig.nandInfo.blockOffset);
-    ibl.nandConfig.nandInfo.pageOffset    = swap32val (ibl.nandConfig.nandInfo.pageOffset);
-    ibl.nandConfig.nandInfo.columnOffset  = swap32val (ibl.nandConfig.nandInfo.columnOffset);
-    ibl.nandConfig.nandInfo.postCommand   = swap16val (ibl.nandConfig.nandInfo.postCommand);
-
-    ibl.spiConfig.addrWidth  = swap16val (ibl.spiConfig.addrWidth);
-    ibl.spiConfig.nPins      = swap16val (ibl.spiConfig.nPins);
-    ibl.spiConfig.csel       = swap16val (ibl.spiConfig.csel);
-    ibl.spiConfig.c2tdelay   = swap16val (ibl.spiConfig.c2tdelay);
-    ibl.spiConfig.busFreqMHz = swap16val (ibl.spiConfig.busFreqMHz);
+
+    ibl.spiConfig.addrWidth  = swap16val(ibl.spiConfig.addrWidth);
+    ibl.spiConfig.nPins      = swap16val(ibl.spiConfig.nPins);
+    ibl.spiConfig.mode       = swap16val(ibl.spiConfig.mode);
+    ibl.spiConfig.csel       = swap16val(ibl.spiConfig.csel);
+    ibl.spiConfig.c2tdelay   = swap16val(ibl.spiConfig.c2tdelay);
+    ibl.spiConfig.busFreqMHz = swap16val(ibl.spiConfig.busFreqMHz);
+
+    for (i = 0; i < ibl_MAX_EMIF_PMEM; i++)  {
+        ibl.emifConfig[i].csSpace    = swap16val(ibl.emifConfig[i].csSpace);
+        ibl.emifConfig[i].busWidth   = swap16val(ibl.emifConfig[i].busWidth);
+        ibl.emifConfig[i].waitEnable = swap32val(ibl.emifConfig[i].waitEnable);
+    }
+
+
+    for (i = 0; i < ibl_N_BOOT_MODES; i++)  {
+        ibl.bootModes[i].bootMode = swap32val(ibl.bootModes[i].bootMode);
+        ibl.bootModes[i].priority = swap32val(ibl.bootModes[i].priority);
+        ibl.bootModes[i].port     = swap32val(ibl.bootModes[i].port);
+
+        if (ibl.bootModes[i].bootMode == ibl_BOOT_MODE_TFTP)  {
+            ibl.bootModes[i].u.ethBoot.doBootp            = swap32val(ibl.bootModes[i].u.ethBoot.doBootp);
+            ibl.bootModes[i].u.ethBoot.useBootpServerIp   = swap32val(ibl.bootModes[i].u.ethBoot.useBootpServerIp);
+            ibl.bootModes[i].u.ethBoot.useBootpFileName   = swap32val(ibl.bootModes[i].u.ethBoot.useBootpFileName);
+            ibl.bootModes[i].u.ethBoot.bootFormat         = swap32val(ibl.bootModes[i].u.ethBoot.bootFormat);
+            ibl.bootModes[i].u.ethBoot.blob.startAddress  = swap32val(ibl.bootModes[i].u.ethBoot.blob.startAddress);
+            ibl.bootModes[i].u.ethBoot.blob.sizeBytes     = swap32val(ibl.bootModes[i].u.ethBoot.blob.sizeBytes);
+            ibl.bootModes[i].u.ethBoot.blob.branchAddress = swap32val(ibl.bootModes[i].u.ethBoot.blob.branchAddress);
+
+        }  else if (ibl.bootModes[i].bootMode == ibl_BOOT_MODE_NAND)  {
+            ibl.bootModes[i].u.nandBoot.bootFormat             = swap32val(ibl.bootModes[i].u.nandBoot.bootFormat);
+            ibl.bootModes[i].u.nandBoot.bootAddress            = swap32val(ibl.bootModes[i].u.nandBoot.bootAddress);
+            ibl.bootModes[i].u.nandBoot.interface              = swap32val(ibl.bootModes[i].u.nandBoot.interface);
+            ibl.bootModes[i].u.nandBoot.blob.startAddress      = swap32val(ibl.bootModes[i].u.nandBoot.blob.startAddress);
+            ibl.bootModes[i].u.nandBoot.blob.sizeBytes         = swap32val(ibl.bootModes[i].u.nandBoot.blob.sizeBytes);
+            ibl.bootModes[i].u.nandBoot.blob.branchAddress     = swap32val(ibl.bootModes[i].u.nandBoot.blob.branchAddress);
+            ibl.bootModes[i].u.nandBoot.nandInfo.busWidthBits  = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.busWidthBits);
+            ibl.bootModes[i].u.nandBoot.nandInfo.pageSizeBytes = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.pageSizeBytes);
+            ibl.bootModes[i].u.nandBoot.nandInfo.pageEccBytes  = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.pageEccBytes);
+            ibl.bootModes[i].u.nandBoot.nandInfo.pagesPerBlock = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.pagesPerBlock);
+            ibl.bootModes[i].u.nandBoot.nandInfo.totalBlocks   = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.totalBlocks);
+            ibl.bootModes[i].u.nandBoot.nandInfo.addressBytes  = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.addressBytes);
+            ibl.bootModes[i].u.nandBoot.nandInfo.lsbFirst      = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.lsbFirst);
+            ibl.bootModes[i].u.nandBoot.nandInfo.blockOffset   = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.blockOffset);
+            ibl.bootModes[i].u.nandBoot.nandInfo.pageOffset    = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.pageOffset);
+            ibl.bootModes[i].u.nandBoot.nandInfo.columnOffset  = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.columnOffset);
+            ibl.bootModes[i].u.nandBoot.nandInfo.postCommand   = swap32val(ibl.bootModes[i].u.nandBoot.nandInfo.postCommand);
+
+        }  else if (ibl.bootModes[i].bootMode == ibl_BOOT_MODE_NOR)  {
+            ibl.bootModes[i].u.norBoot.bootFormat         = swap32val(ibl.bootModes[i].u.norBoot.bootFormat);
+            ibl.bootModes[i].u.norBoot.bootAddress        = swap32val(ibl.bootModes[i].u.norBoot.bootAddress);
+            ibl.bootModes[i].u.norBoot.interface          = swap32val(ibl.bootModes[i].u.norBoot.interface);
+            ibl.bootModes[i].u.norBoot.blob.startAddress  = swap32val(ibl.bootModes[i].u.norBoot.blob.startAddress);
+            ibl.bootModes[i].u.norBoot.blob.sizeBytes     = swap32val(ibl.bootModes[i].u.norBoot.blob.sizeBytes);
+            ibl.bootModes[i].u.norBoot.blob.branchAddress = swap32val(ibl.bootModes[i].u.norBoot.blob.branchAddress);
+
+        }
+
+    }
 
     ibl.chkSum = swap16val (ibl.chkSum);
 }
@@ -406,7 +432,7 @@ void main (void)
     memset (&iblStatus, 0, sizeof(iblStatus_t));
     iblStatus.iblMagic     = ibl_MAGIC_VALUE;
     iblStatus.iblVersion   = ibl_VERSION;
-    iblStatus.activePeriph = ibl_ACTIVE_PERIPH_I2C;
+    iblStatus.activeDevice = ibl_ACTIVE_DEVICE_I2C;
 
 
     /* Determine the boot device to read from */
@@ -424,10 +450,6 @@ void main (void)
                                 break;
 #endif
 
-#ifndef EXCLUDE_NAND_SPI
-    case BOOT_DEVICE_SPI_NAND:  bFxnTbl = iblInitSpiNand ();
-                                break;
-#endif
 
     default:                    iblStatus.iblFail = ibl_FAIL_CODE_INVALID_INIT_DEVICE;
                                 for (;;);
index 043c6a3ffcd72e9737aa04680e954fa11cb4cffd..b17d5cd0170ee0a922d8d9a3ff32164eca4bd458 100644 (file)
@@ -42,6 +42,7 @@
 #include "iblinit.h"
 #include <string.h>
 
+#ifndef EXCLUDE_I2C
 /**
  *  @brief
  *      A global value is used to track the read through the i2c during
@@ -280,3 +281,4 @@ BOOT_MODULE_FXN_TABLE *iblInitI2c (void)
 
 }
 
+#endif /* EXCLUDE_I2C */
index 1339c81f183e4e9ee923849c70e3acf073356eca..25a6812504e8642a3c6e2546d07b0d58eaaf0163 100644 (file)
@@ -42,6 +42,7 @@
 #include "iblinit.h"
 #include <string.h>
 
+#if (!defined(EXCLUDE_NOR_SPI) || !defined(EXCLUDE_NAND_SPI))
 
 /**
  *  @brief
@@ -280,6 +281,7 @@ BOOT_MODULE_FXN_TABLE *iblInitSpiNor (void)
 }
 
 
+#endif /* (!defined(EXCLUDE_NOR_SPI) || !defined(EXCLUDE_NAND_SPI)) */
 
 
 
index 7c8986bab57fa6a789946191da4837739bf306a0..105c866287cc8d38013bd87d0c2d5f63819d2e95 100644 (file)
 #include "device.h"
 #include "ethboot.h"
 #include "nandboot.h"
+#include "norboot.h"
 #include "bis.h"
 #include "coffwrap.h"
 #include "iblbtbl.h"
 #include "iblblob.h"
 #include "timer.h"
 #include "i2c.h"
+#include "spi_api.h"
 #include "ibl_elf.h"
 #include <string.h>
 
@@ -112,6 +114,106 @@ BOOL iblMacAddrIsZero (uint8 *maddr)
 
 }
 
+/**
+ *  @b Description
+ *  @n
+ *  
+ *  For NAND and NOR boots, configure the specified peripheral or memory interface
+ */
+void iblPmemCfg (int32 interface, int32 port, bool enableNand)
+{
+    int32 ret;
+
+    switch (interface)  {
+
+        case ibl_PMEM_IF_GPIO:
+                ret = devicePowerPeriph (TARGET_PWR_GPIO);
+                break;
+
+
+        #if (!defined(EXCLUDE_NOR_SPI) && !defined(EXCLUDE_NAND_SPI))
+
+            case ibl_PMEM_IF_SPI:  {
+
+                    Uint32      v;
+                    spiConfig_t cfg;
+
+                    ret = devicePowerPeriph (TARGET_PWR_SPI);
+                    if (ret != 0)
+                        break;
+
+                    cfg.port      = port;
+                    cfg.mode      = ibl.spiConfig.mode;
+                    cfg.addrWidth = ibl.spiConfig.addrWidth;
+                    cfg.npin      = ibl.spiConfig.nPins;
+                    cfg.csel      = ibl.spiConfig.csel;
+                    cfg.c2tdelay  = ibl.spiConfig.c2tdelay;
+
+                    /* On c661x devices the PLL module has a built in divide by 6, and the SPI
+                     * has a maximum clock divider value of 0xff */
+                    v = ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz / (DEVICE_SPI_MOD_DIVIDER * ibl.spiConfig.busFreqMHz);
+                    if (v > 0xff)
+                        v = 0xff;
+
+                    cfg.clkdiv =  (UINT16) v;
+
+                    ret = hwSpiConfig (&cfg);
+                    if (ret != 0)  {
+                        iblStatus.iblFail = ibl_FAIL_CODE_SPI_PARAMS;
+                        return;
+                    }
+
+                }
+                break;
+        #endif
+
+        #if (!defined(EXCLUDE_NOR_EMIF) || !defined(EXCLUDE_NAND_EMIF))
+
+            case ibl_PMEM_IF_CHIPSEL_2:
+            case ibl_PMEM_IF_CHIPSEL_3:
+            case ibl_PMEM_IF_CHIPSEL_4:
+            case ibl_PMEM_IF_CHIPSEL_5:  {
+
+                    int i;
+
+                    /* Locate the configuration corresponding to this chip select space */
+                    for (i = 0; i < ibl_MAX_EMIF_PMEM; i++) 
+                        if (ibl.emifConfig[i].csSpace == interface)
+                            break;
+                        
+                    if (i == ibl_MAX_EMIF_PMEM)  {
+                        iblStatus.iblFail = ibl_FAIL_CODE_NO_EMIF_CFG;
+                        return;
+                    }
+
+                    ret = devicePowerPeriph (TARGET_PWR_EMIF);
+                    if (ret != 0)
+                        break;
+
+                    if (hwEmif25Init (interface, ibl.emifConfig[i].busWidth, ibl.emifConfig[i].waitEnable, enableNand) != 0)
+                        iblStatus.iblFail = ibl_FAIL_CODE_EMIF_CFG_FAIL;
+
+                }
+                break;
+
+            #endif
+
+            default:
+
+
+
+                iblStatus.iblFail = ibl_FAIL_CODE_INVALID_NAND_PERIPH;
+                return;
+    }
+
+    if (ret != 0)  {
+        iblStatus.iblFail = ibl_FAIL_CODE_PERIPH_POWER_UP;
+        return;
+    }
+
+}
+
+
 
 /**
  * @b Description
@@ -141,13 +243,14 @@ void main (void)
     timer_init ();
 
     /* Load default mac addresses for ethernet boot if requested */
-    for (i = 0; i < ibl_N_ETH_PORTS; i++)  {
+    for (i = 0; i < ibl_N_BOOT_MODES; i++)  {
 
-        if ( (iblPriorityIsValid (ibl.ethConfig[i].ethPriority)       )   &&
-             (iblMacAddrIsZero   (ibl.ethConfig[i].ethInfo.hwAddress) )   )
+        if (ibl.bootModes[i].bootMode == ibl_BOOT_MODE_TFTP)  {
 
-            deviceLoadDefaultEthAddress (ibl.ethConfig[i].ethInfo.hwAddress);
+            if (iblMacAddrIsZero (ibl.bootModes[i].u.ethBoot.ethInfo.hwAddress))
 
+                deviceLoadDefaultEthAddress (ibl.bootModes[i].u.ethBoot.ethInfo.hwAddress);
+        }
     }
 
 
@@ -157,29 +260,47 @@ void main (void)
     /* Try booting forever */
     for (;;)  {
 
-        /* Start looping through the boot modes to find the one with the lowest priority
-         * value, and try to boot it. If a boot mode is not supported the function
-         * statement is simply defined to be a void statement */
+        /* Start looping through the boot modes to find the one with the highest priority
+         * value, and try to boot it. */
         for (i = ibl_HIGHEST_PRIORITY; i < ibl_LOWEST_PRIORITY; i++)  {
 
-#ifndef EXCLUDE_ETH
-            for (j = 0; j < ibl_N_ETH_PORTS; j++)  {
-                if (ibl.ethConfig[j].ethPriority == i)  {
-                    iblStatus.activePeriph = ibl_ACTIVE_PERIPH_ETH;
-                    memcpy (&iblStatus.ethParams, &ibl.ethConfig[j].ethInfo, sizeof (iblEthBootInfo_t));
-                    iblEthBoot (j);
-                }
-            }
-#endif
+            for (j = 0; j < ibl_N_BOOT_MODES; j++)  {
 
-#ifndef EXCLUDE_NAND
-            if (ibl.nandConfig.nandPriority == i)  {
-                iblStatus.activePeriph = ibl_ACTIVE_PERIPH_NAND;
-                iblNandBoot ();
-            }
-#endif
+                if (ibl.bootModes[j].priority == i)  {
+
+                    iblStatus.activeBoot = ibl.bootModes[j].bootMode;
+
+                    switch (ibl.bootModes[j].bootMode)  {
+
+
+                        #ifndef EXCLUDE_ETH
+                            case ibl_BOOT_MODE_TFTP:
+                                    iblStatus.activeDevice = ibl_ACTIVE_DEVICE_ETH;
+                                    iblMemcpy (&iblStatus.ethParams, &ibl.bootModes[j].u.ethBoot.ethInfo, sizeof(iblEthBootInfo_t));
+                                    iblEthBoot (j);
+                                    break;
+                        #endif
+
+                        #if (!defined(EXCLUDE_NAND_EMIF) && !defined(EXCLUDE_NAND_SPI) && !defined(EXCLUDE_NAND_GPIO))
+                            case ibl_BOOT_MODE_NAND:
+                                    iblPmemCfg (ibl.bootModes[j].u.nandBoot.interface, ibl.bootModes[j].port, TRUE);
+                                    iblNandBoot (j);
+                                    break;
+                        #endif
+
+                        #if (!defined(EXCLUDE_NOR_EMIF) && !defined(EXCLUDE_NOR_SPI))
+                            case ibl_BOOT_MODE_NOR:
+                                    iblPmemCfg (ibl.bootModes[j].u.norBoot.interface, ibl.bootModes[j].port, TRUE);
+                                    iblNorBoot (j);
+                                    break;
+                        #endif
+
+                    }
+                }
 
             iblStatus.heartBeat += 1;
+
+            }
         }
 
     }
@@ -238,7 +359,7 @@ Uint32 iblBoot (BOOT_MODULE_FXN_TABLE *bootFxn, Int32 dataFormat, void *formatPa
     }        
 
 
-    iblStatus.activeFormat = dataFormat;
+    iblStatus.activeFileFormat = dataFormat;
 
 
     /* Invoke the parser */
index ce981472289dfc085a5cca56d33fe3683e01b95c..01483672a86cc41ad6260d41b720f513f772dcdb 100644 (file)
 #*
 #* DESCRIPTION: Builds the Intermediate Boot Loader (IBL)
 #*
-#*  Usage:  make c6455 | c6472 | c6474 | c6457 | c661x [DEBUG=yes] [ETH=no] [NAND=no]  \
-#*          [BIS=no] [COFF=no] [BLOB=no] [ELF=no] [NAND_SPI=no] [NOR_SPI=no] [ENDIAN= both | big | little] 
-#*          [I2C_BUS_ADDR= 0x50 | 0x51] [COMPACT_I2C=yes]
+#*  Usage:  make c6455 | c6472 | c6474 | c6457 | c661x 
+#*          [DEBUG=yes]                                                /* Compiles for debug */
+#*          [ETH=no]                                                   /* Disables ethernet support */
+#*          [BIS=no]                                                   /* Disables BIS interpreter */
+#*          [COFF=no]                                                  /* Disables COFF interpreter */
+#*          [BLOB=no]                                                  /* Disables BLOB interpreter */
+#*          [ELF=no]                                                   /* Disables ELF interpreter */
+#*          [NAND=no]                                                          /* Disables NAND support through EMIF/SPI/GPIO */
+#*          [NAND_SPI=no]                                              /* Disables NAND support through SPI */
+#*                     [NAND_EMIF=no]                                          /* Disables NAND support through EMIF */
+#*                     [NAND_GPIO=no]                                          /* Disables NAND support through GPIO */
+#*                     [NOR=no]                                                        /* Disables NOR through EMIF/SPI */
+#*                     [NOR_SPI=no]                                            /* Disables NOR support through SPI */
+#*          [NOR_EMIF=no]                                              /* Disables NOR support through EMIF */
+#*                     [SPI=no]                                                        /* Disables SPI */
+#*                     [I2C=no]                                                        /* Disables I2C */
+#*                     [EMIF=no]                                                       /* Disables EMIF */
+#*                     [SPI_MODE=<0,1,2,3>]                            /* Selects the SPI operating mode */
+#*                     [SPI_ADDR_WIDTH=<16,24>]                        /* Selects the SPI address width */
+#*                     [SPI_NPIN=<4,5>]                                        /* Selects the number of pins on the interface */
+#*                     [SPI_CSEL=<1,2>]                                        /* Sets the SPI CSEL value in 5 pin mode */
+#*                     [SPI_C2TDEL=x]                                          /* Sets the SPI C to T delay value */
+#*                     [SPI_CLKDIV=x]                                          /* Sets the SPI module clock divider */
+#*                     [SPI_USE_ROM=yes]                                       /* Uses SPI interface parameters from boot ROM, if available */
+#*          [ENDIAN= both | big | little]              /* Selects the endian of the build */
+#*          [I2C_BUS_ADDR= 0x50 | 0x51]                /* The initial I2C bus address */
+#*          [COMPACT_I2C=yes]                                  /* Mimimizes the size of the I2C */
+#*                     
 #*
 #* or to make a board specific configuraiton
 #*
-#*                     make evm_c6455 | evm_c6472 | evm_c6474 | evm_c6457
+#*                     make evm_c6455 | evm_c6472 | evm_c6474 | evm_c6457 | evm_c661x
 #*
 #* or to test the builds by making all the devices and testing excludes
 #*
@@ -61,40 +86,100 @@ EVMS_C6X= evm_c6455 evm_c6472 evm_c6474
 # speeds the initial boot time. Note that boot table cannot be excluded
 # because it is required for the two stage I2C load process
 
-EXCLUDES=
+CEXCLUDES=
 
 ifeq ($(ETH),no)
- EXCLUDES+= ETH
-endif
-
-ifeq ($(NAND),no)
- EXCLUDES+= NAND
+ CEXCLUDES+= ETH
 endif
 
 ifeq ($(BIS),no)
- EXCLUDES+= BIS
CEXCLUDES+= BIS
 endif
 
 ifeq ($(COFF),no)
- EXCLUDES+= COFF
CEXCLUDES+= COFF
 endif
 
 ifeq ($(BLOB),no)
- EXCLUDES+= BLOB
CEXCLUDES+= BLOB
 endif
 
 ifeq ($(ELF),no)
- EXCLUDES+= ELF
+ CEXCLUDES+= ELF
+endif
+
+ifeq ($(NAND),no)
+ CEXCLUDES+= NAND_SPI
+ CEXCLUDES+= NAND_EMIF
+ CEXCLUDES+= NAND_GPIO
+
+else
+
+ ifeq ($(NAND_SPI),no)
+  CEXCLUDES+= NAND_SPI
+ endif
+
+ ifeq ($(NAND_EMIF),no)
+  CEXCLUDES+= NAND_EMIF
+ endif
+
+ ifeq ($(NAND_GPIO),no)
+  CEXCLUDES+= NAND_GPIO
+ endif
+
+endif
+
+
+ifeq ($(NOR),no)
+ CEXCLUDES+= NOR_SPI
+ CEXCLUDES+= NOR_EMIF
+
+else
+
+ ifeq ($(NOR_SPI),no)
+  CEXCLUDES+= NOR_SPI
+ endif
+
+ ifeq ($(NOR_EMIF),no)
+  CEXCLUDES+= NOR_EMIF
+ endif
+
 endif
 
-ifeq ($(NAND_SPI),no)
- EXCLUDES+= NAND_SPI
+
+ifeq ($(I2C),no)
+ CEXCLUDES+= I2C
 endif
 
-ifeq ($(NOR_SPI),no)
- EXCLUDES+= NOR_SPI
+
+ifeq ($(SPI),no)
+
+ ifeq (,$(findstring NAND_SPI, $(CEXCLUDES)))
+  CEXCLUDES+= NAND_SPI
+ endif
+
+ ifeq (,$(findstring NOR_SPI, $(CEXCLUDES)))
+  CEXCLUDES+= NOR_SPI
+ endif
+
 endif
+
+
+ifeq ($(EMIF),no)
+
+ ifeq (,$(findstring NAND_EMIF, $(CEXCLUDES)))
+  CEXCLUDES+= NAND_EMIF
+ endif
+
+ ifeq (,$(findstring NOR_EMIF, $(CEXCLUDES)))
+  CEXCLUDES+= NOR_EMIF
+ endif
+
+endif
+
+
+
+
 
 
 # The endian of the build. The default target builds a single ROM image with both endians present
@@ -139,7 +224,7 @@ ifndef SPI_CLKDIV
  SPI_CLKDIV=8
 endif
 
-ifneq ($(SPI_USE_ROM_PARAMS),0)
+ifneq ($(SPI_USE_ROM),0)
  SPI_ROM=1
 else
  SPI_ROM=0
@@ -154,6 +239,8 @@ SPI_DEFS+= SPI_CLKDIV=$(SPI_CLKDIV)
 SPI_DEFS+= SPI_ROM=$(SPI_ROM)
 
 
+.PHONY: all $(IBLS_C6X) evm_c6455 evm_c6472 evm_c6474 evm_c6457 evm_c6618 
+.PHONY: test_c661x test_c6455 test_c6472 test_c6474 test_c6457 clean
 
 
 all:
@@ -168,69 +255,85 @@ export DEBUG
 
 
 $(IBLS_C6X): 
-       make -f makestg1 ARCH=c64x TARGET=$@ I2C_BUS_ADDR=$(I2C_BUS_ADDR) COMPACT_I2C=$(COMPACT_I2C) ENDIAN_MODE=$(ENDIAN_MODE) EXCLUDES='$(EXCLUDES)' SPI_DEFS='$(SPI_DEFS)' $@
+       make -f makestg1 ARCH=c64x TARGET=$@ I2C_BUS_ADDR=$(I2C_BUS_ADDR) COMPACT_I2C=$(COMPACT_I2C) ENDIAN_MODE=$(ENDIAN_MODE) CEXCLUDES='$(CEXCLUDES)' SPI_DEFS='$(SPI_DEFS)' $@
 
 
 # Configurations for individual evms
 # The c455 EVM has a 128k eeprom (64k at 0x50, 64k at 0x51), so both endians are built with full functionality
 evm_c6455:
-       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES= c6455
+       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES= c6455
 
 # The c6472 EVM has a 128k eeprom (64k at 0x50, 64k at 0x51), so both endians are built with full functionality
 evm_c6472:
-       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES= c6472
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES= c6472
 
 # The 6474 EVM has a 32k eeprom. A stripped down version is build with only one endian.
 evm_c6474:
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=little EXCLUDES='ELF NAND BIS' I2C_SIZE_BYTES=0x8000 c6474
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=little CEXCLUDES='ELF NAND_GPIO BIS' I2C_SIZE_BYTES=0x8000 c6474
        cp ibl_c6474/i2crom.dat ibl_c6474/i2crom_0x50.dat
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x51 COMPACT_I2C=yes ENDIAN_MODE=big EXCLUDES='ELF NAND BIS' I2C_SIZE_BYTES=0x8000 c6474
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x51 COMPACT_I2C=yes ENDIAN_MODE=big CEXCLUDES='ELF NAND_GPIO BIS' I2C_SIZE_BYTES=0x8000 c6474
        cp ibl_c6474/i2crom.dat ibl_c6474/i2crom_0x51.dat
 
 # The 6457 EVM
 evm_c6457:
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=little EXCLUDES='ELF NAND BIS' I2C_SIZE_BYTES=0x8000 c6457
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=little CEXCLUDES='ELF NAND_GPIO BIS' I2C_SIZE_BYTES=0x8000 c6457
        cp ibl_c6457/i2crom.dat ibl_c6457/i2crom_0x50.dat
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x51 COMPACT_I2C=yes ENDIAN_MODE=big EXCLUDES='ELF NAND BIS' I2C_SIZE_BYTES=0x8000 c6457
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x51 COMPACT_I2C=yes ENDIAN_MODE=big CEXCLUDES='ELF NAND_GPIO BIS' I2C_SIZE_BYTES=0x8000 c6457
        cp ibl_c6457/i2crom.dat ibl_c6457/i2crom_0x51.dat
 
 # The 6618 EVM
 evm_c6618:
-       make -f makestg1 ARCH=c64x TARGET=c661x I2C_BUS_ADDR=0x50 ENDIAN_MODE=little EXCLUDES= DEBUG=YES SPI_DEFS='$(SPI_DEFS)' c661x
+       make -f makestg1 ARCH=c64x TARGET=c661x I2C_BUS_ADDR=0x50 ENDIAN_MODE=little CEXCLUDES= DEBUG=YES SPI_DEFS='$(SPI_DEFS)' c661x
+
+test_c661x:
+       make -f makestg1 ARCH=c64x TARGET=c661x ENDIAN_MODE=both CEXCLUDES='NOR_SPI' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 COMPACT_I2C=no c661x
+       make -f makestg1 ARCH=c64x TARGET=c661x ENDIAN_MODE=both CEXCLUDES='NAND_SPI' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 COMPACT_I2C=no c661x
+       make -f makestg1 ARCH=c64x TARGET=c661x ENDIAN_MODE=both CEXCLUDES='NOR_EMIF' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 COMPACT_I2C=no c661x
+       make -f makestg1 ARCH=c64x TARGET=c661x ENDIAN_MODE=both CEXCLUDES='NAND_EMIF' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 COMPACT_I2C=no c661x
+       make -f makestg1 ARCH=c64x TARGET=c661x ENDIAN_MODE=both CEXCLUDES='NAND_EMIF NOR_EMIF' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 COMPACT_I2C=no c661x
+       make -f makestg1 ARCH=c64x TARGET=c661x ENDIAN_MODE=both CEXCLUDES='SPI NOR_SPI NAND_SPI' I2C_BUS_ADDR=0x50 COMPACT_I2C=no c661x
+       make -f makestg1 ARCH=c64x TARGET=c661x ENDIAN_MODE=both CEXCLUDES=I2C SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' c661x
 
 # Test - builds all the targets, with single component exclusion
-test_build:
-       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=     c6455
-       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=ETH  c6455
-       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=NAND c6455
-       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=BIS  c6455
-       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=COFF c6455
-       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=ELF  c6455
-       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=BLOB c6455
-
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=     c6457
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=ETH  c6457
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=NAND c6457
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=BIS  c6457
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=COFF c6457
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=ELF  c6457
-       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=BLOB c6457
-
-       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=     c6472
-       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=ETH  c6472
-       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=NAND c6472
-       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=BIS  c6472
-       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=COFF c6472
-       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=ELF  c6472
-       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=BLOB c6472
-
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=     c6474
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=ETH  c6474
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=NAND c6474
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=BIS  c6474
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=COFF c6474
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=ELF  c6474
-       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both EXCLUDES=BLOB c6474
+
+test_c6455:
+       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=          c6455
+       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=ETH       c6455
+       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=NAND_GPIO c6455
+       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=BIS       c6455
+       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=COFF      c6455
+       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=ELF       c6455
+       make -f makestg1 ARCH=c64x TARGET=c6455 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=BLOB      c6455
+
+test_c6457:
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=          c6457
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=ETH       c6457
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=NAND_GPIO c6457
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=BIS       c6457
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=COFF      c6457
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=ELF       c6457
+       make -f makestg1 ARCH=c64x TARGET=c6457 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=BLOB      c6457
+
+test_c6472:
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=          c6472
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=ETH       c6472
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=NAND_GPIO c6472
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=BIS       c6472
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=COFF      c6472
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=ELF       c6472
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both CEXCLUDES=BLOB      c6472
+
+test_c6474:
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=          c6474
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=ETH       c6474
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=NAND_GPIO c6474
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=BIS       c6474
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=COFF      c6474
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=ELF       c6474
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=BLOB      c6474
+
+
+test_build: test_c6455 test_c6457 test_c6472 test_c6474 test_c661x
 
 
 # will need to add a line for each additional ARCH type added
index e9be06e17ff9a3f6470797a02b0e4697d11a2cbc..114b60fec19d2cec080245d27663807784a453dc 100644 (file)
@@ -19,8 +19,8 @@ MEMORY
        TEXT      :  origin = 0x803800, length = 0xd800
        STACK     :  origin = 0x811000, length = 0x0800
        HEAP      :  origin = 0x811800, length = 0x6000
-       DATA_INIT :  origin = 0x817800, length = 0x0200
-       DATA      :  origin = 0x817a00, length = 0x2e00
+       DATA_INIT :  origin = 0x817800, length = 0x0400
+       DATA      :  origin = 0x817c00, length = 0x2c00
        CFG       :  origin = 0x821800, length = 0x0300
        STAT      :  origin = 0x821b00, length = 0x0200
 }
index 5f4a295bf1b92a72d849589a142a9404cdf1bf6c..d6182105b1d50dea833ec70a37e0532f0ed29be0 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 ../main/c64x/make/iblinit.ENDIAN_TAG.oc
+../main/c64x/make/ibliniti2c.ENDIAN_TAG.oc
 ../device/c64x/make/c6455init.ENDIAN_TAG.oc
 ../hw/c64x/make/pll.ENDIAN_TAG.oc
 ../hw/c64x/make/i2c.ENDIAN_TAG.oc
index 3e326d899dadd7dc3b6bf0bc2fe71a66e3fc4b9e..1fb45c457775ca139e7742ea11723607fab922b8 100644 (file)
@@ -45,7 +45,7 @@
 ../hw/c64x/make/mdio.ENDIAN_TAG.oc
 #endif
 
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 ../nandboot/c64x/make/nandboot.ENDIAN_TAG.oc
 ../driver/c64x/make/nand.ENDIAN_TAG.oc
 ../ecc/c64x/make/3byte_ecc.ENDIAN_TAG.oc
index e9be06e17ff9a3f6470797a02b0e4697d11a2cbc..114b60fec19d2cec080245d27663807784a453dc 100644 (file)
@@ -19,8 +19,8 @@ MEMORY
        TEXT      :  origin = 0x803800, length = 0xd800
        STACK     :  origin = 0x811000, length = 0x0800
        HEAP      :  origin = 0x811800, length = 0x6000
-       DATA_INIT :  origin = 0x817800, length = 0x0200
-       DATA      :  origin = 0x817a00, length = 0x2e00
+       DATA_INIT :  origin = 0x817800, length = 0x0400
+       DATA      :  origin = 0x817c00, length = 0x2c00
        CFG       :  origin = 0x821800, length = 0x0300
        STAT      :  origin = 0x821b00, length = 0x0200
 }
index 98cff0bbd138a6735e0d183354aea6c4e9c320c4..c64f1493f176f2c14c6e9abd7e87e05f25c03137 100644 (file)
@@ -4,7 +4,8 @@
  */
 
 ../main/c64x/make/iblinit.ENDIAN_TAG.oc
-../device/c64x/make/c6474init.ENDIAN_TAG.oc
+../main/c64x/make/ibliniti2c.ENDIAN_TAG.oc
+../device/c64x/make/c6457init.ENDIAN_TAG.oc
 ../hw/c64x/make/pll.ENDIAN_TAG.oc
 ../hw/c64x/make/i2c.ENDIAN_TAG.oc
 ../interp/c64x/make/btblwrap.ENDIAN_TAG.oc
index adefe5614d4b7bdd0ba0046f90c55023840b633f..b07799b108145ccc618e63a3c25298a30cb8b0e7 100644 (file)
@@ -47,7 +47,7 @@
 ../hw/c64x/make/sgmii.ENDIAN_TAG.oc
 #endif
 
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 ../nandboot/c64x/make/nandboot.ENDIAN_TAG.oc
 ../driver/c64x/make/nand.ENDIAN_TAG.oc
 ../ecc/c64x/make/3byte_ecc.ENDIAN_TAG.oc
index 8c3c3d30ef24157e81758df18333efa62e4985d3..d49a69ca51057c771048902450c67ff53268e7e6 100644 (file)
@@ -19,8 +19,8 @@ MEMORY
        TEXT      :  origin = 0x802900, length = 0xd700
        STACK     :  origin = 0x810000, length = 0x0800
        HEAP      :  origin = 0x810800, length = 0x6000
-       DATA_INIT :  origin = 0x816800, length = 0x0200
-       DATA      :  origin = 0x816a00, length = 0x2e00
+       DATA_INIT :  origin = 0x816800, length = 0x0400
+       DATA      :  origin = 0x816c00, length = 0x2c00
        CFG       :  origin = 0x819800, length = 0x0300
        STAT      :  origin = 0x819b00, length = 0x0200
 }
index 3ec796f81366892ddb04698d8e81f71da287ca9f..a0f5486a81949298c91a51c9a4ff1f4cb7295412 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 ../main/c64x/make/iblinit.ENDIAN_TAG.oc
+../main/c64x/make/ibliniti2c.ENDIAN_TAG.oc
 ../device/c64x/make/c6472init.ENDIAN_TAG.oc
 ../hw/c64x/make/pll.ENDIAN_TAG.oc
 ../hw/c64x/make/i2c.ENDIAN_TAG.oc
index 564da7433d05510b5a18e165892b53d5a3d8eca7..f4d7ba6a1686b0c75d68f9ff47570fd199911e4b 100644 (file)
@@ -46,7 +46,7 @@
 ../hw/c64x/make/mdio.ENDIAN_TAG.oc
 #endif
 
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 ../hw/c64x/make/gpio.ENDIAN_TAG.oc
 ../hw/c64x/make/nandgpio.ENDIAN_TAG.oc
 ../driver/c64x/make/nand.ENDIAN_TAG.oc
index e9be06e17ff9a3f6470797a02b0e4697d11a2cbc..114b60fec19d2cec080245d27663807784a453dc 100644 (file)
@@ -19,8 +19,8 @@ MEMORY
        TEXT      :  origin = 0x803800, length = 0xd800
        STACK     :  origin = 0x811000, length = 0x0800
        HEAP      :  origin = 0x811800, length = 0x6000
-       DATA_INIT :  origin = 0x817800, length = 0x0200
-       DATA      :  origin = 0x817a00, length = 0x2e00
+       DATA_INIT :  origin = 0x817800, length = 0x0400
+       DATA      :  origin = 0x817c00, length = 0x2c00
        CFG       :  origin = 0x821800, length = 0x0300
        STAT      :  origin = 0x821b00, length = 0x0200
 }
index 98cff0bbd138a6735e0d183354aea6c4e9c320c4..c540b70d89c3e65cc0d0cd4ac98500d54002c89b 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 ../main/c64x/make/iblinit.ENDIAN_TAG.oc
+../main/c64x/make/ibliniti2c.ENDIAN_TAG.oc
 ../device/c64x/make/c6474init.ENDIAN_TAG.oc
 ../hw/c64x/make/pll.ENDIAN_TAG.oc
 ../hw/c64x/make/i2c.ENDIAN_TAG.oc
index c98b6b93804f72c64415fe7cf939335677fc88da..87a24e274bd02a80b90de4d8944ad1bf4c332d79 100644 (file)
@@ -47,7 +47,7 @@
 ../hw/c64x/make/sgmii.ENDIAN_TAG.oc
 #endif
 
-#ifndef EXCLUDE_NAND
+#ifndef EXCLUDE_NAND_GPIO
 ../nandboot/c64x/make/nandboot.ENDIAN_TAG.oc
 ../driver/c64x/make/nand.ENDIAN_TAG.oc
 ../ecc/c64x/make/3byte_ecc.ENDIAN_TAG.oc
index dc888360b0d84899804ac8f05427cb95872a09ba..1ac5c354289d4a9ec4852a2c817d6b5a59ab1f00 100644 (file)
@@ -15,8 +15,8 @@
 
 MEMORY
 {
-       TEXT_INIT :  origin = 0x800000, length = 0x3a00
-       TEXT      :  origin = 0x803a00, length = 0xc600
+       TEXT_INIT :  origin = 0x800000, length = 0x4000
+       TEXT      :  origin = 0x804000, length = 0xc000
        STACK     :  origin = 0x810000, length = 0x0800
        HEAP      :  origin = 0x810800, length = 0x6000
        DATA_INIT :  origin = 0x816800, length = 0x0400
index c619ddc0b3b0b36dc908791be8046b3efe91dc7f..6a690ec2fc3a3cf0d79708736d9f7a1372e328c7 100644 (file)
 ../hw/c64x/make/gmacsl.ENDIAN_TAG.oc
 #endif
 
-#ifndef EXCLUDE_NAND
+
+/* -------------- */
+#if (!defined(EXCLUDE_NAND_EMIF) || !defined(EXCLUDE_NAND_SPI))
+
 ../nandboot/c64x/make/nandboot.ENDIAN_TAG.oc
 ../driver/c64x/make/nand.ENDIAN_TAG.oc
 ../ecc/c64x/make/3byte_ecc.ENDIAN_TAG.oc
  #endif
 
 #endif
+/* -------------- */
+
+
+
+/* -------------- */
+#if (!defined(EXCLUDE_NOR_EMIF) || !defined(EXCLUDE_NOR_SPI))
+
+../norboot/c64x/make/norboot.ENDIAN_TAG.oc
+../driver/c64x/make/nor.ENDIAN_TAG.oc
+../hw/c64x/make/emif25.ENDIAN_TAG.oc
+
+ #ifndef EXCLUDE_NOR_SPI
+ ../hw/c64x/make/norspi.ENDIAN_TAG.oc
+ #endif
+
+ #ifndef EXCLUDE_NOR_EMIF
+ ../hw/c64x/make/noremif25.ENDIAN_TAG.oc
+ #endif
+
+#endif
+/* -------------- */
+
 
-#ifndef EXCLUDE_SPI
+#if (!defined(EXCLUDE_NOR_SPI) || !defined(EXCLUDE_NAND_SPI))
 ../hw/c64x/make/spi.ENDIAN_TAG.oc
 #endif
index 9f2c354f07f6705e7f6810dbf8c599c2d828ca5e..93540424ace39c91a6a1a935390d326b1315c994 100644 (file)
@@ -12,6 +12,7 @@
 
 IBLS_C6X= c6455 c6472 c6474 c6474l c6457 c661x
 
+
 # Excluding functions from the build reduces the I2C eeprom memory used and
 # speeds the initial boot time. Note that boot table cannot be excluded
 # because it is required for the two stage I2C load process
@@ -30,22 +31,84 @@ else
  endif
 endif
 
+EXCLUDES= $(CEXCLUDES)
+
 
 # The default i2c size. This is used only for the i2c writer utility
 ifndef I2C_SIZE_BYTES
  I2C_SIZE_BYTES=0x20000
 endif
 
+# exclusions based on device capability
+ifeq ($(TARGET),c6455)
+ C64X_EXCLUDES=yes
+endif
+
+ifeq ($(TARGET),c6457)
+ C64X_EXCLUDES=yes
+endif
+ifeq ($(TARGET),c6472)
+ C64X_EXCLUDES=yes
+endif
+
+ifeq ($(TARGET),c6474)
+ C64X_EXCLUDES=yes
+endif
+
+ifeq ($(C64X_EXCLUDES),yes)
+
+ ifeq (,$(findstring SPI, $(EXCLUDES)))
+  EXCLUDES+= SPI
+ endif
+
+ ifeq (,$(findstring NOR_SPI, $(EXCLUDES)))
+  EXCLUDES+= NOR_SPI
+ endif
+
+ ifeq (,$(findstring NOR_EMIF, $(EXCLUDES)))
+  EXCLUDES+= NOR_EMIF
+ endif
+
+ ifeq (,$(findstring NAND_SPI, $(EXCLUDES)))
+  EXCLUDES+= NAND_SPI
+ endif
+
+ ifeq (,$(findstring NAND_EMIF, $(EXCLUDES)))
+  EXCLUDES+= NAND_EMIF
+ endif
+
+endif
+
+ifeq ($(TARGET),c661x)
+ EXCLUDES+= NAND_GPIO
+endif
+
+
+# Prevent I2C/SPI rom creation based on defines
+ROMS=
+
+ifeq (,$(findstring I2C, $(EXCLUDES)))
+ ROMS+= i2cRom
+endif
+
+ifeq (,$(findstring SPI, $(EXCLUDES)))
+ ROMS+= spiRom
+endif
+
 
 # Excludes identify which components are not part of the build
 export EXCLUDES
 
+.PHONY: all be_target le_target compare $(IBLS_C6X)
+
 all:
        @echo must specify a target [ $(IBLS_C6X) ]
 
 
 
 be_target:
+       @echo EXCLUDES= $(EXCLUDES)
        make -f makestg2 ARCH=c64x TARGET=$(TARGET) ENDIAN=big    I2C_SIZE_BYTES=$(I2C_SIZE_BYTES) I2C_BUS_ADDR=$(I2C_BUS_ADDR) SPI_DEFS='$(SPI_DEFS)' utils
        make -f makestg2 ARCH=c64x TARGET=$(TARGET) ENDIAN=big    I2C_SIZE_BYTES=$(I2C_SIZE_BYTES) I2C_BUS_ADDR=$(I2C_BUS_ADDR) SPI_DEFS='$(SPI_DEFS)' $(TARGET)
 
@@ -58,8 +121,7 @@ compare:
 
 
 $(IBLS_C6X): $(STAGE1_TARGET)
-       make -f makestg2 ARCH=c64x TARGET=$@ I2CROM=$(I2CROM) I2C_BUS_ADDR=$(I2C_BUS_ADDR) COMPACT_I2C=$(COMPACT_I2C) SPI_DEFS='$(SPI_DEFS)' i2cRom
-
+       make -f makestg2 ARCH=c64x TARGET=$@ I2CROM=$(I2CROM) I2C_BUS_ADDR=$(I2C_BUS_ADDR) COMPACT_I2C=$(COMPACT_I2C) SPI_DEFS='$(SPI_DEFS)' $(ROMS)
 
 
 
index 616de5492ccfa9d26ef498d3312a60ea5cb1a8ab..0a045cc16a23dce5a5abef6b3a1bc17a70ceb6bb 100644 (file)
@@ -12,7 +12,7 @@ ifndef IBL_ROOT
 endif
 
 CFG_MODULES= main device
-MODULES= ethboot nandboot driver hw interp ecc
+MODULES= ethboot nandboot driver hw interp ecc norboot
 
 # Note that the Hw module is a two stage clean and handled seperately
 CLEAN_MODULES=$(addprefix clean_,$(subst hw,,$(MODULES)))
@@ -53,6 +53,9 @@ include $(IBL_ROOT)/make/$(ARCH)/makedefs.mk
 export ARCH
 export TARGET
 
+.PHONY:  $(TARGETS) i2cRom spiRom compare iblInit iblMain $(MODULES) $(CFG_MODULES)
+.PHONY:  utils clean clean_modules hwClean cleant
+
 $(TARGETS): iblMain
 
 
@@ -97,6 +100,8 @@ i2cRom:
        $(CP) i2crom.ccs ibl_$(TARGET)/$@.dat
        $(RM) i2crom.ccs ibl_le.b ibl.b
 
+spiRom:
+       @echo Making SPI ROM
 
 
 
@@ -152,15 +157,15 @@ $(MODULES):
        make -C $(IBL_ROOT)/$@/$(ARCH)/make $@
 
 $(CFG_MODULES):
-       @echo making $@ SPI_CFG=$(SPI_CFG)
+       @echo making $@ SPI_CFG=$(SPI_CFG) CDEFS=$(CDEFS) EXCLUDES=$(EXCLUDES)
        make -C $(IBL_ROOT)/$@/$(ARCH)/make CDEFS='$(MAINDEFS) $(SPI_CFG)' $@
 
 utils:
        make -C $(IBL_ROOT)/util/btoccs
        make -C $(IBL_ROOT)/util/romparse TARGET=$(TARGET)
        make -C $(IBL_ROOT)/util/i2cRead  TARGET=$(TARGET) $(TARGET) 
-       make -C $(IBL_ROOT)/util/i2cWrite TARGET=$(TARGET) I2C_SIZE_BYTES=$(I2C_SIZE_BYTES) MAINDEFS='$(MAINDEFS) -DEXCLUDE_SPI' $(TARGET)
-       make -C $(IBL_ROOT)/util/i2cConfig $(TARGET) MAINDEFS='$(MAINDEFS) -DEXCLUDE_SPI'
+       make -C $(IBL_ROOT)/util/i2cWrite TARGET=$(TARGET) I2C_SIZE_BYTES=$(I2C_SIZE_BYTES) MAINDEFS='$(MAINDEFS) $(SPI_CFG)' $(TARGET)
+       make -C $(IBL_ROOT)/util/i2cConfig $(TARGET) MAINDEFS='$(MAINDEFS) $(SPI_CFG)' 
        make -C $(IBL_ROOT)/util/bconvert
 
 clean: $(CLEAN_MODULES) hwClean
index 5d123101af53c7a4f18099e8044804ec95dda390..c4f3e7e479bd7841c74811e07aea32bc35bd26ab 100644 (file)
 #endif
 
 
-void iblNandBoot (void)
+void iblNandBoot (int32 eIdx)
 {
     Uint32 entry;
+    Int32  ret;
     void   (*exit)();
 
-    /* Power up the device */
-    if (devicePowerPeriph (TARGET_PWR_NAND) < 0)
-        return;
 
 
     /* Perform any device specific configurations */
@@ -79,11 +77,11 @@ void iblNandBoot (void)
 
 
     /* Open the nand driver */
-    if ((*nand_boot_module.open) ((void *)&ibl.nandConfig, NULL))
+    if ((*nand_boot_module.open) ((void *)&ibl.bootModes[eIdx].u.nandBoot, NULL))
         return;
 
 
-    entry = iblBoot (&nand_boot_module, ibl.nandConfig.bootFormat, &ibl.nandConfig.blob);
+    entry = iblBoot (&nand_boot_module, ibl.bootModes[eIdx].u.nandBoot.bootFormat, &ibl.bootModes[eIdx].u.nandBoot.blob);
 
     (*nand_boot_module.close)();
 
@@ -95,6 +93,6 @@ void iblNandBoot (void)
             
     }
 
-  
+} 
 
 
index acbc9c8e6f773363c3e73b94b548b6f5e197786e..d48bbae2fad5654942a58b56e8573e3b8c9537da 100644 (file)
@@ -52,7 +52,7 @@
  *  @details 
  *             The IBL will attempt to boot over the NAND interface
  */
-void iblNandBoot (void);
+void iblNandBoot (int32 eIdx);
 
 
 #endif /* NANDBOOT_H */
diff --git a/src/norboot/c64x/make/makefile b/src/norboot/c64x/make/makefile
new file mode 100644 (file)
index 0000000..0670404
--- /dev/null
@@ -0,0 +1,79 @@
+#*
+#*
+#* Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+#* 
+#* 
+#*  Redistribution and use in source and binary forms, with or without 
+#*  modification, are permitted provided that the following conditions 
+#*  are met:
+#*
+#*    Redistributions of source code must retain the above copyright 
+#*    notice, this list of conditions and the following disclaimer.
+#*
+#*    Redistributions in binary form must reproduce the above copyright
+#*    notice, this list of conditions and the following disclaimer in the 
+#*    documentation and/or other materials provided with the   
+#*    distribution.
+#*
+#*    Neither the name of Texas Instruments Incorporated nor the names of
+#*    its contributors may be used to endorse or promote products derived
+#*    from this software without specific prior written permission.
+#*
+#*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+#*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+#*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+#*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+#*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+#*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+#*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+#*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#*
+
+
+#*************************************************************************************
+#* FILE NAME: makefile
+#*
+#* DESCRIPTION: Makes the nor module for the IBL
+#*
+#*************************************************************************************/
+
+ifndef IBL_ROOT
+       export IBL_ROOT= ../../..
+endif
+
+ECODIR= $(IBL_ROOT)/norboot
+
+CSRC= norboot.c
+
+.PHONY: norboot
+
+
+include $(IBL_ROOT)/make/$(ARCH)/makeeco.mk
+
+
+
+C6X_C_DIR+=  $(IBL_ROOT)
+C6X_C_DIR+= ;$(IBL_ROOT)/arch/$(ARCH)
+C6X_C_DIR+= ;$(IBL_ROOT)/device
+C6X_C_DIR+= ;$(IBL_ROOT)/device/$(TARGET)
+C6X_C_DIR+= ;$(IBL_ROOT)/norboot
+C6X_C_DIR+= ;$(IBL_ROOT)/driver/nor
+C6X_C_DIR+= ;$(STDINC)
+export C6X_C_DIR
+
+
+
+norboot: gen_cdefdep makefile $(OBJS)
+
+
+$(OBJS): cdefdep
+
+gen_cdefdep:
+       @echo Checking command line dependencies
+       @echo $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
+
+
diff --git a/src/norboot/norboot.c b/src/norboot/norboot.c
new file mode 100644 (file)
index 0000000..ece599e
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+
+/** @file norboot.c
+ *
+ * @brief
+ *      The nor boot wrapper
+ */
+
+#include "types.h"
+#include "ibl.h"
+#include "iblloc.h"
+#include "nor.h"
+#include "norboot.h"
+#include "device.h"
+
+
+void iblNorBoot (int32 eIdx)
+{
+    Uint32 entry;
+    void   (*exit)();
+
+    /* Perform any device specific configurations */
+    if (deviceConfigureForNor() < 0)
+        return;
+
+    /* Open the nor driver */
+    if ((*nor_boot_module.open) ((void *)&ibl.bootModes[eIdx].u.norBoot, NULL))
+        return;
+
+
+    entry = iblBoot (&nor_boot_module, ibl.bootModes[eIdx].u.norBoot.bootFormat, &ibl.bootModes[eIdx].u.norBoot.blob);
+
+    (*nor_boot_module.close)();
+
+    if (entry != 0)  {
+
+        iblStatus.exitAddress = entry;
+        exit = (void (*)())entry;
+        (*exit)();
+
+    }
+
+}
+
+
similarity index 89%
rename from src/hw/nands/emif25/nandemif25_loc.h
rename to src/norboot/norboot.h
index b268241ec08c78fccf6fa26858fd4e0885c8a9a0..ad9e4fca0ca41ccc8ef0f7ea420bc00c5e8cec68 100644 (file)
  *
 */
 
-#ifndef _NAND_EMIF25_LOC_H
-#define _NAND_EMIF25_LOC_H
+#ifndef _NORBOOT_H
+#define _NORBOOT_H
+
+/**
+ *  @file norboot.h
+ *
+ *  @brief
+ *             API for the nor boot mode
+ */
+
+#include "types.h"
+
 
-/* Register offsets */
-#define NAND_FLASH_CTL_REG  0x60
-#define NAND_FLASH_ECC_REG(x)       (0xc0 + (((x)-2)*4))
 
+void iblNorBoot (int32 eIdx);
 
-#endif /* _NAND_EMIF25_LOCK_H */
+#endif /* _NORBOOT_H */