Merge branch 'tmp-mike2' of gtgit01.gt.design.ti.com:git/teams/mmi/ibl into tmp-mike2
authorMike Line <m-line1@ti.com>
Thu, 18 Nov 2010 22:51:28 +0000 (17:51 -0500)
committerMike Line <m-line1@ti.com>
Thu, 18 Nov 2010 22:51:28 +0000 (17:51 -0500)
100 files changed:
src/cfg/c6455/iblcfg.h
src/cfg/c6472/iblcfg.h
src/cfg/c6474/iblcfg.h
src/device/c6455/c6455.c
src/device/c6455/c6455init.c [new file with mode: 0644]
src/device/c6472/c6472.c
src/device/c6472/c6472init.c [new file with mode: 0644]
src/device/c6474/c6474.c
src/device/c6474/c6474init.c [new file with mode: 0644]
src/device/c64x/make/makefile
src/device/device.h
src/driver/c64x/make/makefile
src/driver/eth/arp.c
src/driver/eth/arp.pretimer.c
src/driver/eth/arp.timer.c [deleted file]
src/driver/eth/bootp.c
src/driver/eth/icmp.c
src/driver/eth/ip.c
src/driver/eth/net.c
src/driver/eth/net_orig.c [deleted file]
src/driver/eth/net_osal.h [new file with mode: 0644]
src/driver/eth/tftp.c
src/driver/eth/udp.c
src/driver/nand/nand.c
src/driver/stream/stream.c
src/driver/stream/stream_osal.h [new file with mode: 0644]
src/driver/timer/timer.c
src/driver/timer/timer_osal.h [new file with mode: 0644]
src/ecc/c64x/make/makefile
src/ethboot/c64x/make/makefile
src/ethboot/ethboot.c
src/hw/c64x/make/makefile
src/hw/macs/cpmac/cpmacdrv.c
src/hw/macs/cpmac/cpmacdrv.orig.c [deleted file]
src/hw/plls/pllapi.h
src/hw/plls/pllxx1p8/pll.c
src/ibl.h
src/iblloc.h
src/interp/btbl/btblloc.h
src/interp/btbl/btblpr.c
src/interp/btbl/btblwrap.c
src/interp/btbl/btblwrap.h
src/interp/c64x/make/makefile
src/interp/coff/cload.mike.c [deleted file]
src/interp/coff/osal.h
src/interp/elf/ArrayList.c
src/interp/elf/dlw_client.c
src/interp/elf/file_ovr.h
src/main/c64x/make/makefile
src/main/iblStage.h [new file with mode: 0644]
src/main/iblinit.c [new file with mode: 0644]
src/main/iblmain.c
src/make/Makefile
src/make/c64x/makedefs.mk
src/make/ibl_c6455/i2crom.map.pre [new file with mode: 0644]
src/make/ibl_c6455/ibl.cmd
src/make/ibl_c6455/ibl_common.inc [new file with mode: 0644]
src/make/ibl_c6455/ibl_init.cmd [new file with mode: 0644]
src/make/ibl_c6455/ibl_init.rmd [new file with mode: 0644]
src/make/ibl_c6455/ibl_init_image.rmd [new file with mode: 0644]
src/make/ibl_c6455/ibl_init_objs_template.inc [new file with mode: 0644]
src/make/ibl_c6455/ibl_objs_template.inc [new file with mode: 0644]
src/make/ibl_c6472/i2crom.map.pre [new file with mode: 0644]
src/make/ibl_c6472/ibl.cmd
src/make/ibl_c6472/ibl_common.inc [new file with mode: 0644]
src/make/ibl_c6472/ibl_init.cmd [new file with mode: 0644]
src/make/ibl_c6472/ibl_init.rmd [new file with mode: 0644]
src/make/ibl_c6472/ibl_init_image.rmd [new file with mode: 0644]
src/make/ibl_c6472/ibl_init_objs_template.inc [new file with mode: 0644]
src/make/ibl_c6472/ibl_objs_template.inc [new file with mode: 0644]
src/make/ibl_c6474/i2crom.map.pre [new file with mode: 0644]
src/make/ibl_c6474/ibl.cmd
src/make/ibl_c6474/ibl_common.inc [new file with mode: 0644]
src/make/ibl_c6474/ibl_init.cmd [new file with mode: 0644]
src/make/ibl_c6474/ibl_init.rmd [new file with mode: 0644]
src/make/ibl_c6474/ibl_init_image.rmd [new file with mode: 0644]
src/make/ibl_c6474/ibl_init_objs_template.inc [new file with mode: 0644]
src/make/ibl_c6474/ibl_objs_template.inc [new file with mode: 0644]
src/make/makestg1 [new file with mode: 0644]
src/make/makestg2
src/mkdeppath.bat [deleted file]
src/nandboot/c64x/make/makefile
src/util/i2cConfig/Makefile
src/util/i2cConfig/i2cConfig.gel
src/util/i2cConfig/i2cparam.c
src/util/i2cConfig/i2cparam.cmd
src/util/i2cConfig/makestg2
src/util/i2cRead/i2cRead.cmd
src/util/i2cRead/makestg2
src/util/i2cWrite/i2cWrite.c
src/util/i2cWrite/i2cWrite.cmd
src/util/i2cWrite/makestg2
src/util/romparse/Makefile
src/util/romparse/romparse.c
src/util/romparse/romparse.h
src/util/romparse/rparse.flex
src/util/romparse/rparse.tab.c
src/util/romparse/rparse.tab.h
src/util/romparse/rparse.y
src/util/symExtract/symExtract [new file with mode: 0644]

index e18706da9960aa768e7803d08eab08f658b02cec..f74df83009e42ad0d3b8910485296e45586ff864 100644 (file)
 #define IBL_I2C_OWN_ADDR                10
 #define IBL_I2C_CFG_ADDR_DELAY          0x100       /* Delay between sending the address and reading data */
 
-#ifndef IBL_I2C_CFG_EEPROM_BUS_ADDR
- #define IBL_I2C_CFG_EEPROM_BUS_ADDR    0x50
+/**
+ *  @brief The default location for the i2c map information can be overridden during make
+ */
+#ifndef IBL_I2C_MAP_TABLE_DATA_BUS_ADDR
+ #define IBL_I2C_MAP_TABLE_DATA_BUS_ADDR 0x50
 #endif
 
-#define IBL_I2C_CFG_TABLE_DATA_ADDR     (0x10000 - 0x300)
-
 
+#ifndef IBL_I2C_MAP_TABLE_DATA_ADDR
+ #define IBL_I2C_MAP_TABLE_DATA_ADDR     0x400
+#endif
 
 
 
index 6fd37b40d152856f15339fa7a85d4040c98bed39..26f69d85b8ac6ed2879448236e6cb03277f545cd 100644 (file)
 #define BOOTCONFIG_NO_BTBL_IO
 
 /**
- * @brief The I2C bus address and data address of the ibl table.
+ * @brief Estimates of operating parameters. Actual values will be known once they are
+ *        read from the i2c.
  */
 #define IBL_I2C_DEV_FREQ_MHZ            625
 #define IBL_I2C_CLK_FREQ_KHZ            100
 #define IBL_I2C_OWN_ADDR                10
 #define IBL_I2C_CFG_ADDR_DELAY          0x100       /* Delay between sending the address and reading data */
 
-#ifndef IBL_I2C_CFG_EEPROM_BUS_ADDR
- #define IBL_I2C_CFG_EEPROM_BUS_ADDR    0x50
+
+/**
+ *  @brief The default location for the i2c map information can be overridden during make
+ */
+#ifndef IBL_I2C_MAP_TABLE_DATA_BUS_ADDR
+ #define IBL_I2C_MAP_TABLE_DATA_BUS_ADDR 0x50
 #endif
 
-#define IBL_I2C_CFG_TABLE_DATA_ADDR     (0x10000 - 0x300)
+
+#ifndef IBL_I2C_MAP_TABLE_DATA_ADDR
+ #define IBL_I2C_MAP_TABLE_DATA_ADDR     0x420
+#endif
  
 
 
index d75946a05523d95dfbff7aa1597883d6e911a0ec..2a9a6dcb34ad19e6cd60dd0b21b8dfd77825d55c 100644 (file)
 #define IBL_I2C_OWN_ADDR                10
 #define IBL_I2C_CFG_ADDR_DELAY          0x100       /* Delay between sending the address and reading data */
 
-#ifndef IBL_I2C_CFG_EEPROM_BUS_ADDR
- #define IBL_I2C_CFG_EEPROM_BUS_ADDR    0x50
+/**
+ *  @brief The default location for the i2c map information can be overridden during make
+ */
+#ifndef IBL_I2C_MAP_TABLE_DATA_BUS_ADDR
+ #define IBL_I2C_MAP_TABLE_DATA_BUS_ADDR 0x50
 #endif
 
-#define IBL_I2C_CFG_TABLE_DATA_ADDR     (0x8000 - 0x300)
+
+#ifndef IBL_I2C_MAP_TABLE_DATA_ADDR
+ #define IBL_I2C_MAP_TABLE_DATA_ADDR     0x100
+#endif
  
  
 
-/**
- * @brief No NAND support. Define the function call to be a void statement
- */
-#define iblNandBoot()
-
-/**
- * @brief No Elf support
- */
-#define iblIsElf(x)         FALSE
-#define iblBootElf(x,y)     for (;;);
-
 
 #endif
 
index a5c631daf35bce55bae2891da11b83ab4bd6d521..02dd69159e86d70d10b426cd55b654a35b9774b4 100644 (file)
@@ -57,26 +57,6 @@ Uint32 deviceLocalAddrToGlobal (Uint32 addr)
 }
 
 
-/**
- * @brief Configure the PLLs
- *
- * @details
- *   Only the main PLL is enabled. The second pll is used for
- *   emac and DDR, with a fixed multiplier, and is enabled
- *   at power up. The divider is configurable, but not done here.
- */
-void devicePllConfig (void)
-{
-    if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)
-        hwPllSetPll (MAIN_PLL, 
-                     ibl.pllConfig[ibl_MAIN_PLL].prediv,
-                     ibl.pllConfig[ibl_MAIN_PLL].mult,
-                     ibl.pllConfig[ibl_MAIN_PLL].postdiv);
-
-}
-
-
-
 /**
  * @brief
  *   Enable the DDR
@@ -171,10 +151,12 @@ int32 devicePowerPeriph (int32 modNum)
  *
  *  @details  
  */
+#ifndef EXCLUDE_NAND
 int32 deviceConfigureForNand(void)
 {
     return (0);
 }
+#endif
 
 /**
  *  @brief
diff --git a/src/device/c6455/c6455init.c b/src/device/c6455/c6455init.c
new file mode 100644 (file)
index 0000000..614df20
--- /dev/null
@@ -0,0 +1,57 @@
+/************************************************************************************
+ * FILE PURPOSE: C6455 Device Specific functions used in the 1st load stage
+ ************************************************************************************
+ * FILE NAME: c6455init.c
+ *
+ * DESCRIPTION: Implements the device specific functions for the IBL
+ *
+ * @file c6455.c
+ *
+ * @brief
+ *  This file implements the device specific functions for the IBL
+ *
+ ************************************************************************************/
+#include "ibl.h"
+#include "device.h"
+#include "pllapi.h"
+#include "emif31api.h"
+
+
+/**
+ * @brief Configure the PLLs
+ *
+ * @details
+ *   Only the main PLL is enabled. The second pll is used for
+ *   emac and DDR, with a fixed multiplier, and is enabled
+ *   at power up. The divider is configurable, but not done here.
+ */
+void devicePllConfig (void)
+{
+    if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)
+        hwPllSetPll (MAIN_PLL, 
+                     ibl.pllConfig[ibl_MAIN_PLL].prediv,
+                     ibl.pllConfig[ibl_MAIN_PLL].mult,
+                     ibl.pllConfig[ibl_MAIN_PLL].postdiv);
+
+}
+
+
+
+/**
+ * @brief
+ *  Return the endian status of the device
+ *
+ * @details
+ *  Returns true if the device is executing in little endian mode
+ */
+extern cregister volatile unsigned int CSR;
+
+bool deviceIsLittleEndian (void)
+{
+    if ((CSR & (1 << 8)) == 0)    
+        return (FALSE);
+
+    return (TRUE);
+
+}
+
index 2b44a7ea0baac239d29cc0f109a6c2c1714aedae..c5b17ff5a7d43d52c860ccd1de329e2204efbefe 100644 (file)
 extern cregister unsigned int DNUM;
 
 
-/**
- * @brief The default boot configuration table is filled in
- *
- * @details
- *   A default ibl configuraiton table is provided when one is not found
- *   preloaded.
- */
-void deviceLoadDefaultIblTable (void)
-{
-    uint32 macA, macB;
-
-#if 0  /* This is really the default. Switching to a direct tftp boot until I have a bootp server
-        * on a private lan for test */
-    ibl.ethConfig[0].ethPriority = ibl_LOWEST_PRIORITY;
-    ibl.ethConfig[0].port        = 0;
-    ibl.ethConfig[0].doBootp     = TRUE;
-    ibl.ethConfig[0].bootFormat  = ibl_BOOT_FORMAT_AUTO;
-
-    memset (&ibl.ethConfig[0].ethInfo, 0, sizeof(ibl.ethConfig[0].ethInfo));
-#endif
-
-    /* This is the temporary code */
-    ibl.ethConfig[0].ethPriority      = ibl_LOWEST_PRIORITY;
-    ibl.ethConfig[0].port             = 0;
-    ibl.ethConfig[0].doBootp          = FALSE;
-    ibl.ethConfig[0].useBootpServerIp = FALSE;
-    ibl.ethConfig[0].useBootpFileName = FALSE;
-    ibl.ethConfig[0].bootFormat       = ibl_BOOT_FORMAT_NAME;
-
-    memset (&ibl.ethConfig[0].ethInfo, 0, sizeof(ibl.ethConfig[0].ethInfo));
-
-    ibl.ethConfig[0].ethInfo.ipAddr[0] = 10;
-    ibl.ethConfig[0].ethInfo.ipAddr[1] = 218;
-    ibl.ethConfig[0].ethInfo.ipAddr[2] = 109;
-    ibl.ethConfig[0].ethInfo.ipAddr[3] = 21;
-
-    ibl.ethConfig[0].ethInfo.serverIp[0] = 10;
-    ibl.ethConfig[0].ethInfo.serverIp[1] = 218;
-    ibl.ethConfig[0].ethInfo.serverIp[2] = 109;
-    ibl.ethConfig[0].ethInfo.serverIp[3] = 196;
-
-    ibl.ethConfig[0].ethInfo.gatewayIp[0] = 10;
-    ibl.ethConfig[0].ethInfo.gatewayIp[1] = 218;
-    ibl.ethConfig[0].ethInfo.gatewayIp[2] = 109;
-    ibl.ethConfig[0].ethInfo.gatewayIp[3] = 1;
-
-    /* Leave hw address as 0 */
-
-    strcpy (ibl.ethConfig[0].ethInfo.fileName, "test2_little.out");
-
-    ibl.ethConfig[0].blob.startAddress  = 0x00200000;       /* Base address of SL2 */
-    ibl.ethConfig[0].blob.sizeBytes     = 0x000c0000;       /* All of SL2 */
-    ibl.ethConfig[0].blob.branchAddress = 0x00200000;       /* Base of SL2 */
-
-
-
-    macA = *((uint32 *)0x2a80700);
-    macB = *((uint32 *)0x2a80704);
-
-    ibl.ethConfig[0].ethInfo.hwAddress[0] = (macA >> 24) & 0xff;
-    ibl.ethConfig[0].ethInfo.hwAddress[1] = (macA >> 16) & 0xff;
-    ibl.ethConfig[0].ethInfo.hwAddress[2] = (macA >>  8) & 0xff;
-    ibl.ethConfig[0].ethInfo.hwAddress[3] = (macA >>  0) & 0xff;
-    ibl.ethConfig[0].ethInfo.hwAddress[4] = (macB >> 24) & 0xff;
-    ibl.ethConfig[0].ethInfo.hwAddress[5] = (macB >> 16) & 0xff;
-
-
-    ibl.ethConfig[1].ethPriority = ibl_DEVICE_NOBOOT;
-
-
-    /* MDIO configuration */
-    ibl.mdioConfig.nMdioOps = 8;
-    ibl.mdioConfig.mdioClkDiv = 0x20;
-    ibl.mdioConfig.interDelay = 1400;   /* ~2ms at 700 MHz */
-
-    ibl.mdioConfig.mdio[0] =  (1 << 30) | (27 << 21) | (24 << 16) | 0x848b;
-    ibl.mdioConfig.mdio[1] =  (1 << 30) | (20 << 21) | (24 << 16) | 0x0ce0;
-    ibl.mdioConfig.mdio[2] =  (1 << 30) | (24 << 21) | (24 << 16) | 0x4101;
-    ibl.mdioConfig.mdio[3] =  (1 << 30) | ( 0 << 21) | (24 << 16) | 0x9140;
-
-    ibl.mdioConfig.mdio[4] =  (1 << 30) | (27 << 21) | (25 << 16) | 0x848b;
-    ibl.mdioConfig.mdio[5] =  (1 << 30) | (20 << 21) | (25 << 16) | 0x0ce0;
-    ibl.mdioConfig.mdio[6] =  (1 << 30) | (24 << 21) | (25 << 16) | 0x4101;
-    ibl.mdioConfig.mdio[7] =  (1 << 30) | ( 0 << 21) | (25 << 16) | 0x9140;
-
-
-    /* Main Pll configuration */
-    ibl.pllConfig[ibl_MAIN_PLL].doEnable = TRUE;
-    ibl.pllConfig[ibl_MAIN_PLL].prediv   = 1;
-    ibl.pllConfig[ibl_MAIN_PLL].mult     = 28;
-    ibl.pllConfig[ibl_MAIN_PLL].postdiv  = 1;
-
-    ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz = 500;
-
-    /* The DDR PLL. The multipliers/dividers are fixed, so are really dont cares */
-    ibl.pllConfig[ibl_DDR_PLL].doEnable = TRUE;
-
-    /* The network PLL. The multipliers/dividers are fixed */
-    ibl.pllConfig[ibl_NET_PLL].doEnable = TRUE;
-
-    /* EMIF configuration */
-    ibl.ddrConfig.uEmif.emif3p1.sdcfg  = 0x00538832; /* timing, 32bit wide */
-    ibl.ddrConfig.uEmif.emif3p1.sdrfc  = 0x0000073B; /* Refresh 533Mhz */ 
-    ibl.ddrConfig.uEmif.emif3p1.sdtim1 = 0x47245BD2; /* Timing 1 */
-    ibl.ddrConfig.uEmif.emif3p1.sdtim2 = 0x0125DC44; /* Timing 2 */
-    ibl.ddrConfig.uEmif.emif3p1.dmcctl = 0x50001906; /* PHY read latency for CAS 5 is 5 + 2 - 1 */
-
-
-    /* NAND configuration for the MT29F1G08 flash */
-    ibl.nandConfig.nandPriority = ibl_HIGHEST_PRIORITY;
-    ibl.nandConfig.bootFormat   = ibl_BOOT_FORMAT_COFF;
-
-    ibl.nandConfig.nandInfo.busWidthBits  = 8;
-    ibl.nandConfig.nandInfo.pageSizeBytes = 2048;
-    ibl.nandConfig.nandInfo.pageEccBytes  = 64;
-    ibl.nandConfig.nandInfo.pagesPerBlock = 64;
-    ibl.nandConfig.nandInfo.totalBlocks   = 1024;
-
-    ibl.nandConfig.nandInfo.addressBytes  = 4;
-    ibl.nandConfig.nandInfo.lsbFirst      = TRUE;
-    ibl.nandConfig.nandInfo.blockOffset   = 22;
-    ibl.nandConfig.nandInfo.pageOffset    = 16;
-    ibl.nandConfig.nandInfo.columnOffset  = 0;
-
-    ibl.nandConfig.nandInfo.resetCommand    = 0xff;
-    ibl.nandConfig.nandInfo.readCommandPre  = 0;
-    ibl.nandConfig.nandInfo.readCommandPost = 0x30;
-    ibl.nandConfig.nandInfo.postCommand     = TRUE;
-    
-
-}
-
 /**
  *  @brief Determine if an address is local
  *
@@ -197,30 +65,6 @@ Uint32 deviceLocalAddrToGlobal (Uint32 addr)
 }
         
         
-/**
- * @brief Configure the PLLs
- *
- * @details
- *   The three PLLs are enabled. Only the main PLL has the ability to configure
- *   the multiplier and dividers.
- */
-void devicePllConfig (void)
-{
-    if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)
-        hwPllSetPll (MAIN_PLL, 
-                     ibl.pllConfig[ibl_MAIN_PLL].prediv,
-                     ibl.pllConfig[ibl_MAIN_PLL].mult,
-                     ibl.pllConfig[ibl_MAIN_PLL].postdiv);
-
-    if (ibl.pllConfig[ibl_DDR_PLL].doEnable == TRUE)
-        hwPllEnable (DDR_PLL);
-
-    if (ibl.pllConfig[ibl_NET_PLL].doEnable == TRUE)
-        hwPllEnable (NET_PLL);
-
-
-}
-
 /**
  * @brief
  *   Enable the DDR
@@ -264,6 +108,7 @@ int32 devicePowerPeriph (int32 modNum)
  *  @details  On the evm the nand controller is enabled by setting 
  *            gpio 14 high
  */
+#ifndef EXCLUDE_NAND
 int32 deviceConfigureForNand(void)
 {
        hwGpioSetDirection(NAND_MODE_GPIO, GPIO_OUT);
@@ -271,6 +116,7 @@ int32 deviceConfigureForNand(void)
     return (0);
 
 }
+#endif
 
 
 /**
diff --git a/src/device/c6472/c6472init.c b/src/device/c6472/c6472init.c
new file mode 100644 (file)
index 0000000..d4317ff
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * @file c6472init.c
+ *
+ * @brief
+ *             c6472 functions used during the initial stage of the ibl load
+ *
+ */
+#include "ibl.h"
+#include "device.h"
+#include "pllapi.h"
+
+/**
+ * @brief Configure the PLLs
+ *
+ * @details
+ *   The three PLLs are enabled. Only the main PLL has the ability to configure
+ *   the multiplier and dividers.
+ */
+void devicePllConfig (void)
+{
+    if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)
+        hwPllSetPll (MAIN_PLL, 
+                     ibl.pllConfig[ibl_MAIN_PLL].prediv,
+                     ibl.pllConfig[ibl_MAIN_PLL].mult,
+                     ibl.pllConfig[ibl_MAIN_PLL].postdiv);
+
+    if (ibl.pllConfig[ibl_DDR_PLL].doEnable == TRUE)
+        hwPllEnable (DDR_PLL);
+
+    if (ibl.pllConfig[ibl_NET_PLL].doEnable == TRUE)
+        hwPllEnable (NET_PLL);
+
+
+}
+
+
+/**
+ * @brief
+ *  Return the endian status of the device
+ *
+ * @details
+ *  Returns true if the device is executing in little endian mode
+ */
+extern cregister volatile unsigned int CSR;
+
+bool deviceIsLittleEndian (void)
+{
+    if ((CSR & (1 << 8)) == 0)    
+        return (FALSE);
+
+    return (TRUE);
+
+}
+
+
+
index 9622bcd25df197d59c1febcbc48ad3b4bdd82f9c..dd3d7cadfcb1300ff921bd00259e25bff9649517 100644 (file)
@@ -65,24 +65,6 @@ Uint32 deviceLocalAddrToGlobal (Uint32 addr)
 }
         
         
-/**
- * @brief Configure the PLLs
- *
- * @details
- *   Only the main PLL can be configured here. The DDR pll is enabled by default,
- *   and the network PLL is enabled through serdes configuration.
- *   the multiplier and dividers.
- */
-void devicePllConfig (void)
-{
-    if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)
-        hwPllSetPll (MAIN_PLL, 
-                     ibl.pllConfig[ibl_MAIN_PLL].prediv,
-                     ibl.pllConfig[ibl_MAIN_PLL].mult,
-                     ibl.pllConfig[ibl_MAIN_PLL].postdiv);
-
-}
-
 /**
  * @brief
  *   Enable the DDR
@@ -126,7 +108,7 @@ int32 devicePowerPeriph (int32 modNum)
  *  @details  On the evm the nand controller is enabled by setting 
  *            gpio 14 high
  */
-#if 0
+#ifndef EXCLUDE_NAND
 int32 deviceConfigureForNand(void)
 {
        hwGpioSetDirection(NAND_MODE_GPIO, GPIO_OUT);
diff --git a/src/device/c6474/c6474init.c b/src/device/c6474/c6474init.c
new file mode 100644 (file)
index 0000000..d6451d7
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * @file c6474init.c
+ *
+ * @brief
+ *     c6474 functions used during the initial stage of the ibl load
+ */
+#include "ibl.h"
+#include "device.h"
+#include "pllapi.h"
+
+
+/**
+ * @brief Configure the PLLs
+ *
+ * @details
+ *   Only the main PLL can be configured here. The DDR pll is enabled by default,
+ *   and the network PLL is enabled through serdes configuration.
+ *   the multiplier and dividers.
+ */
+void devicePllConfig (void)
+{
+    if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)
+        hwPllSetPll (MAIN_PLL, 
+                     ibl.pllConfig[ibl_MAIN_PLL].prediv,
+                     ibl.pllConfig[ibl_MAIN_PLL].mult,
+                     ibl.pllConfig[ibl_MAIN_PLL].postdiv);
+
+}
+
+
+/**
+ * @brief
+ *  Return the endian status of the device
+ *
+ * @details
+ *  Returns true if the device is executing in little endian mode
+ */
+extern cregister volatile unsigned int CSR;
+
+bool deviceIsLittleEndian (void)
+{
+    if ((CSR & (1 << 8)) == 0)    
+        return (FALSE);
+
+    return (TRUE);
+
+}
index 8ce720cbe8b501eb8205c9d5b4164828761e467c..074e27a38267d2642b14c2c50a306700e7aa0901 100644 (file)
@@ -15,13 +15,13 @@ ECODIR= $(IBL_ROOT)/device
 
 # For no target set CSRC to all sources for clean
 ifeq ($(TARGET),c6472)
- CSRC= c6472.c
+ CSRC= c6472.c c6472init.c
 else 
  ifeq ($(TARGET),c6455)
-  CSRC= c6455.c
+  CSRC= c6455.c c6455init.c
  else
   ifeq ($(TARGET),c6474)
-   CSRC= c6474.c
+   CSRC= c6474.c c6474init.c
   else
    ifeq ($(TARGET),c6474l)
     CSRC= c6474l.c
@@ -64,7 +64,7 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @echo $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
 
index 89a5d78e8167cc2286afcdf755e1a3bff71b96b9..0d54a011812a3f1016185fdbdbb0aa6af45312bf 100644 (file)
@@ -102,6 +102,14 @@ void deviceLoadDefaultEthAddress (uint8 *maddr);
 void deviceSetEthResetState (int32 portNum, BOOL applyReset);
 #endif
  
+ /**
+  *  @brief
+  *     Return the endian status
+  *
+  *  @details
+  *     Returns true if the device is executing in little endian mode
+  */
+bool deviceIsLittleEndian(void);
 
 #endif
 
index 2200916e29056e668ef393b6ef56c46658c8e0c0..368cfc55e0d36d9c28f4953c866643b53ea97faa 100644 (file)
@@ -31,8 +31,6 @@ NANDSRC= nand.c
 CSRC= $(ETHSRC) $(STRMSRC) $(TIMSRC) $(NANDSRC)
 
 
-CDEFS += -DIBL_I2C_CFG_EEPROM_BUS_ADDR=$(I2C_PARAM_BUS_ADDR)
-
 .PHONY: driver
 
 
@@ -61,7 +59,7 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @echo $(TARGET) $(CDEFS) $(DEBUG) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
 
index e299440de17e11c10c7cc0680085b45c159395b5..06a5b430613b2e3bfc4952969a7051388c96d1f6 100644 (file)
@@ -15,7 +15,7 @@
 #include "net.h"
 #include "netif.h"
 #include <string.h>
-
+#include "net_osal.h"
 
 /**********************************************************************
  *************************** LOCAL Structures *************************
@@ -138,12 +138,12 @@ void arp_resolve (IPN dst_ip, IPHDR* ptr_iphdr, Uint16 l3_pkt_size)
 
     /* Initialize the ARP Cache: The cache did not have information for the resolution to work
      * Reset the cache and start again.  */
-    memset ((void *)&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
+    netMemset ((void *)&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
 
     /* Populate the ARP Cache */
     net_arp_cache.ip_address         = dst_ip;    
     net_arp_cache.pending_packet_len = l3_pkt_size;
-    memcpy ((void *)&net_arp_cache.pending_packet[0], (void *)ptr_iphdr, l3_pkt_size);
+    netMemcpy ((void *)&net_arp_cache.pending_packet[0], (void *)ptr_iphdr, l3_pkt_size);
 
     /* Free up the packet now; we have already stored it in the ARP cache. */
     net_free_tx_packet ((Uint8 *)ptr_iphdr);
@@ -161,12 +161,12 @@ void arp_resolve (IPN dst_ip, IPHDR* ptr_iphdr, Uint16 l3_pkt_size)
     ptr_arphdr->Op           = htons(0x1);
 
     /* Populate the Source IP/MAC Address */
-    memcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
-    memcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
+    netMemcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
+    netMemcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
 
     /* Populate the Target IP/MAC Address: This is set to 0 since the cache has been reset above. */
-    memcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
-    memcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&dst_ip, 4);
+    netMemcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
+    netMemcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&dst_ip, 4);
 
     /* Create the Ethernet header. */
     ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_arphdr, &BroadcastMac[0], 0x806);
@@ -223,7 +223,7 @@ Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
 
     /* The ARP packet was meant for us; we need to update the ARP cache with the request. */
     net_arp_cache.ip_address = READ32(ptr_arphdr->IPSrc);
-    memcpy ((void *)&net_arp_cache.mac_address[0], (void *)&ptr_arphdr->SrcAddr[0], 6);
+    netMemcpy ((void *)&net_arp_cache.mac_address[0], (void *)&ptr_arphdr->SrcAddr[0], 6);
 
     /* Check if the packet is an ARP request? */
     if (ptr_arphdr->Op == htons(0x1))
@@ -243,12 +243,12 @@ Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
         ptr_arphdr->Op           = htons(0x2);
 
         /* Populate the Source IP/MAC Address in the ARP Header */
-        memcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
-        memcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
+        netMemcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
+        netMemcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
 
         /* Populate the Target IP/MAC Address in the ARP Header */
-        memcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
-        memcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&net_arp_cache.ip_address, 4);
+        netMemcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
+        netMemcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&net_arp_cache.ip_address, 4);
 
         /* Create the Ethernet header. */
         ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_arphdr, &net_arp_cache.mac_address[0], 0x806);
@@ -272,7 +272,7 @@ Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
             return -1;
 
         /* We now copy the contents of this packet from the ARP cache */
-        memcpy ((void *)ptr_pending_pkt, (void *)&net_arp_cache.pending_packet[0], 
+        netMemcpy ((void *)ptr_pending_pkt, (void *)&net_arp_cache.pending_packet[0], 
                     net_arp_cache.pending_packet_len);
 
         /* We create the Ethernet header. 
@@ -305,7 +305,7 @@ Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
  */
 void arp_init (void)
 {
-    memset (&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
+    netMemset (&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
     return;
 }
 
index e299440de17e11c10c7cc0680085b45c159395b5..f58a99f26978b1eaa1bd4cb5af01e126508be3fe 100644 (file)
@@ -138,12 +138,12 @@ void arp_resolve (IPN dst_ip, IPHDR* ptr_iphdr, Uint16 l3_pkt_size)
 
     /* Initialize the ARP Cache: The cache did not have information for the resolution to work
      * Reset the cache and start again.  */
-    memset ((void *)&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
+    netMemset ((void *)&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
 
     /* Populate the ARP Cache */
     net_arp_cache.ip_address         = dst_ip;    
     net_arp_cache.pending_packet_len = l3_pkt_size;
-    memcpy ((void *)&net_arp_cache.pending_packet[0], (void *)ptr_iphdr, l3_pkt_size);
+    netMemcpy ((void *)&net_arp_cache.pending_packet[0], (void *)ptr_iphdr, l3_pkt_size);
 
     /* Free up the packet now; we have already stored it in the ARP cache. */
     net_free_tx_packet ((Uint8 *)ptr_iphdr);
@@ -161,12 +161,12 @@ void arp_resolve (IPN dst_ip, IPHDR* ptr_iphdr, Uint16 l3_pkt_size)
     ptr_arphdr->Op           = htons(0x1);
 
     /* Populate the Source IP/MAC Address */
-    memcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
-    memcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
+    netMemcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
+    netMemcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
 
     /* Populate the Target IP/MAC Address: This is set to 0 since the cache has been reset above. */
-    memcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
-    memcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&dst_ip, 4);
+    netMemcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
+    netMemcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&dst_ip, 4);
 
     /* Create the Ethernet header. */
     ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_arphdr, &BroadcastMac[0], 0x806);
@@ -223,7 +223,7 @@ Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
 
     /* The ARP packet was meant for us; we need to update the ARP cache with the request. */
     net_arp_cache.ip_address = READ32(ptr_arphdr->IPSrc);
-    memcpy ((void *)&net_arp_cache.mac_address[0], (void *)&ptr_arphdr->SrcAddr[0], 6);
+    netMemcpy ((void *)&net_arp_cache.mac_address[0], (void *)&ptr_arphdr->SrcAddr[0], 6);
 
     /* Check if the packet is an ARP request? */
     if (ptr_arphdr->Op == htons(0x1))
@@ -243,12 +243,12 @@ Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
         ptr_arphdr->Op           = htons(0x2);
 
         /* Populate the Source IP/MAC Address in the ARP Header */
-        memcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
-        memcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
+        netMemcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
+        netMemcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
 
         /* Populate the Target IP/MAC Address in the ARP Header */
-        memcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
-        memcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&net_arp_cache.ip_address, 4);
+        netMemcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
+        netMemcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&net_arp_cache.ip_address, 4);
 
         /* Create the Ethernet header. */
         ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_arphdr, &net_arp_cache.mac_address[0], 0x806);
@@ -272,7 +272,7 @@ Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
             return -1;
 
         /* We now copy the contents of this packet from the ARP cache */
