Debugged the IBL two stage load process
authorMike Line <m-line1@ti.com>
Wed, 3 Nov 2010 18:30:06 +0000 (14:30 -0400)
committerMike Line <m-line1@ti.com>
Wed, 3 Nov 2010 18:30:06 +0000 (14:30 -0400)
The IBL now loads in two stages. The initial load from the boot ROM is
an endian neutral image. This initial load determines the endian setting
of the device and then loads the rest of the IBL using the correct
endian image.

34 files changed:
src/cfg/c6472/iblcfg.h
src/device/c64x/make/makefile
src/driver/c64x/make/makefile
src/ecc/c64x/make/makefile
src/ethboot/c64x/make/makefile
src/hw/c64x/make/makefile
src/interp/btbl/btblloc.h
src/interp/btbl/btblpr.c
src/interp/btbl/btblwrap.c
src/interp/c64x/make/makefile
src/main/c64x/make/makefile
src/main/iblinit.c
src/main/iblmain.c
src/make/Makefile
src/make/c64x/makedefs.mk
src/make/ibl_c6472/ibl.cmd
src/make/ibl_c6472/ibl_init.cmd
src/make/ibl_c6472/ibl_init_image.rmd
src/make/makestg2
src/nandboot/c64x/make/makefile
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/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

index df1a3bfb47d8643a8b85e14a08075c7c469f181a..83620918046de58fb2ed070bc2c3f383b9e8b6f7 100644 (file)
@@ -53,8 +53,8 @@
 
 #define IBL_I2C_CFG_EEPROM_BUS_ADDR    0x50
 
-#define IBL_I2C_CFG_TABLE_DATA_ADDR     (0x10000 - 0x300)
-#define IBL_I2C_MAP_TABLE_DATA_ADDR     0x180
+#define IBL_I2C_CFG_TABLE_DATA_ADDR     0x500
+#define IBL_I2C_MAP_TABLE_DATA_ADDR     0x420
  
 
 
index 12601a8d74cda2ef47f540dfc5daa6b43c9fd37b..1452f856f8e5812f59894fc469ce18f832978438 100644 (file)
@@ -60,7 +60,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 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 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 b1ce547ed25ba84b3affa0e2d766c3b525feeed8..740e97b7c1e6256d204b5928828433519a86b783 100644 (file)
@@ -34,7 +34,6 @@ else
  endif
 endif
 
-CDEFS += -DIBL_I2C_CFG_EEPROM_BUS_ADDR=$(I2C_PARAM_BUS_ADDR)
 
 .PHONY: hw
 
@@ -107,7 +106,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 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..25f75ecf1cde92b2093ea132586c454962c50a0e 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 */
@@ -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..e6284481aeec3064fe4c13df4318c4fe8ef523f0 100644 (file)
@@ -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;
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 '
 
 
index 4c6f435843da84c6f02486a110ea5a3a4763f483..00ca0e1c75f4eb518eed29a84b6cc4f23a42ea68 100644 (file)
@@ -17,9 +17,6 @@ ECODIR= $(IBL_ROOT)/main
 CSRC= iblmain.c iblinit.c
 
 
-CDEFS += -DIBL_I2C_CFG_EEPROM_BUS_ADDR=$(I2C_PARAM_BUS_ADDR)
-
-
 .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 '
 
index 431b070585aa7bdfc51bd8c1ad9084e2bd1444cf..e3b24faa07ca9c4c1c6e2a4ec7c419e293093469 100644 (file)
@@ -106,17 +106,84 @@ uint32 swap32val (uint32 v)
 
 /**
  *  @brief
- *      Swap an array of 32 bit values
+ *      Do a 2 byte endian swap
  */
