r4606 - developers/werner/greg

werner at docs.openmoko.org werner at docs.openmoko.org
Mon Aug 25 20:38:52 CEST 2008


Author: werner
Date: 2008-08-25 20:38:51 +0200 (Mon, 25 Aug 2008)
New Revision: 4606

Added:
   developers/werner/greg/s3c24xx-spi.greg
Modified:
   developers/werner/greg/greg.c
Log:
- added S3C24xx SPI register definitions
- added "C" dump mode (experimental)



Modified: developers/werner/greg/greg.c
===================================================================
--- developers/werner/greg/greg.c	2008-08-25 03:26:38 UTC (rev 4605)
+++ developers/werner/greg/greg.c	2008-08-25 18:38:51 UTC (rev 4606)
@@ -14,6 +14,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 
 #include "reg.h"
 #include "cpp.h"
@@ -102,9 +103,47 @@
 }
 
 
+static void dump_c_values(const char *reg_name, const struct field *field)
+{
+	const char *name;
+	unsigned long long i;
+
+	if (field->value.type != vt_list)
+		return;
+	for (i = 0; i != 1 << field->bits; i++) {
+		name = field->value.u.list[i].name;
+		if (name)
+			printf("#define %s_%s_%s %llu\n",
+			    reg_name, field->name, name, i);
+	}
+}
+
+
+static void dump_c(void)
+{
+	const struct reg *reg;
+	const struct field *field;
+	int bits;
+
+	for (reg = regs; reg; reg = reg->next) {
+		printf("#define %s %s\n", reg->name, reg->id);
+		bits = 0;
+		for (field = reg->fields; field; field = field->next) {
+			if (field->name) {
+				printf("#define %s_%s %d\n",
+				    reg->name, field->name, bits);
+				dump_c_values(reg->name, field);
+			}
+			bits += field->bits;
+		}
+	}
+}
+
+
 static void usage(const char *name)
 {
 	fprintf(stderr, "usage: %s regdef-file [reg value ...]\n", name);
+	fprintf(stderr, "       %s regdef-file -d\n", name);
 	exit(1);
 }
 
@@ -113,12 +152,17 @@
 {
 	int i;
 
-	if (argc < 2 || (argc & 1))
+	if (argc < 2)
 		usage(*argv);
 	run_cpp_on_file(argv[1]);
 	(void) yyparse();
+	if (argc == 3 && !strcmp(argv[2], "-d")) {
+		dump_c();
+		return 0;
+	}
+	if (argc & 1)
+		usage(*argv);
 	for (i = 2; i != argc; i += 2)
 		print(argv[i], strtoull(argv[i+1], NULL, 0));
 	return 0;
-	
 }

Added: developers/werner/greg/s3c24xx-spi.greg
===================================================================
--- developers/werner/greg/s3c24xx-spi.greg	                        (rev 0)
+++ developers/werner/greg/s3c24xx-spi.greg	2008-08-25 18:38:51 UTC (rev 4606)
@@ -0,0 +1,59 @@
+/*
+ * Samsung S3C24xx SPI register definitions
+ */
+
+
+%8
+
+#define SPCONx							\
+	TAGD		"Receive data"				\
+			{ normal_mode tx_auto_garbage }		\
+	CPHA		"Clock phase"				\
+			{ format_a format_b }			\
+	CPOL		"Clock polarity"			\
+			{ active_high active_low }		\
+	MSTR		"Master/slave select"			\
+			{ slave master }			\
+	ENSCK		"SCK enable"				\
+			{ disable enable }			\
+	SMOD[2]		"SPI mode select"			\
+			{ polling interrupt dma _ }		\
+	_		/* undocumented */
+
+#define SPSTAx							\
+	REDY		"Transfer ready"			\
+			{ not_ready data_ready }		\
+	MULF		"Multi master error"			\
+			{ not_detect error_detected }		\
+	DCOL		"Data collision error"			\
+			{ not_detect collision_detected }	\
+	_[5]
+
+#define SPPINx							\
+	KEEP		"Master out keep"			\
+			{ release previous_level }		\
+	SPICSn		"CSn"					\
+			{ activate deactivate }			\
+	ENMUL		"Multi master error detect enable"	\
+			{ disable enable }			\
+	_[5]
+
+0x59000000 SPCON0	"SPI channel 0 control"
+	SPCONx
+0x59000004 SPSTA0	"SPI channel 0 status"
+	SPSTAx
+0x59000008 SPPIN0	"SPI channel 0 PIN control"
+	SPPINx
+0x5900000c SPPRE0	"SPI channel 0 baud rate prescaler"
+0x59000010 SPTDAT0	"SPI channel 0 Tx data"
+0x59000014 SPRDAT0	"SPI channel 0 Rx data"
+
+0x59000020 SPCON1	"SPI channel 1 control"
+	SPCONx
+0x59000024 SPSTA1	"SPI channel 1 status"
+	SPSTAx
+0x59000028 SPPIN1	"SPI channel 1 PIN control"
+	SPPINx
+0x5900002c SPPRE1	"SPI channel 1 baud rate prescaler"
+0x59000030 SPTDAT1	"SPI channel 1 Tx data"
+0x59000034 SPRDAT1	"SPI channel 1 Rx data"




More information about the commitlog mailing list