فهرست منبع

Fix errors that occur when accessing SystemACE CF
Patch by Jeff Angielski, 09 Jan 2005

Wolfgang Denk 20 سال پیش
والد
کامیت
fe599e17ed
2فایلهای تغییر یافته به همراه30 افزوده شده و 4 حذف شده
  1. 3 0
      CHANGELOG
  2. 27 4
      common/cmd_ace.c

+ 3 - 0
CHANGELOG

@@ -2,6 +2,9 @@
 Changes for U-Boot 1.1.3:
 ======================================================================
 
+* Fix errors that occur when accessing SystemACE CF
+  Patch by Jeff Angielski, 09 Jan 2005
+  
 * Document switching between U-Boot and PlanetCore on RPXlite
   by Sam Song, 24 Dec 2004
 

+ 27 - 4
common/cmd_ace.c

@@ -31,6 +31,12 @@
  * available to cmd_fat.c:get_dev and filling in a block device
  * description that has all the bits needed for FAT support to
  * read sectors.
+ * 
+ * According to Xilinx technical support, before accessing the
+ * SystemACE CF you need to set the following control bits:
+ * 	FORCECFGMODE : 1
+ * 	CFGMODE : 0
+ * 	CFGSTART : 0
  */
 
 # include  <common.h>
@@ -95,7 +101,9 @@ static int get_cf_lock(void)
       int retry = 10;
 
 	/* CONTROLREG = LOCKREG */
-      ace_writew(0x0002, 0x18);
+      unsigned val=ace_readw(0x18);
+      val|=0x0002;
+      ace_writew((val&0xffff), 0x18);
 
 	/* Wait for MPULOCK in STATUSREG[15:0] */
       while (! (ace_readw(0x04) & 0x0002)) {
@@ -112,8 +120,9 @@ static int get_cf_lock(void)
 
 static void release_cf_lock(void)
 {
-	/* CONTROLREG = none */
-      ace_writew(0x0000, 0x18);
+	unsigned val=ace_readw(0x18);
+	val&=~(0x0002);
+	ace_writew((val&0xffff), 0x18);
 }
 
 block_dev_desc_t *  systemace_get_dev(int dev)
@@ -127,6 +136,9 @@ block_dev_desc_t *  systemace_get_dev(int dev)
 	    systemace_dev.blksz     = 512;
 	    systemace_dev.removable = 1;
 	    systemace_dev.block_read = systemace_read;
+
+	    init_part(&systemace_dev);
+
       }
 
       return &systemace_dev;
@@ -145,6 +157,7 @@ static unsigned long systemace_read(int dev,
       int retry;
       unsigned blk_countdown;
       unsigned char*dp = (unsigned char*)buffer;
+      unsigned val;
 
       if (get_cf_lock() < 0) {
 	    unsigned status = ace_readw(0x04);
@@ -165,7 +178,7 @@ static unsigned long systemace_read(int dev,
 
       retry = 2000;
       for (;;) {
-	    unsigned val = ace_readw(0x04);
+	    val = ace_readw(0x04);
 
 	      /* If CFDETECT is false, card is missing. */
 	    if (! (val & 0x0010)) {
@@ -212,6 +225,11 @@ static unsigned long systemace_read(int dev,
 	      /* Write sector count | ReadMemCardData. */
 	    ace_writew((trans&0xff) | 0x0300, 0x14);
 
+	    /* Reset the configruation controller */
+	    val = ace_readw(0x18);
+	    val|=0x0080;
+	    ace_writew(val, 0x18);
+
 	    retry = trans * 16;
 	    while (retry > 0) {
 		  int idx;
@@ -231,6 +249,11 @@ static unsigned long systemace_read(int dev,
 		  retry -= 1;
 	    }
 
+	    /* Clear the configruation controller reset */
+	    val = ace_readw(0x18);
+	    val&=~0x0080;
+	    ace_writew(val, 0x18);
+
 	      /* Count the blocks we transfer this time. */
 	    start += trans;
 	    blk_countdown -= trans;