-void swap32mem (uint32 *pv, int32 nwords)
+uint16 swap16val (uint16 v)
 {
-    int32 i;
+    v = (((v >> 8) & 0xff) << 0)  |
+        (((v >> 0) & 0xff) << 8);
 
-    for (i = 0; i < nwords; i++)
-        pv[i] = swap32val (pv[i]);
+    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.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 
@@ -160,6 +227,10 @@ Uint8 i2cFifoRead(void)
     v = i2cData[i2cFifoOut];
 
     i2cFifoOut += 1;
+
+    if (i2cFifoOut == i2cFifoIn)
+        i2cFifoOut = i2cFifoIn = 0;
+
     if (i2cFifoOut >= I2C_MAX_BLOCK_SIZE)
         i2cFifoOut = 0;
 
@@ -319,7 +390,7 @@ void main (void)
 
                  if (ibl.chkSum != 0)  {
 
-                    v = onesComplementChksum ((UINT16 *)&ibl, sizeof(ibl_t));
+                    v = onesComplementChksum ((UINT16 *)&ibl, sizeof(ibl_t) / sizeof(UINT16));
                     if ((v != 0) && (v != 0xffff))  {
                         iblStatus.i2cRetries += 1;
                         continue;
@@ -332,7 +403,7 @@ void main (void)
                     break;
 
                 if (swap32val (ibl.iblMagic) == ibl_MAGIC_VALUE)  {
-                    swap32mem ((uint32 *)&ibl, (sizeof(ibl_t) + 3) >> 2);
+                    iblSwap ();
                     break;
                 }
 
@@ -359,8 +430,12 @@ void main (void)
                 /* 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)
-                    swap32mem ((uint32 *)&map, (sizeof(iblI2cMap_t) + 3) >> 2);
+                if (littleEndian == TRUE)  {
+                    map.length = swap16val (map.length);
+                    map.chkSum = swap16val (map.chkSum);
+                    map.addrLe = swap32val (map.addrLe);
+                    map.addrBe = swap32val (map.addrBe);
+                }
 
                 if (map.length != sizeof(iblI2cMap_t))  {
                     iblStatus.mapSizeFail += 1;
index 46e7387665354931f4b56ab2663f0d4d2beda6e6..20d51df37249f051a4c54c1627dacb0cf4605cad 100644 (file)
@@ -101,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++)  {
 
index 616e39231a0551ed770aca12a6203071f848f952..fc7db5fa5fc8f2e17de1715732b4e1c9dc81f926 100644 (file)
@@ -25,6 +25,7 @@ export DEBUG
 $(IBLS_C6X):
        make -f makestg2 ARCH=c64x TARGET=$@ ENDIAN=big    $@ 
        make -f makestg2 ARCH=c64x TARGET=$@ ENDIAN=little $@ 
+       make -f makestg2 ARCH=c64x TARGET=$@               compare
        make -f makestg2 ARCH=c64x TARGET=$@               i2cRom
 
 
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
index 24714a02b6daae25c7ad061460f31d7d37fbcc3b..53ad8745498e136296aaf904e62199c8b7d3e71f 100644 (file)
@@ -7,63 +7,22 @@
  *
  ************************************************************************************/
 
+/* 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/psc.oc
-../hw/c64x/make/emif31.oc
-../hw/c64x/make/mdio.oc
-../hw/c64x/make/gpio.oc
-../hw/c64x/make/nandgpio.oc
-../interp/c64x/make/bis.oc
-../interp/c64x/make/cload.oc
-../interp/c64x/make/osal.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"
 
--c
--stack 0x800
--heap  0x6000
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
 
 
-
-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
@@ -71,8 +30,5 @@ SECTIONS
        .far    > DATA
        .bss    > DATA
 
-    .ibl_config_table > CFG
-       .ibl_status_table > STAT
-
 }
 
index dc922e692bd3a188cafffa5842748c9a887de3af..96209902cd5c9dddef8d2b7c42259f315859309b 100644 (file)
@@ -7,44 +7,25 @@
  *
  ************************************************************************************/
 
+/* 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"
 
-../main/c64x/make/iblinit.oc
-../device/c64x/make/c6472init.oc
-../hw/c64x/make/pll.oc
-../hw/c64x/make/i2c.oc
-../interp/c64x/make/btblwrap.oc
-../interp/c64x/make/btblpr.oc
-../interp/c64x/make/gem.oc
 
--c
--stack 0x800
--heap  0x6000
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
 
 
-
-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
+       .cinit  > TEXT_INIT
+       .const  > TEXT_INIT
+       .text   > TEXT_INIT
+       .switch > TEXT_INIT
+       .far    > DATA_INIT
+       .bss    > DATA_INIT
 
 }
 
index 2d305e7be1a5a2e90154d63e6f46de4dfe188780..e137e3692c92ea42ad15384187d39ac31248bd77 100644 (file)
@@ -3,7 +3,7 @@
 
 ROMS
 {
-       ROM1:  org = 0x801000, length = 0x20000, memwidth = 32, romwidth = 32
+       ROM1:  org = 0x800000, length = 0x20000, memwidth = 32, romwidth = 32
        files = { ibl_le.b }
 }
 
index 6a1bad03b0333d655de38ed2f497d470dc04192e..13b6139905c1b534540acad78ee277aa85814ecb 100644 (file)
@@ -45,12 +45,20 @@ i2cRom:
        $(CP) i2crom.ccs ibl_$(TARGET)/i2crom.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: $(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
@@ -66,7 +74,11 @@ iblInit: $(MODULES) utils
 
        
 iblMain: iblInit $(MODULES)
-       $(LD) -o ibl_$(TARGET)/ibl_$(TARGET).out -m ibl_$(TARGET)/ibl_$(TARGET).map  ibl_$(TARGET)/ibl.cmd $(RTLIBS)
+       cat ibl_$(TARGET)/ibl_objs_template.inc | sed -e s/ENDIAN_TAG/$(IEXT)/g > 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)
@@ -78,7 +90,6 @@ $(MODULES):
        @echo making $@
        make -C $(IBL_ROOT)/$@/$(ARCH)/make $@
 
-
 utils:
        make -C $(IBL_ROOT)/util/btoccs
        make -C $(IBL_ROOT)/util/romparse TARGET=$(TARGET)
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 d89630440d62c7fa9fa2e0c79f175c4ed4d3b45b..b4ba1dff75fa182ad163bd584965c48496558998 100644 (file)
 
 ibl_t ibl;
 
-#define SETIP(array,i0,i1,i2,i3)      array[0]=(i0);  \
-                                      array[1]=(i1);  \
-                                      array[2]=(i2);  \
-                                      array[3]=(i3)
 
 /**
- * @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 = ibl_DEVICE_NOBOOT;
+  result = (uint32)value1 + (uint32)value2;
 
+  result = (result >> 16) + (result & 0xFFFF); /* add in carry   */
+  result += (result >> 16);                    /* maybe one more */
+  return ((uint16)result);
 }
 
-#endif
 
+/**
+ *  @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
@@ -222,6 +134,7 @@ void main (void)
     char     iline[132];
     Int32    n; 
     Int32    currentOffset;
+    uint16   chk; 
 
     volatile Int32 i;
 
@@ -231,7 +144,7 @@ void main (void)
     /* Program the main system PLL */
     hwPllSetPll (MAIN_PLL,      
                  ibl.pllConfig[ibl_MAIN_PLL].prediv,         /* Pre-divider  */
-                 ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz,  /* Multiplier   */
+                 ibl.pllConfig[ibl_MAIN_PLL].mult,           /* Multiplier   */
                  ibl.pllConfig[ibl_MAIN_PLL].postdiv);       /* Post-divider */
 
 
@@ -241,6 +154,14 @@ void main (void)
                IBL_I2C_OWN_ADDR);                          /* The address used by this device on the i2c bus */
 
 
+    /* Compute the checksum over the ibl configuration structure */
+    ibl.chkSum = 0;
+    chk = onesComplementChksum ((uint16 *)&ibl, sizeof(ibl_t)/sizeof(uint16));
+    if (ibl.chkSum != 0xffff)
+      ibl.chkSum = ~chk;
+
+    
+
     /* Block the data into 64 byte blocks aligned on 64 byte boundaries for the data write.
      * The block address is prepended to the data block before writing */
     currentOffset = 0;
index 1d592a75bcfb9f7715d60a6eb625d9ead8c8c5e1..5edd340c7e9cb7c2301fb958a87edae4da74f667 100644 (file)
@@ -5,9 +5,7 @@
  *
  *************************************************************************/
 
-i2cparam.oc
-../../hw/c64x/make/i2c.oc
-../../hw/c64x/make/pll.oc
+/* Object files included in linker invokation */
 
 -c
 -a
@@ -18,6 +16,7 @@ MEMORY
    STACK   :  origin = 0x810000 length = 0x0400
    TEXT    :  origin = 0x810400 length = 0x8000
    DATA    :  origin = 0x818400 length = 0x0800
+   SYSMEM  :  origin = 0x809000 length = 0x0800
 }
 
 SECTIONS
@@ -33,5 +32,7 @@ SECTIONS
        .bss    > DATA
        .data   > DATA
 
+       .sysmem > SYSMEM
+
 }
        
\ No newline at end of file
index a46e83596437594b65aa0d0d912273032a69ff65..190e815e7b2159acc3b8b11cbbc320086e17aa1c 100644 (file)
@@ -13,6 +13,12 @@ ifndef IBL_ROOT
  IBL_ROOT=../..
 endif
 
