c64x: Add Multi Boot Support
authorSandeep Paulraj <s-paulraj@ti.com>
Sat, 16 Jul 2011 17:02:49 +0000 (13:02 -0400)
committerSandeep Paulraj <s-paulraj@ti.com>
Sat, 16 Jul 2011 17:03:45 +0000 (13:03 -0400)
This commit adds multi boot support for
the c64x+ based low cost EVMs.

TFTP and NAND boot were tested on the
c6472, c6474 and c6457 low cost EVMs

Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
12 files changed:
src/device/c6455/c6455.c
src/device/c6457/c6457.c
src/device/c6472/c6472.c
src/device/c6474/c6474.c
src/device/c6474l/c6474l.c
src/device/device.h
src/main/iblmain.c
src/make/ibl_c6457/i2crom.map.pre
src/make/ibl_c6472/i2crom.map.pre
src/make/ibl_c6472/ibl_common.inc
src/make/ibl_c6474l/i2crom.map.pre
src/make/ibl_c6474l/ibl_common.inc

index 4e0094d6ea7e7d647a6c400ddbba5082b3010bf7..875ef70ce4d7cf56998f5ec2dfd6728326c63235 100644 (file)
@@ -182,7 +182,10 @@ int32 devicePowerPeriph (int32 modNum)
         
 }
 
-
+unsigned int get_device_switch_setting()
+{
+       return (0);
+}
 
 /**
  *  @brief  Enable the pass through version of the nand controller
index ddb817ead4b8c9330321bd06d69d4133d9604684..df69c3d20f1072994bc9c94491792267d9cabf3f 100644 (file)
@@ -136,6 +136,17 @@ int32 devicePowerPeriph (int32 modNum)
         
 }
 
+unsigned int get_device_switch_setting()
+{
+       volatile unsigned int w;
+       unsigned int v;
+
+       w = *((uint32 *)0x02880820);
+       v = w & 0x200;
+       v = v >> 9;
+
+       return(v);
+}
 
 /**
  *  @brief  Enable the pass through version of the nand controller
index a2beaeb963bcc29f13fae57431852e684cd0e67f..9b368e49b671529e4c3dc80c39bd524a49c054bc 100644 (file)
@@ -139,6 +139,18 @@ int32 devicePowerPeriph (int32 modNum)
         
 }
 
+unsigned int get_device_switch_setting()
+{
+       volatile unsigned int w;
+       unsigned int v;
+
+       w = *((uint32 *)0x02a80000);
+       v = w & 0x20000;
+       v = v >> 17;
+
+       return(v);
+}
+
 
 /**
  *  @brief  Enable the pass through version of the nand controller
index 9345be25356c6facb11df424b7f4d3fb759d8922..cbd842bc84fc9d8d623be6421a6600c3c8836ceb 100644 (file)
@@ -139,6 +139,10 @@ int32 devicePowerPeriph (int32 modNum)
         
 }
 
+unsigned int get_device_switch_setting()
+{
+       return (0);
+}
 
 /**
  *  @brief  Enable the pass through version of the nand controller
index 9345be25356c6facb11df424b7f4d3fb759d8922..993210bf8f507beb3fbcbe159c68b165da6af63b 100644 (file)
@@ -139,6 +139,17 @@ int32 devicePowerPeriph (int32 modNum)
         
 }
 
+unsigned int get_device_switch_setting()
+{
+       volatile unsigned int w;
+       unsigned int v;
+
+       w = *((uint32 *)0x02880804);
+       v = w & 0x40;
+       v = v >> 6;
+
+       return(v);
+}
 
 /**
  *  @brief  Enable the pass through version of the nand controller
index e80dd01393e163867f3dfe71643a2b02552365e8..5d698fc5119c2be093768113f37f86f1cb35010b 100644 (file)
@@ -110,6 +110,12 @@ int32 devicePowerPeriph (int32 modNum);
 void deviceDdrConfig (void);
 
 
+/* Function to get the endian setting of a device */
+unsigned int get_device_endian();
+
+/* Function to get the switch setting of a device */
+unsigned int get_device_switch_setting();
+
 /**
  * @brief
  *    Perform device level configuration for nand boot
@@ -159,6 +165,8 @@ bool deviceIsLittleEndian(void);
 void chipDelay32 (uint32 nCycles);
 
 
+
+
 /**
  *  @brief
  *      Return the NAND interface function table
index 0dc44a8167524799d008bb871b5f42bb3f577b24..cbd7a71a51cbd69252de1109267df9809be2be73 100644 (file)
@@ -237,6 +237,7 @@ void main (void)
 {
     int32 i, j;
     UINT32 v, boot_mode_idx, boot_para_idx;
+    unsigned int dip_setting;
 
     /* Initialize the status structure */
     iblMemset (&iblStatus, 0, sizeof(iblStatus_t));