-        memcpy ((void *)ptr_pending_pkt, (void *)&net_arp_cache.pending_packet[0], 
+        netMemcpy ((void *)ptr_pending_pkt, (void *)&net_arp_cache.pending_packet[0], 
                     net_arp_cache.pending_packet_len);
 
         /* We create the Ethernet header. 
@@ -305,7 +305,7 @@ Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
  */
 void arp_init (void)
 {
-    memset (&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
+    netMemset (&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
     return;
 }
 
diff --git a/src/driver/eth/arp.timer.c b/src/driver/eth/arp.timer.c
deleted file mode 100644 (file)
index e8e3169..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-/** 
- *   @file  arp.c
- *
- *   @brief   
- *      The file implements the NET Module ARP functionality.
- *
- *  \par
- *  NOTE:
- *      (C) Copyright 2008, Texas Instruments, Inc.
- *
- *  \par
- */
-#include "types.h"
-#include "iblloc.h"
-#include "net.h"
-#include "netif.h"
-#include "timer.h"
-#include <string.h>
-
-
-/**********************************************************************
- *************************** LOCAL Structures *************************
- **********************************************************************/
-
-/**
- * @brief 
- *  The structure describes the ARP Cache 
- *
- * @details
- *  This describes the ARP Cache which keeps track of the IPv4 address and
- *  the corresponding Layer2 MAC Address. 
- */
-typedef struct NET_ARP_CACHE
-{
-    /**
-     * @brief   This is the MAC Address i.e. Layer2 address matching the
-     * corresponding IP Address.
-     */
-    Uint8       mac_address[6];
-
-    /**
-     * @brief   This is the IP Address stored in network order.
-     */
-    IPN         ip_address;
-
-    /**
-     * @brief   When the upper layers tries to send a packet and 
-     * the MAC Address is not resolved; packets are stored in this 
-     * temporary area. The ARP stack sends out an ARP request packet 
-     * and resolves the IP  address. Once the resolution is done pending 
-     * packets are transmitted. 
-     */
-    Uint8      pending_packet[NET_MAX_MTU];
-
-    /**
-     * @brief   This is the length of the pending packet. A value of 0
-     * indicates that there is no pending packet in the ARP cache.
-     */    
-    Uint16     pending_packet_len;
-
-    /**
-     * @brief   The timer used to handle arp request timeouts
-     */
-    Int32      timer;
-
-    /**
-     * @brief   The number of times an arp request was resent
-     */
-    Uint32     resend_count;
-
-}NET_ARP_CACHE;
-
-/**********************************************************************
- *************************** GLOBAL Variables *************************
- **********************************************************************/
-
-/**
- * @brief   This is the ARP cache; which keeps track of the IP Address to
- * MAC Address mapping.
- */
-NET_ARP_CACHE      net_arp_cache;
-
-/**********************************************************************
- **************************** ARP Functions ***************************
- **********************************************************************/
-
-void arp_send (void)
-{
-    ARPHDR* ptr_arphdr;
-    ETHHDR* ptr_ethhdr;
-    Uint8   BroadcastMac[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
-
-    /* If the address has been resolved then the arp reply was received, despite the timeout */
-    if ( (net_arp_cache.mac_address[0] != 0x00) || (net_arp_cache.mac_address[1] != 0x00) ||
-         (net_arp_cache.mac_address[2] != 0x00) || (net_arp_cache.mac_address[3] != 0x00) || 
-         (net_arp_cache.mac_address[4] != 0x00) || (net_arp_cache.mac_address[5] != 0x00) )
-        return;
-
-    /* Allocate a new packet to send out the ARP request. */
-    ptr_arphdr = (ARPHDR *)net_alloc_tx_packet(sizeof(ARPHDR));
-    if (ptr_arphdr == NULL)
-        return;
-
-    /* Populate the ARP Header. */
-    ptr_arphdr->HardType     = htons(0x1);
-    ptr_arphdr->ProtocolType = htons(0x800);
-    ptr_arphdr->HardSize     = 0x6;
-    ptr_arphdr->ProtocolSize = 0x4;
-    ptr_arphdr->Op           = htons(0x1);
-
-    /* Populate the Source IP/MAC Address */
-    memcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
-    memcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
-
-    /* Populate the Target IP/MAC Address: This is likely set to 0 since the cache has been reset on the first send. */
-    memcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
-    memcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&net_arp_cache.ip_address, 4);
-
-    /* Create the Ethernet header. */
-    ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_arphdr, &BroadcastMac[0], 0x806);
-    if (ptr_ethhdr == NULL)
-        return;
-
-    /* Send the packet out. */
-    net_send_packet (ptr_ethhdr, sizeof(ETHHDR) + sizeof(ARPHDR));
-
-    /* The packet has been transmitted and we can clean it up now. */
-    net_free_tx_packet ((Uint8 *)ptr_arphdr);
-
-}
-
-void arp_timer_expiry (void)
-{
-    /* ARP request timeout. Resend */
-    arp_send();
-
-    net_arp_cache.resend_count += 1;
-}
-
-/**
- *  @b Description
- *  @n  
- *      This function is called by the IP Layer to resolve the layer3 
- *      address to a layer2 MAC address. The function checks the ARP cache
- *      for a match but if no entry exists then the functions sends out
- *      an ARP request and it places this packet into the pending queue.
- *
- *  @param[in]  dst_ip
- *      This is the destination IP address of the packet.
- *  @param[in]  ptr_iphdr
- *      This is the pointer to the IP header
- *  @param[in]  l3_pkt_size
- *      This is the size of the packet (including the IP Header)
- *
- *  @retval
- *      Not Applicable.
- */
-void arp_resolve (IPN dst_ip, IPHDR* ptr_iphdr, Uint16 l3_pkt_size)
-{
-    ETHHDR* ptr_ethhdr;
-    Uint8   BroadcastMac[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
-
-    /* Special Case: Are we sending the packet to 255.255.255.255? */
-    if (dst_ip == (IPN)0xFFFFFFFF)
-    {
-        /* YES. This implies that the destination MAC Address in the packet is the Broadcast address
-         * We dont need to lookup the cache. */
-        ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_iphdr, (void *)&BroadcastMac[0], 0x800);
-        if (ptr_ethhdr == NULL)
-            return;
-
-        /* We now have a completed Ethernet packet; send it across. */
-        net_send_packet (ptr_ethhdr, sizeof(ETHHDR) + l3_pkt_size);
-
-        /* The packet has been transmitted and we can clean it up now. */
-        net_free_tx_packet ((Uint8 *)ptr_iphdr);
-        return;            
-    }
-
-    /* Check if the destination IP Address matches the ARP cache */
-    if (net_arp_cache.ip_address == dst_ip)
-    {
-        /* Make sure the MAC Address in the CACHE has been resolved i.e. Non-Zero. */
-        if ( (net_arp_cache.mac_address[0] != 0x00) || (net_arp_cache.mac_address[1] != 0x00) ||
-             (net_arp_cache.mac_address[2] != 0x00) || (net_arp_cache.mac_address[3] != 0x00) || 
-             (net_arp_cache.mac_address[4] != 0x00) || (net_arp_cache.mac_address[5] != 0x00) )
-        {
-            /* Perfect; the MAC Address is already resolved. 
-             *  We can simply use the ARP CACHE MAC address to create the layer2 header. */
-            ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_iphdr, (void *)&net_arp_cache.mac_address[0], 0x800);
-            if (ptr_ethhdr == NULL)
-                return;
-
-            /* We now have a completed Ethernet packet; send it across. */
-            net_send_packet (ptr_ethhdr, sizeof(ETHHDR) + l3_pkt_size);
-
-            /* The packet has been transmitted and we can clean it up now. */
-            net_free_tx_packet ((Uint8 *)ptr_iphdr);
-            return;
-        }
-    }
-
-    /* Initialize the ARP Cache: The cache did not have information for the resolution to work
-     * Reset the cache and start again.  */
-    memset ((void *)&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
-
-    /* Populate the ARP Cache */
-    net_arp_cache.ip_address         = dst_ip;    
-    net_arp_cache.pending_packet_len = l3_pkt_size;
-    memcpy ((void *)&net_arp_cache.pending_packet[0], (void *)ptr_iphdr, l3_pkt_size);
-
-    /* Free up the packet now; we have already stored it in the ARP cache. */
-    net_free_tx_packet ((Uint8 *)ptr_iphdr);
-
-    net_arp_cache.timer = timer_add (ARP_TIMEOUT, arp_timer_expiry);
-
-    arp_send ();
-
-}
-
-/**
- *  @b Description
- *  @n  
- *       The function handles the reception and processing of ARP packets.
- *
- *  @param[in]  ptr_arphdr
- *      This is the pointer to the received ARP header.
- *  @param[in]  num_bytes
- *      This is the size of the ARP packet.
- *
- *  @retval
- *      Success -   0
- *  @retval
- *      Error   -   <0
- */
-Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes)
-{
-    Uint32  IPAddress;
-    Uint8*  ptr_pending_pkt;
-    ETHHDR* ptr_ethhdr;
-
-    /* Extract the intended target and convert it to host format. */
-    IPAddress = READ32(ptr_arphdr->IPDst);
-
-    /* Ensure that the packet has not been looped back and we received our own frame. */
-    if ((ptr_arphdr->SrcAddr[0] == netmcb.net_device.mac_address[0]) &&
-        (ptr_arphdr->SrcAddr[1] == netmcb.net_device.mac_address[1]) &&
-        (ptr_arphdr->SrcAddr[2] == netmcb.net_device.mac_address[2]) &&
-        (ptr_arphdr->SrcAddr[3] == netmcb.net_device.mac_address[3]) &&
-        (ptr_arphdr->SrcAddr[4] == netmcb.net_device.mac_address[4]) &&
-        (ptr_arphdr->SrcAddr[5] == netmcb.net_device.mac_address[5]))
-    {
-        /* We received our own frame; ignore this. */
-        return -1;
-    }
-
-    /* Check if the packet is meant for us? If it not meant for us we drop the packet. */
-    if (IPAddress != netmcb.net_device.ip_address)
-        return -1;
-
-    /* The ARP packet was meant for us; we need to update the ARP cache with the request. */
-    net_arp_cache.ip_address = READ32(ptr_arphdr->IPSrc);
-    memcpy ((void *)&net_arp_cache.mac_address[0], (void *)&ptr_arphdr->SrcAddr[0], 6);
-
-    /* Check if the packet is an ARP request? */
-    if (ptr_arphdr->Op == htons(0x1))
-    {
-        /* YES. We need to send out an ARP Reply; so create the packet. 
-         *  Ensure that the Layer3 headers are aligned on the 4 byte boundary 
-         *  and yet we have sufficient space for the Ethernet header. */
-        ptr_arphdr = (ARPHDR *)net_alloc_tx_packet(sizeof(ARPHDR));
-        if (ptr_arphdr == NULL)
-            return -1;
-
-        /* Populate the ARP Header. */
-        ptr_arphdr->HardType     = htons(0x1);
-        ptr_arphdr->ProtocolType = htons(0x800);
-        ptr_arphdr->HardSize     = 0x6;
-        ptr_arphdr->ProtocolSize = 0x4;
-        ptr_arphdr->Op           = htons(0x2);
-
-        /* Populate the Source IP/MAC Address in the ARP Header */
-        memcpy ((void *)&ptr_arphdr->SrcAddr[0], (void *)&netmcb.net_device.mac_address[0], 6);
-        memcpy ((void *)&ptr_arphdr->IPSrc[0], (void *)&netmcb.net_device.ip_address, 4);
-
-        /* Populate the Target IP/MAC Address in the ARP Header */
-        memcpy ((void *)&ptr_arphdr->DstAddr[0], (void *)&net_arp_cache.mac_address[0], 6);
-        memcpy ((void *)&ptr_arphdr->IPDst[0], (void *)&net_arp_cache.ip_address, 4);
-
-        /* Create the Ethernet header. */
-        ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_arphdr, &net_arp_cache.mac_address[0], 0x806);
-        if (ptr_ethhdr == NULL)
-            return -1;
-
-        /* Send the packet out. */
-        net_send_packet (ptr_ethhdr, sizeof(ETHHDR) + sizeof(ARPHDR));
-
-        /* The packet has been transmitted and we can clean it up now. */
-        net_free_tx_packet ((Uint8 *)ptr_arphdr);
-    }
-
-    /* Check if there are any packet awaiting resolution? */
-    if (net_arp_cache.pending_packet_len != 0)
-    {
-        /* There was a packet in the ARP cache which was awaiting resolution. 
-         * We need to send out the packet now. */
-        ptr_pending_pkt = net_alloc_tx_packet(net_arp_cache.pending_packet_len);
-        if (ptr_pending_pkt == NULL)
-            return -1;
-
-        /* We now copy the contents of this packet from the ARP cache */
-        memcpy ((void *)ptr_pending_pkt, (void *)&net_arp_cache.pending_packet[0], 
-                    net_arp_cache.pending_packet_len);
-
-        /* We create the Ethernet header. 
-         *  Only IPv4 packets await resolution. */
-        ptr_ethhdr = net_create_eth_header ((Uint8 *)ptr_pending_pkt, &net_arp_cache.mac_address[0], 0x800);
-        if (ptr_ethhdr == NULL)
-            return -1;
-
-        /* Send the packet out. */
-        net_send_packet (ptr_ethhdr, sizeof(ETHHDR) + net_arp_cache.pending_packet_len);
-
-        /* The pending packet in the cache has been sent out. */
-        net_arp_cache.pending_packet_len = 0;
-
-        /* The packet has been transmitted and can be cleaned up. */
-        net_free_tx_packet (ptr_pending_pkt);
-
-        timer_delete (net_arp_cache.timer);
-    }
-
-    /* ARP Packet has been successfully processed. */
-    return 0;
-}
-
-/**
- *  @b Description
- *  @n  
- *       The function initializes the ARP Module in the NET Boot module.
- *
- *  @retval
- *      Not Applicable
- */
-void arp_init (void)
-{
-    memset (&net_arp_cache, 0, sizeof(NET_ARP_CACHE));
-    return;
-}
-
-
-
index bce01327dddd39959b09dc0ad82661140c0fa79b..134c2eae7e3f25e81ec4ca97be9699c8d9b4f35a 100644 (file)
@@ -17,6 +17,7 @@
 #include "timer.h"
 #include "stream.h"
 #include <string.h>
+#include "net_osal.h"
 
 
 /**********************************************************************
@@ -98,7 +99,7 @@ static void bootp_tmr_expiry (void)
     ptr_bootphdr->htype     = BOOTP_HTYPE_ETHERNET;
     ptr_bootphdr->hlen      = 6;
     ptr_bootphdr->xid       = htonl(0x1);
-    memcpy ((void *)&ptr_bootphdr->chaddr, (void *)&netmcb.net_device.mac_address[0], 6);
+    netMemcpy ((void *)&ptr_bootphdr->chaddr, (void *)&netmcb.net_device.mac_address[0], 6);
 
     /* The packet has been populated; send it to the server. */
     udp_sock_send (bootpmcb.sock, (Uint8 *)ptr_bootphdr, sizeof(BOOTPHDR));
@@ -274,7 +275,7 @@ static Int32 bootp_receive (Int32 sock, Uint8* ptr_data, Int32 num_bytes)
     ip_add_route (FLG_RT_NETWORK, netmcb.net_device.ip_address, netmcb.net_device.net_mask, 0);
 
     if (netmcb.net_device.use_bootp_file_name == TRUE)
-        memcpy (netmcb.net_device.file_name, ptr_bootphdr->file, sizeof(netmcb.net_device.file_name));
+        netMemcpy (netmcb.net_device.file_name, ptr_bootphdr->file, sizeof(netmcb.net_device.file_name));
 
     /* Check if we had received a default router? */
     if (defaultRouter != 0)
@@ -319,7 +320,7 @@ void bootp_init (void (*asyncComplete)(void *))
     SOCKET      socket;
 
     /* Initialize the BOOT MCB */ 
-    memset ((void *)&bootpmcb, 0, sizeof(BOOTP_MCB));
+    netMemset ((void *)&bootpmcb, 0, sizeof(BOOTP_MCB));
 
     bootpmcb.asyncComplete = asyncComplete;
 
@@ -351,7 +352,7 @@ void bootp_init (void (*asyncComplete)(void *))
     ptr_bootphdr->htype     = BOOTP_HTYPE_ETHERNET;
     ptr_bootphdr->hlen      = 6;
     ptr_bootphdr->xid       = htonl(0x1);
-    memcpy ((void *)&ptr_bootphdr->chaddr, (void *)&netmcb.net_device.mac_address[0], 6);
+    netMemcpy ((void *)&ptr_bootphdr->chaddr, (void *)&netmcb.net_device.mac_address[0], 6);
 
     /* The packet has been populated; send it to the server. */
     udp_sock_send (bootpmcb.sock, (Uint8 *)ptr_bootphdr, sizeof(BOOTPHDR));
index f3144eca701c7cfb609ed225d1f3ebbc93a5a40d..07bc61954978a830b412f8c8bdc40dbc2f478411 100644 (file)
@@ -12,6 +12,7 @@
  */
 #include <blf.h>
 #include "netif.h"
+#include "net_osal.h"
 
 #ifdef INCLUDE_BLF_NET_MODULE
 #ifdef INCLUDE_BLF_NET_ICMP
@@ -106,7 +107,7 @@ void icmp_receive (IPHDR* ptr_iphdr)
         return;
 
     /* We can blindly copy the 'original' IP packet to the 'reply' IP packet. */
-    utl_memcpy ((void *)ptr_reply_iphdr, (void *)ptr_iphdr, (l4_pkt_size + IPHDR_SIZE));
+    netMemcpy ((void *)ptr_reply_iphdr, (void *)ptr_iphdr, (l4_pkt_size + IPHDR_SIZE));
 
     /* Get the pointer to the new header. 
      *  The new header starts after the IP header. */
index 86c2519ec1226c150b83e03874a54147d8b65dc4..27f0fe9d8d3e7b38dbd831b2178260485c088d75 100644 (file)
@@ -15,6 +15,7 @@
 #include "net.h"
 #include "netif.h"
 #include <string.h>
+#include "net_osal.h"
 
 
 /**
@@ -179,7 +180,7 @@ void ip_del_route (Uint32 flag)
     }
     
     /* Simply reset all the fields */
-    memset ((void *)ptr_rt, 0, sizeof(RT_ENTRY));
+    netMemset ((void *)ptr_rt, 0, sizeof(RT_ENTRY));
     return;
 }
 
@@ -386,7 +387,7 @@ void ip_send (IPHDR* ptr_iphdr, Uint16 size)
 void ip_init (void)
 {
     /* Reset the routing table */
-    memset (&rt_table, 0, sizeof(rt_table));
+    netMemset (&rt_table, 0, sizeof(rt_table));
     return;
 }
 
index 9215bac52afe56d6e6649109dadf8781f4c1142c..e120793ee33a94254a97326d82353354162bb5d6 100644 (file)
@@ -17,6 +17,7 @@
 #include "timer.h"
 #include "stream.h"
 #include <string.h>
+#include "net_osal.h"
 
 
 /**********************************************************************
@@ -120,7 +121,7 @@ Uint8* net_alloc_tx_packet(Int32 packet_len)
     netmcb.txuse = 1;
 
     /* Reset the contents of the packet */
-    memset ((void *)&netmcb.tx_packet[0], 0, sizeof(netmcb.tx_packet));
+    netMemset ((void *)&netmcb.tx_packet[0], 0, sizeof(netmcb.tx_packet));
 
     /* Reserve some space at the head of the packet for the Ethernet headers. */
     return &netmcb.tx_packet[16];
@@ -192,15 +193,15 @@ ETHHDR* net_create_eth_header (Uint8* ptr_l3_hdr, Uint8* dst_mac, Uint16 protoco
     /* Start adding the Ethernet header. 
      *  Move back the data pointer to account for the protocol. */
     ptr_l3_hdr = ptr_l3_hdr - 2;
-    memcpy ((void *)ptr_l3_hdr, (void *)&protocol, sizeof(Uint16));
+    netMemcpy ((void *)ptr_l3_hdr, (void *)&protocol, sizeof(Uint16));
 
     /* Move back the data pointer to account for the source MAC. */
     ptr_l3_hdr = ptr_l3_hdr - 6;
-    memcpy ((void *)ptr_l3_hdr, (void *)&netmcb.net_device.mac_address[0], 6);
+    netMemcpy ((void *)ptr_l3_hdr, (void *)&netmcb.net_device.mac_address[0], 6);
 
     /* Move back the data pointer to account for the destination MAC. */
     ptr_l3_hdr = ptr_l3_hdr - 6;
-    memcpy ((void *)ptr_l3_hdr, (void *)dst_mac, 6);
+    netMemcpy ((void *)ptr_l3_hdr, (void *)dst_mac, 6);
 
     /* Return the pointer to the start of the Ethernet header. */
     return (ETHHDR *)ptr_l3_hdr;
@@ -291,13 +292,13 @@ static Int32 net_open (void* ptr_driver, void (*asyncComplete)(void *))
     }
 
     /* Initialize the NET MCB. */
-    memset (&netmcb, 0, sizeof(NET_MCB));
+    netMemset (&netmcb, 0, sizeof(NET_MCB));
 
     /* Initialize the Network Statistics. */
-    memset (&net_stats, 0, sizeof(NET_STATS));
+    netMemset (&net_stats, 0, sizeof(NET_STATS));
 
     /* Copy the driver information into the NET MCB */
-    memcpy ((void *)&netmcb.net_device, (void *)ptr_net_driver, sizeof(NET_DRV_DEVICE));
+    netMemcpy ((void *)&netmcb.net_device, (void *)ptr_net_driver, sizeof(NET_DRV_DEVICE));
 
     /* Initialize the ARP Module. */
     arp_init ();
@@ -378,7 +379,7 @@ static void proc_packet (void)
     net_stats.num_pkt_rxed++;
 
     /* Extract the destination MAC Address from the received packet. */
-    memcpy ((void *)&dst_mac_address[0], (void *)ptr_data_packet, 6);
+    netMemcpy ((void *)&dst_mac_address[0], (void *)ptr_data_packet, 6);
 
     /* Extract the protocol from the received packet. This is at offset 12 from the 
      * start of the packet. We need to skip the destination and source mac address. */
diff --git a/src/driver/eth/net_orig.c b/src/driver/eth/net_orig.c
deleted file mode 100644 (file)
index 2efcbea..0000000
+++ /dev/null
@@ -1,471 +0,0 @@
-/** 
- *   @file  net.c
- *
- *   @brief   
- *      The file implements the NET Boot Module. 
- *
- *  \par
- *  NOTE:
- *      (C) Copyright 2008, Texas Instruments, Inc.
- *
- *  \par
- */
-#include "types.h"
-#include "iblloc.h"
-#include "net.h"
-#include "netif.h"
-#include "timer.h"
-#include "stream.h"
-#include <string.h>
-
-
-/**********************************************************************
- *************************** Local Functions **************************
- **********************************************************************/
-static Int32 net_open (void* ptr_net_driver);
-static Int32 net_close(void);
-static Int32 net_read (Uint8* ptr_buf, Uint32 num_bytes);
-
-/**********************************************************************
- *************************** GLOBAL Variables *************************
- **********************************************************************/
-
-/**
- * @brief   This is the NETWORK Master control block which keeps track
- * of all the Network boot module related information.
- */
-NET_MCB     netmcb;
-
-/**
- * @brief   This keeps track of the network statistics.
- */
-NET_STATS   net_stats;
-
-/**
- * @brief   This is the global Network Boot Module function table which
- * implements the Boot Module Interface with the kernel.
- */
-BOOT_MODULE_FXN_TABLE net_boot_module = 
-{
-    net_open,       /* Open  API                                      */
-    net_close,      /* Close API                                      */
-    net_read,       /* Read  API                                      */
-    NULL,           /* Write API (NULL: This is not interactive)      */
-    net_peek,       /* Peek  API (TBA)                                */
-};
-
-/**********************************************************************
- **************************** NET Functions ***************************
- **********************************************************************/
-
-/**
- *  @b Description
- *  @n
- *       The function is used to allocate a packet for transmission. This
- *       is called by the higher layer protocols when a packet needs to
- *       be transmitted. The function ensures there is sufficient space
- *       allocated at the beginning of the packet for the Ethernet header.
- *       Since the pointer returned by this API is used to store L3/L4 headers
- *       it always returns a 4 byte aligned buffer data pointer.
- *
- *  @param[in]  packet_len
- *      Length of the packet being transmitted.
- *
- *  @retval
- *      Success -   Pointer to the L3 header. 
- *  @retval
- *      Error   -   NULL
- */
-Uint8* net_alloc_tx_packet(Int32 packet_len)
-{
-    /* Sanity Check: Ensure the packet being allocated does not exceed the
-     * max buffer size that we have. */
-    if (packet_len > NET_MAX_MTU)
-        return NULL;
-
-    /* Sanity Check: Ensure that the packet is available for use. */
-    if (netmcb.txuse == 1)
-        return NULL;
-
-    /* Mark the packet as being in use. */
-    netmcb.txuse = 1;
-
-    /* Reset the contents of the packet */
-    memset ((void *)&netmcb.tx_packet[0], 0, sizeof(netmcb.tx_packet));
-
-    /* Reserve some space at the head of the packet for the Ethernet headers. */
-    return &netmcb.tx_packet[16];
-}
-
-/**
- *  @b Description
- *  @n
- *      The function is called to free up a previously allocated transmit
- *      packet. 
- *
- *  @param[in]  ptr 
- *      Pointer to the packet being cleaned.
- *
- *  @retval
- *      Not Applicable.
- */
-void net_free_tx_packet (Uint8* ptr)
-{
-    /* Sanity Checks: Ensure that the packet being cleaned is the same as the one 
-     * which was allocated. */
-    if (ptr != &netmcb.tx_packet[16])
-        mprintf ("ERROR: NET Free Transmit packet detected corruption\n");
-
-    /* Sanity Checks: Ensure that there is no double free. */
-    if (netmcb.txuse == 0)
-        mprintf ("ERROR: NET Free Transmit packet detected double free\n");
-
-    /* Mark the transmit packet as free and available. */
-    netmcb.txuse = 0;
-    return;
-}
-
-/**
- *  @b Description
- *  @n  
- *       The function is used to append an Ethernet header on the packet.
- *       The source MAC Address in the packet is always the one which was
- *       registered by the driver. Higher layer protocol authors need to 
- *       use the 'net_alloc_tx_packet' API to get a transmit buffer.
- *
- *  @param[in]  ptr_l3_hdr
- *      This is the pointer to the layer3 header.
- *  @param[in]  dst_mac
- *      The destination MAC address
- *  @param[in]  protocol
- *      The layer3 protocol version (passed in host order)
- *
- *  @retval
- *      Success -   Pointer to the start of the Ethernet header i.e. L2.
- *  @retval
- *      Error   -   NULL
- */
-ETHHDR* net_create_eth_header (Uint8* ptr_l3_hdr, Uint8* dst_mac, Uint16 protocol)
-{
-    Int32 rsvd_space;
-
-    /* Compute the reserved space. */
-    rsvd_space = (Int32)ptr_l3_hdr - (Int32)&netmcb.tx_packet[0];
-
-    /* Ensure there is sufficient space to add the header. We dont want memory corruption 
-     * to occur here. */
-    if ((rsvd_space < 0) || (rsvd_space > NET_MAX_MTU) || (rsvd_space < ETHHDR_SIZE))
-        return NULL;
-
-    /* Convert the protocol to network order. */
-    protocol = ntohs(protocol);
-
-    /* Start adding the Ethernet header. 
-     *  Move back the data pointer to account for the protocol. */
-    ptr_l3_hdr = ptr_l3_hdr - 2;
-    memcpy ((void *)ptr_l3_hdr, (void *)&protocol, sizeof(Uint16));
-
-    /* Move back the data pointer to account for the source MAC. */
-    ptr_l3_hdr = ptr_l3_hdr - 6;
-    memcpy ((void *)ptr_l3_hdr, (void *)&netmcb.net_device.mac_address[0], 6);
-
-    /* Move back the data pointer to account for the destination MAC. */
-    ptr_l3_hdr = ptr_l3_hdr - 6;
-    memcpy ((void *)ptr_l3_hdr, (void *)dst_mac, 6);
-
-    /* Return the pointer to the start of the Ethernet header. */
-    return (ETHHDR *)ptr_l3_hdr;
-}
-
-/**
- *  @b Description
- *  @n  
- *       The function is used to send a packet to the driver.
- *
- *  @param[in]  ptr_l2_hdr
- *      This is the pointer to the L2 header of the packet to be transmitted.
- *      All the headers need to be populated by the time comes to this API.
- *  @param[in]  length
- *      Length of the packet being transmitted. This include the L2 header
- *      information.
- *
- *  @retval
- *      Not Applicable.
- */
-void net_send_packet (ETHHDR* ptr_l2_hdr, Uint16 length)
-{
-    /* Sanity Check: This is called after the LAYER3 and ETHER headers 
-     * have been appended to the packet. Here we ensure that the layer3 header
-     * is aligned on the 4 byte boundary. */
-    if ( (((Uint32)ptr_l2_hdr+ETHHDR_SIZE) % 4) != 0)
-        mprintf ("ERROR: Misaligned Layer3 packet transmitted 0x%p.\n", ptr_l2_hdr);
-
-    /* Increment the stats. */
-    net_stats.num_pkt_txed++;
-
-    /* Pass the packet to the platform API for transmission. */
-    netmcb.net_device.send (&netmcb.net_device, (Uint8 *)ptr_l2_hdr, (Int32)length);
-    return;
-}
-
-/**
- *  @b Description
- *  @n  
- *       The function is called from any entity inside the NETWORK Boot Module
- *       to indicate that there has been a FATAL error and that the boot module
- *       processing needs to be aborted.
- *
- *  @retval
- *      Not Applicable.
- */
-void net_set_error (void)
-{
-    /* Set the Error Flag; */
-    netmcb.error_flag = 1;
-    return;
-}
-
-/**
- *  @b Description
- *  @n  
- *       The function opens the BLF NET Module. The function initializes
- *       the various internal components of the NET module and also
- *       initializes the peripheral driver controller 
- *
- *  @param[in]  ptr_driver
- *      This is the pointer to the driver block which was passed to 
- *      the BLF through the BOOT Mode descriptor. For the NET boot
- *      module this points to the NET_DRV_DEVICE object.
- *
- *  @retval
- *      Success -   0
- *  @retval
- *      Error   -   <0
- */
-static Int32 net_open (void* ptr_driver)
-{
-    NET_DRV_DEVICE* ptr_net_driver;
-
-    /* Get the pointer to the net driver. */
-    ptr_net_driver = (NET_DRV_DEVICE*)ptr_driver;
-
-    /* Basic Validation: Ensure there is a valid driver block being passed. */
-    if (ptr_net_driver == NULL)
-        return -1;
-
-    /* Basic Validation: Ensure that all the required API have been provided */
-    if ((ptr_net_driver->start == NULL)   || (ptr_net_driver->send == NULL) ||
-        (ptr_net_driver->receive == NULL) || (ptr_net_driver->stop == NULL))
-    {
-        /* Error: Required API was not specified. */
-        return -1;
-    }
-
-    /* Initialize the NET MCB. */
-    memset (&netmcb, 0, sizeof(NET_MCB));
-
-    /* Initialize the Network Statistics. */
-    memset (&net_stats, 0, sizeof(NET_STATS));
-
-    /* Copy the driver information into the NET MCB */
-    memcpy ((void *)&netmcb.net_device, (void *)ptr_net_driver, sizeof(NET_DRV_DEVICE));
-
-    /* Initialize the ARP Module. */
-    arp_init ();
-
-    /* Initialize the IP Module. */
-    ip_init ();
-
-    /* Initialize the UDP Module. */
-    udp_init ();
-
-    /* Start the networking device */
-    if (netmcb.net_device.start(&netmcb.net_device) < 0)
-        return -1;
-
-    /* Determine if we need to execute BOOTP or not? */
-    if (netmcb.net_device.ip_address != 0)
-    {
-        /* IP Address was supplied by the device team. There is no need 
-         * to execute the BOOTP protocol; manually create the network route also. */
-        ip_add_route (FLG_RT_NETWORK, netmcb.net_device.ip_address, netmcb.net_device.net_mask, 0);
-
-#ifdef INCLUDE_BLF_NET_TFTP
-        /* Lets download the file from the TFTP Server. */
-        tftp_get_file (netmcb.net_device.server_ip, netmcb.net_device.file_name);
-#endif /* INCLUDE_BLF_NET_TFTP */
-    }
-    else
-    {
-#ifdef INCLUDE_BLF_NET_BOOTP
-        /* No IP Address was supplied we need to execute the BOOTP protocol. */
-        bootp_init ();
-#endif
-    }
-   
-    /* The network module is UP and running.. */ 
-    return 0;
-}
-
-/**
- *  @b Description
- *  @n  
- *       The function closes the BLF NET Module.
- *
- *  @retval
- *      Success -   0
- *  @retval
- *      Error   -   <0
- */
-static Int32 net_close (void)
-{
-    return 0;
-}
-
-/**
- *  @b Description
- *  @n  
- *       The function reads data from the BLF net module.
- *
- *  @param[in]  ptr_buf
- *      This points to the data buffer which needs to be populated
- *      with the received data.
- *
- *  @param[in]  num_bytes
- *      This is the number of bytes of data which need to be read.
- *
- *  @retval
- *      Success -   0
- *  @retval
- *      Error   -   <0
- */
-static Int32 net_read (Uint8* ptr_buf, Uint32 num_bytes)
-{
-    Int32       packet_size;
-    Uint16      protocol;
-    Uint8       dst_mac_address[6];
-    Uint8*      ptr_data_packet;
-    Int32       num_bytes_read       = 0;
-    Int32       total_num_bytes_read = 0;
-
-    /* Basic Validations: Ensure that the parameters are valid. */
-    if ((ptr_buf == NULL) || (num_bytes == 0))
-        return -1;
-
-    /* Execute the network scheduler; till there is no error. */
-    while (netmcb.error_flag == 0) 
-    {
-        /* Call the timer scheduler. */
-        timer_run();
-
-        /* Check if there is data in the STREAM? */
-        if (stream_isempty() == FALSE)
-        {
-            /* STREAM indicates there is some data. Lets read it first. */
-            num_bytes_read = stream_read (((ptr_buf + total_num_bytes_read)), num_bytes);
-
-            /* Keep track of the total amount of data read till now. */
-            total_num_bytes_read = total_num_bytes_read + num_bytes_read;
-
-            /* How much more data do we need to read? */ 
-            num_bytes = num_bytes - num_bytes_read;
-
-            /* Check if we have read all the data that was requested? */
-            if (num_bytes == 0)
-                break;
-    
-            /* Control comes here implies that there was more data to be read into
-             * the buffer. We need it to have it available before we can exit the loop.
-             * So lets fall through! */
-        }
-        else
-        {
-            /* STREAM Module is empty. */
-        }
-
-        /* Initialize the pointer in the received packet is stored. 
-         *  This is misaligned on the 2 byte boundary as this will ensure that
-         *  the layer3 headers i.e. IPv4 and ARP are aligned correctly. */
-        ptr_data_packet = (Uint8 *)&netmcb.rx_packet[2];
-
-        /* Check if a packet has been received? */
-        packet_size = netmcb.net_device.receive(&netmcb.net_device, ptr_data_packet);
-        if (packet_size == 0)
-            continue;
-
-        /* Increment the number of packets received. */
-        net_stats.num_pkt_rxed++;
-
-        /* Extract the destination MAC Address from the received packet. */
-        memcpy ((void *)&dst_mac_address[0], (void *)ptr_data_packet, 6);
-
-        /* Extract the protocol from the received packet. This is at offset 12 from the 
-         * start of the packet. We need to skip the destination and source mac address. */
-        protocol = *((Uint16 *)(ptr_data_packet + 12));
-        protocol = ntohs(protocol);
-
-        /* Process the received data.
-         *  Check the destination mac address to determine if the packet is 
-         *  meant for us or not? We accept only directed UNICAST & BROADCAST
-         *  packets */
-        if(((dst_mac_address[0] != 0xFF) || (dst_mac_address[1] != 0xFF) || 
-            (dst_mac_address[2] != 0xFF) || (dst_mac_address[3] != 0xFF) || 
-            (dst_mac_address[4] != 0xFF) || (dst_mac_address[5] != 0xFF)) && 
-           ((dst_mac_address[0] != netmcb.net_device.mac_address[0]) ||
-            (dst_mac_address[1] != netmcb.net_device.mac_address[1]) ||
-            (dst_mac_address[2] != netmcb.net_device.mac_address[2]) ||
-            (dst_mac_address[3] != netmcb.net_device.mac_address[3]) ||
-            (dst_mac_address[4] != netmcb.net_device.mac_address[4]) ||
-            (dst_mac_address[5] != netmcb.net_device.mac_address[5])))
-        {
-            /* Packet is not meant for us; ignore this packet. */
-            net_stats.rx_l2_dropped++;
-            continue;
-        }
-
-        /* Move the pointer to the data packet and skip the ethernet header. */
-        ptr_data_packet = ptr_data_packet + sizeof(ETHHDR);
-
-        /* Deduct the Ethernet header size from the total number of bytes received. */
-        packet_size = packet_size - sizeof(ETHHDR);
-
-        /* Sanity Check: We need to ensure that the Layer3 headers are aligned on the
-         * 4 byte boundary at this stage. */
-        if (((Uint32)ptr_data_packet % 4) != 0)
-            mprintf ("ERROR: Misaligned Layer3 packet received 0x%p.\n", ptr_data_packet);
-
-        /* Demux on the protocol basis and pass it to the upper layer. */
-        switch (protocol)
-        {
-            case ETH_IP:
-            {
-                /* IPv4 Packet. */
-                if (ip_receive ((IPHDR *)ptr_data_packet, packet_size) < 0)
-                    net_stats.rx_ip_dropped++;
-                break;
-            }
-            case ETH_ARP:
-            {
-                /* ARP Packet. */
-                if (arp_receive ((ARPHDR *)ptr_data_packet, packet_size) < 0)
-                    net_stats.rx_arp_dropped++;
-                break;
-            }
-            default:
-            {
-                /* Unexpected packet. Drop the packet! */
-                net_stats.rx_l2_dropped++;
-                break;
-            }
-        }
-    }
-
-    /* Did we come out because of error or not? */
-    if (netmcb.error_flag == 0)
-        return 0;
-
-    /* Return error */
-    return -1;
-}
-
-
diff --git a/src/driver/eth/net_osal.h b/src/driver/eth/net_osal.h
new file mode 100644 (file)
index 0000000..21233f4
--- /dev/null
@@ -0,0 +1,11 @@
+/**
+ *  @file net_osal.h
+ *
+ *  @brief
+ *             operating system abstraction layer definitions specific for the c64x ibl
+ */
+#include "iblloc.h"
+
+#define netMemset iblMemset
+#define netMemcpy iblMemcpy
index 2d7c526e4b78f2018b955e82e9914c43c6dbcd45..42e5d12c05c99a249dda3d36191a90f15918a8c5 100644 (file)
@@ -17,6 +17,7 @@
 #include "timer.h"
 #include "stream.h"
 #include <string.h>
+#include "net_osal.h"
 
 
 /**********************************************************************
@@ -195,7 +196,7 @@ static void tftp_send_ack(void)
     TFTPHDR* ptr_tftphdr;
 
     /* Initialize the data buffer. */ 
-    memset ((void *)&tftpmcb.buffer[0], 0, TFTP_DATA_SIZE + TFTPHEADER_SIZE);
+    netMemset ((void *)&tftpmcb.buffer[0], 0, TFTP_DATA_SIZE + TFTPHEADER_SIZE);
 
     /* Create an ACK packet which is to be sent out. Get the pointer to the
      * TFTP Header. */
@@ -453,7 +454,7 @@ Int32 tftp_get_file (IPN server_ip, Int8* filename)
     }
 
     /* Initialize the TFTP MCB at this stage... */
-    memset ((void *)&tftpmcb, 0, sizeof(TFTP_MCB));
+    netMemset ((void *)&tftpmcb, 0, sizeof(TFTP_MCB));
 
     /* Populate the socket structure and register this with the UDP module. */
     socket.local_port       = 1234;
index 7283d2c57e5dd3ce6bc1aa4d6c3493412e5371d0..c5d32a56eec87757c8f20f44d07b6305d99bc662 100644 (file)
@@ -16,6 +16,7 @@
 #include "netif.h"
 #include "iblcfg.h"
 #include <string.h>
+#include "net_osal.h"
 
 
 /**********************************************************************
@@ -190,7 +191,7 @@ Int32 udp_sock_open (SOCKET* ptr_socket)
         if (udp_socket[index].local_port == 0)
         {
             /* Got a free slot. Copy the socket data over and return the index as the handle. */
-            memcpy ((void *)&udp_socket[index], (void *)ptr_socket, sizeof(SOCKET));
+            netMemcpy ((void *)&udp_socket[index], (void *)ptr_socket, sizeof(SOCKET));
             return index;
         }
     }
@@ -245,7 +246,7 @@ Int32 udp_sock_send (Int32 sock, Uint8* ptr_app_data, Int32 num_bytes)
     /*******************************************************************************
      ********************************* APP Data ************************************
      *******************************************************************************/
-    memcpy ((void *)ptr_data, (void *)ptr_app_data, num_bytes);
+    netMemcpy ((void *)ptr_data, (void *)ptr_app_data, num_bytes);
 
     /*******************************************************************************
      ********************************* UDP Header **********************************
@@ -299,7 +300,7 @@ void udp_sock_close (Int32 sock)
     ptr_socket = &udp_socket[sock];
 
     /* Reset the memory block */
-    memset ((void *)ptr_socket, 0, sizeof(SOCKET));
+    netMemset ((void *)ptr_socket, 0, sizeof(SOCKET));
     return;
 }
 
@@ -314,7 +315,7 @@ void udp_sock_close (Int32 sock)
 void udp_init (void)
 {
     /* Initialize the socket table */
-    memset (&udp_socket, 0, sizeof(udp_socket));
+    netMemset (&udp_socket, 0, sizeof(udp_socket));
     return;
 }
 
