[U-Boot-Users] [PATCH] updated IDE patch for __LITTLE_ENDIAN CPUs

Marc Singer elf at buici.com
Thu Aug 14 22:09:11 CEST 2003


The comment is CHANGELOG is corrected and the C++ comment removed.
-------------- next part --------------
diff -ruN --exclude '*.o' --exclude='*.map' --exclude '*~' --exclude '*-orig' --exclude=.depend --exclude=configx.mk --exclude='*.srec' --exclude='*.a' u-boot-0.4.5/CHANGELOG u-boot/CHANGELOG
--- u-boot-0.4.5/CHANGELOG	2003-08-07 15:18:11.000000000 -0700
+++ u-boot/CHANGELOG	2003-08-14 13:02:49.000000000 -0700
@@ -2,6 +2,9 @@
 Changes for U-Boot 0.4.5:
 ======================================================================
 
+* Patch by Marc Singer, 14 Aug 2003
+  - IDE drivers changes to support little endian CPUs.
+
 * Update for TQM board defaults:
   disable clocks_in_mhz, enable boot count limit
 
diff -ruN --exclude '*.o' --exclude='*.map' --exclude '*~' --exclude '*-orig' --exclude=.depend --exclude=configx.mk --exclude='*.srec' --exclude='*.a' u-boot-0.4.5/common/cmd_ide.c u-boot/common/cmd_ide.c
--- u-boot-0.4.5/common/cmd_ide.c	2003-07-01 14:07:07.000000000 -0700
+++ u-boot/common/cmd_ide.c	2003-08-14 11:55:12.000000000 -0700
@@ -42,7 +42,10 @@
 #ifdef CONFIG_STATUS_LED
 # include <status_led.h>
 #endif
-#ifdef __I386__
+#if defined (__I386__)
+#include <asm/io.h>
+#endif
+#if defined (__ARM__)
 #include <asm/io.h>
 #endif
 
@@ -120,6 +123,10 @@
 #define	ATA_CURR_BASE(dev)	(CFG_ATA_BASE_ADDR+ide_bus_offset[IDE_BUS(dev)])
 #endif
 
+#if defined (__ARM__)
+#define ATA_CURR_BASE(dev)	(CFG_ATA_BASE_ADDR)
+#endif
+
 #ifndef CONFIG_AMIGAONEG3SE
 static int	    ide_bus_ok[CFG_IDE_MAXBUS];
 #else
@@ -559,7 +566,7 @@
 			continue;
 		}
 #endif
-		printf ("Bus %d: ", bus);
+		printf ("Bus %d (dev %x):", bus, dev);
 
 		ide_bus_ok[bus] = 0;
 
@@ -759,6 +766,16 @@
 	printf ("ide_outb: 0x%08lx <== 0x%02x\n", ATA_CURR_BASE(dev)+port, val);
 #endif
 }
+#elif defined (__ARM__)
+static void __inline__
+ide_outb(int dev, int port, unsigned char val)
+{
+	volatile u32* p = (void*) ATA_CURR_BASE(dev)+(port << 2);
+	*p = val;
+#if 0
+	printf ("ide_outb: 0x%08x <== 0x%02x\n", (u32) p, val);
+#endif
+}
 #else	/* ! __PPC__ */
 static void __inline__
 ide_outb(int dev, int port, unsigned char val)
@@ -781,11 +798,23 @@
 #endif
 	return (val);
 }
+#elif defined (__ARM__)
+static unsigned char __inline__
+ide_inb(int dev, int port)
+{
+	volatile u32* p = (volatile void*)(ATA_CURR_BASE (dev) + (port << 2));
+	u16 val = *p;
+
+#if 0
+	printf ("ide_inb_arm: 0x%08x ==> 0x%02x\n", (u32) p, val);
+#endif
+	return ((uchar)val);
+}
 #else	/* ! __PPC__ */
 static unsigned char __inline__
 ide_inb(int dev, int port)
 {
-	return inb(port);
+	return inb (port);
 }
 #endif	/* __PPC__ */
 
@@ -866,7 +895,18 @@
 		*dbuf++ = *pbuf;
 	}
 }
-#else	/* ! __PPC__ */
+#elif defined (__ARM__)
+static void
+input_data(int dev, ulong *sect_buf, int words)
+{
+	volatile u32* p = (volatile void*)(ATA_CURR_BASE (dev));
+	u16* rg = (void*) sect_buf;
+	while (words--)
+	  *rg++ = (*p)&0xffff;
+
+	  /*	insw(ATA_DATA_REG, sect_buf, words << 1); */
+}
+#else
 static void
 input_data(int dev, ulong *sect_buf, int words)
 {
@@ -1055,8 +1095,15 @@
 	}
 #endif /* CONFIG_ATAPI */
 
-	/* swap shorts */
+	/* Oddly, the IDE interface stores the capacity datum in LSB
+	 * order even though the identification strings are stored in MSB
+	 * order. [Compact Flash spec 2.0, section 6.2.1.6,
+	 * Identify Drive Command] */
+#if defined (__BIG_ENDIAN)
 	dev_desc->lba = (iop->lba_capacity << 16) | (iop->lba_capacity >> 16);
+#else
+	dev_desc->lba = iop->lba_capacity;
+#endif
 	/* assuming HD */
 	dev_desc->type=DEV_TYPE_HARDDISK;
 	dev_desc->blksz=ATA_BLOCKSIZE;
@@ -1230,24 +1277,32 @@
  */
 static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len)
 {
-	int start,end;
+#if defined (__LITTLE_ENDIAN) || defined (__PPC__)
+	/* Identity strings are stored in MSB order.  Swap them on LSB
+	   machines to make them look right.
+
+	   We also have to do this on PPC because it uses the function
+	   input_swap_data to reorder all input data.  In the case of
+	   the identity strings, it is reversing the byte order.  */
 
-	start=0;
-	while (start<len) {
-		if (src[start]!=' ')
-			break;
-		start++;
-	}
-	end=len-1;
-	while (end>start) {
-		if (src[end]!=' ')
-			break;
-		end--;
+	{
+	  int i = len/2;
+	  while (i--)
+	    ((u16*) src)[i] = (((u16*) src)[i] >> 8) | (((u16*) src)[i] << 8);
 	}
-	for ( ; start<=end; start++) {
-		*dest++=src[start];
+#endif
+
+	while (*src == ' ' || *src == 0) {
+	  ++src;
+	  --len;
 	}
-	*dest='\0';
+
+	while ((len && src[len - 1] == ' ') || src[len - 1] == 0)
+	  --len;
+
+	while (len--)
+	  *dest++ = *src++;
+	*dest = 0;
 }
 
 /* ------------------------------------------------------------------------- */


More information about the U-Boot mailing list