+ifeq ($(ENDIAN),big)
+ IEXT=be
+else
+ IEXT=le
+endif
+
 ECODIR= $(IBL_ROOT)/util/i2cConfig
 
 MODULES= hw
@@ -45,7 +51,7 @@ CDEFS += -DIBL_I2C_CFG_EEPROM_BUS_ADDR=$(I2C_PARAM_BUS_ADDR)
 .PHONY: i2cparam.cmd
 
 $(DEVICES): gen_cdefdep $(MODULES) $(OBJS) i2cparam.cmd
-       $(LD) -o i2cparam_$(TARGET).out -m i2cparam_$(TARGET).map i2cparam.cmd $(RTLIBS)
+       $(LD) -o i2cparam_$(TARGET)_$(IEXT).out -m i2cparam_$(TARGET)_$(IEXT).map i2cparam.$(IEXT).oc ../../hw/c64x/make/i2c.$(IEXT).oc ../../hw/c64x/make/pll.$(IEXT).oc i2cparam.cmd $(RTLIBS)
 
 $(MODULES):
        @echo making $@
@@ -67,7 +73,7 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(TARGET) $(ARCH) > cdefdep.tmp
+       @echo $(TARGET) $(ARCH) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
        
index da3d7381462ae2223f8eb66c20af83ecb6106761..b92dfe5ea91afbb9e64c78243d48d8619b7aa082 100644 (file)
@@ -1,6 +1,5 @@
 
-i2cRead.oc
-../../hw/c64x/make/i2c.oc
+/* Object files specified on linker invokation */
 
 -c
 -a
index d561abaec616123b21852e94a8401b796295a78c..f0fce5a58115275a9c16026591f79add3ef0eb4a 100644 (file)
@@ -16,6 +16,12 @@ endif
 
 ECODIR= $(IBL_ROOT)/util/i2cRead
 
+ifeq ($(ENDIAN),big)
+ IEXT=be
+else
+ IEXT=le
+endif
+
 MODULES= hw
 CLEAN_MODULES=$(addprefix clean_,$(MODULES))
 
@@ -37,7 +43,7 @@ export ARCH
 export TARGET
 
 $(DEVICES): gen_cdefdep $(MODULES) $(OBJS) i2cRead.cmd
-       $(LD) -o i2cRead.out -m i2cRead.map i2cRead.cmd $(RTLIBS)
+       $(LD) -o i2cRead_$(IEXT).out -m i2cRead_$(IEXT).map i2cRead.$(IEXT).oc ../../hw/c64x/make/i2c.$(IEXT).oc i2cRead.cmd $(RTLIBS)
 
 
 $(MODULES):
@@ -58,6 +64,6 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(ARCH) > cdefdep.tmp
+       @echo $(ARCH) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
index f9370980c1be704ac4aef77138042b34f85aa9bd..007f2a04acc7cafadfa121ff508bae46bdfeba48 100644 (file)
 #include "types.h"
 #include "i2c.h"
 #include "target.h"
+#include "pllapi.h"
 #include <stdio.h>
 #include <string.h>
 
-#define I2C_SIZE_BYTES  0x10000
+#define I2C_SIZE_BYTES  0x20000
 
 /* Run time configuration */
 unsigned int   deviceFreqMhz = 1000;
-unsigned short busAddress    = 0x50;
+unsigned int   prediv        = 1;       /* Pre-divider  */
+unsigned int   mult          = 20;      /* Multiplier   */
+unsigned int   postdiv       = 1;       /* Post-divider */
+
+unsigned int   busAddress    = 0x50;
 unsigned int   i2cBlockSize  = 64;
 unsigned int   nbytes        = I2C_SIZE_BYTES;
 unsigned int   dataAddress   = 0;
 
+#define I2C_DATA_ADDRESS_MASK   0x0fffff        /* 20 bits specifiy the address (4 msb roll into dev address) */
+
 
 #pragma DATA_SECTION(i2cData, ".i2cData")
 unsigned int i2cData[I2C_SIZE_BYTES >> 2];
@@ -92,6 +99,7 @@ int formBlock (unsigned int addr, int byteIndex, int n)
 
     }
 
+
     return (n+2);
 
 }