index 90e80167128892c29ad61bb1287457bc3244b906..8bb5570cec1d9e97ba30e0c9c3e351705cca770f 100644 (file)
@@ -104,16 +104,16 @@ Int32 nand_seek (Int32 loc, Int32 from)
 Int32 nand_free_return (Int32 retcode)
 {
     if (nandmcb.page != NULL)
-        free (nandmcb.page);
+        iblFree (nandmcb.page);
 
     if (nandmcb.logicalToPhysMap != NULL)
-        free (nandmcb.logicalToPhysMap);
+        iblFree (nandmcb.logicalToPhysMap);
 
     if (nandmcb.physToLogicalMap != NULL)
-        free (nandmcb.physToLogicalMap);
+        iblFree (nandmcb.physToLogicalMap);
 
     if (nandmcb.blocks != NULL)
-        free (nandmcb.blocks);
+        iblFree (nandmcb.blocks);
 
     return (retcode);
 
@@ -137,8 +137,8 @@ Int32 nand_open (void *ptr_driver, void (*asyncComplete)(void *))
     Int32 i, j;
 
     /* Initialize the control info */
-    memset (&nandmcb, 0, sizeof(nandmcb));
-    memcpy (&nandmcb.devInfo, &ibln->nandInfo, sizeof(iblNand_t));
+    iblMemset (&nandmcb, 0, sizeof(nandmcb));
+    iblMemcpy (&nandmcb.devInfo, &ibln->nandInfo, sizeof(iblNand_t));
 
     nandmcb.page             = NULL;
     nandmcb.logicalToPhysMap = NULL;
@@ -151,25 +151,25 @@ Int32 nand_open (void *ptr_driver, void (*asyncComplete)(void *))
 
     /* allocate memory for the page data and the logical to physical block map */
     size = nandmcb.devInfo.pageSizeBytes + nandmcb.devInfo.pageEccBytes;
-    nandmcb.page = malloc (size * sizeof(Uint8));
+    nandmcb.page = iblMalloc (size * sizeof(Uint8));
     if (nandmcb.page == NULL)
         nand_free_return (NAND_MALLOC_PAGE_FAIL);
 
 
     /* Logical to physical map data */
-    nandmcb.logicalToPhysMap = malloc (nandmcb.devInfo.totalBlocks * sizeof(Uint16));
+    nandmcb.logicalToPhysMap = iblMalloc (nandmcb.devInfo.totalBlocks * sizeof(Uint16));
     if (nandmcb.logicalToPhysMap == NULL)  
         nand_free_return (NAND_MALLOC_MAP_LTOP_FAIL);
     
 
     /* Physical to logical map data */
-    nandmcb.physToLogicalMap = malloc (nandmcb.devInfo.totalBlocks * sizeof(Uint16));
+    nandmcb.physToLogicalMap = iblMalloc (nandmcb.devInfo.totalBlocks * sizeof(Uint16));
     if (nandmcb.physToLogicalMap == NULL)  
         nand_free_return (NAND_MALLOC_MAP_PTOL_FAIL);
 
     /* Block info */
     size = nandmcb.devInfo.totalBlocks * sizeof(Uint8);
-    nandmcb.blocks = malloc (size);
+    nandmcb.blocks = iblMalloc (size);
     if (nandmcb.blocks == NULL)  
         nand_free_return (NAND_MALLOC_BLOCK_INFO_FAIL);
 
index 26a1c2708037d79af29eb687f27b95e43305061c..4c137a29b281d6e34810eb5fde7e8f0b21abf8e7 100644 (file)
@@ -17,6 +17,7 @@
  **********************************************************************/
 #include "types.h"
 #include "iblcfg.h"
+#include "stream_osal.h"
 #include <string.h>
 
 /** 
@@ -313,7 +314,7 @@ void stream_close (void)
 void stream_init (void)
 {
     /* Reset the memory contents. */
-    memset ((void *)&stream_mcb, 0, sizeof(STREAM_MCB));
+    streamMemset ((void *)&stream_mcb, 0, sizeof(STREAM_MCB));
 
     /* Make sure we initialize the free size correctly. */
     stream_mcb.free_size = MAX_SIZE_STREAM_BUFFER;
diff --git a/src/driver/stream/stream_osal.h b/src/driver/stream/stream_osal.h
new file mode 100644 (file)
index 0000000..a74583b
--- /dev/null
@@ -0,0 +1,10 @@
+/**
+ *  @file stream_osal.h
+ *
+ *  @brief
+ *             operating system abstraction layer definitions specific for the c64x ibl
+ */
+#include "iblloc.h"
+
+#define streamMemset iblMemset
index 51b3e4b46c9c46981fe114bb568ac8c86a8dde35..4462bbd1508701a25232bc52db2e7dc46bfad3e7 100644 (file)
@@ -15,6 +15,7 @@
  #include "timer.h"
  #include "devtimer.h"
  #include "iblcfg.h"
+ #include "timer_osal.h"
  #include <string.h>
 
 
@@ -97,7 +98,7 @@ TIMER_MCB   timermcb;
 void timer_init (void)
 {
     /* Initialize the Timer Master Control Block. */
-    memset (&timermcb, 0, sizeof(TIMER_MCB));
+    timerMemset (&timermcb, 0, sizeof(TIMER_MCB));
     return;
 }
 
@@ -184,7 +185,7 @@ void timer_delete (Int32 handle)
     if (timermcb.num_active_timers > 0)
     {
         /* Simply reset the memory contents */
-        memset ((void *)&timermcb.timer[handle], 0, sizeof(TIMER_BLOCK));
+        timerMemset ((void *)&timermcb.timer[handle], 0, sizeof(TIMER_BLOCK));
 
         /* Decrement the number of active timers in the system */
         timermcb.num_active_timers--;
diff --git a/src/driver/timer/timer_osal.h b/src/driver/timer/timer_osal.h
new file mode 100644 (file)
index 0000000..41953b9
--- /dev/null
@@ -0,0 +1,10 @@
+/**
+ *  @file timer_osal.h
+ *
+ *  @brief
+ *             operating system abstraction layer definitions specific for the c64x ibl
+ */
+#include "iblloc.h"
+
+#define timerMemset iblMemset
index f24887bbe62086c449dba4385dfb9250c758d678..e4024b7db39ee0ee8c089150aa398e015f870a3e 100644 (file)
@@ -36,7 +36,7 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @echo $(TARGET) $(CDEFS) $(DEBUG) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
 
index 9d51e8fa976085258c6039103f977450593bb295..476485aeb3589078b28656aa8d276926fdd9cf42 100644 (file)
@@ -41,7 +41,7 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @echo $(TARGET) $(CDEFS) $(DEBUG) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
 
index c4e2f52f845b47163ab325f256bb6e2cdeccc258..a8fb492969b1268f75de32d948d6333a04043c7c 100644 (file)
@@ -21,6 +21,7 @@
 #include "device.h"
 #include "mdioapi.h"
 #include <string.h>
+#include "net_osal.h"
 
 /**
  *  @brief Remove the possible re-definition of iblEthBoot. iblcfg.h defines this to be a void
@@ -56,7 +57,7 @@ void ibl_rec_params (void *params)
     UNFORM_IPN(iblStatus.ethParams.ipAddr, netdev->ip_address);
     UNFORM_IPN(iblStatus.ethParams.serverIp, netdev->server_ip);
 
-    memcpy (iblStatus.ethParams.hwAddress, netdev->mac_address, sizeof(iblStatus.ethParams.hwAddress));
+    netMemcpy (iblStatus.ethParams.hwAddress, netdev->mac_address, sizeof(iblStatus.ethParams.hwAddress));
     strncpy (iblStatus.ethParams.fileName, netdev->file_name, sizeof(iblStatus.ethParams.fileName));
 
 }
@@ -94,7 +95,7 @@ void iblEthBoot (Int32 eIdx)
     nDevice.port_num = ibl.ethConfig[eIdx].port;
 
     /* Simple transation to initialize the driver */
-    memcpy (nDevice.mac_address, ibl.ethConfig[eIdx].ethInfo.hwAddress, sizeof(nDevice.mac_address));
+    netMemcpy (nDevice.mac_address, ibl.ethConfig[eIdx].ethInfo.hwAddress, sizeof(nDevice.mac_address));
 
     nl = FORM_IPN(ibl.ethConfig[eIdx].ethInfo.ipAddr);
     if (ibl.ethConfig[eIdx].doBootp == TRUE)
@@ -110,7 +111,7 @@ void iblEthBoot (Int32 eIdx)
     nDevice.use_bootp_server_ip = ibl.ethConfig[eIdx].useBootpServerIp;
 
     /* Note - the file name structure in nDevice is only 64 bytes, but 128 in ethInfo */
-    memcpy (nDevice.file_name, ibl.ethConfig[eIdx].ethInfo.fileName, sizeof(nDevice.file_name));
+    netMemcpy (nDevice.file_name, ibl.ethConfig[eIdx].ethInfo.fileName, sizeof(nDevice.file_name));
     nDevice.use_bootp_file_name = ibl.ethConfig[eIdx].useBootpFileName;
 
 
@@ -185,6 +186,7 @@ void iblEthBoot (Int32 eIdx)
 
     }
 
+
     entry = iblBoot (&net_boot_module, format, &ibl.ethConfig[eIdx].blob);
 
 
index 74e4a4b9fa999e6678998f37699f9389ae455dc7..e7d9a7d36cd944ae4c4236ddf87636b6eb6a07b9 100644 (file)
@@ -34,7 +34,6 @@ else
  endif
 endif
 
-CDEFS += -DIBL_I2C_CFG_EEPROM_BUS_ADDR=$(I2C_PARAM_BUS_ADDR)
 
 .PHONY: hw
 
@@ -131,7 +130,7 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @echo $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
 
index 11adee8b953bb9ab1bb0f3d99ce018f4b07a4d74..c32f5bd33478df110868861fbde16d6bf14a6307 100644 (file)
@@ -418,7 +418,7 @@ Int32 cpmac_drv_receive (NET_DRV_DEVICE* ptr_device, Uint8* buffer)
         pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;
 
         /* Copy the data from the descriptor buffer to the supplied buffer. */
-        memcpy((void *)buffer, (void *)pDesc->pBuffer, bytes_received);
+        iblMemcpy((void *)buffer, (void *)pDesc->pBuffer, bytes_received);
 
         /* Put this descriptor back to the HDP. */
         ptr_EMACRegs->RX0HDP = (Uint32)pDesc;
diff --git a/src/hw/macs/cpmac/cpmacdrv.orig.c b/src/hw/macs/cpmac/cpmacdrv.orig.c
deleted file mode 100644 (file)
index 00d15eb..0000000
+++ /dev/null
@@ -1,392 +0,0 @@
-/**
- *   @file  cpmacdrv.c
- *
- *   @brief   
- *      The driver is written for the CPMAC Ethernet controller. It follows
- *      the Network Boot Module Ethernet Driver Specifications.
- *
- *      If there are modifications to this driver required for it to work
- *      on the specific device then device authors are recommended to 
- *      create a copy of this file in the RBL directory and do the 
- *      necessary modifications. Please pass on the appropriate information
- *      to the ROM Boot Loader Framework Development Team.
- *
- *  \par
- *  NOTE:
- *      (C) Copyright 2008, Texas Instruments, Inc.
- *  \par
- */
-#include "types.h"
-#include "iblloc.h"
-#include "device.h"
-#include "net.h"
-#include "cpmac_regs.h"
-#include <string.h>
-
-
-/**********************************************************************
- ************************** Local Definitions *************************
- **********************************************************************/
-
-// Packet Flags for TX and RX
-#define EMAC_DSC_FLAG_SOP                       0x80000000u
-#define EMAC_DSC_FLAG_EOP                       0x40000000u
-#define EMAC_DSC_FLAG_OWNER                     0x20000000u
-#define EMAC_DSC_FLAG_EOQ                       0x10000000u
-#define EMAC_DSC_FLAG_TDOWNCMPLT                0x08000000u
-#define EMAC_DSC_FLAG_PASSCRC                   0x04000000u
-
-// The following flags are RX only
-#define EMAC_DSC_FLAG_JABBER                    0x02000000u
-#define EMAC_DSC_FLAG_OVERSIZE                  0x01000000u
-#define EMAC_DSC_FLAG_FRAGMENT                  0x00800000u
-#define EMAC_DSC_FLAG_UNDERSIZED                0x00400000u
-#define EMAC_DSC_FLAG_CONTROL                   0x00200000u
-#define EMAC_DSC_FLAG_OVERRUN                   0x00100000u
-#define EMAC_DSC_FLAG_CODEERROR                 0x00080000u
-#define EMAC_DSC_FLAG_ALIGNERROR                0x00040000u
-#define EMAC_DSC_FLAG_CRCERROR                  0x00020000u
-#define EMAC_DSC_FLAG_NOMATCH                   0x00010000u
-
-/**********************************************************************
- ************************** Local Structures **************************
- **********************************************************************/
-
-/**
- * @brief 
- *  The structure describes the EMAC Descriptor.
- *
- * @details
- *  Ethernet drivers receives and transmits data through the descriptor
- *  object described here.
- */
-typedef struct _EMAC_Desc 
-{
-    /**
-     * @brief   Pointer to next descriptor in chain
-     */
-    struct _EMAC_Desc* pNext;
-
-    /**
-     * @brief   Pointer to the data buffer.
-     */
-    Uint8*             pBuffer;
-
-    /**
-     * @brief   Buffer Offset(MSW) and Length(LSW)
-     */
-    Uint32             BufOffLen;
-
-    /**
-     * @brief   Packet Flags(MSW) and Length(LSW)
-     */
-    volatile Uint32    PktFlgLen;
-}EMAC_Desc;
-
-/**
- * @brief 
- *  The structure describes the EMAC Master Control Block.
- *
- * @details
- *  The structure stores information required by the EMAC Driver;
- *  which includes the Receive and Transmit Buffer Descriptors.
- */
-typedef struct EMAC_MCB
-{
-    /**
-     * @brief   Pointer to the Receive Buffer Descriptor
-     */
-    EMAC_Desc*      rx_bd;
-
-    /**
-     * @brief   Pointer to the Transmit Buffer Descriptor
-     */
-    EMAC_Desc*      tx_bd;
-
-    /**
-     * @brief   Buffer for receiving data linked with the receive
-     * buffer descriptor.
-     */
-    Uint8           rx_buffer[NET_MAX_MTU];
-}EMAC_MCB;
-
-/**********************************************************************
- ************************** Global Variables **************************
- **********************************************************************/
-
-/**
- * @brief   Global Driver structure which keeps track of all the Ethernet
- * Driver related information.
- */
-EMAC_MCB   emacMCB;
-
-/**
- * @brief   EMAC Registers.
- */
-CPMAC_REGS*  ptr_EMACRegs = (CPMAC_REGS *)EMAC_BASE_ADDRESS;
-
-/**********************************************************************
- ************************** ETHDRV Functions **************************
- **********************************************************************/
-
-/**
- *  @b Description
- *  @n  
- *      This is the Network Open API which is registered with the 
- *      NET Boot module to initialize the Ethernet device.
- *
- *  @param[in]  ptr_device
- *      Pointer to the NET Device structure which is being opened.
- *
- *  @retval
- *      Success -   0
- *  @retval
- *      Error   -   <0
- */
-Int32 cpmac_drv_start (NET_DRV_DEVICE* ptr_device)
-{
-    Uint32           tmpval;
-    volatile Uint32* pRegAddr;
-    Int32            index;
-    EMAC_Desc*       pDesc;
-    
-    /* Reset EMAC */
-    ptr_EMACRegs->SOFTRESET = 0x1;
-    while (ptr_EMACRegs->SOFTRESET != 0x0);
-
-    /* Reset MAC Control */
-    ptr_EMACRegs->MACCONTROL = 0;
-
-    /* Must manually init HDPs to NULL */
-    pRegAddr = &ptr_EMACRegs->TX0HDP;
-    for( index=0; index<8; index++ )
-        *pRegAddr++ = 0;
-    pRegAddr = &ptr_EMACRegs->RX0HDP;
-    for( index=0; index<8; index++ )
-        *pRegAddr++ = 0;
-
-    /* Initialize the RAM locations */
-    for (index = 0; index < 32; index++)
-    {
-        ptr_EMACRegs->MACINDEX  = index;
-        ptr_EMACRegs->MACADDRHI = 0;
-        ptr_EMACRegs->MACADDRLO = 0;
-    }
-
-    /* Setup device MAC address */
-    ptr_EMACRegs->MACINDEX = 0x0;
-
-    /* Configure the MAC Address into the EMAC Controller. */
-    tmpval = 0;
-    for( index=3; index>=0; index-- )
-        tmpval = (tmpval<<8) | *(ptr_device->mac_address+index);
-    ptr_EMACRegs->MACADDRHI = tmpval;
-    tmpval = *(ptr_device->mac_address+5);
-    ptr_EMACRegs->MACADDRLO = CPMAC_MACADDRLO_VALID | CPMAC_MACADDRLO_MATCHFILT | 
-                              (tmpval<<8) | *(ptr_device->mac_address+4);
-
-    /* For us buffer offset will always be zero */
-    ptr_EMACRegs->RXBUFFEROFFSET = 0;
-
-    /* Reset RX (M)ulticast (B)roadcast (P)romiscuous Enable register */
-    ptr_EMACRegs->RXMBPENABLE = 0;
-    ptr_EMACRegs->MACHASH1    = 0;
-    ptr_EMACRegs->MACHASH2    = 0;
-
-    /* Clear Unicast RX on channel 0-7 */
-    ptr_EMACRegs->RXUNICASTCLEAR = 0xFF;
-
-    /* Make sure there are none of the interrupts are enabled. */
-    ptr_EMACRegs->RXINTMASKCLEAR = 0xFF;
-    ptr_EMACRegs->TXINTMASKCLEAR = 0xFF;
-    ptr_EMACRegs->MACINTMASKCLEAR = 0x0;
-
-    /* Setup the receive buffer descriptors. */
-    pDesc = (EMAC_Desc *)_EMAC_DSC_BASE_ADDR;
-
-    /* Initialize the receive buffer descriptor. */
-    pDesc->pNext     = 0;
-    pDesc->pBuffer   = &emacMCB.rx_buffer[0];
-    pDesc->BufOffLen = NET_MAX_MTU;
-    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;
-
-    /* Store this buffer descriptor in the global EMAC MCB */
-    emacMCB.rx_bd = pDesc;
-
-    /* Get the transmit buffer descriptor; it comes right after the receive BD. */
-    pDesc = pDesc + 1;
-
-    /* Initialize the transmit buffer descriptor. */
-    pDesc->pNext     = 0;
-    pDesc->pBuffer   = 0;
-    pDesc->BufOffLen = 0;
-    pDesc->PktFlgLen = 0;
-
-    /* Store this buffer descriptor in the global EMAC MCB */
-    emacMCB.tx_bd = pDesc;
-
-#ifdef EMAC_CACHE_SUPPORT
-    /* Writeback the EMAC MCB Information to the PHYSICAL Memory. 
-     * This is required because the buffer in the cache will always be
-     * invalidated on the RECEIVE; if the buffer is not aligned on the
-     * CACHE Line then it will result in the RX & TX BD in the structure
-     * to also get invalidated to what resides in the PHYSICAL memory.
-     * But if we have written back the structure here then the PHYSICAL
-     * and CACHE are one and the same as far as the BD's are concerned. */
-    Cache_wbL2((void *)&emacMCB, sizeof(emacMCB));
-#endif
-
-    /* Enable the receive and transmit. */
-    ptr_EMACRegs->TXCONTROL = 0x1;
-    ptr_EMACRegs->RXCONTROL = 0x1;
-    
-    /* Initialize the MAC Control: We set the Receive Ownership Bit and the Receive
-     * Offset Length Word and enable the MII. */
-    ptr_EMACRegs->MACCONTROL = CPMAC_MACCONTROL_RXOWNERSHIP | 
-                               CPMAC_MACCONTROL_RXOFFLENBLOCK | 
-                               CPMAC_MACCONTROL_MIIEN;
-
-    /* Startup RX */
-    ptr_EMACRegs->RX0HDP = (Uint32)emacMCB.rx_bd;
-
-    /* Enable receive filters for channel 1 and all broadcast packets. */
-    ptr_EMACRegs->RXUNICASTSET = 1;
-    ptr_EMACRegs->RXMBPENABLE = CPMAC_RXMBPENABLE_RXBROADEN;
-
-    /* Initialize the Device MDIO layer: The function returns only when 
-     * the LINK is UP and RUNNING. */
-    if (dev_mdio_open () < 0)
-        return -1;        
-
-    /* Debug Message: */
-    mprintf ("DEBUG: Ethernet Link is UP \n");
-
-    /* Hardware is up and running. */
-    return 0;
-}
-
-/**
- *  @b Description
- *  @n
- *      This is the Network Send API which is registered with the NET boot module
- *      to send out packets. 
- *
- *  @param[in]   ptr_device
- *      Pointer to the network interface descriptor object.
- *  @param[in]   buffer
- *      Pointer to the packet which is to be transmitted.
- *  @param[in]   num_bytes
- *      Length of the packet which is transmitted.
- *
- *  @retval
- *      Success -   Number of bytes transmitted.
- *  @retval
- *      Error   -   <0
- */
-Int32 cpmac_drv_send (NET_DRV_DEVICE* ptr_device, Uint8* buffer, int num_bytes)
-{
-    volatile EMAC_Desc* pDesc;
-
-    /* Ensure the minimum ethernet size is sent out. */
-    if (num_bytes < 64)
-        num_bytes = 64;
-
-#ifdef EMAC_CACHE_SUPPORT
-    /* Clean the cache for external addesses */
-    Cache_wbL2((void *)buffer, num_bytes);
-#endif
-
-    /* Get the pointer to the transmit buffer descriptor. */
-    pDesc = emacMCB.tx_bd;
-
-    /* Fill out the transmit buffer descriptor */
-    pDesc->pNext     = 0;
-    pDesc->pBuffer   = buffer;
-    pDesc->BufOffLen = num_bytes;
-    pDesc->PktFlgLen = EMAC_DSC_FLAG_SOP | EMAC_DSC_FLAG_EOP | num_bytes | EMAC_DSC_FLAG_OWNER;
-
-    /* Send the packet out. */
-    ptr_EMACRegs->TX0HDP = (Uint32)pDesc;
-
-    /* Loop around till the transmission is complete. */
-    pDesc = (EMAC_Desc *)ptr_EMACRegs->TX0CP;
-    while (pDesc->PktFlgLen & EMAC_DSC_FLAG_OWNER);
-
-    /* The packet has been successfully transmitted. */
-    return num_bytes;
-}
-
-/**
- *  @b Description
- *  @n
- *      This is the Network Receive API which is registered with the NET boot module
- *      to receive packets. 
- *
- *  @param[in]   ptr_device
- *      Pointer to the network interface descriptor object.
- *  @param[out]   buffer
- *      Pointer to the packet which is populated with the received data
- *
- *  @retval
- *      Success -   Number of bytes received.
- *  @retval
- *      Error   -   <0
- */
-Int32 cpmac_drv_receive (NET_DRV_DEVICE* ptr_device, Uint8* buffer)
-{
-    Int32       bytes_received = 0;
-    EMAC_Desc*  pDesc;
-
-    /* Initialize the number of bytes received. */
-    bytes_received = 0;
-
-    /* Read the completion register. We know for sure if the SOP flag is set then
-     * a packet has been received and needs to be picked up from the controller. */
-    pDesc = (EMAC_Desc *)ptr_EMACRegs->RX0CP;
-    if (pDesc->PktFlgLen & EMAC_DSC_FLAG_SOP)
-    {
-        /* Acknowledge that the descriptor has been processed. */
-        ptr_EMACRegs->RX0CP = (Uint32)pDesc;
-
-#ifdef EMAC_CACHE_SUPPORT
-               /* External Memory Support: Invalidate the cache. */
-        Cache_invL2((void *)(pDesc->pBuffer), NET_MAX_MTU);
-#endif
-        /* Remember the number of bytes received. */
-        bytes_received = (pDesc->PktFlgLen & 0xFFFF);
-
-        /* The descriptor is now free to receive more data. Set the status accordingly. */
-        pDesc->BufOffLen = NET_MAX_MTU;
-        pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;
-
-        /* Copy the data from the descriptor buffer to the supplied buffer. */
-        memcpy((void *)buffer, (void *)pDesc->pBuffer, bytes_received);
-
-        /* Put this descriptor back to the HDP. */
-        ptr_EMACRegs->RX0HDP = (Uint32)pDesc;
-    }
-
-    /* Return the number of bytes received. */
-    return bytes_received;
-}
-
-/**
- *  @b Description
- *  @n
- *      This is the Network Close API which is registered with the NET boot module
- *      to close and shutdown the Ethernet controller.
- *
- *  @param[in]   ptr_device
- *      Pointer to the network interface descriptor object.
- *
- *  @retval
- *      Success -   0
- *  @retval
- *      Error   -   <0
- */
-Int32 cpmac_drv_stop (NET_DRV_DEVICE* ptr_device)
-{
-    return 0;
-}
-
-
index ee461b9334319c4c81594a495d1a98223fcc3f0b..1692f04149b02f8ccf45ba6bc2c234b3239d4b80 100644 (file)
 #include "types.h"
 
 /* Prototypes */
-uint16 hwPllResetType (uint16 pllNum);
-int16 hwPllSetPll (uint16 pllNum, uint16 prediv, uint16 mult, uint16 postdiv);
-int16 hwPllDisable (uint16 pllNum);
-int16 hwPllEnable (uint16 pllNum);
+uint16 hwPllResetType (uint32 pllNum);
+int16 hwPllSetPll (uint32 pllNum, uint32 prediv, uint32 mult, uint32 postdiv);
+int16 hwPllDisable (uint32 pllNum);
+int16 hwPllEnable (uint32 pllNum);
 
 
 /**
index 95543b6c8e7503e72cc1daf785c53fd9ddea880e..7ac70b2a2ed7dba34075c8473549ece883ad825a 100644 (file)
@@ -25,7 +25,7 @@
  **************************************************************************************
  * DESCRIPTION: Returns the last boot mode type
  **************************************************************************************/
-uint16 hwPllResetType (uint16 pllNum)
+uint16 hwPllResetType (uint32 pllNum)
 {
   if ( ((DEVICE_REG32_R (DEVICE_PLL_BASE(pllNum) + PLL_REG_RSTYPE)) & PLL_REG_RSTYPE_FIELD_POWER_ON_RESET) != 0 )
     return (pll_POR_RESET);
@@ -56,7 +56,7 @@ void hw_pll_delay (uint32 del)
  **********************************************************************************
  * DESCRIPTION: Sets up the pll
  **********************************************************************************/
-int16 hwPllSetPll (uint16 pllNum, uint16 prediv, uint16 mult, uint16 postdiv)
+int16 hwPllSetPll (uint32 pllNum, uint32 prediv, uint32 mult, uint32 postdiv)
 {
   uint32 ctl;
   uint32 status;
@@ -140,7 +140,7 @@ int16 hwPllSetPll (uint16 pllNum, uint16 prediv, uint16 mult, uint16 postdiv)
  **********************************************************************************
  * DESCRIPTION: The pll is put into bypass. Returns 0 on success. 
  **********************************************************************************/
-int16 hwPllDisable (uint16 pllNum)
+int16 hwPllDisable (uint32 pllNum)
 {
   uint32 ctl;
   uint32 pllBase;
@@ -169,7 +169,7 @@ int16 hwPllDisable (uint16 pllNum)
  ***********************************************************************************
  * DESCRIPTION: The PLL is enabled with no changes to multipliers or dividers
  ***********************************************************************************/
-int16 hwPllEnable (uint16 pllNum)
+int16 hwPllEnable (uint32 pllNum)
 {
   uint32 ctl;
   uint32 pllBase;
index a2b73a2de6deef294580b1e7c50306071725cb88..5b0e0b9c62a6a153455f1af82042418f2bc2eb44 100644 (file)
--- a/src/ibl.h
+++ b/src/ibl.h
@@ -384,6 +384,8 @@ typedef struct ibl_s
     
     iblNand_t nandConfig;                    /**< NAND configuration @ref iblNand_t */
     
+    uint16    chkSum;                        /**< Ones complement checksum over the whole config structure */
+    
     
 /*    iblI2c_t  i2cConfig;  */
 /*    iblSpi_t  spiConfig;  */
@@ -423,6 +425,24 @@ extern ibl_t ibl;
 /* @} */
 
 
+/**
+ *  @defgroup iblFailCode
+ *
+ * @ingroup iblFailCode
+ * @{
+ *      @def ibl_FAIL_CODE_INVALID_I2C_ADDRESS
+ */
+#define ibl_FAIL_CODE_INVALID_I2C_ADDRESS  700      /**< Invalid i2c eeprom address encountered */
+/**
+ *  @def ibl_FAIL_CODE_BTBL_FAIL
+ */
+#define ibl_FAIL_CODE_BTBL_FAIL             701     /**< Boot table processing function error */
+
+ /* @} */
+
+
 /**
  * @brief
  *   Provide status on the boot operation
@@ -435,18 +455,23 @@ typedef struct iblStatus_s
 {
     uint32 iblMagic;        /**<  The @ref ibl_MAGIC_VALUE is placed here to indicate the boot has begun */
     
-    int32  tableLoadFail;   /**<  If non-zero then the load of the parameter table from i2c failed */
+    uint32 iblFail;         /**<  If non-zero the IBL has encountered a fatal error */
+    
+    uint32 i2cRetries;      /**<  Count of I2C read retries */
+    uint32 magicRetries;    /**<  Count of I2C re-reads because the magic number was incorrect */ 
+    uint32 mapSizeFail;     /**<  Number of times an invalid map table size was read from the i2c */
+    uint32 mapRetries;      /**<  Number of times the checksum failed on the read of the i2c map */
+    uint32 i2cDataRetries;  /**<  Number of retries while reading block data from the i2c */
     
     int32  heartBeat;       /**<  An increasing value as long as the boot code is running */
-    int32  noMagic;         /**<  A non-zero value here indicates that @ref ibl_MAGIC_VALUE was not found
-                                  in the @ref ibl_t magic field, and default values were loaded. */
+    
     int32  activePeriph;    /**<  Describes the active boot peripheral @ref iblActivePeriph */
     int32  activeFormat;    /**<  Describes the format being decoded */
     
-    int32  autoDetectFailCnt;       /**<  Counts the number of times an auto detect of the data format failed */
-    int32  nameDetectFailCnt;       /**<  Counts the number of times an name detect of the data format failed */
+    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 */
     
-    int32 invalidDataFormatSpec;    /**<  Counts the number of times the main boot found an invalid boot format request */
+    uint32 invalidDataFormatSpec;   /**<  Counts the number of times the main boot found an invalid boot format request */
     
     uint32 exitAddress;             /**<  If non-zero the IBL exited and branched to this address */
     
@@ -457,6 +482,27 @@ typedef struct iblStatus_s
 extern iblStatus_t iblStatus;                               
 
 
+/** 
+ *  @brief
+ *      The i2c map structure
+ *
+ *  @details 
+ *      The i2c eeprom contains a structure which identifies the location of the big and little
+ *      endian ibl images on the eeprom.
+ */
+typedef struct iblI2cMap_s 
+{
+    uint16  length;         /**<  Size of the structure in bytes */
+    uint16  chkSum;         /**<  Value which makes the ones complement checksum over the block equal to 0 or -0 */
+    
+    uint32  addrLe;         /**<  Base address of the boot tables for the little endian image */
+    uint32  configLe;       /**<  Base address of the ibl structure for use with the little endian image */
+    
+    uint32  addrBe;         /**<  Base address of the boot tables for the big endian image */
+    uint32  configBe;       /**<  Base address of the ibl structure for use with the big endian image */
+
+} iblI2cMap_t;
+
 
 
 
index 02d28e2d12afd9b2d8a0a4736c866eeab6855f6f..62d1e045e72706bde295edc284e73d575a537688 100644 (file)
@@ -73,6 +73,11 @@ typedef struct BOOT_MODULE_FXN_TABLE
 /* Prototypes */
 Uint32 iblBoot (BOOT_MODULE_FXN_TABLE *bootFxn, int32 dataFormat, void *formatParams);
 
+/* Stdlibs referenced through functions to use a single copy in the two stage boot */
+void *iblMalloc (Uint32 size);
+void  iblFree   (void *mem);
+void *iblMemset (void *mem, Int32 ch, Uint32 n);
+void *iblMemcpy (void *s1, const void *s2, Uint32 n);
 
 /* squash printfs */
 void mprintf(char *x, ...);
index b036611fcdd485f6861dd8597f74d5b653f3138f..4597622b05c8af11ad074200844394f330145be3 100644 (file)
@@ -36,7 +36,8 @@ typedef UINT16 BOOT_TBL_STATE_T;
 #define BOOT_TBL_STATE_SIZE         3
 #define BOOT_TBL_STATE_ADDR         4 
 #define BOOT_TBL_STATE_DATA         5 
-#define BOOT_TBL_STATE_FLUSH        6 
+#define BOOT_TBL_STATE_PAD          6
+#define BOOT_TBL_STATE_FLUSH        7 
 #define BOOT_TBL_LAST_STATE         BOOT_TBL_STATE_FLUSH
 #define BOOT_TBL_NUM_STATES         (BOOT_TBL_LAST_STATE + 1)
 
index 391cc20a1becac38691bd08ba6c9a115861d1e89..1786ab322ccd282f6fac77e94da428ce3fdbe2d1 100644 (file)
@@ -82,6 +82,7 @@ void boot_proc_boot_tbl_size(BOOT_TBL_CB_T* p_inst);
 void boot_proc_boot_tbl_addr(BOOT_TBL_CB_T* p_inst);
 void boot_proc_boot_tbl_data(BOOT_TBL_CB_T* p_inst);
 void boot_proc_boot_tbl_flush(BOOT_TBL_CB_T* p_inst);
+void boot_proc_boot_tbl_pad(BOOT_TBL_CB_T* p_inst);
 
 /*******************************************************************************
  * Local variables 
@@ -321,6 +322,38 @@ void boot_proc_boot_tbl_addr(BOOT_TBL_CB_T* p_inst)
     p_inst->data_size_uint16--;
 }
 
+/*******************************************************************************
+ * FUNCTION PURPOSE: Process the boot table in the PAD state
+ *******************************************************************************
+ * DESCRIPTION: Toss data bytes to advance to the next section
+ *******************************************************************************/
+#define MIN(a,b)  (a)<(b) ? (a) : (b)
+void boot_proc_boot_tbl_pad(BOOT_TBL_CB_T* p_inst)
+{
+    UINT32  num_bytes;
+    UINT32  num_uint16_words;
+
+    num_bytes = MIN (p_inst->section_size_bytes, CHIP_UINT16_TO_BYTES(p_inst->data_size_uint16));
+    num_uint16_words = CHIP_BYTES_TO_UINT16(num_bytes);
+
+    /* Update instance variables for the next code section */
+    p_inst->data_size_uint16 -= num_uint16_words;
+    p_inst->p_data           += num_uint16_words;
+    
+    p_inst->section_addr       += num_bytes;
+    p_inst->section_size_bytes -= num_bytes;
+    
+    if(p_inst->section_size_bytes == 0)
+    {
+        p_inst->state = BOOT_TBL_STATE_SIZE;    
+
+        /* Chip specific post block handling. Can be defined to an empty statement */
+        chipBtblBlockDone();
+    }
+}
+
+
+
 /*******************************************************************************
  * FUNCTION PURPOSE: Process the boot table in DATA State
  *******************************************************************************
@@ -332,18 +365,20 @@ void boot_proc_boot_tbl_addr(BOOT_TBL_CB_T* p_inst)
  *   BOOT_TBL_CB_T        *p_inst)  - A pointer to Boot Table Control instance
  *
  *****************************************************************************/
-#define MIN(a,b)  (a)<(b) ? (a) : (b)
 void boot_proc_boot_tbl_data(BOOT_TBL_CB_T* p_inst)
 {
-    UINT32  num_bytes;         /* number of bytes to be copy         */
-    UINT32  num_uint16_words;  /* number of 16 bit words to copy     */
+    UINT32  num_bytes;             /* number of bytes to be copy         */
+    UINT32  num_uint16_words;      /* number of 16 bit words to copy     */
+    UINT32  num_uint16_words_pad;  /* number of 16 bit words, rounded up to a multiple of 4 bytes */
+    UINT32  pad_uint16;            /* The amount of pad present */
     UINT16  error;
     
     num_bytes = MIN (p_inst->section_size_bytes, CHIP_UINT16_TO_BYTES(p_inst->data_size_uint16));
     num_uint16_words = CHIP_BYTES_TO_UINT16(num_bytes);
 
     /* Some processors add padding to the memwidth used in the rom (created by tools) */
-    num_uint16_words = chipAddBtblUint16Pad (num_uint16_words);
+    num_uint16_words_pad = chipAddBtblUint16Pad (num_uint16_words);
+    pad_uint16           = num_uint16_words_pad - num_uint16_words;
     
     /* 
      * Record the last UINT16 word and copy the data to the destination
@@ -365,13 +400,22 @@ void boot_proc_boot_tbl_data(BOOT_TBL_CB_T* p_inst)
     
     p_inst->section_addr       += num_bytes;
     p_inst->section_size_bytes -= num_bytes;
-    
+
     if(p_inst->section_size_bytes == 0)
     {
-        p_inst->state = BOOT_TBL_STATE_SIZE;    
 
-        /* Chip specific post block handling. Can be defined to an empty statement */
-        chipBtblBlockDone();
+        if (pad_uint16)  
+        {
+            p_inst->state              = BOOT_TBL_STATE_PAD;
+            p_inst->section_size_bytes = CHIP_UINT16_TO_BYTES(pad_uint16);
+        } 
+        else
+        {
+            p_inst->state = BOOT_TBL_STATE_SIZE;    
+
+            /* Chip specific post block handling. Can be defined to an empty statement */
+            chipBtblBlockDone();
+        }
     }
     
     /* update statistics */
@@ -412,7 +456,7 @@ void boot_proc_boot_tbl_flush(BOOT_TBL_CB_T* p_inst)
  *****************************************************************************/
 void boot_init_boot_tbl_inst(BOOT_TBL_CB_T *p_btbl_inst)
 {
-    memset(p_btbl_inst, 0, sizeof(BOOT_TBL_CB_T));
+    btblMemset(p_btbl_inst, 0, sizeof(BOOT_TBL_CB_T));
     p_btbl_inst->state = BOOT_TBL_STATE_INIT;
     
     /*
@@ -434,6 +478,7 @@ void boot_init_boot_tbl_inst(BOOT_TBL_CB_T *p_btbl_inst)
     btbl_st_proc_fcn[BOOT_TBL_STATE_SIZE]    = boot_proc_boot_tbl_size;
     btbl_st_proc_fcn[BOOT_TBL_STATE_ADDR]    = boot_proc_boot_tbl_addr;
     btbl_st_proc_fcn[BOOT_TBL_STATE_DATA]    = boot_proc_boot_tbl_data;
+    btbl_st_proc_fcn[BOOT_TBL_STATE_PAD]     = boot_proc_boot_tbl_pad;
     btbl_st_proc_fcn[BOOT_TBL_STATE_FLUSH]   = boot_proc_boot_tbl_flush;
     
 } /* end of boot_init_boot_tbl_inst() */
index a8ac4d44ca4ca36009fcdc1f7b2bb17446e884f4..ae113cd18445d3c458860cb9a27d8f8ca4ae9c11 100644 (file)
@@ -54,11 +54,11 @@ void iblBootBtbl (BOOT_MODULE_FXN_TABLE *bootFxn, Uint32 *entry_point)
     btblWrapEcode = 0;
 
     /* Initialize stats and btbl state */
-    memset (&bootStats, 0, sizeof(bootStats_t));
+    iblMemset (&bootStats, 0, sizeof(bootStats_t));
     
     boot_init_boot_tbl_inst (&tiBootTable);    
 
-    data = malloc (TI_BTBL_BLOCK_SIZE);
+    data = iblMalloc (TI_BTBL_BLOCK_SIZE);
     if (data == NULL)  {
         btblWrapEcode = BTBL_WRAP_ECODE_MALLOC_FAIL;
         return;
@@ -70,6 +70,9 @@ void iblBootBtbl (BOOT_MODULE_FXN_TABLE *bootFxn, Uint32 *entry_point)
 
         switch (tiBootTable.state)  {
 
+            case BOOT_TBL_STATE_PAD:   readSize = 2;
+                                       break;
+
             case BOOT_TBL_STATE_INIT:  
             case BOOT_TBL_STATE_SIZE:  
             case BOOT_TBL_STATE_ADDR:  readSize = 4;
@@ -88,7 +91,7 @@ void iblBootBtbl (BOOT_MODULE_FXN_TABLE *bootFxn, Uint32 *entry_point)
             /* No recovery on block read failure */
             if ((*bootFxn->read)(data, blockSize) < 0)  {
                 btblWrapEcode = BTBL_WRAP_ECODE_READ_FAIL;
-                free (data);
+                iblFree (data);
                 return;
             }
 
@@ -114,7 +117,7 @@ void iblBootBtbl (BOOT_MODULE_FXN_TABLE *bootFxn, Uint32 *entry_point)
     if (btblEcode == 0)
         *entry_point = tiBootTable.code_start_addr;
 
-    free (data);
+    iblFree (data);
 
 }
 
index bba10b468da310ad310cf37979625bb4df0aa322..ec04bd904df859d7ea231a7cfeff1af7334dfff9 100644 (file)
@@ -82,6 +82,8 @@ void btblBootException (UINT32 ecode);
 #define BTBL_WRAP_ECODE_READ_FAIL       101
 #define BTBL_WRAP_ECODE_BTBL_FAIL       102
 
+#define btblMemset iblMemset
+
 
 #endif /* BTBLWRAP_H */
 
index 946787a3c2c03aa1ebff4bdd1ff6ace8e729cf66..a8c37cb34bfd3f4adfafff6557fb82ced55836b1 100644 (file)
@@ -27,7 +27,6 @@ CSRC += blob.c
 # elf loader files
 CSRC += dload.c elfwrap.c dlw_client.c dload_endian.c ArrayList.c
 
-CDEFS += -DIBL_I2C_CFG_EEPROM_BUS_ADDR=$(I2C_PARAM_BUS_ADDR)
 
 .PHONY: interp
 
@@ -58,7 +57,7 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @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/interp/coff/cload.mike.c b/src/interp/coff/cload.mike.c
deleted file mode 100644 (file)
index 67c0593..0000000
+++ /dev/null
@@ -1,2122 +0,0 @@
-/***************************************************************************
-* FILENAME: cload.c
-* VERSION:  2.6  5/2/96  13:11:03
-* SCCS ID:  "@(#)cload.c       2.6  5/2/96"
-***************************************************************************/
-/******************************************************************************/
-/* CLOAD.C  - Generic COFF Loader                      Version 6.00 4/96      */
-/******************************************************************************/
-/*                                                                            */
-/*  This module contains functions to read in and load a COFF object file.    */
-/*  The following routines are defined here:                                  */
-/*                                                                            */
-/*    cload()           - Main driver for COFF loader.                        */
-/*    cload_headers()   - Read in the various headers of the COFF file.       */
-/*    cload_data()      - Read in the raw data and load it into memory.       */
-/*    cload_sect_data() - Read, relocate, and write out one section.          */
-/*    cload_cinit()     - Process one buffer of C initialization records.     */
-/*    cload_symbols()   - Read in the symbol table.                           */
-/*    cload_strings()   - Read in the string table.                           */
-/*    str_free()        - Free a string table.                                */
-/*    sym_read()        - Read and relocate a symbol and its aux entry.       */
-/*    sym_name()        - Return a pointer to the name of a symbol.           */
-/*    sym_add_name()    - Add a symbol name to the string table.              */
-/*    reloc_add()       - Add a symbol to the relocation symbol table.        */
-/*    relocate()        - Perform a single relocation.                        */
-/*    reloc_read()      - Read in and swap one relocation entry.              */
-/*    reloc_size()      - Return the field size of a relocation type.         */
-/*    reloc_offset()    - Return the field offset of a relocation type.       */
-/*    reloc_stop()      - Return the number of bits to read for a reloc type. */
-/*    sym_reloc_amount()- Return relocation amount for a relocation entry.    */
-/*    unpack()          - Extract a relocation field from object bytes.       */
-/*    repack()          - Encode a relocated field into object bytes.         */
-/*    cload_lineno()    - Read in & swap line number entries.                 */
-/*    swap4byte()       - Swap the order of bytes in a int.                  */
-/*    swap2byte()       - Swap the order of bytes in a short.                 */
-/*                                                                            */
-/*  The loader calls the following external functions to perform application  */
-/*  specific tasks:                                                           */
-/*                                                                            */
-/*   set_reloc_amount() - Define relocation amounts for each section.         */
-/*   mem_write()        - Load a buffer of data into memory.                  */
-/*   lookup_sym()       - Look up a symbol in an external symbol table.       */
-/*   load_syms()        - Build the symbol table for the application.         */
-/*   load_msg()         - Write diagnostic messages during loading.           */
-/*                                                                            */
-/******************************************************************************/
-#include "types.h"
-#include "ibl.h"
-#include "iblloc.h"
-#include "iblcfg.h"
-#include "coff.h"
-#include "coff_trg.h"
-#include "cload.h"
-#include <string.h>
-
-#if (FILE_BASED)
-#include <stdio.h>
-#endif
-/*----------------------------------------------------------------------------*/
-/* CONSTANTS, MACROS, VARIABLES, AND STRUCTURES FOR THE LOADER.               */
-/*----------------------------------------------------------------------------*/
-#define MIN(a,b) ((a)<(b)?(a):(b))
-#define MAX(a,b) ((a)>(b)?(a):(b))
-
-#define TRUE 1
-#define FALSE 0
-#define WORDSZ sizeof(T_DATA)           /* SIZE OF DATA UNITS IN OBJ FILE     */
-
-#ifdef TMS320C60
-   extern int target_coff (unsigned short flags);
-#endif
-
-/*----------------------------------------------------------------------------*/
-/* APPLICATION VARIABLES                                                      */
-/*----------------------------------------------------------------------------*/
-#if (FILE_BASED)
-FILE   *fin;                                                   /* INPUT FILE                         */
-#else
-/* extern unsigned char gRxBuffer[0x400040]; */
-extern unsigned char gRxBuffer[0x10];
-#endif
-
-unsigned char gRxBuffer[0x10];
-
-
-int     need_data    = TRUE;            /* APPLICATION NEEDS RAW DATA         */
-int     need_symbols = FALSE;           /* APPLICATION NEEDS SYMBOL TABLE     */
-int     clear_bss    = FALSE;           /* CLEAR BSS SECTION                  */
-
-
-/*----------------------------------------------------------------------------*/
-/* FILL VALUES TO BE USED BY LOADERS                                          */
-/*----------------------------------------------------------------------------*/
-#if defined(OTIS)
-extern int fill_bss;
-extern int fill_bss_value;
-#else
-#define fill_bss 0
-#define fill_bss_value 0
-#endif
-
-/*----------------------------------------------------------------------------*/
-/* LOADER VARIABLES                                                           */
-/*----------------------------------------------------------------------------*/
-FILHDR  file_hdr;                       /* FILE HEADER STRUCTURE              */
-int     coff_version;                   /* COFF VERSION USED IN FILE          */
-AOUTHDR o_filehdr;                      /* OPTIONAL (A.OUT) FILE HEADER       */
-T_ADDR  entry_point;                    /* ENTRY POINT OF MODULE              */
-T_ADDR *reloc_amount = NULL;            /* AMOUNT OF RELOCATION PER SECTION   */
-int     n_sections;                     /* NUMBER OF SECTIONS IN THE FILE     */
-int     big_e_target;                   /* TARGET DATA IN BIG-ENDIAN FORMAT   */
-int     byte_swapped;                   /* BYTE ORDERING OPPOSITE OF HOST     */
-int     curr_sect;                      /* SECTION NUMBER CURRENTLY LOADING   */
-int     load_err;                       /* ERROR CODE RETURNED IF LOADER FAILS*/
-struct strtab *str_head = NULL;         /* LIST OF STRING TABLE BUFFERS       */
-
-static T_SIZE  init_size = 0;           /* CURRENT SIZE OF C INITIALIZATION   */
-static int     need_reloc;              /* RELOCATION REQUIRED                */
-
-
-int  n_array_sections;                  /* The number of sections in sect_hdrs */
-
-SCNHDR   sect_hdrs[MAX_COFF_SECTION_HEADERS];  /* Array of loadable sections */
-O_SCNHDR o_sect_hdrs;                          /* A single old section header */
-
-unsigned int paBuf[LOADBUFSIZE];        /* Temp buffer for packet load */
-
-int stream_offset;                      /* The current stream offset */
-                            
-
-#if TMS320C60
-int big_e_config = TRG_DEF_BIG_E;       /* ENDIANNESS CONFIGURATION           */
-#else
-int big_e_config = DONTCARE;            /* ENDIANNESS CONFIGURATION           */
-#endif
-
-/*----------------------------------------------------------------------------*/
-/* THIS STRUCTURE IS USED TO STORE THE RELOCATION AMOUNTS FOR SYMBOLS.        */
-/* EACH RELOCATABLE SYMBOL HAS A CORRESPONDING ENTRY IN THIS TABLE.           */
-/* THE TABLE IS SORTED BY SYMBOL INDEX; LOOKUP USES A BINARY SEARCH.          */
-/*----------------------------------------------------------------------------*/
-typedef struct
-{
-   int rt_index;                       /* INDEX OF SYMBOL IN SYMBOL TABLE    */
-   int rt_disp;                        /* AMOUNT OF RELOCATION               */
-} RELOC_TAB;
-
-/*----------------------------------------------------------------------------*/
-/* THE RELOCATION SYMBOL TABLE IS ALLOCATED DYNAMICALLY, AND REALLOCATED      */
-/* AS MORE SPACE IS NEEDED.                                                   */
-/*----------------------------------------------------------------------------*/
-#define RELOC_TAB_START 128             /* STARTING SIZE OF TABLE             */
-#define RELOC_GROW_SIZE 128             /* REALLOC AMOUNT FOR TABLE           */
-
-static RELOC_TAB *reloc_tab = NULL;     /* RELOCATION SYMBOL TABLE            */
-
-static int        reloc_tab_size;       /* CURRENT ALLOCATED AMOUNT           */
-static int        reloc_sym_index;      /* CURRENT SIZE OF TABLE              */
-
-/*----------------------------------------------------------------------------*/
-/* RUN-TIME RELOCATION (AS OPPOSED TO LOAD-TIME) RELOCATION IS DETERMINED     */
-/* AS FOLLOWS:  IF THE SECTION'S RUNTIME ADDRESS == LOADTIME ADDRESS, USE     */
-/* LOADTIME RELOCATION.  OTHERWISE, ASSUME LOADTIME RELOC ONLY (RUNTIME RELOC */
-/* == 0).                                                                     */
-/*----------------------------------------------------------------------------*/
-#define RUN_RELOC_AMOUNT(i) ((SECT_HDR(i)->s_paddr == SECT_HDR(i)->s_vaddr) ?  \
-                                   reloc_amount[i] : 0)
-
-/*----------------------------------------------------------------------------*/
-/* DEFINE A STRUCTURE FOR STRING TABLE BUFFERS.  THESE BUFFERS ARE STORED     */
-/* AS A LINKED LIST OF MEMORY PACKETS, EACH CONTAINING UP TO 64K OF THE       */
-/* STRING TABLE.                                                              */
-/*----------------------------------------------------------------------------*/
-typedef struct strtab
-{
-   unsigned int  size;                 /* SIZE OF THIS PACKET                */
-   unsigned int  offset;               /* STARTING OFFSET OF THIS PACKET     */
-   unsigned int  index;                /* AMOUNT CURRENTLY FILLED            */
-   struct strtab *next;                 /* NEXT BUFFER                        */
-   char           buf[1];               /* STRING DATA (EXPAND AS ALLOCATED)  */
-} STRTAB;
-
-#define MAX_STRING_ALLOC (unsigned int)(0xffff-sizeof(STRTAB)+1)
-                                       /* MAX STRING BUFFER: 64K (SMALL HOSTS)*/
-#define MIN_STRING_ALLOC 0x0400        /* MIN STRING BUFFER: 1K               */
-
-unsigned int unpack();
-
-/* extern void mem_copy(unsigned char* dst, unsigned char* src, int nbytes); */
-#define mem_copy(dest,src,nbytes) memcpy((void *)(dest),(void *)(src),nbytes)
-#define mem_write(buf, nbytes, addr, page)  memcpy((void *)(addr),(void *)(buf),nbytes)
-#define str_comp strcmp
-/******************************************************************************/
-/*                                                                            */
-/* CLOAD() - Main driver for COFF loader.                                     */
-/*                                                                            */
-/******************************************************************************/
-int cload(BOOT_MODULE_FXN_TABLE *bootFxn, Uint32 *ientry_point)
-{
-   int result;
-
-   load_err      = 0;
-   stream_offset = 0;
-   result        = cload_headers(bootFxn, ientry_point) && cload_data(bootFxn);
-
-   if (reloc_tab) free(reloc_tab);
-   reloc_tab = NULL;
-
-   if(result == TRUE)
-       return 0;
-   else  {
-       *ientry_point = 0;
-       return -1;
-   }
-}
-
-\f
-/******************************************************************************/
-/*                                                                            */
-/* CLOAD_HEADERS() - Read in the various headers of the COFF file.            */
-/*                                                                            */
-/******************************************************************************/
-int cload_headers(BOOT_MODULE_FXN_TABLE *bootFxn, Uint32 *ientry_point)
-{
-   int i;
-
-   byte_swapped = FALSE;
-   need_reloc   = FALSE;
-
-   *ientry_point = NULL;   /* Error return value */
-
-    if ((*bootFxn->read)((Uint8 *)&file_hdr, FILHSZ) < 0)
-        return (FALSE);
-    stream_offset += FILHSZ;
-
-
-   /*-------------------------------------------------------------------------*/
-   /* MAKE SURE THIS IS REALLY A COFF FILE. CHECK FOR SWAPPED FILES.          */
-   /* DETERMINE BYTE ORDERING OF OBJECT DATA.                                 */
-   /*-------------------------------------------------------------------------*/
-   if (!ISCOFF(file_hdr.f_magic))
-   {
-       swap2byte(&file_hdr.f_magic);
-
-       if (!ISCOFF(file_hdr.f_magic)) { load_err = E_MAGIC; return FALSE; }
-
-       byte_swapped = TRUE;
-
-       swap2byte(&file_hdr.f_nscns);  swap4byte(&file_hdr.f_timdat);
-       swap4byte(&file_hdr.f_symptr); swap4byte(&file_hdr.f_nsyms);
-       swap2byte(&file_hdr.f_opthdr); swap2byte(&file_hdr.f_flags);
-#if COFF_VERSION_1 || COFF_VERSION_2
-       swap2byte(&file_hdr.f_target_id); 
-#endif
-   }
-
-   /*-------------------------------------------------------------------------*/
-   /* DETERMINE THE ENDIANNESS OF THE COFF FILE, AND ENSURE THE ENDIANNESS OF */
-   /* THE FILE IS THE SAME AS THE TARGET, IF THERE IS A TARGET.               */
-   /*-------------------------------------------------------------------------*/
-   big_e_target = ((file_hdr.f_flags & F_BIG) != 0);
-   if (big_e_config != DONTCARE && big_e_target != big_e_config) 
-      { load_err = E_ENDIAN; return FALSE; }
-
-   /*-------------------------------------------------------------------------*/
-   /* DETERMINE VERSION OF COFF BEING USED, CHECK TARGET ID IF NEEDED.        */
-   /*-------------------------------------------------------------------------*/
-   if (ISCOFF_1(file_hdr.f_magic) || ISCOFF_2(file_hdr.f_magic))
-   {
-       if (!ISMAGIC(file_hdr.f_target_id)) { load_err = E_MAGIC; return FALSE; }
-       coff_version = file_hdr.f_magic;
-   } 
-   else coff_version = COFF_MAGIC_0;
-
-#ifdef TMS320C60
-   /*-------------------------------------------------------------------------*/
-   /* DETERMINE WHETHER THE RIGHT COFF IS BEING LOADED                        */
-   /*-------------------------------------------------------------------------*/
-   if ( !target_coff( file_hdr.f_flags) )
-       { load_err = E_FILE; return FALSE; }
-#endif
-   /*-------------------------------------------------------------------------*/
-   /* READ IN OPTIONAL HEADER, IF THERE IS ONE, AND SWAP IF NEEDED.           */
-   /*-------------------------------------------------------------------------*/
-   if (file_hdr.f_opthdr == AOUTSZ)
-   {
-
-    if ((*bootFxn->read)((Uint8 *)&o_filehdr, file_hdr.f_opthdr) < 0)
-        return (FALSE);
-    stream_offset += file_hdr.f_opthdr;
-
-      if (byte_swapped)
-      {
-         swap2byte(&o_filehdr.magic);      swap2byte(&o_filehdr.vstamp);
-         swap4byte(&o_filehdr.tsize);      swap4byte(&o_filehdr.dsize);
-         swap4byte(&o_filehdr.bsize);      swap4byte(&o_filehdr.entrypt);
-         swap4byte(&o_filehdr.text_start); swap4byte(&o_filehdr.data_start);
-      }
-
-      entry_point   = o_filehdr.entrypt;
-      *ientry_point = entry_point;
-   }
-
-   /*-------------------------------------------------------------------------*/
-   /* Read in string table so that we can see long section names, if needed.  */
-   /* This used tobe read right before the symbol table was read, but now the */
-   /* section headers use "flexname" method to specify section names and so   */
-   /* might need access to a string table entry.                              */
-   /*-------------------------------------------------------------------------*/
-   //if (!cload_strings()) return FALSE;
-
-   /*-------------------------------------------------------------------------*/
-   /* READ IN SECTION HEADERS.                                                */
-   /*-------------------------------------------------------------------------*/
-
-   n_array_sections = 0;
-   for (i = 0; i < file_hdr.f_nscns; i++)  {
-
-     SCNHDR   *sptr = (SCNHDR *)&sect_hdrs[n_array_sections];
-     O_SCNHDR *tptr = (O_SCNHDR *)&o_sect_hdrs;
-
-     if (ISCOFF_2(coff_version))  {
-
-        if ((*bootFxn->read)((Uint8 *)sptr, SCNHSZ_IN(coff_version)) < 0)
-            return (FALSE);
-        stream_offset += SCNHSZ_IN(coff_version);
-
-
-       if (byte_swapped)  {
-
-         if (sptr->s_zeroes == 0L) swap4byte(&sptr->s_offset);
-             swap4byte(&sptr->s_paddr);  
-            swap4byte(&sptr->s_vaddr);
-             swap4byte(&sptr->s_size);   
-            swap4byte(&sptr->s_scnptr);
-             swap4byte(&sptr->s_relptr); 
-            swap4byte(&sptr->s_lnnoptr);
-             swap4byte(&sptr->s_nreloc); 
-            swap4byte(&sptr->s_nlnno);
-             swap4byte(&sptr->s_flags);  
-             /* s_mwidth   - single byte */
-             /* s_reserved - single byte */
-            swap2byte(&sptr->s_page);
-         }
-
-
-    }  else  {
-
-        if ((*bootFxn->read)((Uint8 *)tptr, SCNHSZ_IN(coff_version)) < 0)
-            return (FALSE);
-        stream_offset += SCNHSZ_IN(coff_version);
-
-       if (byte_swapped)  {
-             swap4byte(&tptr->os_paddr);  
-            swap4byte(&tptr->os_vaddr);
-             swap4byte(&tptr->os_size);   
-            swap4byte(&tptr->os_scnptr);
-             swap4byte(&tptr->os_relptr); 
-            swap4byte(&tptr->os_lnnoptr);
-             swap2byte(&tptr->os_nreloc); 
-            swap2byte(&tptr->os_nlnno);
-             swap2byte(&tptr->os_flags);
-            /* os_reserved - one byte */
-            /* os_page     - one byte */
-       }
-    
-          strncpy(sptr->s_name, tptr->os_name, SYMNMLEN);
-          sptr->s_paddr   = tptr->os_paddr;
-          sptr->s_vaddr   = tptr->os_vaddr;
-          sptr->s_size    = tptr->os_size;
-          sptr->s_scnptr  = tptr->os_scnptr;
-          sptr->s_relptr  = tptr->os_relptr;
-          sptr->s_lnnoptr = tptr->os_lnnoptr;
-          sptr->s_nreloc  = tptr->os_nreloc;
-          sptr->s_nlnno   = tptr->os_nlnno;
-          sptr->s_flags   = tptr->os_flags;
-          sptr->s_page    = tptr->os_page;
-       }
-
-     /* Dont keep the section if it is not loaded */
-
-     if ((sptr->s_scnptr || ((clear_bss || fill_bss) && IS_BSS(sptr)))   &&
-            (sptr->s_size)                                                  &&
-        !(sptr->s_flags & (STYP_DSECT | STYP_NOLOAD)))
-
-       n_array_sections += 1;
-
-   }
-
-
-   return TRUE;
-}
-
-\f
-/******************************************************************************/
-/*                                                                            */
-/* CLOAD_DATA() - Read in the raw data and load it into memory.               */
-/*                                                                            */
-/******************************************************************************/
-int cload_data(BOOT_MODULE_FXN_TABLE *bootFxn)
-{
-   int ok = TRUE;
-
-   if (!need_data) return TRUE;
-
-   /*-------------------------------------------------------------------------*/
-   /* LOOP THROUGH THE SECTIONS AND LOAD THEM ONE AT A TIME.                  */
-   /*-------------------------------------------------------------------------*/
-   for (curr_sect = 0; curr_sect < n_array_sections && ok; curr_sect++)
-   {
-      SCNHDR *sptr = &sect_hdrs[curr_sect];
-      char   *sname = (sptr->s_zeroes == 0L) ? 
-                               sptr->s_nptr : SNAMECPY(sptr->s_name);
-
-      /*----------------------------------------------------------------------*/
-      /* IF THIS IS THE TEXT SECTION, RELOCATE THE ENTRY POINT.               */
-      /*----------------------------------------------------------------------*/
-      if ((sptr->s_flags & STYP_TEXT) && !strcmp(sname, ".text"))
-        entry_point += RUN_RELOC_AMOUNT(curr_sect);
-
-      /*----------------------------------------------------------------------*/
-      /* IGNORE EMPTY SECTIONS OR SECTIONS WHOSE FLAGS INDICATE THE           */
-      /* SECTION IS NOT TO BE LOADED.  IF THE CLEAR_BSS FLAG IS SET, BSS      */
-      /* IS "LOADED" EVEN THOUGH IT HAS NO DATA                               */
-      /*----------------------------------------------------------------------*/
-      if ((sptr->s_scnptr || ((clear_bss || fill_bss) && IS_BSS(sptr)))   &&
-             (sptr->s_size)                                              &&
-         !(sptr->s_flags & (STYP_DSECT | STYP_NOLOAD)))  {
-
-        if (!(sptr->s_flags & STYP_COPY))
-               ok &= cload_sect_data(sptr, bootFxn);
-        else
-            ok &= cload_sect_data(sptr, bootFxn);
-      }
-   }
-
-
-   return ok;
-}
-
-\f
-/******************************************************************************/
-/*                                                                            */
-/* CLOAD_SECT_DATA() - Read, relocate, and write out the data for one section.*/
-/*                                                                            */
-/******************************************************************************/
-int cload_sect_data(SCNHDR *sptr, BOOT_MODULE_FXN_TABLE *bootFxn)
-{
-   T_ADDR        addr    = sptr->s_vaddr; /* CURRENT ADDRESS IN SECTION       */
-   unsigned int nbytes;                  /* BYTE COUNT WITHIN SECTION        */
-   int           packet_size = 0;         /* SIZE OF CURRENT DATA BUFFER      */
-   int           excess  = 0;             /* BYTES LEFT FROM PREVIOUS BUFFER  */
-   unsigned int  n_reloc = 0;             /* COUNTER FOR RELOCATION ENTRIES   */
-   RELOC         reloc;                   /* RELOCATION ENTRY                 */
-   int           relsz   = RELSZ_IN(coff_version); 
-   unsigned char *packet = (unsigned char *)paBuf; /* LOAD BUFFER                      */
-   unsigned int section_length = (unsigned int)LOCTOBYTE(sptr->s_size);
-   unsigned int buffer_size    = LOADBUFSIZE;
-
-#if defined (UNBUFFERED) && UNBUFFERED
-   /*-------------------------------------------------------------------------*/
-   /* IF UNBUFFERED, THEN SET SIZE TO SECTION LENGTH ROUNDED UP TO MULTIPLE   */
-   /* 32 BYTES.  WE MAINTAIN A MINIMIUM OF LOADBUFSIZE IN THE EVENT SOMEONE   */
-   /* CONTINUES TO USE THAT MACRO AS A SIZE LIMIT.                            */
-   /*-------------------------------------------------------------------------*/
-   buffer_size = MAX(buffer_size, (section_length + 32) & ~31ul); 
-#endif
-
-   /*-------------------------------------------------------------------------*/
-   /* ENSURE LOADBUFSIZE IS A MULTIPLE OF 2                                   */
-   /*-------------------------------------------------------------------------*/
-   if (LOADBUFSIZE % 2) 
-   {
-       return -1;
-   }
-
-   /*-------------------------------------------------------------------------*/
-   /* ALLOCATE THE PACKET BUFFER                                              */
-   /*-------------------------------------------------------------------------*/
-   if (!packet) { load_err = E_ALLOC; return FALSE; }
-
-#ifdef OTIS
-   if (IS_BSS(sptr))
-   {
-      TRG_MVAL filval = fill_bss_value;
-
-      free (packet);
-
-      if (!mem_fill(filval, LOCTOBYTE(sptr->s_size), addr, sptr->s_page))
-         { load_err = E_MEMWRITE; return FALSE; }
-      return TRUE;
-   }
-#else
-   /*-------------------------------------------------------------------------*/
-   /* Always want to clear memory for cases where memsize is not a multiple   */
-   /* of the data size being written out.  If we do not clear the array, the  */
-   /* last byte or so can be corrupted with data from the last buffer read.   */
-   /*-------------------------------------------------------------------------*/
-   for (nbytes = 0; nbytes < buffer_size; ++nbytes) packet[nbytes] = 0;
-#endif
-
-
-   /* Advance the stream to the start of the section */
-   if (sptr->s_scnptr)  {
-
-        unsigned int offset;
-
-        offset = sptr->s_scnptr;
-
-        /* Advance the stream to the next section */
-        if (offset > stream_offset)  {
-
-            unsigned int delta, rsize;
-            int k;
-            
-                
-            delta = sptr->s_scnptr - stream_offset;
-
-            for (k = 0; k < delta; k += rsize)  {
-
-                rsize = MIN(delta, sizeof(paBuf));
-
-                if ((*bootFxn->read)((Uint8 *)paBuf, rsize) < 0)
-                    return (FALSE);
-                stream_offset += rsize;
-
-            }
-
-         }
-
-    }
-
-       
-   /*-------------------------------------------------------------------------*/
-   /* COPY ALL THE DATA IN THE SECTION.                                       */
-   /*-------------------------------------------------------------------------*/
-
-   for (nbytes = 0; nbytes < section_length; nbytes += packet_size)
-   {
-      int j;
-
-      /*----------------------------------------------------------------------*/
-      /* READ IN A BUFFER OF DATA.  IF THE PREVIOUS RELOCATION SPANNED        */
-      /* ACROSS THE END OF THE LAST BUFFER, COPY THE LEFTOVER BYTES INTO      */
-      /* THE BEGINNING OF THE NEW BUFFER.                                     */
-      /*----------------------------------------------------------------------*/
-      for (j = 0; j < excess; ++j) packet[j] = packet[packet_size + j];
-
-      packet_size = (int)MIN(LOCTOBYTE(sptr->s_size) - nbytes, buffer_size);
-
-      if (sptr->s_scnptr)  {
-
-         if ((*bootFxn->read)((Uint8 *)((Uint8 *)packet+ excess), packet_size - excess) < 0)
-            return (FALSE);
-         stream_offset += (packet_size - excess);
-
-      }
-
-
-      excess = 0;
-
-      /*----------------------------------------------------------------------*/
-      /* Clear out end of packet in case we write padding.                    */
-      /*----------------------------------------------------------------------*/
-      if (excess + packet_size < buffer_size)
-         for(j = excess + packet_size; j < buffer_size; j++)
-             packet[j] = 0;
-
-
-#if 0       /* For some reason I have a section with STYP_COPY set, but
-             * the name is not .cinit (first section). The address of
-             * this section is 0, so if memcpy is called it returns 0,
-             * which results in the load_err case */
-             
-      /*----------------------------------------------------------------------*/
-      /* WRITE OUT THE RELOCATED DATA TO THE TARGET DEVICE.  IF THIS IS A     */
-      /* CINIT SECTION, CALL A SPECIAL FUNCTION TO HANDLE IT.                 */
-      /*----------------------------------------------------------------------*/
-      if (!(IS_CINIT(sptr) ?
-             cload_cinit(packet, &packet_size, &excess) :
-              (int)memcpy ((void *)addr, packet, packet_size)))
-         { load_err = E_MEMWRITE; free (packet); return FALSE; }
-#endif
-
-
-
-      if (IS_CINIT(sptr))  {
-        if (cload_cinit(packet, &packet_size, &excess))  {
-            load_err = E_MEMWRITE; return (FALSE); 
-           
-        }
-
-      }  else  {
-        
-        /* If a copy section, but not cinit, ignore it */
-        if (!(sptr->s_flags & STYP_COPY)) 
-              memcpy ((void *)addr, packet, packet_size);
-
-     }
-
-
-      /*----------------------------------------------------------------------*/
-      /* KEEP TRACK OF THE ADDRESS WITHIN THE SECTION.                        */
-      /*----------------------------------------------------------------------*/
-      addr += BYTETOLOC(packet_size);
-
-   }
-
-   return TRUE;
-}
-
-\f
-/******************************************************************************/
-/*                                                                            */
-/* CLOAD_CINIT() - Process one buffer of C initialization records.            */
-/*                                                                            */
-/******************************************************************************/
-int cload_cinit(unsigned char *packet, int *packet_size, int *excess)
-{
-   int           i;                      /* BYTE COUNTER                      */
-   int           init_packet_size;       /* SIZE OF CURRENT INITIALIZATION    */
-   static T_ADDR init_addr;              /* ADDRESS OF CURRENT INITIALIZATION */
-   int           bss_page = 0;           /* BSS SECTION PAGE NUMBER           */
-   /*-------------------------------------------------------------------------*/
-   /* FIND THE BSS SECTION ASSOCIATED WITH THE THE CINIT SECTION CURRENTLY    */
-   /* BEING LOADED.                                                           */
-   /*-------------------------------------------------------------------------*/
-   for (i = 0; i < n_sections; ++i)
-      if (IS_BSS(SECT_HDR(i))) 
-          { bss_page = SECT_HDR(i)->s_page; break; }
-
-   /*-------------------------------------------------------------------------*/
-   /*  PROCESS ALL THE INITIALIZATION RECORDS IN THE BUFFER.                  */
-   /*-------------------------------------------------------------------------*/
-   for (i = 0; i < *packet_size; i += init_packet_size)
-   {
-      /*----------------------------------------------------------------------*/
-      /* IF STARTING A NEW INITIALIZATION, READ THE SIZE AND ADDRESS FROM     */
-      /* THE TABLE.                                                           */
-      /*----------------------------------------------------------------------*/
-      if (init_size == 0)
-      {
-        T_SIZE temp;
-        int    align;
-
-        /*-------------------------------------------------------------------*/
-        /* POSITION THE BYTE INDEX ON THE NEXT INIT RECORD.                  */
-        /*-------------------------------------------------------------------*/
-         if (align = (i % INIT_ALIGN)) i += (INIT_ALIGN - align);
-
-        /*-------------------------------------------------------------------*/
-        /* IF THE SIZE AND ADDRESS ARE NOT FULLY CONTAINED IN THIS BUFFER,   */
-        /* STOP HERE.  SET THE 'EXCESS' COUNTER TO THE NUMBER OF UNPROCESSED */
-        /* BYTES - THESE WILL BE COPIED TO THE HEAD OF THE NEXT BUFFER.      */
-        /*-------------------------------------------------------------------*/
-        if ((int)(i + sizeof(T_SIZE)) > *packet_size)
-           { *excess += *packet_size - i;  *packet_size = i;  break; }
-
-        /*-------------------------------------------------------------------*/
-        /* IF THE NEXT SIZE FIELD IS ZERO, BREAK.                            */
-        /*-------------------------------------------------------------------*/
-        temp = unpack(packet + i, sizeof(T_SIZE)*8, sizeof(T_SIZE)*8, 0);
-        if (temp == 0) break;
-
-        /*-------------------------------------------------------------------*/
-        /* READ THE ADDRESS FIELD ,IF IT'S ALL HERE.                         */
-        /*-------------------------------------------------------------------*/
-         if ((int)(i + sizeof(T_SIZE) + sizeof(T_IADDR)) > *packet_size)
-             { *excess += *packet_size - i;  *packet_size = i;  break; }
-
-         i         += sizeof(T_SIZE);
-         init_size  = temp;
-         init_addr  = unpack(packet+i,sizeof(T_IADDR)*8,sizeof(T_IADDR)*8,0);
-         i         += sizeof(T_IADDR);
-      }
-
-      /*----------------------------------------------------------------------*/
-      /* WRITE OUT THE CURRENT PACKET, UP TO THE END OF THE BUFFER.           */
-      /*----------------------------------------------------------------------*/
-      if (init_packet_size = MIN(*packet_size-i, (int)(init_size * INIT_WSIZE)))
-      {
-       
-        if (!mem_write(packet + i, init_packet_size, init_addr, bss_page))
-            return FALSE;
-
-        init_addr += BYTETOLOC(init_packet_size);
-        init_size -= init_packet_size / INIT_WSIZE;
-      }
-   }
-   return TRUE;
-}
-
-#if 0
-/******************************************************************************/
-/*                                                                            */
-/* CLOAD_SYMBOLS() - Read in the symbol table.                                */
-/*                                                                            */
-/******************************************************************************/
-int cload_symbols()
-{
-   SYMENT sym;
-   AUXENT aux;
-   int first, next;
-
-   if (file_hdr.f_nsyms == 0 || (!need_symbols && !need_reloc)) return TRUE;
-
-   /*------------------------------------------------------------------------*/
-   /* ALLOCATE THE RELOCATION SYMBOL TABLE.                                  */
-   /*------------------------------------------------------------------------*/
-   if (need_reloc)
-   {
-      reloc_sym_index = 0;
-      reloc_tab_size  = MIN(RELOC_TAB_START, (int)file_hdr.f_nsyms);
-
-      if (!(reloc_tab = (RELOC_TAB *)malloc(reloc_tab_size*sizeof(RELOC_TAB))))
-          { load_err = E_ALLOC; return FALSE; }
-   }
-
-   /*------------------------------------------------------------------------*/
-   /* IF THE APPLICATION NEEDS THE SYMBOL TABLE, LET IT READ IT IN.          */
-   /* PASS NEED_RELOC TO THE APPLICATION SO THAT IT CAN CALL RELOC_ADD().    */
-   /*------------------------------------------------------------------------*/
-   if (need_symbols) 
-   {
-      if (load_syms(need_reloc)) return TRUE;
-      else { load_err = E_SYM; return FALSE; }
-   }
-
-   /*------------------------------------------------------------------------*/
-   /*  READ THE SYMBOL TABLE AND BUILD THE RELOCATION SYMBOL TABLE           */
-   /*  FOR SYMBOLS THAT CAN BE USED IN RELCOATION, STORE THEM IN A           */
-   /*  SPECIAL SYMBOL TABLE THAT CAN BE SEARCHED QUICKLY DURING              */
-   /*  RELOCATION.                                                           */
-   /*------------------------------------------------------------------------*/
-   for (first = 0; first < file_hdr.f_nsyms; first = next)
-   {
-       if (!(next = sym_read(first, &sym, &aux))) 
-          { load_err = E_FILE; return FALSE; }
-
-       if (sym.n_sclass == C_EXT     || sym.n_sclass == C_EXTREF  ||
-           sym.n_sclass == C_STAT    || sym.n_sclass == C_LABEL   ||
-           sym.n_sclass == C_SYSTEM  || sym.n_sclass == C_BLOCK   || 
-          sym.n_sclass == C_FCN     || sym.n_sclass == C_STATLAB || 
-          sym.n_sclass == C_EXTLAB) 
-         if (!reloc_add(first, &sym)) return FALSE;
-   }
-   return TRUE;
-}
-
-
-/******************************************************************************/
-/*                                                                            */
-/* CLOAD_STRINGS() - Read in the string table.                                */
-/*                                                                            */
-/******************************************************************************/
-int cload_strings()
-{
-   unsigned int str_size;              /* SIZE OF STRING TABLE              */
-   unsigned int bufsize;               /* SIZE OF CURRENT BUFFER            */
-   unsigned int ntoread;                /* AMOUNT TO READ FROM FILE          */
-   int excess;                          /* AMOUNT LEFT OVER FROM LAST BUFFER */
-   STRTAB *packet;                      /* STRING TABLE BUFFER PACKET        */
-   unsigned int i = 0;
-
-   /*----------------------------------------------------------------------*/
-   /* Do not load if not loading/saving the symbol tables.                 */
-   /* This is because the string table is an extension of the symbol table */
-   /* and if you free and rebuild it, the symbol table's str_head will be  */
-   /* incorrect.                                                           */
-   /*----------------------------------------------------------------------*/
-   if (!need_symbols) return TRUE;
-
-   /*------------------------------------------------------------------------*/
-   /* FREE ANY PREVIOUS STRING BUFFERS                                       */
-   /*------------------------------------------------------------------------*/
-   str_free(str_head); str_head = NULL;
-
-   /*------------------------------------------------------------------------*/
-   /* SEEK TO THE END OF THE SYMBOL TABLE AND READ IN THE SIZE OF THE STRING */
-   /* TABLE.                                                                 */
-   /*------------------------------------------------------------------------*/
-#if FILE_BASED
-   if ((file_hdr.f_nsyms == 0) ||
-          fseek(fin, file_hdr.f_symptr + (file_hdr.f_nsyms * SYMESZ), 0) != 0 ||
-       fread(&str_size, sizeof(int), 1, fin) != 1)
-       return TRUE;
-#else
-   mem_copy(&str_size, &gRxBuffer[file_hdr.f_symptr + (file_hdr.f_nsyms * SYMESZ)], sizeof(int));      
-   if ((file_hdr.f_nsyms == 0))
-       return TRUE; 
-#endif
-   if (byte_swapped) swap4byte(&str_size);
-
-   /*------------------------------------------------------------------------*/
-   /* THE STRING TABLE IS READ IN AS A LINKED LIST OF BUFFERS.  TO           */
-   /* PREVENT NAMES FROM BEING SPLIT ACROSS MULTIPLE BUFFERS, ANY PARTIAL    */
-   /* NAME AT THE END OF A BUFFER IS COPIED INTO THE BEGINNING OF THE        */
-   /* NEXT BUFFER.  THE VARIABLE 'EXCESS' KEEPS TRACK OF HOW MUCH NEEDS      */
-   /* TO BE COPIED FROM THE PREVIOUS BUFFER.                                 */
-   /*------------------------------------------------------------------------*/
-   str_size -= 4;                       /* SUBTRACT OFF 4 BYTES ALREADY READ */
-   excess    = 0;                       /* INITIALIZE LAST-BUFFER OVERFLOW   */
-
-
-   /*------------------------------------------------------------------------*/
-   /* READ STRING BUFFERS UNTIL THE WHOLE STRING TABLE IS READ.              */
-   /*------------------------------------------------------------------------*/
-   while (str_size)
-   {
-      /*---------------------------------------------------------------------*/
-      /* ALLOCATE A NEW BUFFER.  ON 16-BIT MACHINES, RESTRICT THE            */
-      /* BUFFER SIZE TO THE MAXIMUM THAT CAN BE ALLOCATED AT ONCE.           */
-      /*---------------------------------------------------------------------*/
-      bufsize = str_size + excess;
-
-      if (sizeof(int) < 4  && bufsize > MAX_STRING_ALLOC)
-        bufsize = MAX_STRING_ALLOC;
-
-      if (!(packet = (struct strtab *)malloc(sizeof(STRTAB) + 
-                                             (unsigned int)bufsize - 1)))
-         { load_err = E_ALLOC; return FALSE; }
-
-      /*---------------------------------------------------------------------*/
-      /* COPY ANY PARTIAL STRING FROM THE LAST BUFFER INTO THIS ONE.         */
-      /* THEN FILL THE REST OF THE BUFFER BY READING FROM THE FILE.          */
-      /*---------------------------------------------------------------------*/
-      if (excess)
-        strn_copy(packet->buf, str_head->buf + str_head->size, excess);
-
-      ntoread = (unsigned int)(bufsize - excess);
-#if FILE_BASED
-      if (fread(packet->buf + excess, ntoread, 1, fin) != 1) 
-        { load_err = E_FILE; return FALSE; }
-#else
-       mem_copy(packet->buf + excess, &gRxBuffer[file_hdr.f_symptr + (file_hdr.f_nsyms * SYMESZ) +sizeof(int)+ i++*ntoread], ntoread);
-#endif  
-      str_size -= ntoread;
-
-      /*---------------------------------------------------------------------*/
-      /* IF THE BUFFER ENDS IN A PARTIAL STRING (DOESN'T END IN NULL),       */
-      /* KEEP TRACK OF HOW MANY CHARACTERS ARE IN THE PARTIAL STRING         */
-      /* SO THEY CAN BE COPIED INTO THE NEXT BUFFER.                         */
-      /*---------------------------------------------------------------------*/
-      for (excess = 0; packet->buf[bufsize - 1]; --bufsize, ++excess) ;
-
-      /*---------------------------------------------------------------------*/
-      /* LINK THE NEW BUFFER INTO THE HEAD OF THE LIST.                      */
-      /*---------------------------------------------------------------------*/
-      packet->size   = 
-      packet->index  = bufsize;
-      packet->next   = str_head;
-      packet->offset = str_head ? (str_head->offset + str_head->size) : 4;
-      str_head       = packet;
-   }
-   return TRUE;
-}
-
-\f
-/******************************************************************************/
-/*                                                                            */
-/* STR_FREE() - Free the list of string table buffers.                        */
-/*                                                                            */
-/******************************************************************************/
-void str_free(STRTAB *head)
-{
-   STRTAB *this_one, *next;
-   for (this_one = head; this_one; this_one = next)
-   {
-      next = this_one->next;
-      free(this_one);
-   }
-}
-
-
-
-/******************************************************************************/
-/*                                                                            */
-/* SYM_READ() - Read and relocate a symbol and its aux entry.  Return the     */
-/*              index of the next symbol.                                     */
-/*                                                                            */
-/******************************************************************************/
-int sym_read(int index, SYMENT *sym, AUXENT *aux)
-{
-    /*------------------------------------------------------------------------*/
-    /* READ IN A SYMBOL AND ITS AUX ENTRY.                                    */
-    /*------------------------------------------------------------------------*/
-#if FILE_BASED
-    if (fseek(fin, file_hdr.f_symptr + (index * SYMESZ), 0) != 0 ||
-        fread(sym, SYMESZ, 1, fin) != 1                                ||
-        (sym->n_numaux && fread(aux, SYMESZ, 1, fin) != 1)) 
-      { load_err = E_FILE; return FALSE; }
-#else
-       mem_copy((void*)sym, (void*)&gRxBuffer[file_hdr.f_symptr + (index * SYMESZ)], SYMESZ); 
-    if (sym->n_numaux) 
-    { 
-       mem_copy((void*)aux, (void*)&gRxBuffer[file_hdr.f_symptr + ( (index+1) * SYMESZ)], SYMESZ);
-       load_err = E_FILE; 
-       return FALSE; 
-    }
-#endif
-    if (byte_swapped)
-    {
-        /*--------------------------------------------------------------------*/
-       /* SWAP THE SYMBOL TABLE ENTRY.                                       */
-        /*--------------------------------------------------------------------*/
-        if (sym->n_zeroes == 0) swap4byte(&sym->n_offset);
-        swap4byte(&sym->n_value);
-        swap2byte(&sym->n_scnum);
-        swap2byte(&sym->n_type);
-
-        /*--------------------------------------------------------------------*/
-       /* SWAP THE AUX ENTRY, BASED ON THE STORAGE CLASS.                    */
-        /*--------------------------------------------------------------------*/
-        if (sym->n_numaux) switch(sym->n_sclass)
-        {
-          case C_FILE    : break;
-
-          case C_STRTAG  :
-          case C_UNTAG   :
-          case C_ENTAG   : swap4byte(&aux->x_tag.x_fsize);
-                           swap4byte(&aux->x_tag.x_endndx);
-                           break;
-
-          case C_FCN     : if (!str_comp(sym->n_name, ".bf"))
-                          {
-                              swap2byte(&aux->x_block.x_lcnt);
-                              swap4byte(&aux->x_block.x_regmask); 
-                              swap4byte(&aux->x_block.x_framesize);
-                          }
-                               
-          case C_BLOCK   : swap2byte(&aux->x_block.x_lnno);
-                          swap4byte(&aux->x_block.x_endndx);
-                           break;
-
-          case C_EOS     : swap4byte(&aux->x_eos.x_fsize);
-                           swap4byte(&aux->x_eos.x_tagndx);
-                           break;
-
-          default        : /*-------------------------------------------------*/
-                           /* HANDLE FUNCTION DEFINITION SYMBOL               */
-                           /*-------------------------------------------------*/
-                           if (((sym->n_type >> 4) & 3) == DCT_FCN)
-                           {
-                               swap4byte(&aux->x_func.x_tagndx);
-                               swap4byte(&aux->x_func.x_fsize);
-                               swap4byte(&aux->x_func.x_lnnoptr);
-                               swap4byte(&aux->x_func.x_endndx);
-                           }
-
-                           /*-------------------------------------------------*/
-                           /* HANDLE ARRAYS.                                  */
-                           /*-------------------------------------------------*/
-                           else if (((sym->n_type >> 4) & 3) == DCT_ARY)
-                           {
-                               swap4byte(&aux->x_array.x_tagndx);
-                               swap4byte(&aux->x_array.x_fsize);
-                               swap2byte(&aux->x_array.x_dimen[0]);
-                               swap2byte(&aux->x_array.x_dimen[1]);
-                               swap2byte(&aux->x_array.x_dimen[2]);
-                               swap2byte(&aux->x_array.x_dimen[3]);
-                           }
-
-                           /*-------------------------------------------------*/
-                           /* HANDLE SECTION DEFINITIONS                      */
-                           /*-------------------------------------------------*/
-                           else if (sym->n_type == 0)
-                           {
-                               swap4byte(&aux->x_scn.x_scnlen);
-                               swap2byte(&aux->x_scn.x_nreloc);
-                               swap2byte(&aux->x_scn.x_nlinno);
-                           }
-
-                           /*-------------------------------------------------*/
-                           /* HANDLE MISC SYMBOL RECORD                       */
-                           /*-------------------------------------------------*/
-                           else
-                           {
-                               swap4byte(&aux->x_sym.x_fsize);
-                               swap4byte(&aux->x_sym.x_tagndx);
-                           }
-        }
-    }
-
-    /*------------------------------------------------------------------------*/
-    /* RELOCATE THE SYMBOL, BASED ON ITS STORAGE CLASS.                       */
-    /*------------------------------------------------------------------------*/
-    switch(sym->n_sclass)
-    {
-       case C_SYSTEM  :
-       case C_EXT     :
-       case C_EXTREF  :
-       case C_STAT    :
-       case C_LABEL   :
-       case C_BLOCK   :
-       case C_FCN     : 
-       case C_STATLAB :
-       case C_EXTLAB  :
-         /*------------------------------------------------------------------*/
-         /* IF THE SYMBOL IS UNDEFINED, CALL AN APPLICATION ROUTINE TO LOOK  */
-         /* IT UP IN AN EXTERNAL SYMBOL TABLE.  IF THE SYMBOL IS DEFINED,    */
-         /* RELOCATE IT ACCORDING TO THE SECTION IT IS DEFINED IN.           */
-         /*------------------------------------------------------------------*/
-          if (sym->n_scnum == 0) 
-            lookup_sym((short)index, sym, aux);
-          else if (sym->n_scnum > 0) 
-         {
-            if (sym->n_sclass == C_STATLAB || sym->n_sclass == C_EXTLAB)
-                 sym->n_value += reloc_amount[sym->n_scnum - 1];
-            else sym->n_value += RUN_RELOC_AMOUNT(sym->n_scnum - 1);
-          }
-    }
-
-    return (index + sym->n_numaux + 1);
-}
-
-\f
-/******************************************************************************/
-/*                                                                            */
-/* SYM_NAME() - Return a pointer to the name of a symbol in either the symbol */
-/*              entry or the string table.                                    */
-/*                                                                            */
-/******************************************************************************/
-char *sym_name(SYMENT *symptr)
-{
-    static char temp[9];
-
-    if (symptr->n_zeroes == 0)
-    {
-       STRTAB *packet = str_head;
-
-       /*---------------------------------------------------------------------*/
-       /* Return the empty string if this symbol has no name (offset == 0)    */
-       /*---------------------------------------------------------------------*/
-       if (symptr->n_offset < 4) /* Anything below 4 isn't valid */
-       {
-          temp[0] = 0;
-          return temp;
-       }
-
-       /*---------------------------------------------------------------------*/
-       /* Otherwise, return the string in the string table.                   */
-       /*---------------------------------------------------------------------*/
-       while (packet && symptr->n_offset < (int)packet->offset)
-          packet = packet->next;
-
-       /*---------------------------------------------------------------------*/
-       /* Return the empty string if packet NULL (invalid offset)             */
-       /*---------------------------------------------------------------------*/
-       if (!packet)
-       {
-          temp[0] = 0;
-          return temp;
-       }
-
-       return packet->buf + (symptr->n_offset - packet->offset);
-    }
-    
-    strn_copy(temp, symptr->n_name, 8);
-    temp[8] = 0;
-    return temp;
-}
-
-
-/******************************************************************************/
-/*                                                                            */
-/* SYM_ADD_NAME() - Given a symbol table entry, return a pointer to the       */
-/*                  symbol's name in the string table.  Add the name to the   */
-/*                  table if it's not already there.                          */
-/*                                                                            */
-/******************************************************************************/
-char *sym_add_name(SYMENT *symptr)
-{
-    char *dest;
-    char *result;
-    int i;
-
-    /*------------------------------------------------------------------------*/
-    /* IF THE SYMBOL'S NAME WAS IN THE COFF STRING TABLE, LOOK THROUGH THE    */
-    /* LIST OF STRING TABLE BUFFERS UNTIL FINDING THE ONE THE NAME IS IN,     */
-    /* AND SIMPLY POINT INTO THE BUFFER.                                      */
-    /*------------------------------------------------------------------------*/
-    if (symptr->n_zeroes == 0)
-       return sym_name(symptr);
-
-    /*------------------------------------------------------------------------*/
-    /* OTHERWISE ADD THE STRING TO THE STRING TABLE.                          */
-    /* ALLOCATE AND LINK IN A NEW PACKET IF NECESSARY.  NEW PACKETS ARE       */
-    /* LINKED TO THE HEAD OF THE LIST TO EASE ADDING NEW SYMBOLS.             */
-    /*------------------------------------------------------------------------*/
-    if (!str_head || str_head->index + SYMNMLEN + 1 > str_head->size)
-    {
-       STRTAB *packet;
-
-       if (!(packet = (STRTAB *)malloc(sizeof(STRTAB) + MIN_STRING_ALLOC - 1)))
-          { load_err = E_ALLOC; return NULL; }
-
-       packet->size   = MIN_STRING_ALLOC;
-       packet->index  = 0;
-       packet->next   = str_head;
-       packet->offset = str_head ? (str_head->offset + str_head->size) : 4;
-       str_head       = packet;
-    }
-
-    /*------------------------------------------------------------------------*/
-    /* COPY THE NAME INTO THE STRING TABLE.                                   */
-    /*------------------------------------------------------------------------*/
-    result = dest = str_head->buf + str_head->index; 
-    for (i = 0; *dest++ = symptr->n_name[i++]; )
-       if (i == SYMNMLEN) { *dest++ = '\0'; ++i; break; }
-
-    symptr->n_zeroes = 0;
-    symptr->n_offset = str_head->offset + str_head->index;
-    str_head->index += i;
-    return result;
-}
-#endif
-
-/******************************************************************************/
-/*                                                                            */
-/* RELOC_ADD() - Add an entry to the relocation symbol table.  This table     */
-/*               stores relocation information for each relocatable symbol.   */
-/*                                                                            */
-/******************************************************************************/
-int reloc_add(int index, SYMENT *sym)
-{
-   int disp;                            /* RELOCATION AMOUNT FOR THIS SYMBOL */
-
-   if (!need_reloc) return TRUE;
-
-   /*-------------------------------------------------------------------------*/
-   /* USE THE SYMBOL VALUE TO CALCULATE THE RELOCATION AMOUNT:                */
-   /* 1) IF THE SYMBOL WAS UNDEFINED (DEFINED IN SECTION 0), USE THE          */
-   /*    SYMBOL'S VALUE.                                                      */
-   /* 2) IF THE SYMBOL HAS A POSITIVE SECTION NUMBER, USE THE RELOCATION      */
-   /*    AMOUNT FOR THE SECTION IN WHICH THE SYMBOL IS DEFINED.               */
-   /* 3) OTHERWISE, THE SYMBOL IS ABSOLUTE, SO THE RELOCATION AMOUNT IS 0.    */
-   /*-------------------------------------------------------------------------*/
-   if (sym->n_scnum == 0)
-      disp = sym->n_value;
-   else if (sym->n_scnum > 0)
-   {
-      if (sym->n_sclass == C_STATLAB || sym->n_sclass == C_EXTLAB)
-          disp = reloc_amount[sym->n_scnum - 1];
-      else disp = RUN_RELOC_AMOUNT(sym->n_scnum - 1);
-   }
-   else disp = 0;
-
-   /*-------------------------------------------------------------------------*/
-   /* IF THERE IS A NON-ZERO RELOCATION AMOUNT, ADD THE SYMBOL TO THE TABLE.  */
-   /*-------------------------------------------------------------------------*/
-   if (disp == 0) return TRUE;
-
-   if (reloc_sym_index >= reloc_tab_size)
-   {
-      reloc_tab_size += RELOC_GROW_SIZE;
-      reloc_tab = (RELOC_TAB *)realloc((char *)reloc_tab, 
-                                       reloc_tab_size*sizeof(RELOC_TAB));
-
-      if (!reloc_tab) { load_err = E_ALLOC; return FALSE; }
-   }
-   reloc_tab[reloc_sym_index  ].rt_index = index;
-   reloc_tab[reloc_sym_index++].rt_disp  = disp;
-
-   return TRUE;
-}
-
-/******************************************************************************/
-/*                                                                            */
-/* RELOCATE() - Perform a single relocation by patching the raw data.         */
-/*                                                                            */
-/******************************************************************************/
-int relocate(RELOC *rp, unsigned char *data, int s)
-{
-/*   RELOC         *rp;                    RELOCATION ENTRY                   */
-/*   unsigned char *data;                  DATA BUFFER                        */
-/*   int            s;                     INDEX OF CURRENT SECTION           */
-   int fieldsz = reloc_size(rp->r_type);     /* SIZE OF ACTUAL PATCH VALUE    */
-   int offset  = reloc_offset(rp->r_type);   /* OFFSET OF ACTUAL PATCH VALUE  */
-   int wordsz  = MAX(fieldsz, reloc_stop(rp->r_type)); /* SIZE CONTAINING FLD */
-   int objval;                              /* FIELD TO BE PATCHED           */
-   int reloc_amt;                           /* AMOUNT OF RELOCATION          */
-
-   int pp_shift_cnt = 0;
-   int pp_local     = FALSE;
-
-   if (rp->r_type == R_ABS) return TRUE;          /* NOTHING TO DO   */
-
-   /*-------------------------------------------------------------------------*/
-   /* DETERMINE THE RELOCATION AMOUNT FROM THE RELOCATION SYMBOL TABLE.       */
-   /*-------------------------------------------------------------------------*/
-   reloc_amt = (rp->r_symndx == -1) ? RUN_RELOC_AMOUNT(s) 
-                                   : sym_reloc_amount(rp);
-
-   /*-------------------------------------------------------------------------*/
-   /* EXTRACT THE RELOCATABLE FIELD FROM THE OBJECT DATA.                     */
-   /*-------------------------------------------------------------------------*/
-   objval = unpack(data, fieldsz, wordsz, offset + BIT_OFFSET(rp->r_vaddr));
-
-   /*-------------------------------------------------------------------------*/
-   /* MODIFY THE FIELD BASED ON THE RELOCATION TYPE.                          */
-   /*-------------------------------------------------------------------------*/
-   switch (rp->r_type)
-   {
-      /*----------------------------------------------------------------------*/
-      /* NORMAL RELOCATIONS: ADD IN THE RELOCATION AMOUNT.                    */
-      /*----------------------------------------------------------------------*/
-      case R_RELBYTE:
-      case R_RELWORD:
-      case R_REL24:
-      case R_RELLONG:
-      case R_DIR32:
-      case R_PARTLS16:
-        objval += reloc_amt;
-        break;
-
-      /*--------------------------------------------------------------------*/
-      /* ADD IN THE RELOCATION AMOUNT, BUT MAKE SURE WE'RE STILL IN THE     */
-      /* 370'S REGISTER FILE.                                               */
-      /*--------------------------------------------------------------------*/
-      case R_RRNREG:
-      case R_RRRELREG:
-        if (rp->r_type == R_RRNREG)
-           objval = ((char)objval + reloc_amt);
-        else objval += reloc_amt;
-         if (objval & ((-1L >> 8*fieldsz) << 8*fieldsz))
-         {
-           /* ERROR */
-         }
-         break;
-      /*--------------------------------------------------------------------*/
-      /* PP UNSCALED 15-BIT OFFSET RELOCATION.                              */
-      /*--------------------------------------------------------------------*/
-      case R_PP15    :
-      case R_PPL15   :
-      case R_PPN15   :
-      case R_PPLN15  :
-        {
-           int  bit;
-           char *sname = (SECT_HDR(s)->s_zeroes == 0L) ?
-                         SECT_HDR(s)->s_nptr : SNAMECPY(SECT_HDR(s)->s_name);
-
-           pp_local = (rp->r_type == R_PPL15) || (rp->r_type == R_PPLN15);
-
-           /*--------------------------------------------------------------*/
-           /* IF NEGATIVE RELOC TYPE, THEN TREAT CONST OFFSET AS A NEGATIVE*/
-           /*--------------------------------------------------------------*/
-           if (rp->r_type == R_PPN15 || rp->r_type == R_PPLN15)
-           {
-               objval      = -objval;
-                rp->r_type -= 010;           /* CHANGE TYPE TO NON NEG.     */
-            }
-
-           objval += reloc_amt;
-
-           /*--------------------------------------------------------------*/
-            /* IF THE ADDRESS STILL FALLS WITHIN AN APPROPRIATE RANGE       */
-           /*--------------------------------------------------------------*/
-           if ((objval >= 0x00000000 && objval <= 0x00007fff) || 
-               (objval >= 0x01000000 && objval <= 0x010007ff) )
-               break;
-
-           /*--------------------------------------------------------------*/
-            /* IF THE ADDRESS FALLS OUTSIDE AN APPROPRIATE RANGE, BUT CAN   */
-           /* BE SCALED BY SIZE TO GET BACK INTO RANGE, THEN READ THE UPPER*/
-           /* BIT OF THE SIZE FIELD.  IF IT IS A 1, THEN WE CAN SCALE THIS */
-           /* OFFSET BY 4, IF IT IS 0, THEN WE CAN SCALE THIS OFFSET BY 2. */ 
-           /*--------------------------------------------------------------*/
-           bit = unpack(data, 1, 64, pp_local ? 30 : 8);
-           /*--------------------------------------------------------------*/
-           /* DETERMINE IF THE OFFSET IS ALIGNED FOR SCALING.  IF SO,      */
-           /* THEN PACK THE SCALED OFFSET INTO INSTRUCTION, CHANGE THE     */
-           /* RELOC TYPE TO SCALED, AND TURN ON SCALE BIT IN INSTRUCT.     */
-           /*--------------------------------------------------------------*/
-           if (!(objval & ((2<<bit)-1)) && 
-                (objval >>= (bit+1)) >= 0 && objval <= 0x7fff)
-           {
-               rp->r_type = pp_local ? (bit ? R_PPL15W : R_PPL15H) : 
-                                       (bit ? R_PP15W : R_PP15H);
-               repack(1, data, 1, 64, pp_local ? 28 : 6);
-               break;
-           }
-           
-           /*--------------------------------------------------------------*/
-           /* ERROR, THE OFFSET WILL NOT FIT SCALED OR UNSCALED.           */
-           /*--------------------------------------------------------------*/
-           
-           load_err = E_RELOCENT;
-           return FALSE;
-         }
-
-      /*--------------------------------------------------------------------*/
-      /* PP SCALED 15-BIT OFFSET RELOCATION. FOR R_PP15W THE RELOC_AMT IS   */
-      /* DIVIDED BY 4.  FOR R_PP15H THE RELOC_AMT IS DIVIDED BY 2.          */ 
-      /*--------------------------------------------------------------------*/
-      case R_PP15W   :
-      case R_PPL15W  :
-      case R_PPN15W  :
-      case R_PPLN15W : pp_shift_cnt++;   /* FALL THROUGH */
-
-      case R_PP15H   :
-      case R_PPL15H  :
-      case R_PPN15H  :
-      case R_PPLN15H :  pp_shift_cnt++;   /* FALL THROUGH */
-        {
-           int obj_addr_x;
-           char *sname = (SECT_HDR(s)->s_zeroes == 0) ? 
-                         SECT_HDR(s)->s_nptr : SNAMECPY(SECT_HDR(s)->s_name);
-
-           /*--------------------------------------------------------------*/
-           /* NOTE THAT THIS IS DEPENDENT ON THE NUMBERING OF THESE RELOC  */
-           /* VALUES.                                                      */
-           /*--------------------------------------------------------------*/
-           pp_local = (rp->r_type & 4);
-
-           /*--------------------------------------------------------------*/
-           /* IF NEGATIVE RELOC TYPE, THEN TREAT CONST OFFSET AS NEGATIVE  */
-           /*--------------------------------------------------------------*/
-           if (rp->r_type >= R_PPN15) 
-           {
-               objval      = -objval;
-                rp->r_type -= 010;           /* CHANGE TYPE TO NON NEG.     */
-            }
-
-           obj_addr_x = (objval << pp_shift_cnt) + reloc_amt;
-
-           /*--------------------------------------------------------------*/
-            /* LINK TIME ADDRESS VIOLATES THE SCALING FACTOR WE ARE USING   */
-           /* FOR THIS OPERAND. UNSCALE THE VALUE IF IT WILL FIT IN 15 BITS*/
-           /* BY CHANGING RELOC TYPE TO UNSCALED, AND CHANGING SCALE BIT   */
-           /* IN THE INSTRUCTION.                                          */
-           /*--------------------------------------------------------------*/
-           if (pp_shift_cnt && (reloc_amt & ((1<<pp_shift_cnt)-1)))
-           {
-               objval     = obj_addr_x;
-               rp->r_type = (pp_local ? R_PPL15 : R_PP15);
-               repack(0, data, 1, 64, pp_local ? 28 : 6);
-           }
-           else objval = obj_addr_x >> pp_shift_cnt;
-
-           /*--------------------------------------------------------------*/
-            /* IF THE ADDRESS STILL FALLS WITHIN AN APPROPRIATE RANGE       */
-           /*--------------------------------------------------------------*/
-           if ((objval     >= 0x00000000  && objval     <= 0x00007fff) || 
-               (obj_addr_x >= 0x01000000  && obj_addr_x <= 0x010007ff) )
-               break;
-
-           /*--------------------------------------------------------------*/
-           /* ERROR, THE OFFSET WILL NOT FIT SCALED OR UNSCALED.           */
-           /*--------------------------------------------------------------*/
-           
-           load_err = E_RELOCENT;
-           return FALSE;
-         }
-
-      /*--------------------------------------------------------------------*/
-      /* PP 16-bit byte offset relocation. For R_PP16B the lower 15-bits    */
-      /* are handled just like R_PP15, and the upper bit is placed in the   */
-      /* scale indicator bit of the field.                                  */
-      /*--------------------------------------------------------------------*/
-      case R_PP16B   :
-      case R_PPL16B  :
-      case R_PPN16B  :
-      case R_PPLN16B :
-        {
-           char *sname = (SECT_HDR(s)->s_zeroes == 0) ? 
-                         SECT_HDR(s)->s_nptr : SNAMECPY(SECT_HDR(s)->s_name);
-
-           pp_local = (rp->r_type == R_PPL16B) || (rp->r_type == R_PPLN16B);
-
-            /*--------------------------------------------------------------*/
-           /* READ THE SCALE BIT (16th BIT) AND CREATE 16 BIT CONSTANT OFF */
-            /*--------------------------------------------------------------*/
-           objval |= (unpack(data, 1, 64, pp_local ? 28 : 6) << 15);
-
-           /*--------------------------------------------------------------*/
-           /* IF NEGATIVE RELOC TYPE, THEN TREAT CONST OFFSET AS NEGATIVE  */
-           /*--------------------------------------------------------------*/
-           if (rp->r_type == R_PPN16B || rp->r_type == R_PPLN16B)
-           {
-              objval      = - objval;
-               rp->r_type -= 010; /* CHANGE THE TYPE TO A NON NEG TYPE.     */
-            }
-
-           objval += reloc_amt;
-
-           /*--------------------------------------------------------------*/
-            /* IF THE ADDRESS STILL FALLS WITHIN AN APPROPRIATE RANGE       */
-           /*--------------------------------------------------------------*/
-           if ((objval >= 0x00000000 && objval <= 0x0000ffff) || 
-               (objval >= 0x01000000 && objval <= 0x010007ff) )
-           {
-              /*-----------------------------------------------------------*/
-              /* RELOCATE THE 16TH BIT OF THE ADDRESS.                     */
-              /*-----------------------------------------------------------*/
-              repack(((objval&0x8000) >> 15), data, 1, 64, pp_local ? 28 : 6);
-              break;
-            }
-
-           /*--------------------------------------------------------------*/
-            /* ADDRESS IS OUT OF RANGE.                                     */
-           /*--------------------------------------------------------------*/
-           
-           load_err = E_RELOCENT;
-           return FALSE;
-         }
-
-      /*--------------------------------------------------------------------*/
-      /* PP BASE ADDRESS RELOCATION.  BIT 0 IS 0 IF IN DATA RAM, 1 IF IN    */
-      /* PARAMETER RAM.  THIS CODE ASSUMES THAT WE DO NOT RELOCATE FROM     */
-      /* PRAM TO DRAM OR FROM DRAM TO PRAM AT LOAD TIME.                    */
-      /*--------------------------------------------------------------------*/
-      case R_PPLBASE: pp_local = TRUE;
-      case R_PPBASE:
-         {
-          /*---------------------------------------------------------------*/
-          /* IF WAS DRAM AND RELOC_AMT IS GREAT ENOUGH TO MOVE INTO PRAM,  */
-          /* CHANGE TO PRAM                                                */
-          /*---------------------------------------------------------------*/
-          if (!objval && reloc_amt > (int)(0x01000000 - 0xC000)) objval = 1;
-
-          /*---------------------------------------------------------------*/
-          /* IF WAS PRAM AND RELOC_AMT IS NEGATIVE AND CAN MOVE INTO DRAM, */
-          /* CHANGE TO DRAM                                                */
-          /*---------------------------------------------------------------*/
-          else if (objval && (-reloc_amt) > (int)(0x01000000 - 0xC000))
-              objval = 0;
-
-          break;
-         }
-
-      /*----------------------------------------------------------------------*/
-      /* 34010 ONE'S COMPLEMENT RELOCATION.  SUBTRACT INSTEAD OF ADD.         */
-      /*----------------------------------------------------------------------*/
-      case R_OCRLONG:
-        objval -= reloc_amt;
-        break;
-
-      /*----------------------------------------------------------------------*/
-      /* 34020 WORD-SWAPPED RELOCATION.  SWAP BEFORE RELOCATING.              */
-      /*----------------------------------------------------------------------*/
-      case R_GSPOPR32:
-      case R_OCBD32:
-          objval  = ((objval >> 16) & 0xFFFF) | (objval << 16); 
-          objval += (rp->r_type == R_GSPOPR32) ? reloc_amt : -reloc_amt; 
-          objval  = ((objval >> 16) & 0xFFFF) | (objval << 16);
-          break; 
-
-      /*----------------------------------------------------------------------*/
-      /* PC-RELATIVE RELOCATIONS.  IN THIS CASE THE RELOCATION AMOUNT         */
-      /* IS ADJUSTED BY THE PC DIFFERENCE.   IF THIS IS AN INTERNAL           */
-      /* RELOCATION TO THE CURRENT SECTION, NO ADJUSTMENT IS NEEDED.          */
-      /*----------------------------------------------------------------------*/
-      case R_PCRBYTE:
-      case R_PCRWORD:
-      case R_GSPPCR16:
-      case R_GSPPCA16:
-      case R_PCRLONG:
-      case R_PCR24:
-      case R_ANKPCR16:
-      case R_ANKPCR8:
-         {
-            int           shift = 8 * (4 - fieldsz);
-           unsigned int pcdif = RUN_RELOC_AMOUNT(s);
-
-           /*----------------------------------------------------------------*/
-           /* HANDLE SPECIAL CASES OF JUMPING FROM ABSOLUTE SECTIONS (SPECIAL*/
-           /* RELOC TYPE) OR TO ABSOLUTE DESTINATION (SYMNDX == -1).  IN     */
-           /* EITHER CASE, SET THE APPROPRIATE RELOCATION AMOUNT TO 0.       */
-           /*----------------------------------------------------------------*/
-           if( rp->r_symndx == -1 )      reloc_amt = 0;
-           if( rp->r_type == R_GSPPCA16) pcdif = 0;
-
-            /*----------------------------------------------------------------*/
-            /* Handle ankoor's offset where upper 14 (PCR8) and upper 6(PCR16)*/
-            /* bits of 22 bit address is held in r_disp field of reloc entry  */
-            /*----------------------------------------------------------------*/
-            if(rp->r_type == R_ANKPCR8 || rp->r_type == R_ANKPCR16)
-            {
-                shift = 10;
-                objval |= rp->r_disp << ((rp->r_type == R_ANKPCR8) ? 8 : 16);
-            }
-
-           reloc_amt -= pcdif;
-
-            if (rp->r_type == R_GSPPCR16 || rp->r_type == R_GSPPCA16)
-              reloc_amt >>= 4;                              /* BITS TO WORDS */
-
-           objval  = (int)(objval << shift) >> shift;      /* SIGN EXTEND   */
-           objval += reloc_amt;
-            break;
-         }
-
-      /*--------------------------------------------------------------------*/
-      /* Ankoor page-addressing.  Calculate address from the 22-bit         */
-      /* value in the relocation field plus the relocation amount. Shift    */
-      /* out the lower 16 bits.                                             */
-      /*--------------------------------------------------------------------*/
-      case R_PARTMS6:
-          objval = (objval & 0xC0) |
-                   (((rp->r_disp += reloc_amt) >> 16) & 0x3F);
-          break;
-
-      /*----------------------------------------------------------------------*/
-      /* 320C30 PAGE-ADDRESSING RELOCATION.  CALCULATE THE ADDRESS FROM       */
-      /* THE 8-BIT PAGE VALUE IN THE FIELD, THE 16-BIT OFFSET IN THE RELOC    */
-      /* ENTRY, AND THE RELOCATION AMOUNT.  THEN, STORE THE 8-BIT PAGE        */
-      /* VALUE OF THE RESULT BACK IN THE FIELD.                               */
-      /*----------------------------------------------------------------------*/
-      case R_PARTMS8:
-         objval = (int)((objval << 16) + rp->r_disp + reloc_amt) >> 16;
-         break;
-
-      /*----------------------------------------------------------------------*/
-      /* DSP(320) PAGE-ADDRESSING.  CALCULATE ADDRESS FROM THE 16-BIT         */
-      /* VALUE IN THE RELOCATION FIELD PLUS THE RELOCATION AMOUNT.  OR THE    */
-      /* TOP 9 BITS OF THIS RESULT INTO THE RELOCATION FIELD.                 */
-      /*----------------------------------------------------------------------*/
-      case R_PARTMS9:
-         objval = (objval & 0xFE00) | 
-                  (((int)(rp->r_disp + reloc_amt) >> 7) & 0x1FF);
-          break;
-
-      /*----------------------------------------------------------------------*/
-      /* DSP(320) PAGE-ADDRESSING.  CALCULATE ADDRESS AS ABOVE, AND OR THE    */
-      /* 7-BIT DISPLACEMENT INTO THE FIELD.                                   */
-      /*----------------------------------------------------------------------*/
-      case R_PARTLS7:
-         objval = (objval & 0x80) | ((rp->r_disp + reloc_amt) & 0x7F);
-         break;
-
-      /*--------------------------------------------------------------------*/
-      /* Ankoor page-addressing.  Calculate address from the 22-bit         */
-      /* value in the relocation field plus the relocation amount. Mask off */
-      /* bits [21:16] and [5:0] to extract a data page within a 64K page    */
-      /*--------------------------------------------------------------------*/
-      case R_PARTMID10:
-          objval = (objval & 0xFC00) |
-                   (((rp->r_disp += reloc_amt) >> 6) & 0x3FF);
-          break;
-
-      /*--------------------------------------------------------------------*/
-      /* RR(370) MSB RELOCATION.  CALCULATE ADDRESS FROM THE 16-BIT VALUE   */
-      /* IN THE RELOCATION ENTRY PLUS THE RELOCATION AMOUNT.  PATCH THE     */
-      /* MSB OF THE RESULT INTO THE RELOCATION FIELD.                       */
-      /*--------------------------------------------------------------------*/
-      case R_HIWORD:
-         objval += (rp->r_disp += (unsigned short)reloc_amt) >> 8;
-         break;
-
-      /*--------------------------------------------------------------------*/
-      /* C8+ High byte of 24-bit address.  Calculate address from 24-bit    */
-      /* value in the relocation entry plus the relocation amount.  Patch   */
-      /* the MSB of the result into the relocation field.                   */
-      /*--------------------------------------------------------------------*/
-      case R_C8PHIBYTE:
-          objval = (int)((objval << 16) + rp->r_disp + reloc_amt) >> 16;
-          break;
-
-      /*--------------------------------------------------------------------*/
-      /* C8+ Middle byte of 24-bit address.  Calculate address from 24-bit  */
-      /* value in the relocation entry plus the relocation amount.  Patch   */
-      /* the middle byte of the result into the relocation field.           */
-      /*--------------------------------------------------------------------*/
-      case R_C8PMIDBYTE:
-          objval = (int)((objval << 16) + rp->r_disp + reloc_amt) >> 8;
-          break;
-
-      /*--------------------------------------------------------------------*/
-      /* C8+ Vector Address.  Calculate address from 24-bit value in the    */
-      /* relocation entry plus the relocation amount.  MSB must be 0xFF     */
-      /* since interrupt and trap handlers must be programmed in the top-   */
-      /* most segment of memory.  Patch bottom 16-bits of the result into   */
-      /* the relocation field.                                              */
-      /*--------------------------------------------------------------------*/
-      case R_C8PVECADR:
-          objval += reloc_amt;
-          if ((objval & 0xFF0000) != 0xFF0000)
-          {
-            /* ERROR */
-          }
-          objval &= 0xFFFF;
-          break;
-
-      /*----------------------------------------------------------------------*/
-      /* C8+ 24-bit Address.  The byte ordering for 24-bit addresses on the   */
-      /* C8+ is reversed (low, middle, high).  Needs to be unordered, add     */
-      /* in reloc_amt, then re-ordered.                                       */
-      /*----------------------------------------------------------------------*/
-      case R_C8PADR24:
-          objval = ((objval>>16) | (objval&0xff00) | ((objval&0xff)<<16));
-          objval += reloc_amt;
-          objval = ((objval>>16) | (objval&0xff00) | ((objval&0xff)<<16));
-          break;
-
-      /*----------------------------------------------------------------------*/
-      /* DSP(320) 13-BIT CONSTANT.  RELOCATE ONLY THE LOWER 13 BITS OF THE    */
-      /* FIELD.                                                               */
-      /*----------------------------------------------------------------------*/
-      case R_REL13:
-          objval = (objval & 0xE000) | ((objval + reloc_amt) & 0x1FFF);
-          break;
-
-      /*--------------------------------------------------------------------*/
-      /* ANKOOR 22-bit extended address.  Calculate address by masking      */
-      /* off the opcode and OR in the lower 16-bit constant + the           */
-      /* amount.                                                            */
-      /*--------------------------------------------------------------------*/
-      case R_REL22:
-         {
-            unsigned int obj_hi = unpack(data  , 16, 16, 0);
-            unsigned int obj_lo = unpack(data+2, 16, 16, 0);
-
-            /*--------------------------------------------------------------*/
-            /* BUILD THE OFFSET TO BE RELOCATED.                            */
-            /*--------------------------------------------------------------*/
-            objval = ((obj_hi & 0x003F) << 16) | (obj_lo & 0xFFFF);
-
-            /*--------------------------------------------------------------*/
-            /* Calculate displacement                                       */
-            /*--------------------------------------------------------------*/
-            objval += reloc_amt;
-
-            /*--------------------------------------------------------------*/
-            /* REPACK THE RELOCATED VALUE BACK IN THE OBJECT VALUE.         */
-            /*--------------------------------------------------------------*/
-            obj_hi = (obj_hi & 0xFFC0) | ((objval & 0x3F0000) >> 16);
-            obj_lo = objval & 0xFFFF;
-            repack(obj_hi, data  , 16, 16, 0);
-            repack(obj_lo, data+2, 16, 16, 0);
-
-            return TRUE;
-         }
-
-      /*--------------------------------------------------------------------*/
-      /* DSP, LEAD 23-bit extended address.  Calculate address by masking   */
-      /* off the opcode and OR in the lower 16-bit constant + the           */
-      /* amount.                                                            */
-      /*--------------------------------------------------------------------*/
-      case R_REL23:
-         {
-            unsigned int obj_hi = unpack(data  , 16, 16, 0);
-            unsigned int obj_lo = unpack(data+2, 16, 16, 0);
-
-            /*--------------------------------------------------------------*/
-            /* BUILD THE OFFSET TO BE RELOCATED.                            */
-            /*--------------------------------------------------------------*/
-            objval = ((obj_hi & 0x007F) << 16) | (obj_lo & 0xFFFF);
-
-            /*--------------------------------------------------------------*/
-            /* Calculate displacement                                       */
-            /*--------------------------------------------------------------*/
-            objval += reloc_amt;
-
-            /*--------------------------------------------------------------*/
-            /* REPACK THE RELOCATED VALUE BACK IN THE OBJECT VALUE.         */
-            /*--------------------------------------------------------------*/
-            obj_hi = (obj_hi & 0xFF80) | ((objval & 0x7F0000) >> 16);
-            obj_lo = objval & 0xFFFF;
-            repack(obj_hi, data  , 16, 16, 0);
-            repack(obj_lo, data+2, 16, 16, 0);
-
-            return TRUE;
-         }
-
-
-      /*----------------------------------------------------------------------*/
-      /* PRISM (370/16) code label relocation.  Convert word address to byte  */
-      /* address, add in relocation, convert back to word address.            */
-      /*----------------------------------------------------------------------*/
-      case R_LABCOD:
-         objval = ((objval << 1) + reloc_amt) >> 1;
-         break;
-   }
-
-   /*-------------------------------------------------------------------------*/
-   /* PACK THE RELOCATED FIELD BACK INTO THE OBJECT DATA.                     */
-   /*-------------------------------------------------------------------------*/
-   repack(objval, data, fieldsz, wordsz, offset + BIT_OFFSET(rp->r_vaddr));
-   return TRUE;
-} 
-
-
-/******************************************************************************/
-/*                                                                            */
-/* RELOC_READ() - Read a single relocation entry.                             */
-/*                                                                            */
-/******************************************************************************/
-#if FILE_BASED
-int reloc_read(RELOC *rptr)
-#else
-int reloc_read(RELOC *rptr, unsigned int offset)
-#endif
-{
-#if COFF_VERSION_1 || COFF_VERSION_2
-   /*------------------------------------------------------------------------*/
-   /* THE FOLLOWING UNION IS USED TO READ IN VERSION 0 OR 1 RELOC ENTRIES    */
-   /*------------------------------------------------------------------------*/
-   /* THE FORMAT OF RELOCATION ENTRIES CHANGED BETWEEN COFF VERSIONS 0 AND 1.*/
-   /* VERSION 0 HAS A 16 BIT SYMBOL INDEX, WHILE VERSION 1 HAS A 32 BIT INDX.*/
-   /*------------------------------------------------------------------------*/
-   union { RELOC new_c; RELOC_OLD old; } input_entry;
-#if FILE_BASED
-   if (fread(&input_entry, RELSZ_IN(coff_version), 1, fin) != 1)
-      { load_err = E_FILE; return FALSE; }
-#else
-       mem_copy((void*)&input_entry, (void*)&gRxBuffer[offset], RELSZ_IN(coff_version));
-#endif
-   /*------------------------------------------------------------------------*/
-   /* IF LOADING A VERSION 0 FILE, TRANSLATE ENTRY TO VERSION 1 FORMAT.      */
-   /* (THIS COULD BE SIMPLER - ALL THE SWAPS EXCEPT FOR THE SYMBOL INDEX     */
-   /* COULD BE DONE AFTER THE TRANSLATION - BUT THIS SEEMS TO BE CLEARER)    */
-   /*------------------------------------------------------------------------*/
-   if (ISCOFF_0(coff_version))
-   {
-      if (byte_swapped)
-      {
-         swap4byte(&input_entry.old.r_vaddr);
-        swap2byte(&input_entry.old.r_type);
-
-        /* if a field reloc, fields are chars, so don't swap */
-        if (!isfldrel(input_entry.old.r_type))
-        {
-            swap2byte(&input_entry.old.r_symndx);
-            swap2byte(&input_entry.old.r_disp);
-        }
-      }
-
-      rptr->r_vaddr  = input_entry.old.r_vaddr;
-      rptr->r_symndx = input_entry.old.r_symndx;
-      rptr->r_disp   = input_entry.old.r_disp;
-      rptr->r_type   = input_entry.old.r_type;
-   }
-   else
-   {
-      *rptr = input_entry.new_c;
-
-      if (byte_swapped)
-      {
-         swap4byte(&rptr->r_vaddr); 
-        swap2byte(&rptr->r_type);
-
-        /* Again, if a field reloc, fields are chars, so don't swap */
-        if (!isfldrel(rptr->r_type))
-        {
-            swap4byte(&rptr->r_symndx);
-            swap2byte(&rptr->r_disp);  
-        }
-      }
-   }
-
-#else
-   /*-------------------------------------------------------------------------*/
-   /* READ IN AND BYTE SWAP AN VERSION 0 RELOC ENTRY                          */
-   /*-------------------------------------------------------------------------*/
-   if (fread(rptr, RELSZ, 1, fin) != 1) { load_err = E_FILE; return FALSE; }
-
-   if (byte_swapped)
-   {
-      swap4byte(&rptr->r_vaddr);
-      swap2byte(&rptr->r_type);  
-
-      /* If a field reloc, fields are chars, so don't swap */
-      if (!isfldrel(rptr->r_type))
-      {
-         swap2byte(&rptr->r_symndx);
-         swap2byte(&rptr->r_disp);
-      }
-   }
-#endif
-
-   return TRUE;
-}
-
-
-/*************************************************************************/
-/*                                                                       */
-/*   RELOC_SIZE()-                                                       */
-/*      Return the field size of a relocation type.                      */
-/*                                                                       */
-/*************************************************************************/
-
-int reloc_size(int type)
-{
-   switch (type)
-   {
-       case R_PPBASE:
-       case R_PPLBASE:      return 1;
-
-       case R_HIWORD:
-       case R_C8PHIBYTE:
-       case R_C8PMIDBYTE:
-       case R_RELBYTE:
-       case R_PCRBYTE:
-       case R_RRNREG:
-       case R_RRRELREG:
-       case R_ANKPCR8:
-       case R_PARTLS6:
-       case R_PARTMS6:
-       case R_PARTLS7:      return 8;
-
-       case R_PP15:
-       case R_PP15W:
-       case R_PP15H:
-       case R_PP16B:
-       case R_PPN15:
-       case R_PPN15W:
-       case R_PPN15H:
-       case R_PPN16B:
-       case R_PPL15:
-       case R_PPL15W:
-       case R_PPL15H:
-       case R_PPL16B:
-       case R_PPLN15:
-       case R_PPLN15W:
-       case R_PPLN15H:
-       case R_PPLN16B:      return 15;
-
-       case R_LABCOD:
-       case R_RELWORD:
-       case R_PCRWORD:
-       case R_ANKPCR16:
-       case R_GSPPCR16:
-       case R_GSPPCA16:
-       case R_PARTLS16:
-       case R_PARTMS8:
-       case R_PARTMS9:
-       case R_PARTMID10:
-       case R_PARTMS16:
-       case R_REL22:
-       case R_REL13:        
-       case R_C8PVECADR:    return 16;
-
-       case R_REL24:
-       case R_PCR24:
-       case R_PCR24W:
-      case R_C8PADR24:      return 24;
-
-       case R_MPPCR:
-       case R_GSPOPR32:
-       case R_RELLONG:
-       case R_PCRLONG:
-       case R_OCBD32:
-       case R_OCRLONG:
-       case R_DIR32:        return 32;
-
-       default:             return 0;
-   }
-}
-
-
-/*************************************************************************/
-/*                                                                       */
-/*   RELOC_OFFSET()-                                                     */
-/*      Return the offset of a relocation type field.  The value of      */
-/*      offset should be the bit offset of the LSB of the field in       */
-/*      little-endian mode.                                              */
-/*                                                                       */
-/*************************************************************************/
-
-int reloc_offset(int type)
-{
-   switch (type)
-   {
-       case R_PP15    :
-       case R_PP15W   :
-       case R_PP15H   :
-       case R_PP16B   :
-       case R_PPN15   :
-       case R_PPN15W  :
-       case R_PPN15H  :
-       case R_PPN16B  :
-       case R_PPLBASE :     return 22;
-
-       case R_PPL15   :
-       case R_PPL15W  :
-       case R_PPL15H  :
-       case R_PPL16B  :
-       case R_PPLN15  :
-       case R_PPLN15W :
-       case R_PPLN15H :
-       case R_PPLN16B :
-       case R_PPBASE  :     return 0;
-
-       default        :     return 0;
-   }
-}
-
-
-/*************************************************************************/
-/*                                                                       */
-/*   RELOC_STOP() -                                                      */
-/*      Return the number of bits to read for a relocation type.         */
-/*                                                                       */
-/*************************************************************************/
-
-int reloc_stop(int type)
-{
-   switch (type)
-   {
-       case R_PPBASE  :
-       case R_PPLBASE :
-
-       case R_PP15    :
-       case R_PP15W   :
-       case R_PP15H   :
-       case R_PP16B   :
-
-       case R_PPL15   :
-       case R_PPL15W  :
-       case R_PPL15H  :
-       case R_PPL16B  :
-
-       case R_PPN15   :
-       case R_PPN15W  :
-       case R_PPN15H  :
-       case R_PPN16B  :
-
-       case R_PPLN15  :
-       case R_PPLN15W :
-       case R_PPLN15H :
-       case R_PPLN16B :   return 64;
-
-       default       :    return WORDSZ * 8;
-   }
-}
-
-
-/******************************************************************************/
-/*                                                                            */
-/* SYM_RELOC_AMOUNT() - Determine the amount of relocation for a particular   */
-/*                      relocation entry.  Search the relocation symbol table */
-/*                      for the referenced symbol, and return the amount from */
-/*                      the table.                                            */
-/*                                                                            */
-/******************************************************************************/
-int sym_reloc_amount(RELOC *rp)
-{
-   int index = rp->r_symndx;
-
-   int i = 0,
-       j = reloc_sym_index - 1;
-
-   /*-------------------------------------------------------------------------*/
-   /* THIS IS A SIMPLE BINARY SEARCH (THE RELOC TABLE IS ALWAYS SORTED).      */
-   /*-------------------------------------------------------------------------*/
-   while (i <= j)
-   {
-      int m = (i + j) / 2;
-      if      (reloc_tab[m].rt_index < index) i = m + 1;
-      else if (reloc_tab[m].rt_index > index) j = m - 1;
-      else return reloc_tab[m].rt_disp;                              /* FOUND */
-   }
-
-   /*-------------------------------------------------------------------------*/
-   /* IF NOT FOUND, SYMBOL WAS NOT RELOCATED.                                 */
-   /*-------------------------------------------------------------------------*/
-   return 0;
-}
-
-
-/******************************************************************************/
-/*                                                                            */
-/*  UNPACK() - Extract a relocation field from object bytes and convert into  */
-/*             a int so it can be relocated.                                 */
-/*                                                                            */
-/******************************************************************************/
-unsigned int unpack(unsigned char *data, int fieldsz, int wordsz, int bit_offset)
-{
-   register int  i;
-   unsigned int objval;
-   int           start;                       /* MS byte with reloc data      */
-   int           stop;                        /* LS byte with reloc data      */
-   int           r  = bit_offset & 7;         /* num unused LS bits in stop   */
-   int           l  = 8 - r;                  /* num used   MS bits in stop   */
-   int           tr = ((bit_offset+fieldsz-1) & 7)+1; /* # LS bits in strt*/
-   int           tl = 8 - tr;                /* num unused MS bits in start  */
-
-   start = (big_e_target ? (wordsz-fieldsz-bit_offset) : 
-                          (bit_offset+fieldsz-1)) >>3;
-   stop  = (big_e_target ? (wordsz-bit_offset-1) : bit_offset) >>3;
-
-   if (start == stop) return (data[stop] >> r) & ((0x1 << fieldsz) - 0x1);
-
-   objval = (unsigned)((data[start] << tl) & 0xFF) >> tl;
-   
-   if (big_e_target) 
-        for (i=start+1; i<stop; ++i) objval = (objval << 8) | data[i];
-   else  for (i=start-1; i>stop; --i) objval = (objval << 8) | data[i];
-   
-   return (objval << l) | (data[stop] >> r);
-}
-
-
-
-/******************************************************************************/
-/*                                                                            */
-/* REPACK() - Encode a binary relocated field back into the object data.      */
-/*                                                                            */
-/******************************************************************************/
-void repack(unsigned int objval, unsigned char *data, int fieldsz,
-            int  wordsz, int bit_offset)
-{
-   register int  i;
-   int           start;                      /* MS byte with reloc data       */
-   int           stop;                       /* LS byte with reloc data       */
-   int           r     = bit_offset & 7;     /* num unused LS bits in stop    */
-   int           l     = 8 - r;              /* num used   MS bits in stop    */
-   int           tr    = ((bit_offset+fieldsz-1) & 7)+1; /* # LS bits in strt */
-   unsigned int mask  = (1ul << fieldsz) - 1ul;
-
-   if (fieldsz < sizeof(objval)) objval &= mask;
-   
-   start = (big_e_target ? (wordsz-fieldsz-bit_offset) : 
-                          (bit_offset+fieldsz-1)) >>3;
-   stop  = (big_e_target ? (wordsz-bit_offset-1) : bit_offset) >>3;
-
-   if (start == stop)
-   {
-       data[stop] &= ~(mask << r);
-       data[stop] |= (objval << r); 
-       return;
-   }
-
-   data[start] &= ~((1<<tr)-1);
-   data[stop]  &=  ((1<< r)-1);
-   data[stop]  |= (objval << r); 
-   objval     >>= l;
-
-   if (big_e_target) 
-        for (i = stop - 1; i > start; objval >>= 8) data[i--] = objval;
-   else for (i = stop + 1; i < start; objval >>= 8) data[i++] = objval;
-   
-   data[start] |= objval; 
-}
-
-
-/******************************************************************************/
-/*                                                                            */
-/* CLOAD_LINENO() - Read in, swap, and relocate line number entries.  This    */
-/*                  function is not called directly by the loader, but by the */
-/*                  application when it needs to read in line number entries. */
-/*                                                                            */
-/******************************************************************************/
-int cload_lineno(int filptr, int count, LINENO *lptr, int scnum) 
-{
-/*   int    filptr;                      WHERE TO READ FROM                  */
-/*   int     count;                       HOW MANY TO READ                    */
-/*   LINENO *lptr;                        WHERE TO PUT THEM                   */
-/*   int     scnum;                       SECTION NUMBER OF THESE ENTRIES     */
-
-    int i;
-
-    /*------------------------------------------------------------------------*/
-    /* READ IN THE REQUESTED NUMBER OF LINE NUMBER ENTRIES AS A BLOCK.        */
-    /*------------------------------------------------------------------------*/
-#if FILE_BASED
-    if (fseek(fin, filptr, 0) != 0) { load_err = E_FILE; return FALSE; }
-    for (i = 0; i < count; i++)
-        if (fread(lptr + i, 1, LINESZ, fin) != LINESZ) 
-                                    { load_err = E_FILE; return FALSE; }
-#else
-       for (i = 0; i < count; i++)
-       mem_copy((void*)(lptr+i), (void*)&gRxBuffer[filptr + i*LINESZ], LINESZ);
-#endif
-    /*------------------------------------------------------------------------*/
-    /* SWAP AND RELOCATE EACH ENTRY, AS NECESSARY.                            */
-    /*------------------------------------------------------------------------*/
-    if (byte_swapped || RUN_RELOC_AMOUNT(scnum - 1))
-       for (i = 0; i < count; i++, lptr++)
-       {
-         if (byte_swapped)
-         {
-             swap2byte(&lptr->l_lnno);
-             swap4byte(&lptr->l_addr.l_paddr);
-         }
-
-         if (lptr->l_lnno != 0) 
-            lptr->l_addr.l_paddr += RUN_RELOC_AMOUNT(scnum - 1);
-       }
-    
-    return TRUE;
-}
-
-
-/******************************************************************************/
-/*                                                                            */
-/*  SWAP4BYTE() - Swap the order of bytes in a int.                          */
-/*                                                                            */
-/******************************************************************************/
-void swap4byte(void *addr)
-{
-   unsigned int *value = (unsigned int *)addr;
-   unsigned int temp1, temp2, temp3, temp4;
-
-   temp1 = (*value)       & 0xFF;
-   temp2 = (*value >> 8)  & 0xFF;
-   temp3 = (*value >> 16) & 0xFF;
-   temp4 = (*value >> 24) & 0xFF;
-
-   *value = (temp1 << 24) | (temp2 << 16) | (temp3 << 8) | temp4;
-}
-
-
-/******************************************************************************/
-/*                                                                            */
-/*  SWAP2BYTE() - Swap the order of bytes in a short.                         */
-/*                                                                            */
-/******************************************************************************/
-void swap2byte(void *addr)
-{
-   unsigned short *value = (unsigned short *)addr;
-   unsigned short temp1,temp2;
-
-   temp1 = temp2 = *value;
-   *value = ((temp2 & 0xFF) << 8) | ((temp1 >> 8) & 0xFF);
-}
index 9dd3ef3b6b7a13ac88ac262a7747ebc2dd1e8a8e..a499bba3300cecebd5b23d6050ab73163d45ac48 100644 (file)
 #define fread(w,x,y,z)      (((*z->read)((Uint8 *)(w),(Uint32)((x)*(y)))) == 0 ? (y) : 0)
 
 /* Use stdlib functions where possible */
-#define mem_copy(dest,src,nbytes)           memcpy((void *)(dest),(void *)(src),nbytes)
-#define mem_write(buf, nbytes, addr, page)  memcpy((void *)(addr),(void *)(buf),nbytes)
+#define mem_copy(dest,src,nbytes)           iblMemcpy((void *)(dest),(void *)(src),nbytes)
+#define mem_write(buf, nbytes, addr, page)  iblMemcpy((void *)(addr),(void *)(buf),nbytes)
 #define str_comp                            strcmp
 #define strn_copy                           strncpy
 
+#define malloc                              iblMalloc
+#define free                                iblFree
+
 
 /***********************
  * Function Prototypes
index f602563eb1f2afb11281ae0d32c6effc9739fcc3..b3bb2984eccdd125236a282006b385c87850c04b 100644 (file)
@@ -65,6 +65,7 @@
 #include "ArrayList.h"
 #include "ewrap.h"
 #include "dload_api.h"
+#include "file_ovr.h"
 
 /*****************************************************************************/
 /* AL_INITIALIZE() - Initialize a newly created Array_List object.           */
@@ -120,5 +121,5 @@ int32_t AL_size(Array_List* obj)
 /*****************************************************************************/
 void AL_destroy(Array_List* obj)
 {
-   free(obj->buf);
+   DLIF_free(obj->buf);
 }
index cd7985424995f3e956fbd9c77a8a29e63b779c16..90cdb039c881ca0c66723336a8a3290e99fb79f4 100644 (file)
@@ -111,7 +111,7 @@ int32_t DLIF_fclose(LOADER_FILE_DESC *fd)
 /*****************************************************************************/
 void* DLIF_malloc(size_t size)
 {
-   return malloc(size*sizeof(uint8_t));
+   return iblMalloc(size*sizeof(uint8_t));
 }
 
 /*****************************************************************************/
@@ -119,7 +119,7 @@ void* DLIF_malloc(size_t size)
 /*****************************************************************************/
 void DLIF_free(void* ptr)
 {
-   free(ptr);
+   iblFree(ptr);
 }
 
 /*****************************************************************************/
index d3e261936d4f7a0806bf71bd2fdbb7a1431233b7..8db75f0205461437d1468081121050bd93ab5f51 100644 (file)
 #define fclose(x)           0
 
 
+/* Redirect memory operations */
+#define malloc      iblMalloc
+#define free        iblFree
+#define memset      iblMemset
+#define memcpy      iblMemcpy
+
 #define FILE BOOT_MODULE_FXN_TABLE
 
 #endif /* _FILE_OVR_H */
index 9a73485fec75d9c2827446fe5b946eddbdf7d4b2..00ca0e1c75f4eb518eed29a84b6cc4f23a42ea68 100644 (file)
@@ -14,10 +14,7 @@ endif
 ECODIR= $(IBL_ROOT)/main
 
 
-CSRC= iblmain.c
-
-
-CDEFS += -DIBL_I2C_CFG_EEPROM_BUS_ADDR=$(I2C_PARAM_BUS_ADDR)
+CSRC= iblmain.c iblinit.c
 
 
 .PHONY: main
@@ -64,6 +61,6 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @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/main/iblStage.h b/src/main/iblStage.h
new file mode 100644 (file)
index 0000000..2ac3fdb
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef _IBL_STAGE_H
+#define _IBL_STAGE_H
+/**
+ * @file iblStage.h
+ *
+ * @brief
+ *       This file contains global declarations used by both stages of the IBL
+ */
+
+/**
+ * @brief The ibl table is declared.
+ *
+ * @details
+ *   The ibl table is declared uninitialized by this ibl program. An external
+ *   initialization can be performed if the default operation of the ibl is
+ *   not desired.
+ */
+#pragma DATA_SECTION(ibl, ".ibl_config_table")
+ibl_t ibl;
+
+
+/**
+ * @brief The ibl status table is declared.
+ *  
+ * @details
+ *   The ibl status table is declared. It is initialized at run time
+ *   in function main.
+ */
+#pragma DATA_SECTION(iblStatus, ".ibl_status_table")
+iblStatus_t iblStatus;
+
+
+
+
+#endif  /* _IBL_STAGE_H */
diff --git a/src/main/iblinit.c b/src/main/iblinit.c
new file mode 100644 (file)
index 0000000..a5986eb
--- /dev/null
@@ -0,0 +1,578 @@
+/**
+ *  @file iblinit.c
+ *
+ *  @brief
+ *             This file contains code which runs prior to loading the full IBL
+ *
+ *  @details
+ *             The IBL loads itself in a two stage process. The ROM boot loader
+ *             loads this first stage IBL first. This entire program must be
+ *             endian independent in execution.
+ *
+ *      This first loader reads the IBL parameters, and will endian
+ *      switch them if required. The PLL is configured if indicated
+ *      by the parameters.
+ *
+ *      The I2C block which contains the I2C EEPROM address for both
+ *      the big and little endian images is then read. Based on the
+ *      endianness of the device the rest of the IBL is read from
+ *      the I2C EEPROM, and execution is transferred to the full
+ *      IBL.
+ *
+ *      The subsequent reads are allowed to cross 16 bit i2c EEPROM
+ *      addresses. When the boundary is crossed the i2c address
+ *      field is incremented.
+ *
+ */
+
+#include "ibl.h"
+#include "iblloc.h"
+#include "iblcfg.h"
+#include "device.h"
+#include "iblbtbl.h"
+#include "i2c.h"
+#include <string.h>
+
+
+/**
+ *  @brief
+ *      Data structures shared between the 1st and 2nd stage IBL load
+ *      are declared in a single header file, included in both stages
+ */
+#include "iblStage.h"
+
+/**
+ *  @brief
+ *      byte swapping of i2c data must be done when in little endian mode
+ */
+bool littleEndian;
+
+/**
+ *  @brief
+ *      The boot table processing status is declared in the boot table wrapper,
+ *      and used here in the main status fields.
+ */
+extern Int32 btblWrapEcode;
+
+/**
+ *  @brief
+ *      The malloc function used for both boot stages of the ibl
+ */
+void *iblMalloc (Uint32 size)
+{
+    return (malloc (size));
+}
+
+/**
+ *  @brief
+ *      The free function used for both stages of the ibl
+ */
+void iblFree (void *mem)
+{
+    free (mem);
+}
+
+/**
+ *  @brief
+ *      The memset function used for both stages of the ibl
+ */
+void *iblMemset (void *mem, Int32 ch, Uint32 n)
+{
+    return (memset (mem, ch, n));
+}
+
+/**
+ *  @brief
+ *      The memcpy function used for both stages of the ibl
+ */
+void *iblMemcpy (void *s1, const void *s2, Uint32 n)
+{
+    return (memcpy (s1, s2, n));
+
+}
+
+/**
+ *  @brief
+ *      Ones complement addition
+ */
+inline uint16 onesComplementAdd (uint16 value1, uint16 value2)
+{
+  uint32 result;
+
+  result = (uint32)value1 + (uint32)value2;
+
+  result = (result >> 16) + (result & 0xFFFF); /* add in carry   */
+  result += (result >> 16);                    /* maybe one more */
+  return ((uint16)result);
+}
+
+
+/**
+ *  @brief
+ *      Ones complement checksum computation 
+ */
+uint16 onesComplementChksum (uint16 * restrict p_data, uint16 len)
+{
+  uint16 chksum = 0;
+
+  while (len > 0)
+  {
+    chksum = onesComplementAdd(chksum, *p_data);
+    p_data++;
+    len--;
+  }
+  return (chksum);
+} 
+
+
+
+/**
+ *  @brief
+ *      Do a 4 byte endian swap
+ */
+uint32 swap32val (uint32 v)
+{
+    v =  (((v >> 24) & 0xff) <<  0)  |
+         (((v >> 16) & 0xff) <<  8)  |
+         (((v >>  8) & 0xff) << 16)  |
+         (((v >>  0) & 0xff) << 24);
+
+    return (v);
+
+}
+
+/**
+ *  @brief
+ *      Do a 2 byte endian swap
+ */
+uint16 swap16val (uint16 v)
+{
+    v = (((v >> 8) & 0xff) << 0)  |
+        (((v >> 0) & 0xff) << 8);
+
+    return (v);
+
+}
+
+/**
+ *  @brief
+ *  Do an endian swap on the ibl structure
+ */
+void iblSwap (void)
+{
+    int i;
+
+    ibl.iblMagic = swap32val (ibl.iblMagic);
+
+    for (i = 0; i < ibl_N_PLL_CFGS; i++)  {
+        ibl.pllConfig[i].doEnable      = swap16val (ibl.pllConfig[i].doEnable);
+        ibl.pllConfig[i].prediv        = swap32val (ibl.pllConfig[i].prediv);
+        ibl.pllConfig[i].mult          = swap32val (ibl.pllConfig[i].mult);
+        ibl.pllConfig[i].postdiv       = swap32val (ibl.pllConfig[i].postdiv);
+        ibl.pllConfig[i].pllOutFreqMhz = swap32val (ibl.pllConfig[i].pllOutFreqMhz);
+    }
+
+    ibl.ddrConfig.configDdr = swap16val (ibl.ddrConfig.configDdr);
+
+    ibl.ddrConfig.uEmif.emif3p1.sdcfg  = swap32val(ibl.ddrConfig.uEmif.emif3p1.sdcfg);
+    ibl.ddrConfig.uEmif.emif3p1.sdrfc  = swap32val(ibl.ddrConfig.uEmif.emif3p1.sdrfc);
+    ibl.ddrConfig.uEmif.emif3p1.sdtim1 = swap32val(ibl.ddrConfig.uEmif.emif3p1.sdtim1);
+    ibl.ddrConfig.uEmif.emif3p1.sdtim2 = swap32val(ibl.ddrConfig.uEmif.emif3p1.sdtim2);
+    ibl.ddrConfig.uEmif.emif3p1.dmcctl = swap32val(ibl.ddrConfig.uEmif.emif3p1.dmcctl);
+
+    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.mdioConfig.nMdioOps   = swap16val (ibl.mdioConfig.nMdioOps);
+    ibl.mdioConfig.mdioClkDiv = swap16val (ibl.mdioConfig.mdioClkDiv);
+    ibl.mdioConfig.interDelay = swap32val (ibl.mdioConfig.interDelay);
+
+    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.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.chkSum = swap16val (ibl.chkSum);
+}
+
+        
+
+/**
+ *  @brief
+ *      The i2c load context consists of the address of the next block 
+ *      to read, and a simple fifo holding any existing data.
+ */
+#define I2C_MAX_BLOCK_SIZE      0x80
+uint32 i2cReadAddress;
+
+uint32 i2cFifoIn  = 0;
+uint32 i2cFifoOut = 0;
+uint8  i2cData[I2C_MAX_BLOCK_SIZE];
+uint16 i2cSum[I2C_MAX_BLOCK_SIZE >> 1];
+
+
+/**
+ *  @brief
+ *      Return the number of elements in the fifo
+ */
+Uint32 i2cFifoCount (void)
+{
+    Int32 count;
+
+    if (i2cFifoIn >= i2cFifoOut)
+        count = i2cFifoIn - i2cFifoOut;
+    else
+        count = i2cFifoIn + I2C_MAX_BLOCK_SIZE - i2cFifoOut;
+
+    return (count);
+
+}
+
+    
+/**
+ *  @brief
+ *      Read a byte from the fifo
+ */
+Uint8 i2cFifoRead(void)
+{
+    Uint8 v;
+
+    v = i2cData[i2cFifoOut];
+
+    i2cFifoOut += 1;
+
+    if (i2cFifoOut == i2cFifoIn)
+        i2cFifoOut = i2cFifoIn = 0;
+
+    if (i2cFifoOut >= I2C_MAX_BLOCK_SIZE)
+        i2cFifoOut = 0;
+
+    return (v);
+
+}
+
+/**
+ *  @brief
+ *      Read a block of data from the I2C eeprom and put it in the fifo
+ */
+void i2cReadBlock (void)
+{
+    uint16 len;
+    int32  i, j;
+    uint32 v;
+
+    for (;;) {
+        while (hwI2cMasterRead (i2cReadAddress & 0xffff,    /* The address on the eeprom of the table */
+                                4,                          /* The number of bytes to read */
+                                i2cData,                    /* Where to store the bytes */
+                                i2cReadAddress >> 16,       /* The bus address of the eeprom */
+                                IBL_I2C_CFG_ADDR_DELAY)     /* The delay between sending the address and reading data */
+    
+             != I2C_RET_OK)  {
+
+            iblStatus.i2cDataRetries += 1;
+        }
+
+        /* Form the length. The received bytes are always in big endian format */
+        len    = (i2cData[0] << 8) | i2cData[1];
+
+
+        if (len > I2C_MAX_BLOCK_SIZE)
+            continue;
+
+
+        while (hwI2cMasterRead (i2cReadAddress & 0xffff,    /* The address on the eeprom of the table */
+                                len,                        /* The number of bytes to read */
+                                i2cData,                    /* Where to store the bytes */
+                                i2cReadAddress >> 16,       /* The bus address of the eeprom */
+                                IBL_I2C_CFG_ADDR_DELAY)     /* The delay between sending the address and reading data */
+    
+             != I2C_RET_OK)  {
+
+            iblStatus.i2cDataRetries += 1;
+        }
+
+
+        /* Must do endian conversion to verify the checksum */
+        for (i = j = 0; i < len; i += 2, j += 1) 
+            i2cSum[j] = (i2cData[i+0] << 8) | i2cData[i+1];
+
+        v = onesComplementChksum (i2cSum, j);
+        if ((v == 0) || (v == 0xffff))
+            break;
+
+        
+        iblStatus.i2cDataRetries += 1;
+
+    }
+
+
+    i2cReadAddress += len;
+    
+    i2cFifoIn  = len;
+    i2cFifoOut = 4;    /* The i2c header is effectively removed */
+
+}
+
+             
+
+
+/**
+ *  @brief
+ *      Read data from the I2C to pass to the interpreter
+ */
+Int32 iblI2cRead (Uint8 *buf, Uint32 num_bytes)
+{
+    int i;
+
+    for (i = 0; i < num_bytes; i++)  {
+
+        if (i2cFifoCount() == 0)
+            i2cReadBlock ();
+
+        buf[i] = i2cFifoRead();
+    }
+
+    return (0);
+
+}
+
+#define iblBITMASK(x,y)      (   (   (  ((UINT32)1 << (((UINT32)x)-((UINT32)y)+(UINT32)1) ) - (UINT32)1 )   )   <<  ((UINT32)y)   )
+#define iblREAD_BITFIELD(z,x,y)   (((UINT32)z) & iblBITMASK(x,y)) >> (y)
+/**
+ *  @brief
+ *      Return the lower 16 bits of a 32 bit value. A function is used (with cross-function optomization off)
+ *      which results in an endian independent version
+ */
+uint16 readLower16 (uint32 v)
+{
+    return (iblREAD_BITFIELD(v,15,0));
+
+}
+
+/**
+ * @brief
+ *      Return the upper 16 bits of a 32 bit value. A function is used to force an endian independent version
+ */
+uint16 readUpper16 (uint32 v)
+{
+  return (iblREAD_BITFIELD(v,31,16));
+}
+
+
+/**
+ *  @brief
+ *      The module function table used for boot from i2c
+ */
+BOOT_MODULE_FXN_TABLE i2cinit_boot_module = 
+{
+    NULL,           /* Open  API */
+    NULL,           /* Close API */
+    iblI2cRead,     /* Read  API */
+    NULL,           /* Write API */
+    NULL,           /* Peek  API */
+    NULL,           /* Seek  API */
+    NULL            /* Query API */
+};
+
+
+
+/**
+ *  @brief
+ *      The main function
+ *
+ *  @details
+ *      The ibl configuration parameters are read from the i2c, 
+ *      followed by the i2c mapping information. The second stage
+ *      of the IBL is then loaded, and execution transferred 
+ *      to the second stage.
+ */
+void main (void)
+{
+
+    uint16       v;
+    uint16       configAddrLsw;
+    uint16       configAddrMsw;
+    uint32       entry;
+    void         (*exit)();
+    iblI2cMap_t  map;
+
+    memset (&iblStatus, 0, sizeof(iblStatus_t));
+    iblStatus.iblMagic     = ibl_MAGIC_VALUE;
+    iblStatus.activePeriph = ibl_ACTIVE_PERIPH_I2C;
+
+    /* Read the endianness setting of the device */
+    littleEndian = deviceIsLittleEndian();
+    
+    /* Load the default configuration table from the i2c. The actual speed of the device
+     * isn't really known here, since it is part of the table, so a compile time
+     * value is used (the pll may have been configured during the initial load) */
+    hwI2Cinit (IBL_I2C_DEV_FREQ_MHZ,        /* The CPU frequency during I2C data load */
+               DEVICE_I2C_MODULE_DIVISOR,   /* The divide down of CPU that drives the i2c */
+               IBL_I2C_CLK_FREQ_KHZ,        /* The I2C data rate used during table load */
+               IBL_I2C_OWN_ADDR);           /* The address used by this device on the i2c bus */
+
+
+    /* Read the I2C mapping information from the eeprom */
+    for (;;)  {
+        if (hwI2cMasterRead (IBL_I2C_MAP_TABLE_DATA_ADDR,     /* The address on the eeprom of the data mapping */
+                             sizeof(iblI2cMap_t),             /* The number of bytes to read */
+                             (UINT8 *)&map,                   /* Where to store the bytes */
+                             IBL_I2C_MAP_TABLE_DATA_BUS_ADDR, /* The bus address of the eeprom */
+                             IBL_I2C_CFG_ADDR_DELAY)          /* The delay between sending the address and reading data */
+
+             == I2C_RET_OK)  {
+
+                /* On the I2C EEPROM the table is always formatted with the most significant
+                 * byte first. So if the device is running little endain the endian must be
+                 * swapped */
+                if (littleEndian == TRUE)  {
+                    map.length   = swap16val (map.length);
+                    map.chkSum   = swap16val (map.chkSum);
+                    map.addrLe   = swap32val (map.addrLe);
+                    map.configLe = swap32val (map.configLe);
+                    map.addrBe   = swap32val (map.addrBe);
+                    map.configBe = swap32val (map.configBe);
+
+                    configAddrLsw = readLower16 (map.configLe);
+                    configAddrMsw = readUpper16 (map.configLe);
+
+                }  else  {
+                    configAddrLsw = readLower16 (map.configBe);
+                    configAddrMsw = readUpper16 (map.configLe);
+
+                }
+
+
+                if (map.length != sizeof(iblI2cMap_t))  {
+                    iblStatus.mapSizeFail += 1;
+                    continue;
+                }
+
+                if (map.chkSum != 0)  {
+                    
+                    v = onesComplementChksum ((UINT16 *)&map, sizeof(iblI2cMap_t));
+                    if ((v != 0) && (v != 0xffff))  {
+                        iblStatus.mapRetries += 1;
+                        continue;
+                    }
+                }
+
+                break;
+        }
+
+        iblStatus.mapRetries += 1;
+
+    }
+
+
+    /* Read the i2c configuration tables until the checksum passes and the magic number
+     * matches. The checksum must be verified before the endian re-ordering is done */
+    for (;;)  {
+
+        if (hwI2cMasterRead (configAddrLsw,                  /* The address on the eeprom of the table */
+                             sizeof(ibl_t),                  /* The number of bytes to read */
+                             (UINT8 *)&ibl,                  /* Where to store the bytes */
+                             configAddrMsw,                  /* The bus address of the eeprom */
+                             IBL_I2C_CFG_ADDR_DELAY)         /* The delay between sending the address and reading data */
+
+             == I2C_RET_OK)  {
+
+                 if (ibl.chkSum != 0)  {
+
+                    v = onesComplementChksum ((UINT16 *)&ibl, sizeof(ibl_t) / sizeof(UINT16));
+                    if ((v != 0) && (v != 0xffff))  {
+                        iblStatus.i2cRetries += 1;
+                        continue;
+                    }
+
+                 }  
+
+
+                if (ibl.iblMagic == ibl_MAGIC_VALUE)
+                    break;
+
+                if (swap32val (ibl.iblMagic) == ibl_MAGIC_VALUE)  {
+                    iblSwap ();
+                    break;
+                }
+
+                iblStatus.magicRetries += 1;
+
+            }
+
+            iblStatus.i2cRetries += 1;
+    }
+
+    /* Pll configuration is device specific */
+    devicePllConfig ();
+
+
+    /* The rest of the IBL is in boot table format. Read and process the data */
+    if (littleEndian == TRUE) 
+        i2cReadAddress = map.addrLe;
+    else
+        i2cReadAddress = map.addrBe;
+
+    if (i2cReadAddress == 0xffffffff)  {
+        iblStatus.iblFail = ibl_FAIL_CODE_INVALID_I2C_ADDRESS;
+        for (;;);
+    }
+
+
+    /* Pass control to the boot table processor */
+    iblBootBtbl (&i2cinit_boot_module, &entry);
+
+    if (btblWrapEcode != 0)  {
+        iblStatus.iblFail = ibl_FAIL_CODE_BTBL_FAIL;
+        for (;;);
+    }
+
+    /* jump to the exit point, which will be the entry point for the full IBL */
+    exit = (void (*)())entry;
+    (*exit)();
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
index 8507b5f2e4297c93040ce0c2770f6c5ce156f089..c734b02d2e85665eef23067621bdde8a30591990 100644 (file)
 #include "ibl_elf.h"
 #include <string.h>
 
-
 /**
- * @brief The ibl table is declared.
- *
- * @details
- *   The ibl table is declared uninitialized by this ibl program. An external
- *   initialization can be performed if the default operation of the ibl is
- *   not desired.
+ *  @brief
+ *      Data structures shared between the 1st and 2nd stage IBL load
+ *      are declared in a single header file, included in both stages
  */
-#pragma DATA_SECTION(ibl, ".ibl_config_table")
-ibl_t ibl;
-
+#include "iblStage.h"
 
-/**
- * @brief The ibl status table is declared.
- *  
- * @details
- *   The ibl status table is declared. It is initialized at run time
- *   in function main.
- */
-#pragma DATA_SECTION(iblStatus, ".ibl_status_table")
-iblStatus_t iblStatus;
 
 
 /* Eat printfs */
@@ -106,7 +91,7 @@ void main (void)
     int32 i, j;
 
     /* Initialize the status structure */
-    memset (&iblStatus, 0, sizeof(iblStatus_t));
+    iblMemset (&iblStatus, 0, sizeof(iblStatus_t));
     iblStatus.iblMagic = ibl_MAGIC_VALUE;
 
 
@@ -116,31 +101,6 @@ void main (void)
     /* Initialize the system timer (software tracking of the hardware timer state) */
     timer_init ();
 
-
-
-    /* Load the default configuration table from the i2c. The actual speed of the device
-     * isn't really known here, since it is part of the table, so a compile time
-     * value is used (the pll may have been configured during the initial load) */
-    hwI2Cinit (IBL_I2C_DEV_FREQ_MHZ,        /* The CPU frequency during I2C data load */
-               DEVICE_I2C_MODULE_DIVISOR,   /* The divide down of CPU that drives the i2c */
-               IBL_I2C_CLK_FREQ_KHZ,        /* The I2C data rate used during table load */
-               IBL_I2C_OWN_ADDR);           /* The address used by this device on the i2c bus */
-
-    if (hwI2cMasterRead (IBL_I2C_CFG_TABLE_DATA_ADDR,    /* The address on the eeprom of the table */
-                         sizeof(ibl_t),                  /* The number of bytes to read */
-                         (UINT8 *)&ibl,                  /* Where to store the bytes */
-                         IBL_I2C_CFG_EEPROM_BUS_ADDR,    /* The bus address of the eeprom */
-                         IBL_I2C_CFG_ADDR_DELAY)         /* The delay between sending the address and reading data */
-
-         != I2C_RET_OK)  {
-
-       /* There is no recovery if the load of the configuration table failed */
-       iblStatus.tableLoadFail = 0x11111111;
-       for (;;);
-
-    }
-
-
     /* Load default mac addresses for ethernet boot if requested */
     for (i = 0; i < ibl_N_ETH_PORTS; i++)  {
 
@@ -152,9 +112,6 @@ void main (void)
     }
 
 
-    /* Pll configuration is device specific */
-    devicePllConfig ();
-
     /* DDR configuration is device specific */
     deviceDdrConfig ();
 
@@ -166,13 +123,22 @@ void main (void)
          * statement is simply defined to be a void statement */
         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)
-                iblEthBoot (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
 
-            if (ibl.nandConfig.nandPriority == i)
+#ifndef EXCLUDE_NAND
+            if (ibl.nandConfig.nandPriority == i)  {
+                iblStatus.activePeriph = ibl_ACTIVE_PERIPH_NAND;
                 iblNandBoot ();
+            }
+#endif
 
             iblStatus.heartBeat += 1;
         }
@@ -198,61 +164,74 @@ void main (void)
  */
 Uint32 iblBoot (BOOT_MODULE_FXN_TABLE *bootFxn, Int32 dataFormat, void *formatParams)
 { 
-    Uint32 entry = 0;
-
-    union  {
-
-        Uint8   dataBuf[4];   /* Place holder */
-        Uint32  bisValue;
-        Uint16  coffVer;    
-
-    } fid;
-
+    Uint32  entry = 0;
+    Uint32  value32;
+    Uint8   dataBuf[4];   
+    Uint16  value16;
 
     /* Determine the data format if required */
     if (dataFormat == ibl_BOOT_FORMAT_AUTO)  {
 
-        (*bootFxn->peek)((Uint8 *)&fid, sizeof(fid));
+        (*bootFxn->peek)(dataBuf, sizeof(dataBuf));
+        value32 = (dataBuf[0] << 24) | (dataBuf[1] << 16) | (dataBuf[2] << 8) | (dataBuf[3] << 0);
+        value16 = (dataBuf[0] <<  8) | (dataBuf[1] <<  0);
 
         /* BIS */
-        if (fid.bisValue == BIS_MAGIC_NUMBER)
+#ifndef EXCLUDE_BIS
+        if (value32 == BIS_MAGIC_NUMBER)
             dataFormat = ibl_BOOT_FORMAT_BIS;
+#endif
 
-        if (iblIsCoff (fid.coffVer))
+#ifndef EXCLUDE_COFF
+        if (iblIsCoff (value16))
             dataFormat = ibl_BOOT_FORMAT_COFF;
+#endif
 
-        if (iblIsElf (fid.dataBuf))
+#ifndef EXCLUDE_ELF
+        if (iblIsElf (dataBuf))
             dataFormat = ibl_BOOT_FORMAT_ELF;
+#endif
 
-        else  {
+        if (dataFormat == ibl_BOOT_FORMAT_AUTO)  {
             iblStatus.autoDetectFailCnt += 1;
             return (0);
         }
     }        
 
 
+    iblStatus.activeFormat = dataFormat;
+
+
     /* Invoke the parser */
     switch (dataFormat)  {
 
+#ifndef EXCLUDE_BIS
         case ibl_BOOT_FORMAT_BIS:
             iblBootBis (bootFxn, &entry);
             break;
+#endif
 
+#ifndef EXCLUDE_COFF
         case ibl_BOOT_FORMAT_COFF:
             iblBootCoff (bootFxn, &entry);
             break;
+#endif
 
         case ibl_BOOT_FORMAT_BTBL:
             iblBootBtbl (bootFxn, &entry);
             break;
 
+#ifndef EXCLUDE_BLOB
         case ibl_BOOT_FORMAT_BBLOB:
             iblBootBlob (bootFxn, &entry, formatParams);
             break;
+#endif
 
+#ifndef EXCLUDE_ELF
         case ibl_BOOT_FORMAT_ELF:
             iblBootElf (bootFxn, &entry);
             break;
+#endif
 
         default:
             iblStatus.invalidDataFormatSpec += 1;
index 72cea2c96b7d1c7fb49abdff3be601b73dc9fbb5..b894e3e9598141510c63d8c7b860702cd472deac 100644 (file)
 #*
 #* DESCRIPTION: Builds the Intermediate Boot Loader (IBL)
 #*
+#*  Usage:  make c6455 | c6472 | c6474 | c6457 [DEBUG=yes] [ETH=no] [NAND=no]  \
+#*          [BIS=no] [COFF=no] [BLOB=no] [ELF=no] [ENDIAN= both | big | little] [I2C_BUS_ADDR= 0x50 | 0x51] \
+#*                     [COMPACT_I2C=yes]
+#*
+#* or to make a board specific configuraiton
+#*
+#*                     make evm_c6455 | evm_c6472 | evm_c6474
+#*
+#* or to test the builds by making all the devices and testing excludes
+#*
+#*                     make test_build
 #*******************************************************************************************
 
 IBLS_C6X= c6455 c6472 c6474 c6474l c6457
+EVMS_C6X= evm_c6455 evm_c6472 evm_c6474
 
 
-all:
-       @echo must specify a target [ $(IBLS_C6X) ]
+# 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
 
+EXCLUDES=
 
-# Default options that can be overridden on the command line
-ifndef ENDIAN
- ENDIAN=little
+ifeq ($(ETH),no)
+ EXCLUDES+= ETH
 endif
-export ENDIAN
 
-# The debug flag changes compiler options
-ifndef DEBUG
- DEBUG=no
+ifeq ($(NAND),no)
+ EXCLUDES+= NAND
+endif
+
+ifeq ($(BIS),no)
+ EXCLUDES+= BIS
+endif
+
+ifeq ($(COFF),no)
+ EXCLUDES+= COFF
+endif
+
+ifeq ($(BLOB),no)
+ EXCLUDES+= BLOB
 endif
-export DEBUG
 
-# The value of I2C_PARAM_BUS_ADDR determines the I2C bus address used
-# to read the ibl configuration table from. The default values are
-# 0x50 for little endian and 0x51 for big endian.
+ifeq ($(ELF),no)
+ EXCLUDES+= ELF
+endif
+
+
+
 
-ifndef I2C_PARAM_BUS_ADDR
+# The endian of the build. The default target builds a single ROM image with both endians present
+ifeq ($(ENDIAN),big)
+ ENDIAN_MODE=big
+else
  ifeq ($(ENDIAN),little)
-   I2C_PARAM_BUS_ADDR=0x50
+  ENDIAN_MODE=little
  else
-   I2C_PARAM_BUS_ADDR=0x51
+  ENDIAN_MODE=both
  endif
 endif
 
-export I2C_PARAM_BUS_ADDR
+# The i2c ROM bus address. The code will advance accross I2C bus address boundaries (the code must
+# be blocked so that a single block doesn't cross a boundary, however). 
+ifndef I2C_BUS_ADDR
+ I2C_BUS_ADDR=0x50
+endif
+
 
 
-$(IBLS_C6X):
-       make -f makestg2 ARCH=c64x TARGET=$@ $@ 
+all:
+       @echo must specify a target [ $(IBLS_C6X) $(EVMS_C6X) ]
+
+
+# The debug flag changes compiler options
+ifndef DEBUG
+ DEBUG=no
+endif
+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)' $@
+
+
+# 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
+
+# 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
+
+# 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=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=little EXCLUDES='ELF NAND BIS' c6474
+       cp ibl_c6474/i2crom.dat ibl_c6474/i2crom.dat i2crom_0x50.dat
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x51 COMPACT_I2C=no ENDIAN_MODE=big EXCLUDES='ELF NAND BIS' c6474
+       cp ibl_c6474/i2crom.dat ibl_c6474/i2crom.dat i2crom_0x51.dat
+
+
+# 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=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=     c6455
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=ETH  c6455
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=NAND c6455
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=BIS  c6455
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=COFF c6455
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=ELF  c6455
+       make -f makestg1 ARCH=c64x TARGET=c6472 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=BLOB c6455
+
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=     c6455
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=ETH  c6455
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=NAND c6455
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=BIS  c6455
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=COFF c6455
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=ELF  c6455
+       make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 COMPACT_I2C=no ENDIAN_MODE=both EXCLUDES=BLOB c6455
 
 # will need to add a line for each additional ARCH type added
 clean:
index f5158c89abb41cda2e06e3668a81c80b0376b79d..cbfda230b31e0cdb3c49927e81970391fb055d34 100644 (file)
@@ -9,6 +9,12 @@
 #* (C) Copyright 1999 TELOGY Networks, Inc.             
 #*******************************************************************************
 
+ifeq ($(ENDIAN),big)
+ MEXT=be
+else
+ MEXT=le
+endif
+
 CC          = $(TOOLSC6X)/cgtools/bin/cl6x
 AS          = $(TOOLSC6X)/cgtools/bin/cl6x
 LD          = $(TOOLSC6X)/cgtools/bin/cl6x -z
@@ -18,9 +24,9 @@ HEX6X         = $(TOOLSC6X)/cgtools/bin/hex6x
 CDBTOOL     = $(COMSPEC) /c $(TOOLSBIOSCDBC6X)\gconfgen
 MAKEDEP     = $(MAKEDEPPATH)
 MAKEDEP_OPT = -q
-COBJEXT     = oc
+COBJEXT     = $(MEXT).oc
 LOBJEXT     = ol
-AOBJEXT     = oa
+AOBJEXT     = $(MEXT).oa
 CDEPEXT     = dc
 LDEPEXT     = dl
 ADEPEXT     = da
diff --git a/src/make/ibl_c6455/i2crom.map.pre b/src/make/ibl_c6455/i2crom.map.pre
new file mode 100644 (file)
index 0000000..a3f3d17
--- /dev/null
@@ -0,0 +1,71 @@
+#include "iblcfg.h"
+;  This file is run through the C preprocessor to get the build time layout information
+;  The following values must be defined:
+;     I2C_BUS_ADDR   - The I2C bus address of the eeprom holding the ROM boot info and the layout info
+;        INIT_EXE_FILE  - The I2C blocked stage 1 of the ibl
+;     EXE_FILE_1     - The I2C blocked stage 2 of the ibl, must be the little endian version
+;     EXE_FILE_2        - The I2C blocked stage 2 of the ibl, must be the big endian version
+;     PAD_FILE_ID_1  - This pad holds the IBL configuration structure for the little endian version
+;     PAD_FILE_ID_2  - This pad holds the IBL configuration structure for the big endian version
+;
+;  The section statement directs the ROM boot loader to load the initial endian independent 
+;  portion of the IBL
+section 
+{
+  param_index   = 0
+  boot_mode     = 5
+  options       = 1
+
+  core_freq_mhz    = 50
+  i2c_clk_freq_khz = 400
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+; The layout statement defines how the resulting I2C image is layed out. The base address
+; of this (given in the dev_addr) statement must be known to the initial IBL program
+; at compile time. The layout block is simple a group of 32 bit i2c addresses, so 
+; the order of the exe_file and pad_file_id statements must be configured so as to
+; match the definition of struct iblI2cMap_t defined in ibl.h.
+layout
+{
+  dev_addr     = IBL_I2C_MAP_TABLE_DATA_ADDR           ; Defined in iblcfg.h
+  dev_addr_ext = I2C_BUS_ADDR
+  file_align   = 0x80
+
+  exe_file    = EXE_FILE_1
+  pad_file_id = PAD_FILE_ID_1
+
+
+  exe_file    = EXE_FILE_2
+  pad_file_id = PAD_FILE_ID_2
+}
+
+; The pad statements simply provide space for the IBL configuration structures. It is valid to
+; have a single configuration structure which is used for both endian values.
+pad
+{
+  pad_file_id  = 1
+  dev_addr     = 0x500
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = 0x300
+}
+
+#if (PAD_FILE_ID_1 != PAD_FILE_ID_2)
+pad
+{
+  pad_file_id  = 2
+  dev_addr     = 0x800
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = 0x300
+}
+#endif
+
+
+
+
index 24fceadc4efc573ba10088dc7ea47aacb57f3842..676e8f9f0e8a101d26895838a6a4e4431b8bac3e 100644 (file)
@@ -7,72 +7,26 @@
  *
  ************************************************************************************/
 
+/* In order to speed build time during debug, the object files are saved in
+ * both big and little endian format. The include file is generated by
+ * make to use the correct endian object files
+ */
+#include "ibl_objs.inc"
 
-../main/c64x/make/iblmain.oc
-../device/c64x/make/c6455.oc
-../ethboot/c64x/make/ethboot.oc
-../nandboot/c64x/make/nandboot.oc
-../driver/c64x/make/net.oc
-../driver/c64x/make/arp.oc
-../driver/c64x/make/ip.oc
-../driver/c64x/make/udp.oc
-../driver/c64x/make/stream.oc
-../driver/c64x/make/timer.oc
-../driver/c64x/make/bootp.oc
-../driver/c64x/make/tftp.oc
-../driver/c64x/make/nand.oc
-../hw/c64x/make/t64.oc
-../hw/c64x/make/cpmacdrv.oc
-../hw/c64x/make/pll.oc
-../hw/c64x/make/emif31.oc
-../hw/c64x/make/mdio.oc
-../hw/c64x/make/gpio.oc
-../hw/c64x/make/nandgpio.oc
-../hw/c64x/make/i2c.oc
-../interp/c64x/make/bis.oc
-../interp/c64x/make/cload.oc
-../interp/c64x/make/osal.oc
-../interp/c64x/make/btblwrap.oc
-../interp/c64x/make/btblpr.oc
-../interp/c64x/make/gem.oc
-../interp/c64x/make/blob.oc
-../interp/c64x/make/dload.oc
-../interp/c64x/make/elfwrap.oc
-../interp/c64x/make/dlw_client.oc
-../interp/c64x/make/dload_endian.oc
-../interp/c64x/make/ArrayList.oc
-../ecc/c64x/make/3byte_ecc.oc
+/* Symbols from the 1st portion of the load, generated by the make process */
+#include "ibl_init_symbols.inc"
 
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
 
--c
--stack 0x400
--heap 0x6000
-
-
-
-MEMORY
-{
-       TEXT   :  origin = 0x801000, length = 0x20000
-       STACK  :  origin = 0x821000, length = 0x0800
-       HEAP   :  origin = 0x821800, length = 0x6000
-       DATA   :  origin = 0x827800, length = 0x3000
-       CFG    :  origin = 0x831800, length = 0x0300
-       STAT :    origin = 0x831b00, length = 0x0200
-}
 
 SECTIONS
 {
-       .stack  > STACK
-       .sysmem > HEAP
        .cinit  > TEXT
        .const  > TEXT
        .text   > TEXT
        .switch > TEXT
        .far    > DATA
        .bss    > DATA
-
-    .ibl_config_table > CFG
-       .ibl_status_table > STAT
-
 }
 
diff --git a/src/make/ibl_c6455/ibl_common.inc b/src/make/ibl_c6455/ibl_common.inc
new file mode 100644 (file)
index 0000000..e9be06e
--- /dev/null
@@ -0,0 +1,38 @@
+/************************************************************************************
+ * FILE PURPOSE: Provide common memory and sections definitions for ibl_init and ibl
+ ************************************************************************************
+ * FILE NAME: ibl_common.inc
+ *
+ * DESCRIPTION: Defines the common memory map and section placement required
+ *                         to get ibl and ibl_init to work together in a two stage load
+ *                             process.
+ *************************************************************************************/
+
+-c
+-stack 0x800
+-heap  0x6000
+
+
+MEMORY
+{
+       TEXT_INIT :  origin = 0x801000, length = 0x2800
+       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
+       CFG       :  origin = 0x821800, length = 0x0300
+       STAT      :  origin = 0x821b00, length = 0x0200
+}
+
+
+SECTIONS
+{
+       .stack  > STACK
+       .sysmem > HEAP
+
+       .ibl_config_table > CFG
+       .ibl_status_table > STAT
+
+}
+
diff --git a/src/make/ibl_c6455/ibl_init.cmd b/src/make/ibl_c6455/ibl_init.cmd
new file mode 100644 (file)
index 0000000..9620990
--- /dev/null
@@ -0,0 +1,31 @@
+/************************************************************************************
+ * FILE PURPOSE: Define the memory usage of the ibl module for the c6455
+ ************************************************************************************
+ * FILE NAME: ibl.cmd
+ *
+ * DESCRIPTION: The memory placement for the IBL is defined
+ *
+ ************************************************************************************/
+
+/* In order to speed build time during debug, the object files are saved in
+ * both big and little endian format. The include file is generated by
+ * make to use the correct endian object files
+ */
+#include "ibl_init_objs.inc"
+
+
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
+
+
+SECTIONS
+{
+       .cinit  > TEXT_INIT
+       .const  > TEXT_INIT
+       .text   > TEXT_INIT
+       .switch > TEXT_INIT
+       .far    > DATA_INIT
+       .bss    > DATA_INIT
+
+}
+
diff --git a/src/make/ibl_c6455/ibl_init.rmd b/src/make/ibl_c6455/ibl_init.rmd
new file mode 100644 (file)
index 0000000..41c1b87
--- /dev/null
@@ -0,0 +1,11 @@
+-a
+-boot
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x0400, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c6455/ibl_init_image.rmd b/src/make/ibl_c6455/ibl_init_image.rmd
new file mode 100644 (file)
index 0000000..2d305e7
--- /dev/null
@@ -0,0 +1,10 @@
+-a
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x801000, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c6455/ibl_init_objs_template.inc b/src/make/ibl_c6455/ibl_init_objs_template.inc
new file mode 100644 (file)
index 0000000..5f4a295
--- /dev/null
@@ -0,0 +1,18 @@
+/* ibl_init_objs_template.inc
+ *
+ *  list of object files tagged with the endian field for replacement during make
+ */
+
+../main/c64x/make/iblinit.ENDIAN_TAG.oc
+../device/c64x/make/c6455init.ENDIAN_TAG.oc
+../hw/c64x/make/pll.ENDIAN_TAG.oc
+../hw/c64x/make/i2c.ENDIAN_TAG.oc
+../interp/c64x/make/btblwrap.ENDIAN_TAG.oc
+../interp/c64x/make/btblpr.ENDIAN_TAG.oc
+../interp/c64x/make/gem.ENDIAN_TAG.oc
+
+
+
+
+
+
diff --git a/src/make/ibl_c6455/ibl_objs_template.inc b/src/make/ibl_c6455/ibl_objs_template.inc
new file mode 100644 (file)
index 0000000..09400f1
--- /dev/null
@@ -0,0 +1,56 @@
+/* ibl_objs_template.inc
+ *
+ * list of object files tagged with the endian field for replacement during make
+ */
+
+../main/c64x/make/iblmain.ENDIAN_TAG.oc
+../device/c64x/make/c6455.ENDIAN_TAG.oc
+../driver/c64x/make/timer.ENDIAN_TAG.oc
+../hw/c64x/make/t64.ENDIAN_TAG.oc
+../hw/c64x/make/psc.ENDIAN_TAG.oc
+../hw/c64x/make/emif31.ENDIAN_TAG.oc
+
+
+#ifndef EXCLUDE_BIS
+../interp/c64x/make/bis.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_COFF
+../interp/c64x/make/cload.ENDIAN_TAG.oc
+../interp/c64x/make/osal.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_BLOB
+../interp/c64x/make/blob.ENDIAN_TAG.oc
+#endif
+
+
+#ifndef EXCLUDE_ELF
+../interp/c64x/make/dload.ENDIAN_TAG.oc
+../interp/c64x/make/elfwrap.ENDIAN_TAG.oc
+../interp/c64x/make/dlw_client.ENDIAN_TAG.oc
+../interp/c64x/make/dload_endian.ENDIAN_TAG.oc
+../interp/c64x/make/ArrayList.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_ETH
+../ethboot/c64x/make/ethboot.ENDIAN_TAG.oc
+../driver/c64x/make/net.ENDIAN_TAG.oc
+../driver/c64x/make/arp.ENDIAN_TAG.oc
+../driver/c64x/make/ip.ENDIAN_TAG.oc
+../driver/c64x/make/udp.ENDIAN_TAG.oc
+../driver/c64x/make/stream.ENDIAN_TAG.oc
+../driver/c64x/make/bootp.ENDIAN_TAG.oc
+../driver/c64x/make/tftp.ENDIAN_TAG.oc
+../hw/c64x/make/cpmacdrv.ENDIAN_TAG.oc
+../hw/c64x/make/mdio.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_NAND
+../nandboot/c64x/make/nandboot.ENDIAN_TAG.oc
+../driver/c64x/make/nand.ENDIAN_TAG.oc
+../ecc/c64x/make/3byte_ecc.ENDIAN_TAG.oc
+../hw/c64x/make/gpio.ENDIAN_TAG.oc
+../hw/c64x/make/nandgpio.ENDIAN_TAG.oc
+#endif
+
diff --git a/src/make/ibl_c6472/i2crom.map.pre b/src/make/ibl_c6472/i2crom.map.pre
new file mode 100644 (file)
index 0000000..2964367
--- /dev/null
@@ -0,0 +1,72 @@
+#include "iblcfg.h"
+;  This file is run through the C preprocessor to get the build time layout information
+;  The following values must be defined:
+;     I2C_BUS_ADDR   - The I2C bus address of the eeprom holding the ROM boot info and the layout info
+;        INIT_EXE_FILE  - The I2C blocked stage 1 of the ibl
+;     EXE_FILE_1     - The I2C blocked stage 2 of the ibl, must be the little endian version
+;     EXE_FILE_2        - The I2C blocked stage 2 of the ibl, must be the big endian version
+;     PAD_FILE_ID_1  - This pad holds the IBL configuration structure for the little endian version
+;     PAD_FILE_ID_2  - This pad holds the IBL configuration structure for the big endian version
+;
+;  The section statement directs the ROM boot loader to load the initial endian independent 
+;  portion of the IBL
+section 
+{
+  param_index   = 0
+  boot_mode     = 257
+  sw_pll               = 25
+  options       = 1
+
+  core_freq_mhz    = 625
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+; The layout statement defines how the resulting I2C image is layed out. The base address
+; of this (given in the dev_addr) statement must be known to the initial IBL program
+; at compile time. The layout block is simple a group of 32 bit i2c addresses, so 
+; the order of the exe_file and pad_file_id statements must be configured so as to
+; match the definition of struct iblI2cMap_t defined in ibl.h.
+layout
+{
+  dev_addr     = IBL_I2C_MAP_TABLE_DATA_ADDR           ; Defined in iblcfg.h
+  dev_addr_ext = I2C_BUS_ADDR
+  file_align   = 0x80
+
+  exe_file    = EXE_FILE_1
+  pad_file_id = PAD_FILE_ID_1
+
+
+  exe_file    = EXE_FILE_2
+  pad_file_id = PAD_FILE_ID_2
+}
+
+; The pad statements simply provide space for the IBL configuration structures. It is valid to
+; have a single configuration structure which is used for both endian values.
+pad
+{
+  pad_file_id  = 1
+  dev_addr     = 0x500
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = 0x300
+}
+
+#if (PAD_FILE_ID_1 != PAD_FILE_ID_2)
+pad
+{
+  pad_file_id  = 2
+  dev_addr     = 0x800
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = 0x300
+}
+#endif
+
+
+
+
index d94b8de7617cc3f7b3ba6c8dadb2dd39b07a3b4d..e7862c88985baa4089dd8f77412be52b0e5329e8 100644 (file)
@@ -7,65 +7,21 @@
  *
  ************************************************************************************/
 
+/* In order to speed build time during debug, the object files are saved in
+ * both big and little endian format. The include file is generated by
+ * make to use the correct endian object files
+ */
+#include "ibl_objs.inc"
 
-../main/c64x/make/iblmain.oc
-../device/c64x/make/c6472.oc
-../ethboot/c64x/make/ethboot.oc
-../nandboot/c64x/make/nandboot.oc
-../driver/c64x/make/net.oc
-../driver/c64x/make/arp.oc
-../driver/c64x/make/ip.oc
-../driver/c64x/make/udp.oc
-../driver/c64x/make/stream.oc
-../driver/c64x/make/timer.oc
-../driver/c64x/make/bootp.oc
-../driver/c64x/make/tftp.oc
-../driver/c64x/make/nand.oc
-../hw/c64x/make/t64.oc
-../hw/c64x/make/cpmacdrv.oc
-../hw/c64x/make/pll.oc
-../hw/c64x/make/psc.oc
-../hw/c64x/make/emif31.oc
-../hw/c64x/make/mdio.oc
-../hw/c64x/make/gpio.oc
-../hw/c64x/make/nandgpio.oc
-../hw/c64x/make/i2c.oc
-../interp/c64x/make/bis.oc
-../interp/c64x/make/cload.oc
-../interp/c64x/make/osal.oc
-../interp/c64x/make/btblwrap.oc
-../interp/c64x/make/btblpr.oc
-../interp/c64x/make/gem.oc
-../interp/c64x/make/blob.oc
 
-../interp/c64x/make/dload.oc
-../interp/c64x/make/elfwrap.oc
-../interp/c64x/make/dlw_client.oc
-../interp/c64x/make/dload_endian.oc
-../interp/c64x/make/ArrayList.oc
+/* Symbols from the 1st portion of the load, generated by the make process */
+#include "ibl_init_symbols.inc"
 
-../ecc/c64x/make/3byte_ecc.oc
-
--c
--stack 0x800
--heap  0x6000
-
-
-
-MEMORY
-{
-       TEXT   :  origin = 0x801000, length = 0x20000
-       STACK  :  origin = 0x821000, length = 0x0800
-       HEAP   :  origin = 0x821800, length = 0x6000
-       DATA   :  origin = 0x827800, length = 0x3000
-       CFG    :  origin = 0x831800, length = 0x0300
-       STAT :    origin = 0x831b00, length = 0x0200
-}
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
 
 SECTIONS
 {
-       .stack  > STACK
-       .sysmem > HEAP
        .cinit  > TEXT
        .const  > TEXT
        .text   > TEXT
@@ -73,8 +29,5 @@ SECTIONS
        .far    > DATA
        .bss    > DATA
 
-    .ibl_config_table > CFG
-       .ibl_status_table > STAT
-
 }
 
diff --git a/src/make/ibl_c6472/ibl_common.inc b/src/make/ibl_c6472/ibl_common.inc
new file mode 100644 (file)
index 0000000..8c3c3d3
--- /dev/null
@@ -0,0 +1,38 @@
+/************************************************************************************
+ * FILE PURPOSE: Provide common memory and sections definitions for ibl_init and ibl
+ ************************************************************************************
+ * FILE NAME: ibl_common.inc
+ *
+ * DESCRIPTION: Defines the common memory map and section placement required
+ *                         to get ibl and ibl_init to work together in a two stage load
+ *                             process.
+ *************************************************************************************/
+
+-c
+-stack 0x800
+-heap  0x6000
+
+
+MEMORY
+{
+       TEXT_INIT :  origin = 0x800000, length = 0x2900
+       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
+       CFG       :  origin = 0x819800, length = 0x0300
+       STAT      :  origin = 0x819b00, length = 0x0200
+}
+
+
+SECTIONS
+{
+       .stack  > STACK
+       .sysmem > HEAP
+
+       .ibl_config_table > CFG
+       .ibl_status_table > STAT
+
+}
+
diff --git a/src/make/ibl_c6472/ibl_init.cmd b/src/make/ibl_c6472/ibl_init.cmd
new file mode 100644 (file)
index 0000000..9620990
--- /dev/null
@@ -0,0 +1,31 @@
+/************************************************************************************
+ * FILE PURPOSE: Define the memory usage of the ibl module for the c6455
+ ************************************************************************************
+ * FILE NAME: ibl.cmd
+ *
+ * DESCRIPTION: The memory placement for the IBL is defined
+ *
+ ************************************************************************************/
+
+/* In order to speed build time during debug, the object files are saved in
+ * both big and little endian format. The include file is generated by
+ * make to use the correct endian object files
+ */
+#include "ibl_init_objs.inc"
+
+
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
+
+
+SECTIONS
+{
+       .cinit  > TEXT_INIT
+       .const  > TEXT_INIT
+       .text   > TEXT_INIT
+       .switch > TEXT_INIT
+       .far    > DATA_INIT
+       .bss    > DATA_INIT
+
+}
+
diff --git a/src/make/ibl_c6472/ibl_init.rmd b/src/make/ibl_c6472/ibl_init.rmd
new file mode 100644 (file)
index 0000000..41c1b87
--- /dev/null
@@ -0,0 +1,11 @@
+-a
+-boot
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x0400, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c6472/ibl_init_image.rmd b/src/make/ibl_c6472/ibl_init_image.rmd
new file mode 100644 (file)
index 0000000..e137e36
--- /dev/null
@@ -0,0 +1,10 @@
+-a
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x800000, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c6472/ibl_init_objs_template.inc b/src/make/ibl_c6472/ibl_init_objs_template.inc
new file mode 100644 (file)
index 0000000..3ec796f
--- /dev/null
@@ -0,0 +1,18 @@
+/* ibl_init_objs_template.inc
+ *
+ *  list of object files tagged with the endian field for replacement during make
+ */
+
+../main/c64x/make/iblinit.ENDIAN_TAG.oc
+../device/c64x/make/c6472init.ENDIAN_TAG.oc
+../hw/c64x/make/pll.ENDIAN_TAG.oc
+../hw/c64x/make/i2c.ENDIAN_TAG.oc
+../interp/c64x/make/btblwrap.ENDIAN_TAG.oc
+../interp/c64x/make/btblpr.ENDIAN_TAG.oc
+../interp/c64x/make/gem.ENDIAN_TAG.oc
+
+
+
+
+
+
diff --git a/src/make/ibl_c6472/ibl_objs_template.inc b/src/make/ibl_c6472/ibl_objs_template.inc
new file mode 100644 (file)
index 0000000..564da74
--- /dev/null
@@ -0,0 +1,55 @@
+/* ibl_objs_template.inc
+ *
+ * list of oject files tagged with the endian field for replacement during make
+ */
+
+../main/c64x/make/iblmain.ENDIAN_TAG.oc
+../device/c64x/make/c6472.ENDIAN_TAG.oc
+../driver/c64x/make/timer.ENDIAN_TAG.oc
+../hw/c64x/make/t64.ENDIAN_TAG.oc
+../hw/c64x/make/psc.ENDIAN_TAG.oc
+../hw/c64x/make/emif31.ENDIAN_TAG.oc
+
+
+#ifndef EXCLUDE_BIS
+../interp/c64x/make/bis.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_COFF
+../interp/c64x/make/cload.ENDIAN_TAG.oc
+../interp/c64x/make/osal.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_BLOB
+../interp/c64x/make/blob.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_ELF
+../interp/c64x/make/dload.ENDIAN_TAG.oc
+../interp/c64x/make/elfwrap.ENDIAN_TAG.oc
+../interp/c64x/make/dlw_client.ENDIAN_TAG.oc
+../interp/c64x/make/dload_endian.ENDIAN_TAG.oc
+../interp/c64x/make/ArrayList.ENDIAN_TAG.oc
+#endif
+
+
+#ifndef EXCLUDE_ETH
+../ethboot/c64x/make/ethboot.ENDIAN_TAG.oc
+../driver/c64x/make/net.ENDIAN_TAG.oc
+../driver/c64x/make/arp.ENDIAN_TAG.oc
+../driver/c64x/make/ip.ENDIAN_TAG.oc
+../driver/c64x/make/udp.ENDIAN_TAG.oc
+../driver/c64x/make/stream.ENDIAN_TAG.oc
+../driver/c64x/make/bootp.ENDIAN_TAG.oc
+../driver/c64x/make/tftp.ENDIAN_TAG.oc
+../hw/c64x/make/cpmacdrv.ENDIAN_TAG.oc
+../hw/c64x/make/mdio.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_NAND
+../hw/c64x/make/gpio.ENDIAN_TAG.oc
+../hw/c64x/make/nandgpio.ENDIAN_TAG.oc
+../driver/c64x/make/nand.ENDIAN_TAG.oc
+../nandboot/c64x/make/nandboot.ENDIAN_TAG.oc
+../ecc/c64x/make/3byte_ecc.ENDIAN_TAG.oc
+#endif
diff --git a/src/make/ibl_c6474/i2crom.map.pre b/src/make/ibl_c6474/i2crom.map.pre
new file mode 100644 (file)
index 0000000..19bb501
--- /dev/null
@@ -0,0 +1,72 @@
+#include "iblcfg.h"
+;  This file is run through the C preprocessor to get the build time layout information
+;  The following values must be defined:
+;     I2C_BUS_ADDR   - The I2C bus address of the eeprom holding the ROM boot info and the layout info
+;        INIT_EXE_FILE  - The I2C blocked stage 1 of the ibl
+;     EXE_FILE_1     - The I2C blocked stage 2 of the ibl, must be the little endian version
+;     EXE_FILE_2        - The I2C blocked stage 2 of the ibl, must be the big endian version
+;     PAD_FILE_ID_1  - This pad holds the IBL configuration structure for the little endian version
+;     PAD_FILE_ID_2  - This pad holds the IBL configuration structure for the big endian version
+;
+;  The section statement directs the ROM boot loader to load the initial endian independent 
+;  portion of the IBL
+section 
+{
+  param_index   = 1
+  boot_mode     = 257
+  sw_pll               = 20
+  options       = 1
+
+  core_freq_mhz    = 1000
+  i2c_clk_freq_khz = 100
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 200
+  exe_file = INIT_EXE_FILE
+}
+
+; The layout statement defines how the resulting I2C image is layed out. The base address
+; of this (given in the dev_addr) statement must be known to the initial IBL program
+; at compile time. The layout block is simple a group of 32 bit i2c addresses, so 
+; the order of the exe_file and pad_file_id statements must be configured so as to
+; match the definition of struct iblI2cMap_t defined in ibl.h.
+layout
+{
+  dev_addr     = IBL_I2C_MAP_TABLE_DATA_ADDR           ; Defined in iblcfg.h
+  dev_addr_ext = I2C_BUS_ADDR
+  file_align   = 0x80
+
+  exe_file    = EXE_FILE_1
+  pad_file_id = PAD_FILE_ID_1
+
+
+  exe_file    = EXE_FILE_2
+  pad_file_id = PAD_FILE_ID_2
+}
+
+; The pad statements simply provide space for the IBL configuration structures. It is valid to
+; have a single configuration structure which is used for both endian values.
+pad
+{
+  pad_file_id  = 1
+  dev_addr     = 0x500
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = 0x300
+}
+
+#if (PAD_FILE_ID_1 != PAD_FILE_ID_2)
+pad
+{
+  pad_file_id  = 2
+  dev_addr     = 0x800
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = 0x300
+}
+#endif
+
+
+
+
index fdabe5adde588266d5792aa123af94cac3e47ea9..8cc0067f6a366a9123318b8a0d6d75572705ecf3 100644 (file)
@@ -7,61 +7,18 @@
  *
  ************************************************************************************/
 
+/* In order to speed build time during debug, the object files are saved in
+ * both big and little endian format. The include file is generated by
+ * make to use the correct endian object files
+ */
+#include "ibl_objs.inc"
 
-../main/c64x/make/iblmain.oc
-../device/c64x/make/c6474.oc
-../ethboot/c64x/make/ethboot.oc
-../driver/c64x/make/net.oc
-../driver/c64x/make/arp.oc
-../driver/c64x/make/ip.oc
-../driver/c64x/make/udp.oc
-../driver/c64x/make/stream.oc
-../driver/c64x/make/timer.oc
-../driver/c64x/make/bootp.oc
-../driver/c64x/make/tftp.oc
-../hw/c64x/make/t64.oc
-../hw/c64x/make/cpmacdrv.oc
-../hw/c64x/make/pll.oc
-../hw/c64x/make/psc.oc
-../hw/c64x/make/emif31.oc
-../hw/c64x/make/mdio.oc
-../hw/c64x/make/i2c.oc
-../hw/c64x/make/sgmii.oc
-../interp/c64x/make/bis.oc
-../interp/c64x/make/cload.oc
-../interp/c64x/make/osal.oc
-../interp/c64x/make/btblwrap.oc
-../interp/c64x/make/btblpr.oc
-../interp/c64x/make/gem.oc
-../interp/c64x/make/blob.oc
 
-/* ../interp/c64x/make/dload.oc */
-/* ../interp/c64x/make/elfwrap.oc */
-/* ../interp/c64x/make/dlw_client.oc */
-/* ../interp/c64x/make/dload_endian.oc */
-/* ../interp/c64x/make/ArrayList.oc */
+/* Symbols from the 1st portion of the load, generated by the make process */
+#include "ibl_init_symbols.inc"
 
-/* ../nandboot/c64x/make/nandboot.oc */
-/* ../driver/c64x/make/nand.oc */
-/* ../ecc/c64x/make/3byte_ecc.oc */
-/* ../hw/c64x/make/gpio.oc */
-/* ../hw/c64x/make/nandgpio.oc */
-
--c
--stack 0x800
--heap  0x6000
-
-
-
-MEMORY
-{
-       TEXT   :  origin = 0x801000, length = 0x20000
-       STACK  :  origin = 0x821000, length = 0x0800
-       HEAP   :  origin = 0x821800, length = 0x6000
-       DATA   :  origin = 0x827800, length = 0x3000
-       CFG    :  origin = 0x831800, length = 0x0300
-       STAT :    origin = 0x831b00, length = 0x0200
-}
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
 
 SECTIONS
 {
@@ -74,8 +31,5 @@ SECTIONS
        .far    > DATA
        .bss    > DATA
 
-    .ibl_config_table > CFG
-       .ibl_status_table > STAT
-
 }
 
diff --git a/src/make/ibl_c6474/ibl_common.inc b/src/make/ibl_c6474/ibl_common.inc
new file mode 100644 (file)
index 0000000..e9be06e
--- /dev/null
@@ -0,0 +1,38 @@
+/************************************************************************************
+ * FILE PURPOSE: Provide common memory and sections definitions for ibl_init and ibl
+ ************************************************************************************
+ * FILE NAME: ibl_common.inc
+ *
+ * DESCRIPTION: Defines the common memory map and section placement required
+ *                         to get ibl and ibl_init to work together in a two stage load
+ *                             process.
+ *************************************************************************************/
+
+-c
+-stack 0x800
+-heap  0x6000
+
+
+MEMORY
+{
+       TEXT_INIT :  origin = 0x801000, length = 0x2800
+       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
+       CFG       :  origin = 0x821800, length = 0x0300
+       STAT      :  origin = 0x821b00, length = 0x0200
+}
+
+
+SECTIONS
+{
+       .stack  > STACK
+       .sysmem > HEAP
+
+       .ibl_config_table > CFG
+       .ibl_status_table > STAT
+
+}
+
diff --git a/src/make/ibl_c6474/ibl_init.cmd b/src/make/ibl_c6474/ibl_init.cmd
new file mode 100644 (file)
index 0000000..6416ca2
--- /dev/null
@@ -0,0 +1,31 @@
+/************************************************************************************
+ * FILE PURPOSE: Define the memory usage of the ibl module for the c6474
+ ************************************************************************************
+ * FILE NAME: ibl.cmd
+ *
+ * DESCRIPTION: The memory placement for the IBL is defined
+ *
+ ************************************************************************************/
+
+/* In order to speed build time during debug, the object files are saved in
+ * both big and little endian format. The include file is generated by
+ * make to use the correct endian object files
+ */
+#include "ibl_init_objs.inc"
+
+
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
+
+
+SECTIONS
+{
+       .cinit  > TEXT_INIT
+       .const  > TEXT_INIT
+       .text   > TEXT_INIT
+       .switch > TEXT_INIT
+       .far    > DATA_INIT
+       .bss    > DATA_INIT
+
+}
+
diff --git a/src/make/ibl_c6474/ibl_init.rmd b/src/make/ibl_c6474/ibl_init.rmd
new file mode 100644 (file)
index 0000000..41c1b87
--- /dev/null
@@ -0,0 +1,11 @@
+-a
+-boot
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x0400, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c6474/ibl_init_image.rmd b/src/make/ibl_c6474/ibl_init_image.rmd
new file mode 100644 (file)
index 0000000..2d305e7
--- /dev/null
@@ -0,0 +1,10 @@
+-a
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x801000, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c6474/ibl_init_objs_template.inc b/src/make/ibl_c6474/ibl_init_objs_template.inc
new file mode 100644 (file)
index 0000000..98cff0b
--- /dev/null
@@ -0,0 +1,18 @@
+/* ibl_init_objs_template.inc
+ *
+ *  list of object files tagged with the endian field for replacement during make
+ */
+
+../main/c64x/make/iblinit.ENDIAN_TAG.oc
+../device/c64x/make/c6474init.ENDIAN_TAG.oc
+../hw/c64x/make/pll.ENDIAN_TAG.oc
+../hw/c64x/make/i2c.ENDIAN_TAG.oc
+../interp/c64x/make/btblwrap.ENDIAN_TAG.oc
+../interp/c64x/make/btblpr.ENDIAN_TAG.oc
+../interp/c64x/make/gem.ENDIAN_TAG.oc
+
+
+
+
+
+
diff --git a/src/make/ibl_c6474/ibl_objs_template.inc b/src/make/ibl_c6474/ibl_objs_template.inc
new file mode 100644 (file)
index 0000000..c98b6b9
--- /dev/null
@@ -0,0 +1,57 @@
+/* ibl_objs_template.inc
+ *
+ * list of object files tagged with the endian field for replacement during make
+ */
+
+../main/c64x/make/iblmain.ENDIAN_TAG.oc
+../device/c64x/make/c6474.ENDIAN_TAG.oc
+../driver/c64x/make/timer.ENDIAN_TAG.oc
+../hw/c64x/make/t64.ENDIAN_TAG.oc
+../hw/c64x/make/psc.ENDIAN_TAG.oc
+../hw/c64x/make/emif31.ENDIAN_TAG.oc
+
+
+#ifndef EXCLUDE_BIS
+../interp/c64x/make/bis.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_COFF
+../interp/c64x/make/cload.ENDIAN_TAG.oc
+../interp/c64x/make/osal.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_BLOB
+../interp/c64x/make/blob.ENDIAN_TAG.oc
+#endif
+
+
+#ifndef EXCLUDE_ELF
+../interp/c64x/make/dload.ENDIAN_TAG.oc
+../interp/c64x/make/elfwrap.ENDIAN_TAG.oc
+../interp/c64x/make/dlw_client.ENDIAN_TAG.oc
+../interp/c64x/make/dload_endian.ENDIAN_TAG.oc
+../interp/c64x/make/ArrayList.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_ETH
+../ethboot/c64x/make/ethboot.ENDIAN_TAG.oc
+../driver/c64x/make/net.ENDIAN_TAG.oc
+../driver/c64x/make/arp.ENDIAN_TAG.oc
+../driver/c64x/make/ip.ENDIAN_TAG.oc
+../driver/c64x/make/udp.ENDIAN_TAG.oc
+../driver/c64x/make/stream.ENDIAN_TAG.oc
+../driver/c64x/make/bootp.ENDIAN_TAG.oc
+../driver/c64x/make/tftp.ENDIAN_TAG.oc
+../hw/c64x/make/cpmacdrv.ENDIAN_TAG.oc
+../hw/c64x/make/mdio.ENDIAN_TAG.oc
+../hw/c64x/make/sgmii.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_NAND
+../nandboot/c64x/make/nandboot.ENDIAN_TAG.oc
+../driver/c64x/make/nand.ENDIAN_TAG.oc
+../ecc/c64x/make/3byte_ecc.ENDIAN_TAG.oc
+../hw/c64x/make/gpio.ENDIAN_TAG.oc
+../hw/c64x/make/nandgpio.ENDIAN_TAG.oc
+#endif
+
diff --git a/src/make/makestg1 b/src/make/makestg1
new file mode 100644 (file)
index 0000000..592c233
--- /dev/null
@@ -0,0 +1,69 @@
+#*******************************************************************************************
+#* FILE PURPOSE: Top level make for the IBL
+#*******************************************************************************************
+#* FILE NAME: Makefile
+#*
+#* DESCRIPTION: Builds the Intermediate Boot Loader (IBL)
+#*
+#*  Usage:  make c6455 | c6472 | c6474 | c6474l | c6457 [DEBUG=yes] [ETH=no] [NAND=no]  \
+#*          [BIS=no] [COFF=no] [BLOB=no] [ELF=no] [ENDIAN= both | big | little] [I2C_BUS_ADDR= 0x50 | 0x51] \
+#*                     [COMPACT_I2C=yes]
+#*******************************************************************************************
+
+IBLS_C6X= c6455 c6472 c6474 c6474l c6457
+
+# 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
+
+# The endian of the build. The default target builds a single ROM image with both endians present
+ifeq ($(ENDIAN_MODE),big)
+ I2CROM=        big_endian
+ STAGE1_TARGET= be_target
+else
+ ifeq ($(ENDIAN_MODE),little)
+  I2CROM=        little_endian
+  STAGE1_TARGET= le_target
+ else
+  I2CROM=        both
+  STAGE1_TARGET= be_target le_target compare
+ endif
+endif
+
+# The i2c ROM bus address. The code will advance accross I2C bus address boundaries (the code must
+# be blocked so that a single block doesn't cross a boundary, however). 
+ifndef I2C_BUS_ADDR
+ I2C_BUS_ADDR=0x50
+endif
+
+# Excludes identify which components are not part of the build
+export EXCLUDES
+
+all:
+       @echo must specify a target [ $(IBLS_C6X) ]
+
+
+
+be_target:
+       make -f makestg2 ARCH=c64x TARGET=$(TARGET) ENDIAN=big       I2C_BUS_ADDR=$(I2C_BUS_ADDR) $(TARGET)
+
+le_target:
+       make -f makestg2 ARCH=c64x TARGET=$(TARGET) ENDIAN=little    I2C_BUS_ADDR=$(I2C_BUS_ADDR) $(TARGET)
+
+compare:
+       make -f makestg2 ARCH=c64x TARGET=$(TARGET) compare
+
+
+$(IBLS_C6X): $(STAGE1_TARGET)
+       make -f makestg2 ARCH=c64x TARGET=$@ I2CROM=$(I2CROM) I2C_BUS_ADDR=$(I2C_BUS_ADDR) COMPACT_I2C=$(COMPACT_I2C) i2cRom
+
+
+
+
+
+
+
+
+
+
+
index 456628b6bfc703e46f80c22f32302a544ededea6..9f0ed7a9bf47ead059242c9bd400e32b7ef8eb9a 100644 (file)
@@ -11,11 +11,26 @@ ifndef IBL_ROOT
        IBL_ROOT=..
 endif
 
-MODULES= main device ethboot nandboot driver hw interp ecc
+CFG_MODULES= main device
+MODULES= ethboot nandboot driver hw interp ecc
+
 CLEAN_MODULES=$(addprefix clean_,$(MODULES))
+CLEAN_MODULES+=$(addprefix clean,$(CFG_MODULES))
+
 
 TARGETS= c6472 c6474 c6474l c6455 c6457
 
+# The main module needs to know the device address of the i2c where the image map resides
+MAINDEFS=-DIBL_I2C_MAP_TABLE_DATA_BUS_ADDR=$(I2C_BUS_ADDR)
+
+# Add build time exclusion definitions
+MAINDEFS+=$(addprefix -DEXCLUDE_,$(EXCLUDES))
+
+
+# Common symbols are functions which are loaded with the stage load of the IBL, and
+# also referenced from the second stage
+COMMON_SYMBOLS= hwI2Cinit hwI2cMasterRead iblBootBtbl iblMalloc iblFree iblMemset iblMemcpy
+
 ifeq ($(ENDIAN),little)
        HEX_OPT= -order L
        IEXT=     le
@@ -24,10 +39,8 @@ else
        IEXT=     be
 endif
 
-ifeq ($(TARGET),c6474)
+ifeq ($(COMPACT_I2C),yes)
   COMPACT= -compact
-else
-  COMPACT=
 endif
 
 include $(IBL_ROOT)/make/$(ARCH)/makedefs.mk
@@ -35,24 +48,105 @@ include $(IBL_ROOT)/make/$(ARCH)/makedefs.mk
 export ARCH
 export TARGET
 
+$(TARGETS): iblMain
 
-$(TARGETS): $(MODULES) utils $(RIBL)
-       $(LD) -o ibl_$@/ibl_$@.out -m ibl_$@/ibl_$@.map  ibl_$@/ibl.cmd $(RTLIBS)
-       hex6x $(HEX_OPT) ibl_$@/ibl.rmd ibl_$@/ibl_$@.out
-       ../util/bconvert/bconvert64x -$(IEXT) ibl_le.b ibl.b
-       $(CP) ibl.b ibl_$@
-       ../util/btoccs/b2i2c ibl_$@/ibl.b ibl_$@/ibl.i2c.b
-       ../util/btoccs/b2ccs ibl_$@/ibl.i2c.b ibl_$@/ibl.i2c.$(IEXT).ccs
-       ../util/romparse/romparse $(COMPACT) ibl_$@/i2crom_$(IEXT).map
-       $(CP) i2crom.ccs ibl_$@/i2crom_$(IEXT).ccs
-       $(CP) i2crom.ccs ibl_$@/i2crom_$(IEXT).dat
+
+
+# The I2C creation options. The I2C map file is run through the C pre-processor to generate
+# the desired I2C mapping. There are three possible configurations - an i2c which has
+# both endians present, or an I2C with only one of the endians
+
+I2C_BE_FILE=      '"ibl_$(TARGET)/ibl.i2c.be.ccs"'
+I2C_LE_FILE=      '"ibl_$(TARGET)/ibl.i2c.le.ccs"'
+I2C_INIT_BE_FILE= '"ibl_$(TARGET)/ibl_init.i2c.be.ccs"'
+I2C_INIT_LE_FILE= '"ibl_$(TARGET)/ibl_init.i2c.le.ccs"'
+
+I2C_DEFS= -DI2C_BUS_ADDR=$(I2C_BUS_ADDR) 
+
+ifeq ($(I2CROM),both) 
+ I2C_DEFS+= -DINIT_EXE_FILE=$(I2C_INIT_LE_FILE)
+ I2C_DEFS+= -DEXE_FILE_1=$(I2C_LE_FILE) 
+ I2C_DEFS+= -DPAD_FILE_ID_1=1 
+ I2C_DEFS+= -DEXE_FILE_2=$(I2C_BE_FILE) 
+ I2C_DEFS+= -DPAD_FILE_ID_2=2 
+else 
+ I2C_DEFS+= -DPAD_FILE_ID_1=1
+ I2C_DEFS+= -DPAD_FILE_ID_2=1
+
+ ifeq ($(I2CROM),little_endian)
+  I2C_DEFS+= -DINIT_EXE_FILE=$(I2C_INIT_LE_FILE)
+  I2C_DEFS+= -DEXE_FILE_1=$(I2C_LE_FILE)
+  I2C_DEFS+= -DEXE_FILE_2='""'
+ else
+  I2C_DEFS+= -DINIT_EXE_FILE=$(I2C_INIT_BE_FILE)
+  I2C_DEFS+= -DEXE_FILE_1='""'
+  I2C_DEFS+= -DEXE_FILE_2=$(I2C_BE_FILE)
+ endif
+endif
+
+
+i2cRom:
+       $(CC) -ppo -I../cfg/$(TARGET) $(I2C_DEFS) ibl_$(TARGET)/$@.map.pre
+       ../util/romparse/romparse $(COMPACT) -rom_base $(I2C_BUS_ADDR) ibl_$(TARGET)/$@.map.pp
+       $(CP) i2crom.ccs ibl_$(TARGET)/$@.ccs
+       $(CP) i2crom.ccs ibl_$(TARGET)/$@.dat
        $(RM) i2crom.ccs ibl_le.b ibl.b
 
 
+
+
+
+
+# Target compare checks if the iblInit is compiled the same for both endians
+compare:
+       @echo -
+       @sh -c 'if diff -q ibl_$(TARGET)/ibl_init.le.ccs ibl_$(TARGET)/ibl_init.be.ccs ; then echo IBL init endian neutral ; else echo !!! WARNING !!!! IBL ini NOT endian neutral !!! ; fi '
+       @echo -
+
+# For the init code a raw image is created as well as the i2c code to verify
+# endian independent code is generated. The symbols required for linking
+# the full application are then extracted
+iblInit: $(CFG_MODULES) $(MODULES) utils
+       cat ibl_$(TARGET)/ibl_init_objs_template.inc | sed -e s/ENDIAN_TAG/$(IEXT)/g > ibl_$(TARGET)/ibl_init_objs.inc
+       $(LD) -o ibl_$(TARGET)/ibl_$(TARGET)_init.out -m ibl_$(TARGET)/ibl_$(TARGET)_init.map ibl_$(TARGET)/ibl_init.cmd $(RTLIBS)
+       $(CP) ibl_$(TARGET)/ibl_$(TARGET)_init.out ibl_$(TARGET)/ibl_$(TARGET)_init.$(IEXT).out
+       $(RM) -f ibl_$(TARGET)/ibl_init_obj.inc
+
+       hex6x $(HEX_OPT) ibl_$(TARGET)/ibl_init_image.rmd ibl_$(TARGET)/ibl_$(TARGET)_init.out
+       $(CP) ibl_le.b ibl_$(TARGET)/ibl.b
+       ../util/btoccs/b2ccs ibl_$(TARGET)/ibl.b ibl_$(TARGET)/ibl_init.$(IEXT).ccs
+
+       hex6x $(HEX_OPT) ibl_$(TARGET)/ibl_init.rmd ibl_$(TARGET)/ibl_$(TARGET)_init.out
+       ../util/bconvert/bconvert64x -$(IEXT) ibl_le.b ibl.b
+       $(CP) ibl.b ibl_$(TARGET)
+       ../util/btoccs/b2i2c ibl_$(TARGET)/ibl.b ibl_$(TARGET)/ibl.i2c.b
+       ../util/btoccs/b2ccs ibl_$(TARGET)/ibl.i2c.b ibl_$(TARGET)/ibl_init.i2c.$(IEXT).ccs
+
+       bash ../util/symExtract/symExtract ibl_$(TARGET)/ibl_$(TARGET)_init.map ibl_$(TARGET)/ibl_init_symbols.inc $(COMMON_SYMBOLS)
+
+       
+iblMain: iblInit $(CFG_MODULES) $(MODULES)
+       cat ibl_$(TARGET)/ibl_objs_template.inc | sed -e s/ENDIAN_TAG/$(IEXT)/g > ibl_$(TARGET)/ibl_objs.tmp
+       $(CC) -ppo $(MAINDEFS) -DENDIAN_TAG=$(IEXT) ibl_$(TARGET)/ibl_objs.tmp
+       $(CP) ibl_$(TARGET)/ibl_objs.pp ibl_$(TARGET)/ibl_objs.inc
+       $(LD) -o ibl_$(TARGET)/ibl_$(TARGET).out -m ibl_$(TARGET)/ibl_$(TARGET).$(IEXT).map  ibl_$(TARGET)/ibl.cmd $(RTLIBS)
+       $(CP) ibl_$(TARGET)/ibl_$(TARGET).out ibl_$(TARGET)/ibl_$(TARGET).$(IEXT).out
+       $(RM) -f ibl_$(TARGET)/ibl_obj.inc
+
+       hex6x $(HEX_OPT) ibl_$(TARGET)/ibl.rmd ibl_$(TARGET)/ibl_$(TARGET).out
+       ../util/bconvert/bconvert64x -$(IEXT) ibl_le.b ibl.b
+       $(CP) ibl.b ibl_$(TARGET)
+       ../util/btoccs/b2i2c ibl_$(TARGET)/ibl.b ibl_$(TARGET)/ibl.i2c.b
+       ../util/btoccs/b2ccs ibl_$(TARGET)/ibl.i2c.b ibl_$(TARGET)/ibl.i2c.$(IEXT).ccs
+
+
 $(MODULES):
        @echo making $@
        make -C $(IBL_ROOT)/$@/$(ARCH)/make $@
 
+$(CFG_MODULES):
+       @echo making $@
+       make -C $(IBL_ROOT)/$@/$(ARCH)/make CDEFS='$(MAINDEFS)' $@
 
 utils:
        make -C $(IBL_ROOT)/util/btoccs
diff --git a/src/mkdeppath.bat b/src/mkdeppath.bat
deleted file mode 100644 (file)
index d2ed041..0000000
+++ /dev/null
@@ -1 +0,0 @@
-set MAKEDEPPATH=/data/projects/ibl/git/ibl/src/make/makedep/makedep.exe
index b55420246aa61c904fd93ebdaf250e1007feef62..9bbd330fac3e1708696c4024a9d97e5d4abb5444 100644 (file)
@@ -38,7 +38,7 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
+       @echo $(TARGET) $(ARCH) $(CDEFS) $(DEBUG) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
 
index e8025f5ea24f9d162de9256ddcb6705e290d9cae..606aced1a9507a9e582f3da1dacceb116ef5f1e1 100644 (file)
@@ -20,19 +20,6 @@ endif
 
 export ENDIAN
 
-# The value of I2C_PARAM_BUS_ADDR determines the I2C bus address used
-# to read the ibl configuration table from. The default values are
-# 0x50 for little endian and 0x51 for big endian
-
-ifndef I2C_PARAM_BUS_ADDR
- ifeq ($(ENDIAN),little)
-   I2C_PARAM_BUS_ADDR=0x50
- else
-   I2C_PARAM_BUS_ADDR=0x51
- endif
-endif
-
-export I2C_PARAM_BUS_ADDR
 
 $(DEVICES):
        make -f makestg2 ARCH=c64x TARGET=$@ $@
index 8e83d967cb4c5ceeca6d7ec6ccaeabf431dcebe7..48c64004b6eb79d886549f85db35f30743e65cc3 100644 (file)
@@ -60,12 +60,12 @@ hotmenu setConfig_c6472()
     ibl.ethConfig[0].doBootp          = FALSE;\r
     ibl.ethConfig[0].useBootpServerIp = FALSE;\r
     ibl.ethConfig[0].useBootpFileName = FALSE;\r
-    ibl.ethConfig[0].bootFormat       = ibl_BOOT_FORMAT_BBLOB;\r
+    ibl.ethConfig[0].bootFormat       = ibl_BOOT_FORMAT_AUTO;\r
 \r
 \r
-    SETIP(ibl.ethConfig[0].ethInfo.ipAddr,    158,218,100,113);\r
-    SETIP(ibl.ethConfig[0].ethInfo.serverIp,  158,218,100,25);\r
-    SETIP(ibl.ethConfig[0].ethInfo.gatewayIp, 158,218,100,2);\r
+    SETIP(ibl.ethConfig[0].ethInfo.ipAddr,    10,218,109,21);\r
+    SETIP(ibl.ethConfig[0].ethInfo.serverIp,  10,218,109,196);\r
+    SETIP(ibl.ethConfig[0].ethInfo.gatewayIp, 10,218,109,2);\r
     SETIP(ibl.ethConfig[0].ethInfo.netmask,   255,255,255,0);\r
 \r
     /* Leave the hardware address as 0 so the e-fuse value will be used */\r
@@ -73,18 +73,18 @@ hotmenu setConfig_c6472()
 \r
 \r
 \r
-    ibl.ethConfig[0].ethInfo.fileName[0]  = 'c';\r
-    ibl.ethConfig[0].ethInfo.fileName[1]  = '6';\r
-    ibl.ethConfig[0].ethInfo.fileName[2]  = '4';\r
-    ibl.ethConfig[0].ethInfo.fileName[3]  = '7';\r
-    ibl.ethConfig[0].ethInfo.fileName[4]  = '2';\r
-    ibl.ethConfig[0].ethInfo.fileName[5]  = '-';\r
-    ibl.ethConfig[0].ethInfo.fileName[6]  = 'l';\r
-    ibl.ethConfig[0].ethInfo.fileName[7]  = 'e';\r
-    ibl.ethConfig[0].ethInfo.fileName[8]  = '.';\r
-    ibl.ethConfig[0].ethInfo.fileName[9]  = 'b';\r
-    ibl.ethConfig[0].ethInfo.fileName[10] = 'i';\r
-    ibl.ethConfig[0].ethInfo.fileName[11] = 'n';\r
+    ibl.ethConfig[0].ethInfo.fileName[0]  = 't';\r
+    ibl.ethConfig[0].ethInfo.fileName[1]  = 'e';\r
+    ibl.ethConfig[0].ethInfo.fileName[2]  = 's';\r
+    ibl.ethConfig[0].ethInfo.fileName[3]  = 't';\r
+    ibl.ethConfig[0].ethInfo.fileName[4]  = '.';\r
+    ibl.ethConfig[0].ethInfo.fileName[5]  = 'o';\r
+    ibl.ethConfig[0].ethInfo.fileName[6]  = 'u';\r
+    ibl.ethConfig[0].ethInfo.fileName[7]  = 't';\r
+    ibl.ethConfig[0].ethInfo.fileName[8]  = '\0';\r
+    ibl.ethConfig[0].ethInfo.fileName[9]  = '\0';\r
+    ibl.ethConfig[0].ethInfo.fileName[10] = '\0';\r
+    ibl.ethConfig[0].ethInfo.fileName[11] = '\0';\r
     ibl.ethConfig[0].ethInfo.fileName[12] = '\0';\r
     ibl.ethConfig[0].ethInfo.fileName[13] = '\0';\r
     ibl.ethConfig[0].ethInfo.fileName[14] = '\0';\r
@@ -104,7 +104,7 @@ hotmenu setConfig_c6472()
     ibl.ethConfig[1].doBootp          = TRUE;\r
     ibl.ethConfig[1].useBootpServerIp = TRUE;\r
     ibl.ethConfig[1].useBootpFileName = TRUE;\r
-    ibl.ethConfig[1].bootFormat       = ibl_BOOT_FORMAT_BBLOB;\r
+    ibl.ethConfig[1].bootFormat       = ibl_BOOT_FORMAT_AUTO;\r
 \r
 \r
     /* SGMII not present */\r
@@ -161,6 +161,25 @@ hotmenu setConfig_c6472()
     /* Nand boot is disabled */\r
     ibl.nandConfig.nandPriority = ibl_DEVICE_NOBOOT;\r
 \r
+    ibl.nandConfig.bootFormat   = ibl_BOOT_FORMAT_AUTO;\r
+\r
+    ibl.nandConfig.nandInfo.busWidthBits  = 8;\r
+    ibl.nandConfig.nandInfo.pageSizeBytes = 2048;\r
+    ibl.nandConfig.nandInfo.pageEccBytes  = 64;\r
+    ibl.nandConfig.nandInfo.pagesPerBlock = 64;\r
+    ibl.nandConfig.nandInfo.totalBlocks   = 1024;\r
+\r
+    ibl.nandConfig.nandInfo.addressBytes  = 4;\r
+    ibl.nandConfig.nandInfo.lsbFirst      = TRUE;\r
+    ibl.nandConfig.nandInfo.blockOffset   = 22;\r
+    ibl.nandConfig.nandInfo.pageOffset    = 16;\r
+    ibl.nandConfig.nandInfo.columnOffset  = 0;\r
+\r
+    ibl.nandConfig.nandInfo.resetCommand    = 0xff;\r
+    ibl.nandConfig.nandInfo.readCommandPre  = 0;\r
+    ibl.nandConfig.nandInfo.readCommandPost = 0x30;\r
+    ibl.nandConfig.nandInfo.postCommand     = TRUE;\r
+\r
 }\r
 \r
 \r
index d89630440d62c7fa9fa2e0c79f175c4ed4d3b45b..6ef8df5abc881c3d1c33efea362de3fed7f14ba1 100644 (file)
 
 ibl_t ibl;
 
-#define SETIP(array,i0,i1,i2,i3)      array[0]=(i0);  \
-                                      array[1]=(i1);  \
-                                      array[2]=(i2);  \
-                                      array[3]=(i3)
+/* The configAddress must be programmed. On images which support both endians
+ * there can be two seperate configurations, one for big endian, and one for little */
+unsigned int configBusAddress = 0x50;
+unsigned int configAddress    = 0;
+
 
 /**
- * @brief  The desired ibl configuration is setup here. Edit the fields
- *         to match the desired setup.
+ *  @brief
+ *      Ones complement addition
  */
-
-#if 0
-void setupTable (void)
+inline uint16 onesComplementAdd (uint16 value1, uint16 value2)
 {
+  uint32 result;
 
-    /* Initialize the table */
-    memset (&ibl, 0, sizeof (ibl_t));
-
-    ibl.iblMagic = ibl_MAGIC_VALUE;
-
-    ibl.pllConfig[ibl_MAIN_PLL].doEnable      = TRUE;
-    ibl.pllConfig[ibl_MAIN_PLL].prediv        = 1;
-    ibl.pllConfig[ibl_MAIN_PLL].mult          = 28;
-    ibl.pllConfig[ibl_MAIN_PLL].postdiv       = 1;
-    ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz = 700;
-
-    /* The DDR PLL. The multipliers/dividers are fixed, so are really dont cares */
-    ibl.pllConfig[ibl_DDR_PLL].doEnable = TRUE;
-
-    /* The network PLL. The multipliers/dividers are fixed */
-    ibl.pllConfig[ibl_NET_PLL].doEnable = TRUE;
-
-    /* EMIF configuration. The values are for DDR at 533 MHz  */
-    ibl.ddrConfig.configDdr = TRUE;
-
-    ibl.ddrConfig.uEmif.emif3p1.sdcfg  = 0x00538832; /* timing, 32bit wide */
-    ibl.ddrConfig.uEmif.emif3p1.sdrfc  = 0x0000073B; /* Refresh 533Mhz */ 
-    ibl.ddrConfig.uEmif.emif3p1.sdtim1 = 0x47245BD2; /* Timing 1 */
-    ibl.ddrConfig.uEmif.emif3p1.sdtim2 = 0x0125DC44; /* Timing 2 */
-    ibl.ddrConfig.uEmif.emif3p1.dmcctl = 0x50001906; /* PHY read latency for CAS 5 is 5 + 2 - 1 */
-
-    /* Ethernet configuration for port 0 */
-    ibl.ethConfig[0].ethPriority      = ibl_HIGHEST_PRIORITY;
-    ibl.ethConfig[0].port             = 0;
-
-    /* Bootp is disabled. The server and file name are provided here */
-    ibl.ethConfig[0].doBootp          = FALSE;
-    ibl.ethConfig[0].useBootpServerIp = FALSE;
-    ibl.ethConfig[0].useBootpFileName = FALSE;
-    ibl.ethConfig[0].bootFormat       = ibl_BOOT_FORMAT_BBLOB;
-
-#if 0
-    SETIP(ibl.ethConfig[0].ethInfo.ipAddr,    192,168,2,100);
-    SETIP(ibl.ethConfig[0].ethInfo.serverIp,  192,168,2,110);
-    SETIP(ibl.ethConfig[0].ethInfo.gatewayIp, 192,168,2,2);
-    SETIP(ibl.ethConfig[0].ethInfo.netmask,   255,255,255,0);
-#endif
-    SETIP(ibl.ethConfig[0].ethInfo.ipAddr,    10,218,109,35);
-    SETIP(ibl.ethConfig[0].ethInfo.serverIp,  10,218,109,196);
-    SETIP(ibl.ethConfig[0].ethInfo.gatewayIp, 10,218,109,1);
-    SETIP(ibl.ethConfig[0].ethInfo.netmask,   255,255,255,0);
-
-    /* Leave the hardware address as 0 so the e-fuse value will be used */
-
-    strcpy (ibl.ethConfig[0].ethInfo.fileName, "test.blob");
-
-    /* Even though the entire range of DDR2 is chosen, the load will
-     * stop when the ftp reaches the end of the file */
-    ibl.ethConfig[0].blob.startAddress  = 0xe0000000;       /* Base address of DDR2 */
-    ibl.ethConfig[0].blob.sizeBytes     = 0x20000000;       /* All of DDR2 */
-    ibl.ethConfig[0].blob.branchAddress = 0xe0000000;       /* Base of DDR2 */
-
-    /* For port 1 use bootp */
-    /* Ethernet configuration for port 0 */
-    ibl.ethConfig[1].ethPriority      = ibl_HIGHEST_PRIORITY + 1;
-    ibl.ethConfig[1].port             = 1;
-
-    /* Bootp is disabled. The server and file name are provided here */
-    ibl.ethConfig[1].doBootp          = TRUE;
-    ibl.ethConfig[1].useBootpServerIp = TRUE;
-    ibl.ethConfig[1].useBootpFileName = TRUE;
-    ibl.ethConfig[1].bootFormat       = ibl_BOOT_FORMAT_BBLOB;
-
-
-    /* SGMII */
-
-
-    /* Leave the hardware address as 0 so the e-fuse value will be used */
-    /* Leave all remaining fields as 0 since bootp will fill them in */
-
-
-    /* Even though the entire range of DDR2 is chosen, the load will
-     * stop when the ftp reaches the end of the file */
-    ibl.ethConfig[1].blob.startAddress  = 0xe0000000;       /* Base address of DDR2 */
-    ibl.ethConfig[1].blob.sizeBytes     = 0x20000000;       /* All of DDR2 */
-    ibl.ethConfig[1].blob.branchAddress = 0xe0000000;       /* Base of DDR2 */
-    
-
-
-    /* MDIO configuration */
-    ibl.mdioConfig.nMdioOps = 8;
-    ibl.mdioConfig.mdioClkDiv = 0x20;
-    ibl.mdioConfig.interDelay = 1400;   /* ~2ms at 700 MHz */
-
-    ibl.mdioConfig.mdio[0] =  (1 << 30) | (27 << 21) | (24 << 16) | 0x848b;
-    ibl.mdioConfig.mdio[1] =  (1 << 30) | (20 << 21) | (24 << 16) | 0x0ce0;
-    ibl.mdioConfig.mdio[2] =  (1 << 30) | (24 << 21) | (24 << 16) | 0x4101;
-    ibl.mdioConfig.mdio[3] =  (1 << 30) | ( 0 << 21) | (24 << 16) | 0x9140;
-
-    ibl.mdioConfig.mdio[4] =  (1 << 30) | (27 << 21) | (25 << 16) | 0x848b;
-    ibl.mdioConfig.mdio[5] =  (1 << 30) | (20 << 21) | (25 << 16) | 0x0ce0;
-    ibl.mdioConfig.mdio[6] =  (1 << 30) | (24 << 21) | (25 << 16) | 0x4101;
-    ibl.mdioConfig.mdio[7] =  (1 << 30) | ( 0 << 21) | (25 << 16) | 0x9140;
-
-
-    /* Nand boot is disabled */
-    ibl.nandConfig.nandPriority =&