r4607 - in developers/werner: . wlan-spi

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


Author: werner
Date: 2008-08-25 20:40:25 +0200 (Mon, 25 Aug 2008)
New Revision: 4607

Added:
   developers/werner/wlan-spi/
   developers/werner/wlan-spi/Makefile
   developers/werner/wlan-spi/WIRING
   developers/werner/wlan-spi/spi.c
Log:
- WIRING: SD/SPI wiring cheat sheet
- Makefile, spi.c: small user-mode demo for polling mode SPI (tested only TX)



Added: developers/werner/wlan-spi/Makefile
===================================================================
--- developers/werner/wlan-spi/Makefile	                        (rev 0)
+++ developers/werner/wlan-spi/Makefile	2008-08-25 18:40:25 UTC (rev 4607)
@@ -0,0 +1,10 @@
+CC=arm-angstrom-linux-gnueabi-gcc
+
+CFLAGS=-Wall
+
+all:		spi
+
+spi.c:		s3c24xx-spi.h
+
+s3c24xx-spi.h:	../greg/s3c24xx-spi.greg
+		../greg/greg $< -d >$@ || { rm -f $@; exit 1; }

Added: developers/werner/wlan-spi/WIRING
===================================================================
--- developers/werner/wlan-spi/WIRING	                        (rev 0)
+++ developers/werner/wlan-spi/WIRING	2008-08-25 18:40:25 UTC (rev 4607)
@@ -0,0 +1,54 @@
+---  SD/SDIO connector  -------------------------------------------------------
+
+	SD/SDIO		SPI
+
+8	DAT1		IRQ
+7	DAT0		MISO
+6 "JB"	GND		GND
+5	CLK		CLK
+4	VDD		VDD
+3	GND		GND
+2	CMD		MOSI
+1	CD/DAT3		CS
+  9	DAT2		-
+
+
+---  WLAN Prototype Board (PCB)  ----------------------------------------------
+
+	SD/SDIO		SPI		CPU
+
+(0)	VDD		VDD
+1	CD/DAT3		CS		G2
+2	DAT0		MISO		E11
+3 X	DAT2		-		-
+4	DAT1		IRQ		F3
+5	CLK		CLK		E13
+6	CMD		MOSI		E12
+7	GND		GND
+8	VDD		VDD
+
+
+--- Debug board ---------------------------------------------------------------
+
+PCB	CPU	Signal	Pin	Signal		CPU	PCB
+
+8	-	VCC3	10 9	GND		-	7
+-	-	-	8  7	EINT3		F3	4
+1	G2	SS	6  5	MISO		E11	2
+6	E12	MOSI	4  3	CLK		E13	5
+-	-	I2C_SDA	2  1	I2C_SCL		-	-
+
+
+---  Scope  -------------------------------------------------------------------
+
+E12 MOSI
+
+E13 CLK
+
+F3  IRQ
+
+---
+
+E11 MISO
+
+G2  CS

Added: developers/werner/wlan-spi/spi.c
===================================================================
--- developers/werner/wlan-spi/spi.c	                        (rev 0)
+++ developers/werner/wlan-spi/spi.c	2008-08-25 18:40:25 UTC (rev 4607)
@@ -0,0 +1,83 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#include "s3c24xx-spi.h"
+
+
+#define GPECON 0x56000040
+#define CLKCON 0x4C00000C
+#define INTMSK 0x4A000008
+
+
+static volatile void *regs;
+
+
+#define R(x) (*(volatile uint32_t *) (regs+(x)-0x40000000))
+
+
+static void fn(unsigned long reg, int bit)
+{
+	R(reg) = (R(reg) & ~(3UL << 2*bit)) | (2 << 2*bit);
+}
+
+
+int main(int argc, char **argv)
+{
+	int fd;
+	const char *s;
+	int i;
+
+	fd = open("/dev/mem", O_RDWR);
+	if (fd < 0) {
+		perror("/dev/mem");
+		exit(1);
+	}
+
+	regs = mmap(NULL, 0x20000000, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
+	    0x40000000);
+	if (regs == MAP_FAILED) {
+		perror("mmap");
+		exit(1);
+	}
+
+	R(INTMSK) |= 1 << 22;	/* mask SPI0 */
+
+	fn(GPECON, 11);		/* GPE11 = MISO */
+	fn(GPECON, 12);		/* GPE12 = MOSI */
+	fn(GPECON, 13);		/* GPE13 = CLK */
+
+	R(CLKCON) |= 1 << 18;	/* enable clock to SPI subsystem */
+
+	R(SPPRE0) = 0x4f;	/* Dennis say's that's ~514kHz.
+				   I think it's 312.5kHz. My scope says it's
+				   about 317kHz. Close enough :) */
+	/* SPI clock = 50MHz/2/(SPPRE0+1) */
+
+	R(SPPIN0) =
+	    (SPPIN0_ENMUL_disable << SPPIN0_ENMUL) |
+	    (SPPIN0_SPICSn_deactivate << SPPIN0_SPICSn) | /* CSn is unused */
+	    (SPPIN0_KEEP_previous_level << SPPIN0_KEEP);
+
+	R(SPCON0) =
+	    (SPCON0_SMOD_polling << SPCON0_SMOD) |
+	    (SPCON0_ENSCK_enable << SPCON0_ENSCK) |
+	    (SPCON0_MSTR_master << SPCON0_MSTR) |
+	    (SPCON0_CPOL_active_high << SPCON0_CPOL) |
+	    (SPCON0_CPHA_format_b << SPCON0_CPHA) |
+	    (SPCON0_TAGD_normal_mode << SPCON0_TAGD);
+
+	/* duh. 2442 manual says this is what we have to do */
+	for (i = 0; i != 10; i++)
+		R(SPTDAT0) = 0xff;
+
+	for (s = argv[1]; *s; s++) {
+		while (((R(SPSTA0) >> SPSTA0_REDY) & 1) ==
+		    SPSTA0_REDY_not_ready);
+		R(SPTDAT0) = *s;
+	}
+
+	return 0;
+}




More information about the commitlog mailing list