Clean up the code and fixed instablitily issue in the NAND/EMIF driver DEV.MCSDK.02.00.00.IBL.NAND_BOOT_CLEANUP
authorHao Zhang <hzhang@ti.com>
Sun, 6 Mar 2011 15:40:51 +0000 (10:40 -0500)
committerHao Zhang <hzhang@ti.com>
Sun, 6 Mar 2011 15:40:51 +0000 (10:40 -0500)
src/device/c661x/c661xinit.c
src/hw/nands/emif25/nandemif25.c
src/ibl.h
src/main/iblinit.c
src/main/iblmain.c
src/util/nandwriter/nandwriter.c

index 195e77d68b5b1209a32e0d0477280c051ad58854..28036955a53499013871392019e1b29838b78b8b 100644 (file)
@@ -228,19 +228,10 @@ void iblEnterRom ()
         dev_stat = DEVICE_REG32_R(DEVICE_REG_DEVSTAT );
         dev_stat &= ~(0x0000080E);
         dev_stat |= ((bm_hi << 8) | bm_lo);
-#if 0        
-        /* Unlock Boot Config */
-        *((volatile Uint32 *)0x2620038) = 0x83e70b13;
-        *((volatile Uint32 *)0x262003c) = 0x95a4f1e0;
-#endif
         
         /* Update the DEVSTAT register for the intended Boot Device and i2c Addr */
         DEVICE_REG32_W (DEVICE_REG_DEVSTAT, dev_stat);
-#if 0        
-        /* Lock Boot Config */
-        *((volatile Uint32 *)0x2620038) = 0;
-        *((volatile Uint32 *)0x262003c) = 0;
-#endif        
+
         exit = (void (*)())BOOT_ROM_ENTER_ADDRESS;
         (*exit)();        
     }
index caceb60fc6ff2595bce3946250a5b81e94d78f37..fdcf9683ec4c1151cde827191ab7cf9724f4aec5 100644 (file)
 #define NAND_ALE_OFFSET     0x2000  /* Address latch enable register offset */
 #define NAND_CMD_OFFSET     0x4000  /* Command latch enable register offset */
 
-#define NAND_DELAY          50000 
+#define NAND_DELAY          50000
+
+#define DEVICE_REG8_W(x,y)  *(volatile Uint8 *)(x)=(y)
+#define DEVICE_REG8_R(x)    (*(volatile Uint8 *)(x))
+
+#define DEVICE_REG16_W(x,y) *(volatile Uint16 *)(x)=(y)
+#define DEVICE_REG16_R(x)   (*(volatile Uint16 *)(x))
 
 extern void chipDelay32 (uint32 del);
 extern uint32 deviceEmif25MemBase (int32 cs);
@@ -61,7 +67,7 @@ nandAleSet
     Uint32    addr
 )
 {
-    DEVICE_REG32_W (memBase + NAND_ALE_OFFSET, addr);
+    DEVICE_REG8_W (memBase + NAND_ALE_OFFSET, addr);
 }
 
 void 
@@ -70,7 +76,7 @@ nandCmdSet
     Uint32    cmd
 )
 {
-    DEVICE_REG32_W (memBase + NAND_CMD_OFFSET, cmd);
+    DEVICE_REG8_W (memBase + NAND_CMD_OFFSET, cmd);
 }
 
 void 
@@ -81,16 +87,20 @@ nandReadDataBytes
 )
 {
     Int32   i;
+    Uint16  *data16;
 
     if (hwDevInfo->busWidthBits == 8)  
     {
         for (i = 0; i < nbytes; i++)
-            data[i] = *(volatile Uint8 *)memBase;
+            data[i] = DEVICE_REG8_R(memBase);
 
-    }  else  {
+    }  
+    else  
+    {
+        data16 = (Uint16 *)data;
 
         for (i = 0; i < (nbytes+1) >> 1; i++)
-            data[i] = *(volatile Uint16 *)memBase;
+            data16[i] = DEVICE_REG16_R(memBase);
     }
 }
 
@@ -104,6 +114,9 @@ Int32 nandHwEmifDriverInit (int32 cs, void *vdevInfo)
     hwDevInfo = (nandDevInfo_t *)vdevInfo;
     memBase   = deviceEmif25MemBase (cs);
 
+    nandCmdSet(hwDevInfo->resetCommand);
+    chipDelay32 (NAND_DELAY);
+
     return (0);
 }
 
@@ -118,19 +131,7 @@ Int32 nandHwEmifDriverReadBytes (Uint32 block, Uint32 page, Uint32 byte, Uint32
 
     addr = (block << hwDevInfo->blockOffset) | (page << hwDevInfo->pageOffset) | ((byte & 0xff) << hwDevInfo->columnOffset);   
 
-    if (byte < 256)
-    {
-        cmd = hwDevInfo->readCommandPre;
-    }
-    else if (byte < 512)
-    {
-        cmd = hwDevInfo->readCommandPre + 1;
-    }
-    else
-    {
-        cmd = 0x50;
-    }
-
+    cmd = hwDevInfo->readCommandPre;
     nandCmdSet(cmd); // First cycle send 0
 
     /* 4 address cycles */
index 1d25d2711035546061bf75c628f7c08c757631b9..35b6db501f419698c08100b75d715c9abd1961e6 100644 (file)
--- a/src/ibl.h
+++ b/src/ibl.h
@@ -67,7 +67,7 @@
  * @brief
  *  The version number, 1.0.0.0
  */
-#define ibl_VERSION  ibl_MAKE_VERSION(1,0,0,0)
+#define ibl_VERSION  ibl_MAKE_VERSION(1,0,0,1)
 
 
 /**
index 65592510db4cbe33f8e0b91057edfb931968a193..5b5642f300df5ee56235c6dc00375d620ed975dc 100644 (file)
@@ -434,8 +434,6 @@ void main (void)
     iblStatus.iblVersion   = ibl_VERSION;
     iblStatus.activeDevice = ibl_ACTIVE_DEVICE_I2C;
 
-    /* Pll configuration is device specific */
-    devicePllConfig ();
 
     /* Determine the boot device to read from */
     bootDevice = deviceReadBootDevice();
@@ -459,6 +457,9 @@ void main (void)
     }
     
 
+    /* Pll configuration is device specific */
+    devicePllConfig ();
+
     /* Enable the EDC for local memory */
     if (IBL_ENABLE_EDC)
     {
index 9731c1b28b7a01cb530fda59aca7015e68a26024..3bcac31e9f124cebcf0983467529e146f858db7b 100644 (file)
@@ -283,7 +283,6 @@ void main (void)
                                     break;
                         #endif
 
-                        //#if (!defined(EXCLUDE_NAND_EMIF) && !defined(EXCLUDE_NAND_SPI) && !defined(EXCLUDE_NAND_GPIO))
                         #if ((!defined(EXCLUDE_NAND_EMIF)) )                                    
                             case ibl_BOOT_MODE_NAND:
                                     iblPmemCfg (ibl.bootModes[j].u.nandBoot.interface, ibl.bootModes[j].port, TRUE);
index 7962e2b6a3b1b29187e892c2b5375d77957c89a5..41dc182b1dee0cab3fdeb272c22286d38630a7ca 100644 (file)
@@ -419,7 +419,7 @@ int main (void)
     deviceConfigureForNand();
     
     /* Initialize the programming interface */
-    ret = nandHwDriverInit (&devInfo);
+    ret = nandHwEmifDriverInit (&devInfo);
     if (ret != 0)  {
         printf ("nandHwDriverInit failed with error code %d\n", ret);
         free (data);