]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/ibl.git/blobdiff - src/main/iblmain.c
Code review updates
[keystone-rtos/ibl.git] / src / main / iblmain.c
index c0fb4ce3c08230ca8bc3f400a5c7c28f27f73934..7c8986bab57fa6a789946191da4837739bf306a0 100644 (file)
@@ -1,3 +1,40 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+
+
 /*****************************************************************************************
  * FILE PURPOSE: Perform the top level boot
  *****************************************************************************************
@@ -17,6 +54,7 @@
 #include "iblcfg.h"
 #include "device.h"
 #include "ethboot.h"
+#include "nandboot.h"
 #include "bis.h"
 #include "coffwrap.h"
 #include "iblbtbl.h"
 #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 */
 void mprintf(char *x, ...) { }
@@ -106,42 +129,16 @@ void main (void)
     int32 i, j;
 
     /* Initialize the status structure */
-    memset (&iblStatus, 0, sizeof(iblStatus_t));
-    iblStatus.iblMagic = ibl_MAGIC_VALUE;
+    iblMemset (&iblStatus, 0, sizeof(iblStatus_t));
+    iblStatus.iblMagic   = ibl_MAGIC_VALUE;
+    iblStatus.iblVersion = ibl_VERSION;
 
-    /* Initialize the system timer (software tracking of the hardware timer state */
-    timer_init ();
 
-#if 0
-    /* If there is no magic value in the ibl configuration structure then a default
-     * table is used. */
-    if (ibl.iblMagic != ibl_MAGIC_VALUE)  {
-        deviceLoadDefaultIblTable();
-        iblStatus.noMagic = 1;
-        ibl.iblMagic = ibl_MAGIC_VALUE;
-    }
-#endif
+    /* Power up the timer */
+    devicePowerPeriph (TARGET_PWR_TIMER_0);
 
-    /* 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 (;;);
-    }
+    /* Initialize the system timer (software tracking of the hardware timer state) */
+    timer_init ();
 
     /* Load default mac addresses for ethernet boot if requested */
     for (i = 0; i < ibl_N_ETH_PORTS; i++)  {
@@ -154,9 +151,6 @@ void main (void)
     }
 
 
-    /* Pll configuration is device specific */
-    devicePllConfig ();
-
     /* DDR configuration is device specific */
     deviceDdrConfig ();
 
@@ -164,16 +158,26 @@ void main (void)
     for (;;)  {
 
         /* Start looping through the boot modes to find the one with the lowest priority
-         * value, and try to boot it */
+         * value, and try to boot it. If a boot mode is not supported the function
+         * 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;
         }
@@ -199,58 +203,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
+
+#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;