@@ -134,17 +142,26 @@ void showI2cError (I2C_RET iret)
 void main (void)
 {
     I2C_RET i2cRet;
-    int     n;
+    int     n, m, p;
     int     remain;
     int     progBytes;
     int     eCount;
 
+    unsigned int bAddress;
+
     UINT8  *iData;
     UINT8   writeByte;
     int     j;
 
     volatile int i;
 
+
+    /* Program the main system PLL */
+    hwPllSetPll (0,              /* Main PLL     */
+                 prediv,         /* Pre-divider  */
+                 mult,           /* Multiplier   */
+                 postdiv);       /* Post-divider */
+
     hwI2Cinit (deviceFreqMhz,
                DEVICE_I2C_MODULE_DIVISOR,
                25,                              /* Run the bus at 25 kHz */
@@ -161,11 +178,14 @@ void main (void)
         /* formBlock sets up the address as well as the data */
         progBytes = formBlock (dataAddress + n, n, remain);
 
+        /* Form the i2c bus address. Bits from the i2c address can roll into the bus address field */
+        bAddress = (((busAddress << 16) & ~I2C_DATA_ADDRESS_MASK) + dataAddress + n) >> 16;
+
         if (progBytes < 0)
             return;
 
         /* Write the block */
-        i2cRet = hwI2cMasterWrite (busAddress,
+        i2cRet = hwI2cMasterWrite (bAddress,
                                    i2cBlock,
                                    progBytes,
                                    I2C_RELEASE_BUS,
@@ -188,17 +208,30 @@ void main (void)
 
     memset (i2cRead, 0xffffffff, sizeof(i2cRead));
 
-    /* Read the data back */
-    i2cRet = hwI2cMasterRead (dataAddress,
-                              nbytes,
-                              (UINT8 *)i2cRead,
-                              busAddress,
-                              0x100);
+    iData = (UINT8 *)i2cRead;
+
+    for (p = 0, n = nbytes; n > 0;  n = n - m, p = p + m)  {
+
+      /* bAddress is the complete address, device address in bits 31:16 */
+      bAddress = ((busAddress << 16) & ~I2C_DATA_ADDRESS_MASK) + dataAddress + p;
+
+      /* m is the number of bytes that can be read from the current device address */
+      m = (bAddress + 0x10000) - bAddress;
+      if (m > n) m = n;
+
+      /* Read the data back */
+      i2cRet = hwI2cMasterRead (bAddress & 0xffff,
+                                m,
+                                &iData[p],
+                                bAddress >> 16,
+                                0x100);
+
 
+      if (i2cRet != I2C_RET_OK)  {
+          showI2cError (i2cRet);
+          return;
+      }
 
-    if (i2cRet != I2C_RET_OK)  {
-        showI2cError (i2cRet);
-        return;
     }
 
     printf ("I2C read complete, comparing data\n");
index 92913a3b479b3a0cf6d1fd85b672987059024676..e8e344e2ea504ac959e24c0f66af71cfba4326d5 100644 (file)
@@ -1,6 +1,5 @@
 
-i2cWrite.oc
-../../hw/c64x/make/i2c.oc
+/* Object file list provided in linker invokation */
 
 -c
 -a
@@ -9,9 +8,9 @@ i2cWrite.oc
 
 MEMORY
 {
-       I2C_DAT  :  origin = 0x800000  length = 0x10000
-       I2C_READ :  origin = 0x810000  length = 0x10000
-       L2       :  origin = 0x820000  length = 0x10000
+       I2C_DAT  :  origin = 0x800000  length = 0x20000
+       I2C_READ :  origin = 0x820000  length = 0x20000
+       L2       :  origin = 0x840000  length = 0x10000
 
 }
 
index 9e68d85a877fb19ac44ce74b594c71aede1379d5..4a5cf5057ac41d386a608fb60fe46d478be6d98e 100644 (file)
@@ -14,6 +14,12 @@ ifndef IBL_ROOT
  IBL_ROOT=../..
 endif
 
+ifeq ($(ENDIAN),big)
+ IEXT=be
+else
+ IEXT=le
+endif
+
 ECODIR= $(IBL_ROOT)/util/i2cWrite
 
 MODULES= hw
@@ -27,6 +33,7 @@ UTIL=yes
 include $(IBL_ROOT)/make/$(ARCH)/makeeco.mk
 
 C6X_C_DIR=   $(IBL_ROOT)/hw/i2c
+C6X_C_DIR+= ;$(IBL_ROOT)/hw/plls
 C6X_C_DIR+= ;$(IBL_ROOT)/cfg/$(TARGET)
 C6X_C_DIR+= ;$(IBL_ROOT)/device/$(TARGET)
 C6X_C_DIR+= ;$(IBL_ROOT)/arch/$(ARCH)
@@ -37,7 +44,7 @@ export ARCH
 export TARGET
 
 $(DEVICES): gen_cdefdep $(MODULES) $(OBJS) i2cWrite.cmd
-       $(LD) -o i2cWrite.out -m i2cWrite.map i2cWrite.cmd $(RTLIBS)
+       $(LD) -o i2cWrite_$(IEXT).out -m i2cWrite_$(IEXT).map i2cWrite.$(IEXT).oc ../../hw/c64x/make/i2c.$(IEXT).oc ../../hw/c64x/make/pll.$(IEXT).oc i2cWrite.cmd $(RTLIBS)
 
 
 $(MODULES):
@@ -58,6 +65,6 @@ $(OBJS): cdefdep
 
 gen_cdefdep:
        @echo Checking command line dependencies
-       @echo $(ENDIAN) $(ARCH) > cdefdep.tmp
+       @echo $(ARCH) > cdefdep.tmp
        @sh -c 'if diff -q cdefdep.tmp cdefdep ; then echo same ; else $(CP) cdefdep.tmp cdefdep ; fi '
 
index aa57ba8b95741fd69fefbd71f30375f730648128..21dc8522a68884d92bf5019a60377609f2720d57 100644 (file)
  *************************************************************************************/
 extern FILE *yyin;
 
+/*************************************************************************************
+ * Declaration: Keep track of lines in the parse
+ *************************************************************************************/
+int line = 1;
+
 /*************************************************************************************
  * Declaration: currentType identifies the current parse mode, either SECTION
  *              or LAYOUT.
@@ -47,7 +52,13 @@ int           max_index    =  0;  /* maximum table index, used for compacting ou
  * Declaration: Layout tables. 
  ************************************************************************************/
 layout_t  layouts[MAX_LAYOUTS];   /* Array of layout structures */                
-int       currentLayout = 0;      /* Currently active layout    */
+int       currentLayout;          /* Currently active layout    */
+
+/************************************************************************************
+ * Declaration: Pads
+ ************************************************************************************/
+pad_t pads[MAX_PADS];             /* Array of pad structures */
+int   currentPad;                 /* Currently active pad    */
 
 /************************************************************************************
  * Declaration: The structure storing the program data files, and the number of
@@ -62,6 +73,12 @@ int        nProgFiles = 0;
 pciFile_t pciFile;
 int       pciSet = 0;
 
+/*************************************************************************************
+ * Declaration: The array that tracks the ordering of pad and layout structures
+ *************************************************************************************/
+padLayoutOrder_t padLayoutOrder[MAX_PADS+MAX_LAYOUTS];
+int currentPL = 0;
+
 /*************************************************************************************
  * Declaration: The next free address in the ROM for general data usage. For the
  *              start address there is room for the initial boot parameter tables, 
@@ -86,7 +103,7 @@ int   compact = 0;
  *************************************************************************************/
 void yyerror (char *s)
 {
-  fprintf (stderr, "flex/bison error is %s\n", s);
+  fprintf (stderr, "flex/bison error is %s at line %d\n", s, line);
 } /* yyerror */
 
 void yywrap (void)
@@ -170,6 +187,11 @@ void setLayout (void)
       progFile[layouts[currentLayout].file[i]].align = newAlign;
 
   }
+
+
+  padLayoutOrder[currentPL].type  = LAYOUT;
+  padLayoutOrder[currentPL].index = currentLayout;
+  currentPL += 1;
     
   currentLayout += 1;      /* Advance to the next layout */
 
@@ -177,7 +199,38 @@ void setLayout (void)
     initLayout (&layouts[currentLayout]);
 
 }    
-    
+
+/*************************************************************************************
+ * FUNCTION PURPOSE: Initialize a pad structure
+ *************************************************************************************
+ * DESCRIPTION: A pad structure is set to the default state
+ *************************************************************************************/
+void initPad (pad_t *p)
+{
+  p->address = 0;
+  p->len     = 0;
+}
+
+
+/**************************************************************************************
+ * FUNCTION PURPOSE: Complete a pad
+ **************************************************************************************
+ * DESCRIPTION: The parser has found a complete pad specification. Complete the pad
+ *              structure
+ **************************************************************************************/
+void setPad (void)
+{
+
+  padLayoutOrder[currentPL].type  = PAD;
+  padLayoutOrder[currentPL].index = currentPad;
+  currentPL += 1;
+
+  currentPad += 1;
+
+  if (currentPad < MAX_PADS)
+    initPad (&pads[currentPad]);
+
+}
 
 
 /*************************************************************************************
@@ -334,70 +387,118 @@ int setPciParams (char *fname)
 void assignKeyVal (int field, int value)
 {
 
-  if ((currentType == SECTION) && (currentLayout >= MAX_LAYOUTS))  {
-    fprintf (stderr, "romparse: Too many layout sections (max = %d\n", MAX_LAYOUTS);
-    return;
-  }
+  switch (currentType)   {
 
 
+    case SECTION:
 
-  switch (field)  {
 
-    case BOOT_MODE:        current_table.common.boot_mode = value;
-                           break;
+      switch (field)  {
 
-    case PARAM_INDEX:      ctable_index = value;
-                           break;
+        case BOOT_MODE:        current_table.common.boot_mode = value;
+                               break;
 
-    case OPTIONS:          current_table.i2c.options = value;
-                           break;
+        case PARAM_INDEX:      ctable_index = value;
+                               break;
 
-    case MULTI_I2C_ID:     current_table.i2c.multi_i2c_id = value;
-                           break;
+        case OPTIONS:          current_table.i2c.options = value;
+                               break;
 
-    case MY_I2C_ID:        current_table.i2c.my_i2c_id = value;
-                           break;
+        case MULTI_I2C_ID:     current_table.i2c.multi_i2c_id = value;
+                               break;
 
-    case CORE_FREQ_MHZ:    current_table.i2c.core_freq_mhz = value;
-                           break;
+        case MY_I2C_ID:        current_table.i2c.my_i2c_id = value;
+                               break;
 
-    case I2C_CLK_FREQ_KHZ: current_table.i2c.i2c_clk_freq_khz = value;
-                           break;
+        case CORE_FREQ_MHZ:    current_table.i2c.core_freq_mhz = value;
+                               break;
 
-    case NEXT_DEV_ADDR:    current_table.i2c.next_dev_addr = value;
-                           break;
+        case I2C_CLK_FREQ_KHZ: current_table.i2c.i2c_clk_freq_khz = value;
+                               break;
+
+        case NEXT_DEV_ADDR:    current_table.i2c.next_dev_addr = value;
+                               break;
                                
 
-    case NEXT_DEV_ADDR_EXT: current_table.i2c.next_dev_addr_ext = value;
-                            break;
+        case NEXT_DEV_ADDR_EXT: current_table.i2c.next_dev_addr_ext = value;
+                                break;
 
-    case ADDRESS_DELAY:    current_table.i2c.address_delay = value;
-                           break;
+        case ADDRESS_DELAY:    current_table.i2c.address_delay = value;
+                               break;
 
 #ifndef c6455         
-    case SWPLL:            current_table.i2c.swPll = value;
-                           break;
+        case SWPLL:            current_table.i2c.swPll = value;
+                               break;
 #endif
 
-    case DEV_ADDR_EXT:     if (currentType == SECTION)
-                             current_table.i2c.dev_addr_ext = value;
-                           else 
-                             layouts[currentLayout].dev_addr = value;
+        case DEV_ADDR_EXT:     current_table.i2c.dev_addr_ext = value;
+                               break;
 
-                           break;
+        case DEV_ADDR:         current_table.i2c.dev_addr = value;
+                               break;
 
-    case DEV_ADDR:         if (currentType == SECTION) 
-                             current_table.i2c.dev_addr = value;
-                           else
-                             layouts[currentLayout].address = value;
 
+        default:
+            fprintf (stderr, "romparse: Invalid assignment in section specification (line %d)\n", line);
+            break;
+
+      }
+
+      break;
+
+
+    case LAYOUT:
+
+      if (currentLayout >= MAX_LAYOUTS)  { 
+        fprintf (stderr, "romparse: Too many layout sections (max = %d)\n", MAX_LAYOUTS);
+        exit (-1);
+      }
+
+
+      switch (field)  {
+
+        case DEV_ADDR_EXT: layouts[currentLayout].dev_addr = value;
                            break;
 
-    case ALIGN:            layouts[currentLayout].align = value;
+        case DEV_ADDR:     layouts[currentLayout].address = value;
                            break;
 
+        case ALIGN:        layouts[currentLayout].align = value;
+                           break;
+
+
+        default:
+            fprintf (stderr, "romparase: Invalid assignment in layout specification (line %d)\n", line);
+            break;
+
+      }
+      break;
+
+
+    case PAD:
+
+      if (currentPad >= MAX_PADS)  {
+        fprintf (stderr, "romparse: Too many pad sections (max = %d)\n", MAX_PADS);
+        exit (-1);
+      }
+
+      switch (field)  {
+
+        case DEV_ADDR:  pads[currentPad].address = value;
+                        break;
+
+        case LENGTH:    pads[currentPad].len = value;
+                        break;
+
+        default:
+          fprintf (stderr, "romparse: Invalid assignment in pad specificaiton (line %d)\n", line);
+          break;
+
+      }
+      break;
+
+   }
 
-  }
 
 } /* assignKeyVal */
 
@@ -562,39 +663,54 @@ void createOutput (void)
   if (pciSet)
     base = base + PCI_EEAI_PARAM_SIZE;
 
-  /* Layout tables */
-  for (i = 0; i < currentLayout; i++)  {
 
-    /* Determine the size of the table. Four bytes for each file, plus the 4 byte header */ 
-    v1 = (layouts[i].nFiles * 4) + 4;
+  /* Pad, layout tables */
+  for (i = 0; i < currentPL; i++)  {
 
-    v2 = (layouts[i].dev_addr << 16) + layouts[i].address;
+    j = padLayoutOrder[i].index;
 
-    if (v2 == 0)
-      base = base + v1;
+    if (padLayoutOrder[i].type == LAYOUT)  {
 
-    else  {
+      /* Determine the size of the table. Four bytes for each file, plus the 4 byte header */ 
+      v1 = (layouts[j].nFiles * 4) + 4;
 
-      /* Mask out device address bits but extend past 64k */
-      v2 = v2 & I2C_ADDR_MASK;
+      v2 = (layouts[j].dev_addr << 16) + layouts[j].address;
 
-      if (base > v2)  {
-        fprintf (stderr, "romparse: fatal error - layout block %d specified a start address of 0x%04x\n", i, layouts[i].address);
+      if (v2 == 0)
+        base = base + v1;
+
+      else  {
+
+        /* Mask out device address bits but extend past 64k */
+        v2 = v2 & I2C_ADDR_MASK;
+
+        if (base > v2)  {
+          fprintf (stderr, "romparse: fatal error - layout block %d specified a start address of 0x%04x\n", j, layouts[j].address);
+          fprintf (stderr, "          but this conflicts with the base mapping (ends at 0x%04x)\n", base);
+          exit (-1);
+        }
+
+        base = layouts[j].address + v1;
+
+
+      }  
+    }  else  {   /* Otherwise this is a pad */
+
+      if (base > pads[j].address)  {
+        fprintf (stderr, "romparse: fatal error - pad block %d specified a start address of 0x%04x\n", j, pads[j].address);
         fprintf (stderr, "          but this conflicts with the base mapping (ends at 0x%04x)\n", base);
         exit (-1);
       }
 
-      base = layouts[i].address + v1;
+      base = pads[j].address + pads[j].len;
 
     }
-
   }
 
-
   for (i = 0; i < NUM_BOOT_PARAM_TABLES; i++)  {
     if (progFile[i].align > 0)  
       base = ((base + progFile[i].align - 1) / progFile[i].align) * progFile[i].align;
-    progFile[i].addressBytes = base;
+    progFile[i].addressBytes = base + (0x50 << 16);  /* For now hard code the base address */
     base = base + progFile[i].sizeBytes;
   }
 
@@ -603,7 +719,7 @@ void createOutput (void)
   for (i = 0; i < NUM_BOOT_PARAM_TABLES; i++)  {
     for (j = 0; j < NUM_BOOT_PARAM_TABLES; j++)  {
       if (progFile[i].tag[j] >= 0)
-        boot_params[progFile[i].tag[j]].i2c.dev_addr = progFile[i].addressBytes;
+        boot_params[progFile[i].tag[j]].i2c.dev_addr = (progFile[i].addressBytes & 0xffff);
     }
   }
 
@@ -669,7 +785,7 @@ void createOutput (void)
   /* Write out each of the program files */
   for (i = 0; i < nProgFiles; i++)  {
 
-    base = imagePad (base, image, progFile[i].addressBytes);
+    base = imagePad (base, image, (progFile[i].addressBytes & I2C_ADDR_MASK));
 
     for (j = 0; j < progFile[i].sizeBytes >> 2; j++)
       base = imageWord (base, image, (progFile[i]).data[j]);
index 2d4f912c9ec1f8fdbed5bf1b2f6e67192b800aa7..506c0eac810e9f0fc01d7c2be7edaf0fc0af2830 100644 (file)
@@ -71,4 +71,24 @@ typedef struct  {
 #define I2C_ADDR_MASK   0x0fffff
 
 
+/* Pad section. The pad section creates a gap in the i2c memory map */
+#define MAX_PADS        8
+typedef struct  {
+  unsigned int address;
+  unsigned int len;
+} pad_t;
+
+
+/* Layout/pad interleave. The rom specification must be in order, so this structure tracks
+ * the arrangement of layouts and pads */
+typedef struct
+{
+  int type;   /* Either PAD or LAYOUT */
+  int index;  /* The array index for the pad/layout */
+  
+} padLayoutOrder_t;
+
+
+
+
 #endif /* ROMPARSE_H */
index 33b2b353146f93f8e666eb92a3537ac68bbb1eda..0e4ef610745e7558748ad9068ceeedfd7aa88a6b 100644 (file)
@@ -1,6 +1,7 @@
 /* Lexical analyzer for the eeprom boot builder */
 %{
 #include "rparse.tab.h"
+extern int line;
 %}
 %%
 
@@ -10,6 +11,7 @@
 
 section           { yylval = SECTION;           rBegin(SECTION); return (SECTION);           }
 layout                   { yylval = LAYOUT;                    rBegin(LAYOUT);  return (LAYOUT);                        }
+pad                              { yylval = PAD;                               rBegin(PAD);     return (PAD);                           }
 boot_mode         { yylval = BOOT_MODE;                          return (BOOT_MODE);         }
 param_index       { yylval = PARAM_INDEX;                        return (PARAM_INDEX);       }
 options           { yylval = OPTIONS;                            return (OPTIONS);           }
@@ -26,6 +28,7 @@ next_dev_addr_ext { yylval = NEXT_DEV_ADDR_EXT;                  return (NEXT_DE
 address_delay     { yylval = ADDRESS_DELAY;                      return (ADDRESS_DELAY);     }
 sw_pll                   { yylval = SWPLL;                                              return (SWPLL);                         }
 align                    { yylval = ALIGN;                                                          return (ALIGN);             }
+len                              { yylval = LENGTH;                                                     return (LENGTH);                        }
 
 
 [0-9]+                  { yylval = atoi(yytext); return (VALUE);  }
@@ -34,7 +37,7 @@ align                   { yylval = ALIGN;                                                          return (ALIGN);             }
 \".*\"         return (STRING);
 
 [ \t]+         ;
-[\n]           ;
+[\n]           line++ ;
 
 %%
 
index 9f1535174a51d851b588b6dd0f079fac2f6f99dc..9a9440ad9c0d9278e13c6b792eb7d706c9310852 100644 (file)
@@ -28,6 +28,8 @@
 #define        DEV_ADDR        278
 #define        LAYOUT  279
 #define        ALIGN   280
+#define        PAD     281
+#define        LENGTH  282
 
 #line 2 "rparse.y"
 
@@ -46,11 +48,11 @@ extern char *yytext;
 
 
 
-#define        YYFINAL         39
+#define        YYFINAL         45
 #define        YYFLAG          -32768
-#define        YYNTBASE        26
+#define        YYNTBASE        28
 
-#define YYTRANSLATE(x) ((unsigned)(x) <= 280 ? yytranslate[x] : 33)
+#define YYTRANSLATE(x) ((unsigned)(x) <= 282 ? yytranslate[x] : 36)
 
 static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -80,33 +82,35 @@ static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
      6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-    16,    17,    18,    19,    20,    21,    22,    23,    24,    25
+    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    26,    27
 };
 
 #if YYDEBUG != 0
 static const short yyprhs[] = {     0,
-     0,     2,     5,     7,     9,    14,    18,    23,    25,    28,
-    32,    36,    38,    40,    42,    44,    46,    48,    50,    52,
-    54,    56,    58,    60,    62,    64
+     0,     2,     5,     7,     9,    11,    16,    20,    25,    30,
+    32,    35,    39,    43,    45,    47,    49,    51,    53,    55,
+    57,    59,    61,    63,    65,    67,    69,    71,    73
 };
 
-static const short yyrhs[] = {    27,
-     0,    26,    27,     0,    28,     0,    29,     0,     5,     3,
-    30,     4,     0,    17,     6,     8,     0,    24,     3,    30,
-     4,     0,    31,     0,    30,    31,     0,    32,     6,     7,
-     0,    32,     6,     8,     0,     9,     0,    10,     0,    11,
-     0,    12,     0,    13,     0,    14,     0,    15,     0,    16,
-     0,    18,     0,    19,     0,    22,     0,    20,     0,    21,
-     0,    23,     0,    25,     0
+static const short yyrhs[] = {    29,
+     0,    28,    29,     0,    30,     0,    31,     0,    32,     0,
+     5,     3,    33,     4,     0,    17,     6,     8,     0,    24,
+     3,    33,     4,     0,    26,     3,    33,     4,     0,    34,
+     0,    33,    34,     0,    35,     6,     7,     0,    35,     6,
+     8,     0,     9,     0,    10,     0,    11,     0,    12,     0,
+    13,     0,    14,     0,    15,     0,    16,     0,    18,     0,
+    19,     0,    22,     0,    20,     0,    21,     0,    23,     0,
+    25,     0,    27,     0
 };
 
 #endif
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-    12,    13,    16,    17,    20,    22,    26,    31,    32,    35,
-    37,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-    50,    51,    52,    53,    54,    55
+    12,    13,    16,    17,    18,    21,    23,    27,    31,    36,
+    37,    40,    42,    46,    47,    48,    49,    50,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,    61
 };
 #endif
 
@@ -117,69 +121,77 @@ static const char * const yytname[] = {   "$","error","$undefined.","LBRACE",
 "RBRACE","SECTION","EQU","VALUE","STRING","BOOT_MODE","PARAM_INDEX","OPTIONS",
 "MULTI_I2C_ID","MY_I2C_ID","CORE_FREQ_MHZ","I2C_CLK_FREQ_KHZ","EXE_FILE","PCI_PARMS",
 "NEXT_DEV_ADDR","NEXT_DEV_ADDR_EXT","ADDRESS_DELAY","SWPLL","DEV_ADDR_EXT","DEV_ADDR",
-"LAYOUT","ALIGN","promspec","segment","bootParams","layout","assigns","assign",
-"keyword", NULL
+"LAYOUT","ALIGN","PAD","LENGTH","promspec","segment","bootParams","layout","pad",
+"assigns","assign","keyword", NULL
 };
 #endif
 
 static const short yyr1[] = {     0,
-    26,    26,    27,    27,    28,    28,    29,    30,    30,    31,
-    31,    32,    32,    32,    32,    32,    32,    32,    32,    32,
-    32,    32,    32,    32,    32,    32
+    28,    28,    29,    29,    29,    30,    30,    31,    32,    33,
+    33,    34,    34,    35,    35,    35,    35,    35,    35,    35,
+    35,    35,    35,    35,    35,    35,    35,    35,    35
 };
 
 static const short yyr2[] = {     0,
-     1,     2,     1,     1,     4,     3,     4,     1,     2,     3,
-     3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-     1,     1,     1,     1,     1,     1
+     1,     2,     1,     1,     1,     4,     3,     4,     4,     1,
+     2,     3,     3,     1,     1,     1,     1,     1,     1,     1,
+     1,     1,     1,     1,     1,     1,     1,     1,     1
 };
 
 static const short yydefact[] = {     0,
-     0,     0,     0,     0,     1,     3,     4,     0,     0,     0,
-     2,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-    21,    23,    24,    22,    25,    26,     0,     8,     0,     6,
-     0,     5,     9,     0,     7,    10,    11,     0,     0
+     0,     0,     0,     0,     0,     1,     3,     4,     5,     0,
+     0,     0,     0,     2,    14,    15,    16,    17,    18,    19,
+    20,    21,    22,    23,    25,    26,    24,    27,    28,    29,
+     0,    10,     0,     7,     0,     0,     6,    11,     0,     8,
+     9,    12,    13,     0,     0
 };
 
-static const short yydefgoto[] = {     4,
-     5,     6,     7,    27,    28,    29
+static const short yydefgoto[] = {     5,
+     6,     7,     8,     9,    31,    32,    33
 };
 
 static const short yypact[] = {    -3,
-    -2,     4,     3,     0,-32768,-32768,-32768,    53,    -4,    53,
+    -2,     7,     1,     3,     0,-32768,-32768,-32768,-32768,    77,
+     8,    77,    77,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,    16,-32768,     5,-32768,
-    36,-32768,-32768,     1,-32768,-32768,-32768,    12,-32768
+    18,-32768,     9,-32768,    38,    58,-32768,-32768,     2,-32768,
+-32768,-32768,-32768,    19,-32768
 };
 
 static const short yypgoto[] = {-32768,
-     9,-32768,-32768,     6,   -24,-32768
+    13,-32768,-32768,-32768,    -1,   -28,-32768
 };
 
 
-#define        YYLAST          78
+#define        YYLAST          104
 
 
-static const short yytable[] = {    38,
-     8,     1,    33,    30,     1,    10,    33,    36,    37,     9,
-    34,    39,    11,     2,     0,    31,     2,     0,     0,    32,
-     3,     0,     0,     3,    12,    13,    14,    15,    16,    17,
-    18,    19,     0,    20,    21,    22,    23,    24,    25,    35,
-    26,     0,     0,     0,    12,    13,    14,    15,    16,    17,
-    18,    19,     0,    20,    21,    22,    23,    24,    25,     0,
-    26,    12,    13,    14,    15,    16,    17,    18,    19,     0,
-    20,    21,    22,    23,    24,    25,     0,    26
+static const short yytable[] = {    44,
+    10,     1,    38,    12,     1,    13,    38,    38,    42,    43,
+    35,    36,    11,     2,    39,    34,     2,    14,    45,     0,
+     3,    37,     4,     3,     0,     4,    15,    16,    17,    18,
+    19,    20,    21,    22,     0,    23,    24,    25,    26,    27,
+    28,    40,    29,     0,    30,     0,    15,    16,    17,    18,
+    19,    20,    21,    22,     0,    23,    24,    25,    26,    27,
+    28,    41,    29,     0,    30,     0,    15,    16,    17,    18,
+    19,    20,    21,    22,     0,    23,    24,    25,    26,    27,
+    28,     0,    29,     0,    30,    15,    16,    17,    18,    19,
+    20,    21,    22,     0,    23,    24,    25,    26,    27,    28,
+     0,    29,     0,    30
 };
 
 static const short yycheck[] = {     0,
-     3,     5,    27,     8,     5,     3,    31,     7,     8,     6,
-     6,     0,     4,    17,    -1,    10,    17,    -1,    -1,     4,
-    24,    -1,    -1,    24,     9,    10,    11,    12,    13,    14,
-    15,    16,    -1,    18,    19,    20,    21,    22,    23,     4,
-    25,    -1,    -1,    -1,     9,    10,    11,    12,    13,    14,
-    15,    16,    -1,    18,    19,    20,    21,    22,    23,    -1,
-    25,     9,    10,    11,    12,    13,    14,    15,    16,    -1,
-    18,    19,    20,    21,    22,    23,    -1,    25
+     3,     5,    31,     3,     5,     3,    35,    36,     7,     8,
+    12,    13,     6,    17,     6,     8,    17,     5,     0,    -1,
+    24,     4,    26,    24,    -1,    26,     9,    10,    11,    12,
+    13,    14,    15,    16,    -1,    18,    19,    20,    21,    22,
+    23,     4,    25,    -1,    27,    -1,     9,    10,    11,    12,
+    13,    14,    15,    16,    -1,    18,    19,    20,    21,    22,
+    23,     4,    25,    -1,    27,    -1,     9,    10,    11,    12,
+    13,    14,    15,    16,    -1,    18,    19,    20,    21,    22,
+    23,    -1,    25,    -1,    27,     9,    10,    11,    12,    13,
+    14,    15,    16,    -1,    18,    19,    20,    21,    22,    23,
+    -1,    25,    -1,    27
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "bison.simple"
@@ -679,84 +691,92 @@ yyreduce:
 
   switch (yyn) {
 
-case 5:
-#line 21 "rparse.y"
+case 6:
+#line 22 "rparse.y"
 { section (); ;
     break;}
-case 6:
-#line 23 "rparse.y"
+case 7:
+#line 24 "rparse.y"
 { setPciParams (yytext); ;
     break;}
-case 7:
-#line 27 "rparse.y"
+case 8:
+#line 28 "rparse.y"
 { setLayout ();  ;
     break;}
-case 10:
-#line 36 "rparse.y"
-{ assignKeyVal (yyvsp[-2], yyvsp[0]); ;
-    break;}
-case 11:
-#line 38 "rparse.y"
-{ assignKeyStr (yyvsp[-2], yytext); ;
+case 9:
+#line 32 "rparse.y"
+{ setPad ();  ;
     break;}
 case 12:
 #line 41 "rparse.y"
-{  yyval=yyvsp[0];  ;
+{ assignKeyVal (yyvsp[-2], yyvsp[0]); ;
     break;}
 case 13:
-#line 42 "rparse.y"
-{  yyval=yyvsp[0];  ;
+#line 43 "rparse.y"
+{ assignKeyStr (yyvsp[-2], yytext); ;
     break;}
 case 14:
-#line 43 "rparse.y"
+#line 46 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 15:
-#line 44 "rparse.y"
+#line 47 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 16:
-#line 45 "rparse.y"
+#line 48 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 17:
-#line 46 "rparse.y"
+#line 49 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 18:
-#line 47 "rparse.y"
+#line 50 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 19:
-#line 48 "rparse.y"
+#line 51 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 20:
-#line 49 "rparse.y"
+#line 52 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 21:
-#line 50 "rparse.y"
+#line 53 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 22:
-#line 51 "rparse.y"
+#line 54 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 23:
-#line 52 "rparse.y"
+#line 55 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 24:
-#line 53 "rparse.y"
+#line 56 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 25:
-#line 54 "rparse.y"
+#line 57 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 case 26:
-#line 55 "rparse.y"
+#line 58 "rparse.y"
+{  yyval=yyvsp[0];  ;
+    break;}
+case 27:
+#line 59 "rparse.y"
+{  yyval=yyvsp[0];  ;
+    break;}
+case 28:
+#line 60 "rparse.y"
+{  yyval=yyvsp[0];  ;
+    break;}
+case 29:
+#line 61 "rparse.y"
 {  yyval=yyvsp[0];  ;
     break;}
 }
@@ -957,7 +977,7 @@ yyerrhandle:
   yystate = yyn;
   goto yynewstate;
 }
-#line 58 "rparse.y"
+#line 64 "rparse.y"
 
 
 
index 563ab6cfa5aa48cd693370075085cfb69dccb9b7..324c9b8911a49e1e0df326ba2240091934bdc6ac 100644 (file)
@@ -24,6 +24,8 @@
 #define        DEV_ADDR        278
 #define        LAYOUT  279
 #define        ALIGN   280
+#define        PAD     281
+#define        LENGTH  282
 
 
 extern YYSTYPE yylval;
index 288681dce2b71fa68014548e859bd18df29bc8d4..bc72a7b1f9eb072f0fc6cd6d2ee4795825fe8395 100644 (file)
@@ -6,7 +6,7 @@ extern char *yytext;
 %token LBRACE RBRACE SECTION EQU VALUE STRING BOOT_MODE PARAM_INDEX OPTIONS 
 %token MULTI_I2C_ID MY_I2C_ID CORE_FREQ_MHZ I2C_CLK_FREQ_KHZ 
 %token EXE_FILE PCI_PARMS NEXT_DEV_ADDR NEXT_DEV_ADDR_EXT ADDRESS_DELAY SWPLL
-%token DEV_ADDR_EXT DEV_ADDR LAYOUT ALIGN
+%token DEV_ADDR_EXT DEV_ADDR LAYOUT ALIGN PAD LENGTH
 %%
 
 promspec   : segment
@@ -15,6 +15,7 @@ promspec   : segment
 
 segment           : bootParams
                   | layout
+                  | pad
                   ;
 
 bootParams : SECTION LBRACE assigns RBRACE
@@ -27,6 +28,10 @@ layout     : LAYOUT LBRACE assigns RBRACE
                         { setLayout ();  }
                   ;
 
+pad               : PAD LBRACE assigns RBRACE
+                    { setPad ();  }
+                  ;
+
 
 assigns    : assign
                   | assigns assign
@@ -53,6 +58,7 @@ keyword    : BOOT_MODE                     {  $$=$1;  }
                   | SWPLL                               {  $$=$1;  }
                   | DEV_ADDR                    {  $$=$1;  }
                   | ALIGN                               {  $$=$1;  }
+                  | LENGTH              {  $$=$1;  }
                   ;
 
 %%