r4132 - trunk/src/target/gpio

werner at sita.openmoko.org werner at sita.openmoko.org
Thu Feb 28 14:32:38 CET 2008


Author: werner
Date: 2008-02-28 14:32:35 +0100 (Thu, 28 Feb 2008)
New Revision: 4132

Added:
   trunk/src/target/gpio/gpio-glamo.c
Modified:
   trunk/src/target/gpio/Makefile
Log:
Quick and dirty GPIO dumper for the Glamo 3362.



Modified: trunk/src/target/gpio/Makefile
===================================================================
--- trunk/src/target/gpio/Makefile	2008-02-28 12:16:41 UTC (rev 4131)
+++ trunk/src/target/gpio/Makefile	2008-02-28 13:32:35 UTC (rev 4132)
@@ -2,4 +2,4 @@
 
 CFLAGS=-Wall -g
 
-all:		gpio
+all:		gpio gpio-glamo

Added: trunk/src/target/gpio/gpio-glamo.c
===================================================================
--- trunk/src/target/gpio/gpio-glamo.c	2008-02-28 12:16:41 UTC (rev 4131)
+++ trunk/src/target/gpio/gpio-glamo.c	2008-02-28 13:32:35 UTC (rev 4132)
@@ -0,0 +1,145 @@
+/*
+ * gpio-glamo - Read and set GPIO pins (of the Smedia Glamo 3362)
+ *
+ * Copyright (C) 2008 by OpenMoko, Inc.
+ * Written by Werner Almesberger <werner at openmoko.org>
+ * All Rights Reserved
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+
+#define BASE 0x08000000
+
+
+static volatile void *mem;
+
+
+#define CON_IN	0
+#define CON_OUT	1
+#define CON_F1	2
+#define CON_F2	3
+
+
+/* 2442 port assignment */
+
+static struct port {
+	const char *name;
+	int offset;
+	int start;
+	enum { pt_gpio, pt_dgpio } type;
+} ports[] = {
+	{ "GPIO",  0x50,  0, pt_gpio },
+	{ "GPIO",  0x52,  4, pt_gpio },
+	{ "GPIO",  0x54,  8, pt_gpio },
+	{ "GPIO",  0x56, 12, pt_gpio },
+	{ "GPIO",  0x58, 16, pt_gpio },
+	{ "DGPIO", 0x5c,  0, pt_dgpio },
+	{ "DGPIO", 0x5e,  4, pt_dgpio },
+	{ "DGPIO", 0x60,  8, pt_dgpio },
+	{ "DGPIO", 0x62, 12, pt_dgpio },
+	{ NULL, }
+};
+
+
+static void print_n(const char *name, int start)
+{
+	int i;
+
+	printf("%s ", name);
+	for (i = 0; i != 4; i++)
+		printf("%2d ", start+i);
+	putchar('\n');
+}
+
+
+/* ----- Read a pin -------------------------------------------------------- */
+
+
+static const char *pin(const struct port *p, int n)
+{
+	static char res[4];
+	uint16_t reg;
+
+	reg = *(uint16_t *) (mem+p->offset);
+	if (p->type == pt_dgpio || ((reg >> (n+12)) & 1))
+		res[0] = res[0] = (reg >> n) & 1 ? ' ' : '>';
+	else
+		res[0] = 'F';
+	res[1] = (reg >> (n+8)) & 1 ? '1' : '0';
+	if (res[0] == ' ')
+		res[2] = ' ';
+	else
+		res[2] = ((reg >> (n+4)) ^ (reg >> (n+8))) & 1 ? '!' : ' ';
+	return res;
+}
+
+
+/* ----- Dump all ports ---------------------------------------------------- */
+
+
+static void dump_all(void)
+{
+	const struct port *p;
+	int i;
+
+	for (p = ports; p->name; p++) {
+		print_n(p->name, p->start);
+		printf("%*s ", strlen(p->name), "");
+		for (i = 0; i != 4; i++)
+			printf("%s ", pin(p, i));
+		putchar('\n');
+	}
+}
+
+
+/* ----- Command-line parsing ---------------------------------------------- */
+
+
+static void __attribute__((noreturn)) usage(const char *name)
+{
+	fprintf(stderr,
+"usage: %s [pin[=value] ...]\n\n"
+"  pin = <letter><number>, e.g., A5, b10\n"
+"  value = <control><pull-down>, with\n"
+"    <control> = 0 (output 0), 1 (output 1), Z (input), F (primary\n"
+"                function), X (secondary function)\n"
+"    <pull-down> = R (pull-down active) or nothing\n"
+"    As a short-cut, ZR can be abbreviated as R.\n\n"
+"  Examples: A5=ZR, b10=0\n",
+    name);
+	exit(1);
+}
+
+
+int main(int argc, char **argv)
+{
+	int fd;
+
+	fd = open("/dev/mem", O_RDWR);
+        if (fd < 0) {
+		perror("/dev/mem");
+		exit(1);
+	}
+	mem = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, BASE);
+	if (mem == MAP_FAILED) {
+		perror("mmap");
+		exit(1);
+	}
+	if (argc == 1)
+		dump_all();
+	else
+		usage(*argv);
+	return 0;
+}





More information about the commitlog mailing list