@@ -343,53 +344,36 @@ void main (void)
         else
 #endif
         {
-            
-           /* For C64x devices, loop through the boot modes to find the one with the highest priority
-            * value, and try to boot it. */
-            for (i = ibl_HIGHEST_PRIORITY; i < ibl_LOWEST_PRIORITY; i++)  {
-                
-                for (j = 0; j < ibl_N_BOOT_MODES; j++)  {
-                    
-                    if (ibl.bootModes[j].priority == i)  {
-                        
-                        iblStatus.activeBoot = ibl.bootModes[j].bootMode;
-                        
-                        switch (ibl.bootModes[j].bootMode)  {
-                            
-                            
+
+       dip_setting = get_device_switch_setting();
+       
+       if (dip_setting == 0)
+               boot_mode_idx = 0;
+       else if (dip_setting == 1)
+               boot_mode_idx = 1;
+       
+       iblStatus.activeBoot = ibl.bootModes[boot_mode_idx].bootMode;
+       
+       switch (ibl.bootModes[boot_mode_idx].bootMode) {                            
 #ifndef EXCLUDE_ETH
-                        case ibl_BOOT_MODE_TFTP:
-                            iblStatus.activeDevice = ibl_ACTIVE_DEVICE_ETH;
-                            iblMemcpy (&iblStatus.ethParams, &ibl.bootModes[j].u.ethBoot.ethInfo, sizeof(iblEthBootInfo_t));
-                            iblEthBoot (j);
-                            break;
+                case ibl_BOOT_MODE_TFTP:
+                        iblStatus.activeDevice = ibl_ACTIVE_DEVICE_ETH;
+                        iblMemcpy (&iblStatus.ethParams, &ibl.bootModes[boot_mode_idx].u.ethBoot.ethInfo, sizeof(iblEthBootInfo_t));
+                        iblEthBoot (boot_mode_idx);
+                        break;
 #endif
                             
 #if ((!defined(EXCLUDE_NAND_EMIF)) || (!defined(EXCLUDE_NAND_GPIO)))
-                        case ibl_BOOT_MODE_NAND:
-                            iblPmemCfg (ibl.bootModes[j].u.nandBoot.interface, ibl.bootModes[j].port, TRUE);
-                            iblNandBoot (j);
-                            break;
-#endif
-                            
-#if (!defined(EXCLUDE_NOR_EMIF) && !defined(EXCLUDE_NOR_SPI))
-                        case ibl_BOOT_MODE_NOR:
-                            iblPmemCfg (ibl.bootModes[j].u.norBoot.interface, ibl.bootModes[j].port, TRUE);
-                            iblNorBoot (j);
-                            break;
+               case ibl_BOOT_MODE_NAND:
+                        iblPmemCfg (ibl.bootModes[boot_mode_idx].u.nandBoot.interface, ibl.bootModes[boot_mode_idx].port, TRUE);
+                        iblNandBoot (boot_mode_idx);
+                        break;
 #endif
-                            
-                        }
-                    }
-                    
-                    iblStatus.heartBeat += 1;
-                    
-                }
-            }
-        }
-    }
-
+       }
+       iblStatus.heartBeat += 1;
+       }
 
+    }
 } /* main */
 
 
index c233b7497c1b402c816933eb3557e3159fddb641..e216fa702b65298a9fb77ad7d52a7e3b5e84cf6f 100644 (file)
@@ -28,6 +28,25 @@ section
   exe_file = INIT_EXE_FILE
 }
 
+section 
+{
+  param_index   = 1
+  boot_mode     = 257
+  sw_pll               = 20
+  options       = 1
+
+  core_freq_mhz    = 1000
+  i2c_clk_freq_khz = 100
+
+  dev_addr     = 0x500
+  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 
index 05c480c9d0d09970147f03692605ec0777cf6c59..1b04421ef72c2f75a311b746e5ac139f4d4e7ab6 100644 (file)
@@ -28,6 +28,25 @@ section
   exe_file = INIT_EXE_FILE
 }
 
+section 
+{
+  param_index   = 1
+  boot_mode     = 257
+  sw_pll               = 25
+  options       = 1
+
+  core_freq_mhz    = 625
+  i2c_clk_freq_khz = 200
+
+  dev_addr     = 0x800
+  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 
index d49a69ca51057c771048902450c67ff53268e7e6..a3c2f34ac80bc4c1b909258eb746f9ce944cae7d 100644 (file)
@@ -15,8 +15,8 @@
 
 MEMORY
 {
-       TEXT_INIT :  origin = 0x800000, length = 0x2900
-       TEXT      :  origin = 0x802900, length = 0xd700
+       TEXT_INIT :  origin = 0x800000, length = 0x2b00
+       TEXT      :  origin = 0x802b00, length = 0xd500
        STACK     :  origin = 0x810000, length = 0x0800
        HEAP      :  origin = 0x810800, length = 0x6000
        DATA_INIT :  origin = 0x816800, length = 0x0400
index 8be6936ecd058f877800557a7f49994ab50ab89b..e216fa702b65298a9fb77ad7d52a7e3b5e84cf6f 100644 (file)
 ;
 ;  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               = 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
+}
+
 section 
 {
   param_index   = 1
@@ -20,6 +38,7 @@ section
   core_freq_mhz    = 1000
   i2c_clk_freq_khz = 100
 
+  dev_addr     = 0x500
   dev_addr_ext = I2C_BUS_ADDR
 
   multi_i2c_id = 0
index d8ec2cf2c6d055b4eda023c9df28de0231d2adf4..9efebc2a03a1d9f0bcb7e4ad7d1a54fefd7f3bf1 100644 (file)
@@ -15,8 +15,8 @@
 
 MEMORY
 {
-       TEXT_INIT :  origin = 0x801000, length = 0x2800
-       TEXT      :  origin = 0x803800, length = 0xd800
+       TEXT_INIT :  origin = 0x801000, length = 0x2a00
+       TEXT      :  origin = 0x803a00, length = 0xd600
        STACK     :  origin = 0x811000, length = 0x0800
        HEAP      :  origin = 0x811800, length = 0x6000
        DATA_INIT :  origin = 0x817800, length = 0x0400