[PATCH] uboot-add-rev-detection.patch

Andy Green andy at openmoko.com
Mon Mar 31 13:56:30 CEST 2008


GTA02 A6+ has board rev detection capability, provide
 int gta02_get_pcb_revision(void)
which returns

b9    b8        b2    b1    b0
GPD4  GPD3     GPD0  GPC15 GPC13

GTA02 A5 and before:  0x000
GTA02 A6           :  0x101

Also create pcb_rev in the environment, which contains, eg, 0x101 and
can be passed into the operating system on the commandline.  For linux
this can then be seen from userspace by

cat /proc/cmdline

Signed-off-by: Andy Green <andy at openmoko.com>
---

 board/neo1973/gta02/gta02.c |   73 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 72 insertions(+), 1 deletions(-)


diff --git a/board/neo1973/gta02/gta02.c b/board/neo1973/gta02/gta02.c
index 07b0917..9583d79 100644
--- a/board/neo1973/gta02/gta02.c
+++ b/board/neo1973/gta02/gta02.c
@@ -68,6 +68,8 @@ extern unsigned char booted_from_nand;
 extern unsigned char booted_from_nor;
 extern int nobootdelay;
 
+int gta02_get_pcb_revision(void);
+
 static inline void delay (unsigned long loops)
 {
 	__asm__ volatile ("1:\n"
@@ -170,12 +172,25 @@ int board_init(void)
 	gpio->GPBCON = 0x00155555;
 	gpio->GPBUP = 0x000007FF;
 
-	/* pulldown on "PIO_5" BT module to stop float when unpowered */
+	/*
+	 * PCB rev index found on C13, C15, D0, D3 and D4.  These are NC or
+	 * pulled up by 10K.  Therefore to ensure no current flows when they
+	 * are not interrogated, we drive them high.  When we interrogate them
+	 * we make them pulled them down inputs briefly and set them high op
+	 * again afterwards.
+	 */
+
+	/* pulldown on "PIO_5" BT module to stop float when unpowered
+	 * C13 and C15 are b0 and b1 of PCB rev index
+	 */
 	gpio->GPCCON = 0x55555155;
 	gpio->GPCUP = 0x0000FFFF & ~(1 << 5);
+	gpio->GPCDAT |= (1 << 13) | (1 << 15); /* index detect -> hi */
 
+	/* D0, D3 and D4 are b2, b3 and b4 of PCB rev index */
 	gpio->GPDCON = 0x55555555;
 	gpio->GPDUP = 0x0000FFFF;
+	gpio->GPDDAT |= (1 << 0) | (1 << 3) | (1 << 4); /* index detect -> hi */
 
 	/* pulldown on GPE11 / SPIMISO0 - goes to debug board and will float */
 	gpio->GPECON = 0xAAAAAAAA;
@@ -245,6 +260,12 @@ int board_late_init(void)
 	char buf[32];
 	int menu_vote = 0; /* <= 0: no, > 0: yes */
 	int seconds = 0;
+	int rev = gta02_get_pcb_revision();
+
+	printf("PCB rev: 0x%03X\n", rev);
+	/* expose in the env so we can add to kernel commandline */
+	sprintf(buf, "0x%03X", rev);
+	setenv("pcb_rev", buf);
 
 	/* Initialize the Power Management Unit with a safe register set */
 	pcf50633_init();
@@ -521,3 +542,53 @@ void neo1973_led(int led, int on)
 	else
 		gpio->GPBDAT &= ~(1 << led);
 }
+
+/**
+ * returns PCB revision information in b9,b8 and b2,b1,b0
+ * Pre-GTA02 A6 returns 0x000
+ *     GTA02 A6 returns 0x101
+ */
+
+int gta02_get_pcb_revision(void)
+{
+	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
+	int n;
+	u32 u;
+
+	/* make C13 and C15 pulled-down inputs */
+	gpio->GPCCON &= ~0xcc000000;
+	gpio->GPCUP  &= ~((1 << 13) | (1 << 15));
+	/* D0, D3 and D4 pulled-down inputs */
+	gpio->GPDCON &= ~0x000003c3;
+	gpio->GPDUP  &= ~((1 << 0) | (1 << 3) | (1 << 4));
+
+	/* delay after changing pulldowns */
+	u = gpio->GPCDAT;
+	u = gpio->GPDDAT;
+
+	/* read the version info */
+	u = gpio->GPCDAT;
+	n =  (u >> (13 - 0)) & 0x001;
+	n |= (u >> (15 - 1)) & 0x002;
+	u = gpio->GPDDAT;
+	n |= (u << (0 + 2))  & 0x004;
+
+	n |= (u << (8 - 3))  & 0x100;
+	n |= (u << (9 - 4))  & 0x200;
+
+	/*
+	 * when not being interrogated, all of the revision GPIO
+	 * are set to output HIGH without pulldown so no current flows
+	 * if they are NC or pulled up.
+	 */
+	/* make C13 and C15 high ouputs with no pulldowns */
+	gpio->GPCCON |= 0x44000000;
+	gpio->GPCUP  |= (1 << 13) | (1 << 15);
+	gpio->GPCDAT |= (1 << 13) | (1 << 15);
+	/* D0, D3 and D4 high ouputs with no pulldowns */
+	gpio->GPDCON |= 0x00000141;
+	gpio->GPDUP  |= (1 << 0) | (1 << 3) | (1 << 4);
+	gpio->GPDDAT |= (1 << 0) | (1 << 3) | (1 << 4);
+
+	return n;
+}





More information about the openmoko-kernel mailing list