altos: Split out SPI driver. Add Numonyx M25P driver for TT.
authorKeith Packard <keithp@keithp.com>
Tue, 2 Nov 2010 00:30:49 +0000 (17:30 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 2 Nov 2010 00:30:49 +0000 (17:30 -0700)
For TT (and TM with the companion connector), the SPI bus will be
shared among multiple devices. Split out the existing SPI code into a
common driver, with the SPI bus protected by a mutex.

Add the Numonyx M25Pxx driver to support the flash chips on TT and
newer TM versions. This is not yet integrated into the TM code.

Signed-off-by: Keith Packard <keithp@keithp.com>
13 files changed:
src/Makefile.proto
src/ao.h
src/ao_audio.c
src/ao_ee.c
src/ao_flash.c
src/ao_m25.c [new file with mode: 0644]
src/ao_pins.h
src/ao_spi.c [new file with mode: 0644]
src/ao_teleterra.c
src/telemetrum-v0.1-sirf/Makefile.defs
src/telemetrum-v0.1-sky/Makefile.defs
src/telemetrum-v1.0/Makefile.defs
src/teleterra-v0.1/Makefile.defs

index 1a59096941b90295279e810e37baf36bc3295f77..fe916a9de77ef5d2bda715e5f665e196f6d23ef8 100644 (file)
@@ -71,6 +71,12 @@ TELE_DRIVER_SRC = \
        ao_convert.c \
        ao_serial.c
 
+#
+# Spi bus driver
+#
+SPI_DRIVER_SRC = \
+       ao_spi.c
+
 #
 # Debug dongle driver (only on TI)
 #
@@ -152,6 +158,9 @@ TT_TASK_SRC = \
        ao_audio.c \
        ao_terraui.c
 
+TT_DRIVER_SRC = \
+       ao_m25.c
+
 #
 # All sources for TeleTerra
 #
@@ -162,6 +171,7 @@ TT_SRC = \
        $(TELE_DRIVER_SRC) \
        $(TELE_COMMON_SRC) \
        $(TT_MAIN_SRC) \
+       $(TT_DRIVER_SRC) \
        $(TT_TASK_SRC)
 
 #
index a3519150823a87763b441e25bd0ed57854397584..7750504f74be51ad182c628832e64755f826eb5d 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -478,6 +478,24 @@ ao_ee_read_config(uint8_t *buf, uint16_t len) __reentrant;
 void
 ao_ee_init(void);
 
+/*
+ * ao_m25.c
+ *
+ * Numonyx M25P family flash driver
+ */
+
+void
+ao_flash_erase_sector(uint8_t sector) __reentrant;
+
+void
+ao_flash_write_page(uint16_t page, __xdata uint8_t d[256]) __reentrant;
+
+void
+ao_flash_read_page(uint16_t page, __xdata uint8_t d[256]) __reentrant;
+
+void
+ao_flash_init(void);
+
 /*
  * ao_log.c
  */
@@ -747,6 +765,19 @@ void
 ao_serial_init(void);
 #endif
 
+/*
+ * ao_spi.c
+ */
+
+void
+ao_spi_send(void __xdata *block, uint16_t len) __reentrant;
+
+void
+ao_spi_recv(void __xdata *block, uint16_t len) __reentrant;
+
+void
+ao_spi_init(void);
+
 /*
  * ao_gps.c
  */
index 6b16089d664c63e501cb427ed08d0346e439ce1e..32a29a27f988b113cb296963513a2f9c0791989a 100644 (file)
@@ -277,298 +277,6 @@ __code uint8_t ao_audio_sound[] = {
         125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 123, 123, 122, 123, 122, 122,
         120, 122, 120, 120, 122, 122, 120, 122, 122, 122, 122, 122, 122, 122, 122, 123,
         123, 123, 123, 125, 125, 125, 125, 126, 126, 126, 126, 126, 128, 128, 128, 130,
-        130, 130, 130, 130, 131, 131, 131, 130, 131, 131, 131, 130, 130, 131, 131, 131,
-        131, 130, 130, 131, 131, 131, 133, 131, 133, 133, 131, 131, 131, 133, 131, 131,
-        131, 130, 130, 131, 131, 131, 131, 130, 131, 131, 130, 130, 130, 130, 130, 130,
-        130, 130, 128, 128, 126, 126, 125, 126, 126, 125, 125, 123, 125, 125, 125, 125,
-        125, 126, 126, 126, 126, 125, 125, 125, 126, 126, 126, 128, 128, 128, 128, 126,
-        126, 128, 130, 130, 130, 130, 130, 130, 133, 139, 140, 136, 133, 133, 131, 131,
-        130, 131, 133, 133, 134, 131, 128, 123, 125, 123, 122, 125, 126, 126, 125, 125,
-        125, 125, 123, 122, 120, 125, 128, 126, 126, 130, 134, 134, 128, 123, 125, 128,
-        130, 130, 128, 128, 128, 128, 125, 122, 122, 122, 122, 122, 122, 122, 117, 116,
-        116, 119, 119, 117, 117, 117, 120, 120, 120, 120, 122, 123, 125, 126, 126, 126,
-        126, 126, 128, 128, 130, 130, 130, 128, 128, 128, 130, 130, 130, 133, 131, 131,
-        131, 131, 131, 133, 133, 131, 131, 133, 133, 130, 128, 126, 128, 130, 130, 130,
-        130, 128, 128, 128, 128, 130, 130, 128, 130, 130, 130, 128, 128, 128, 128, 126,
-        126, 128, 128, 125, 125, 125, 125, 126, 123, 122, 122, 122, 123, 125, 123, 123,
-        123, 123, 123, 122, 123, 123, 122, 122, 122, 122, 125, 123, 123, 123, 122, 123,
-        122, 125, 125, 125, 123, 125, 126, 128, 126, 125, 126, 126, 126, 126, 126, 126,
-        126, 126, 128, 128, 128, 126, 128, 128, 130, 131, 130, 130, 130, 130, 131, 133,
-        131, 131, 130, 130, 130, 130, 128, 128, 128, 128, 130, 130, 128, 128, 130, 128,
-        128, 126, 128, 126, 125, 123, 125, 125, 125, 123, 123, 123, 123, 122, 122, 122,
-        123, 122, 119, 120, 120, 120, 117, 116, 117, 117, 116, 112, 112, 112, 111, 109,
-        108, 108, 106, 105, 106, 105, 105, 105, 105, 105, 108, 112, 116, 117, 122, 125,
-        128, 130, 133, 137, 142, 145, 147, 150, 151, 155, 156, 158, 161, 161, 161, 159,
-        159, 159, 158, 158, 156, 155, 155, 153, 150, 147, 145, 144, 144, 140, 139, 139,
-        137, 136, 134, 134, 131, 133, 133, 133, 133, 133, 133, 131, 130, 128, 126, 126,
-        123, 122, 120, 119, 117, 116, 114, 111, 109, 108, 105, 101,  98,  97,  94,  91,
-         86,  84,  83,  78,  73,  70,  73,  81,  83,  78,  83, 100, 108, 103, 105, 123,
-        137, 139, 142, 150, 167, 179, 178, 175, 183, 194, 194, 181, 173, 178, 181, 167,
-        153, 148, 147, 142, 123, 112, 109, 111, 100,  87,  86,  91,  92,  86,  81,  91,
-        100, 103, 103, 111, 125, 134, 137, 145, 158, 167, 175, 178, 184, 192, 197, 197,
-        198, 201, 200, 194, 189, 186, 179, 172, 159, 151, 144, 131, 120, 109, 100,  89,
-         80,  70,  64,  59,  52,  48,  47,  47,  47,  47,  47,  50,  55,  56,  58,  61,
-         69,  77,  78,  81,  91, 105, 111, 114, 119, 137, 150, 142, 148, 165, 173, 170,
-        173, 181, 192, 194, 187, 183, 187, 192, 183, 169, 162, 167, 162, 147, 136, 131,
-        131, 123, 111, 103, 105, 105,  98,  91,  91,  97,  98,  97,  97, 105, 112, 117,
-        120, 126, 144, 151, 142, 155, 181, 184, 176, 179, 192, 209, 204, 190, 198, 209,
-        204, 194, 179, 179, 184, 169, 150, 144, 140, 133, 116, 100,  94,  92,  81,  64,
-         56,  53,  55,  50,  41,  41,  47,  48,  47,  45,  45,  58,  67,  67,  67,  72,
-         81,  89,  91,  87,  97, 111, 122, 122, 123, 134, 145, 147, 151, 159, 162, 169,
-        176, 176, 176, 181, 184, 184, 183, 178, 176, 172, 165, 159, 151, 145, 140, 134,
-        125, 119, 112, 108, 105, 100,  97,  97,  97,  97,  97,  98, 101, 108, 112, 116,
-        123, 130, 142, 153, 155, 150, 170, 189, 186, 178, 183, 201, 209, 194, 184, 197,
-        200, 194, 179, 167, 170, 170, 151, 134, 130, 125, 119, 101,  84,  81,  81,  70,
-         55,  47,  47,  52,  45,  36,  39,  50,  52,  48,  48,  56,  70,  70,  69,  77,
-         87,  94,  95,  98, 106, 119, 123, 128, 136, 145, 151, 155, 161, 170, 169, 172,
-        181, 189, 189, 186, 189, 190, 187, 183, 178, 173, 169, 162, 156, 147, 139, 133,
-        123, 116, 109, 105, 100,  95,  91,  89,  89,  89,  91,  91,  94, 100, 105, 109,
-        116, 122, 131, 144, 151, 150, 158, 173, 181, 179, 176, 184, 197, 194, 183, 184,
-        189, 186, 178, 164, 158, 158, 147, 131, 119, 112, 108,  98,  81,  72,  70,  66,
-         56,  48,  44,  47,  48,  42,  41,  50,  55,  59,  61,  66,  77,  80,  81,  87,
-         97, 100, 101, 108, 117, 123, 128, 134, 142, 150, 151, 150, 159, 173, 170, 167,
-        176, 189, 189, 183, 183, 189, 190, 184, 178, 172, 169, 165, 156, 144, 139, 136,
-        130, 120, 111, 108, 106, 103,  97,  94,  95,  97,  97,  97,  98, 106, 112, 116,
-        120, 130, 137, 145, 150, 156, 165, 170, 175, 178, 181, 184, 189, 187, 187, 187,
-        183, 176, 172, 167, 161, 151, 145, 140, 130, 120, 112, 105,  97,  91,  84,  78,
-         72,  67,  62,  61,  59,  59,  59,  61,  64,  67,  69,  73,  78,  84,  84,  84,
-         91, 101, 101,  98, 100, 111, 120, 122, 120, 126, 140, 151, 144, 139, 159, 170,
-        164, 161, 172, 184, 184, 176, 176, 179, 183, 176, 167, 159, 158, 158, 144, 140,
-        128, 123, 116, 109, 105, 100,  94,  89,  87,  86,  87,  86,  86,  89,  95, 100,
-        106, 112, 120, 128, 134, 142, 151, 158, 164, 169, 178, 183, 183, 183, 186, 187,
-        186, 183, 178, 176, 172, 164, 155, 147, 142, 136, 126, 117, 111, 105,  95,  89,
-         81,  75,  69,  66,  64,  62,  62,  61,  62,  66,  72,  70,  73,  81,  86,  91,
-         91,  95, 103, 109, 111, 109, 116, 123, 130, 133, 133, 137, 148, 153, 147, 151,
-        164, 167, 165, 167, 175, 181, 179, 175, 175, 176, 178, 169, 159, 156, 155, 145,
-        136, 131, 128, 125, 117, 109, 106, 105, 100,  97,  95,  95,  95,  94,  97, 101,
-        105, 108, 112, 120, 128, 133, 137, 145, 151, 155, 159, 164, 170, 170, 172, 172,
-        173, 172, 170, 167, 164, 159, 155, 148, 140, 136, 130, 125, 119, 116, 111, 105,
-         98,  94,  89,  86,  81,  78,  78,  77,  78,  80,  81,  86,  87,  91,  95, 100,
-        103, 108, 112, 117, 122, 123, 126, 131, 133, 133, 133, 133, 131, 131, 131, 131,
-        130, 130, 130, 130, 128, 128, 126, 128, 128, 130, 130, 130, 130, 130, 133, 134,
-        136, 134, 137, 139, 140, 142, 144, 147, 148, 150, 151, 150, 151, 151, 151, 150,
-        150, 148, 147, 144, 140, 139, 137, 134, 133, 133, 130, 126, 125, 125, 125, 125,
-        123, 125, 125, 123, 125, 123, 123, 126, 128, 130, 131, 133, 133, 136, 136, 136,
-        137, 139, 139, 139, 139, 139, 139, 137, 136, 133, 131, 130, 126, 126, 125, 120,
-        119, 116, 114, 112, 109, 111, 109, 108, 106, 106, 105, 105, 103, 103, 105, 105,
-        105, 105, 106, 108, 109, 109, 111, 112, 116, 116, 117, 120, 123, 125, 128, 130,
-        131, 134, 136, 139, 142, 142, 142, 142, 144, 144, 144, 142, 144, 142, 140, 139,
-        139, 139, 139, 137, 136, 136, 136, 134, 131, 130, 130, 128, 126, 126, 128, 126,
-        125, 123, 123, 125, 126, 125, 125, 126, 126, 126, 126, 125, 126, 128, 128, 128,
-        128, 128, 130, 131, 131, 131, 133, 133, 133, 133, 131, 131, 131, 131, 131, 130,
-        130, 128, 130, 128, 126, 125, 123, 123, 122, 120, 119, 119, 117, 116, 112, 111,
-        111, 109, 111, 111, 112, 111, 112, 112, 114, 114, 114, 116, 119, 120, 122, 123,
-        125, 126, 128, 131, 133, 134, 136, 137, 137, 140, 140, 140, 140, 140, 142, 142,
-        142, 142, 140, 140, 139, 136, 137, 136, 136, 134, 133, 131, 130, 130, 130, 128,
-        128, 131, 134, 136, 134, 134, 134, 134, 133, 131, 128, 128, 128, 130, 133, 131,
-        131, 131, 133, 131, 130, 128, 125, 123, 125, 125, 123, 125, 125, 125, 126, 125,
-        125, 123, 123, 123, 123, 123, 123, 122, 122, 120, 119, 119, 117, 116, 114, 112,
-        112, 114, 114, 112, 111, 111, 112, 112, 112, 111, 112, 114, 114, 116, 116, 116,
-        116, 117, 119, 120, 122, 125, 128, 130, 133, 134, 136, 136, 137, 139, 139, 140,
-        142, 142, 142, 142, 140, 140, 140, 139, 137, 137, 136, 134, 134, 133, 134, 133,
-        133, 133, 133, 131, 133, 131, 137, 144, 139, 137, 140, 145, 144, 142, 139, 142,
-        144, 144, 145, 139, 137, 137, 137, 139, 134, 131, 130, 130, 133, 131, 126, 123,
-        122, 122, 123, 123, 119, 114, 114, 117, 119, 114, 109, 108, 109, 111, 108, 105,
-        100,  98,  98,  98,  97,  94,  91,  91,  94,  95,  92,  91,  97, 105, 109, 109,
-        114, 122, 130, 136, 142, 145, 148, 156, 164, 165, 167, 165, 167, 169, 167, 165,
-        159, 155, 151, 148, 142, 134, 128, 122, 120, 117, 112, 108, 105, 105, 108, 109,
-        108, 109, 112, 119, 123, 125, 130, 136, 140, 148, 155, 159, 162, 164, 167, 170,
-        167, 164, 164, 165, 165, 161, 156, 151, 147, 142, 139, 133, 128, 122, 119, 114,
-        109, 105, 100,  98,  94,  91,  87,  86,  84,  80,  78,  78,  77,  77,  75,  75,
-         75,  72,  72,  77,  77,  77,  78,  80,  86,  97, 109, 117, 119, 134, 159, 162,
-        153, 167, 187, 189, 186, 189, 198, 200, 194, 190, 189, 179, 172, 162, 151, 144,
-        133, 120, 112, 108, 103,  97,  91,  87,  87,  91,  95,  97, 100, 109, 122, 131,
-        134, 139, 151, 164, 170, 172, 175, 181, 184, 186, 187, 184, 178, 176, 176, 173,
-        165, 159, 158, 156, 151, 148, 144, 137, 137, 134, 133, 128, 120, 112, 111, 111,
-        103,  94,  87,  86,  83,  78,  70,  66,  62,  61,  62,  62,  59,  58,  62,  69,
-         69,  69,  75,  81,  86,  89,  92,  98, 108, 122, 133, 136, 144, 169, 175, 158,
-        165, 190, 186, 169, 172, 183, 181, 167, 164, 164, 155, 145, 139, 130, 122, 117,
-        109, 106, 103, 101,  98, 101,  98, 100, 106, 111, 117, 117, 126, 137, 145, 144,
-        147, 159, 167, 165, 164, 169, 173, 170, 164, 169, 169, 161, 159, 161, 158, 153,
-        153, 155, 153, 150, 148, 148, 147, 140, 137, 136, 131, 123, 114, 111, 108,  98,
-         89,  84,  80,  75,  69,  69,  67,  64,  64,  67,  70,  69,  73,  81,  89,  89,
-         87,  94, 101, 101,  97, 100, 108, 112, 123, 139, 136, 133, 161, 176, 158, 150,
-        178, 187, 169, 167, 183, 183, 170, 169, 173, 164, 155, 153, 145, 137, 134, 126,
-        119, 112, 111, 111, 111, 108, 106, 112, 119, 120, 119, 125, 137, 144, 147, 147,
-        150, 159, 164, 162, 162, 164, 161, 158, 158, 159, 155, 148, 151, 151, 147, 145,
-        147, 145, 144, 145, 144, 140, 137, 136, 134, 130, 123, 116, 109, 103,  98,  89,
-         83,  80,  72,  69,  67,  67,  67,  67,  69,  72,  73,  78,  83,  86,  92,  95,
-         95,  97, 100, 103, 103, 103, 105, 106, 106, 117, 130, 131, 130, 147, 167, 156,
-        145, 167, 183, 170, 164, 175, 179, 169, 167, 170, 161, 150, 148, 142, 131, 126,
-        122, 116, 112, 109, 108, 111, 111, 108, 112, 122, 126, 125, 128, 140, 148, 147,
-        147, 153, 158, 156, 153, 156, 170, 173, 145, 139, 164, 169, 150, 136, 139, 151,
-        150, 144, 150, 142, 133, 145, 150, 140, 134, 126, 128, 126, 119, 112, 108,  95,
-         89,  94,  94,  84,  69,  67,  80,  84,  75,  70,  78,  86,  89,  92,  95, 101,
-        100, 100, 108, 109, 101,  98, 106, 111, 108, 105, 119, 131, 133, 137, 158, 162,
-        145, 150, 179, 179, 161, 159, 176, 176, 164, 161, 162, 151, 142, 144, 134, 123,
-        119, 114, 109, 109, 105, 103, 105, 109, 111, 116, 122, 122, 122, 130, 142, 147,
-        142, 144, 155, 159, 145, 140, 155, 155, 140, 134, 140, 145, 136, 130, 142, 144,
-        134, 139, 147, 147, 145, 145, 148, 147, 142, 142, 137, 130, 123, 122, 117, 108,
-         97,  92,  97,  92,  84,  78,  81,  84,  83,  84,  87,  91,  91,  95, 105, 109,
-        108, 108, 108, 109, 109, 105, 103, 103, 105, 108, 109, 114, 125, 131, 136, 156,
-        165, 153, 158, 179, 184, 170, 169, 178, 176, 164, 162, 164, 147, 134, 137, 131,
-        119, 114, 111, 108, 109, 112, 111, 112, 114, 117, 125, 133, 133, 130, 134, 144,
-        148, 144, 145, 151, 151, 137, 140, 150, 145, 134, 131, 142, 148, 140, 139, 150,
-        148, 147, 151, 156, 155, 151, 150, 151, 148, 142, 139, 133, 123, 119, 119, 111,
-        103,  92,  87,  91,  87,  80,  77,  78,  81,  84,  86,  89,  94,  92,  95, 103,
-        106, 105, 103, 103, 103, 100,  94,  92,  92,  94,  94, 100, 112, 123, 126, 139,
-        162, 165, 153, 162, 184, 178, 161, 164, 175, 162, 150, 148, 145, 133, 126, 126,
-        117, 111, 111, 111, 111, 114, 116, 117, 120, 123, 128, 136, 140, 136, 131, 134,
-        140, 142, 137, 136, 142, 145, 136, 133, 144, 148, 140, 137, 147, 153, 151, 150,
-        159, 159, 155, 156, 159, 159, 155, 150, 147, 145, 142, 137, 131, 125, 120, 119,
-        116, 111, 103,  97,  98,  97,  91,  86,  87,  86,  89,  91,  95, 100,  97,  98,
-        101, 109, 109, 101,  95, 100, 103,  97,  91,  91,  95, 101, 109, 120, 130, 136,
-        156, 173, 165, 158, 173, 183, 164, 153, 162, 164, 147, 136, 139, 134, 125, 123,
-        120, 116, 117, 122, 117, 119, 125, 128, 128, 130, 130, 131, 134, 133, 126, 123,
-        125, 130, 130, 125, 125, 130, 137, 140, 139, 140, 148, 148, 150, 155, 158, 155,
-        151, 155, 155, 155, 150, 145, 145, 145, 145, 140, 133, 130, 131, 130, 126, 120,
-        114, 109, 106, 100,  94,  89,  84,  81,  81,  83,  86,  86,  86,  89,  94,  97,
-         97,  98, 101, 105, 103,  97,  95,  97,  94,  91,  91,  92, 100, 112, 128, 137,
-        144, 162, 178, 167, 161, 176, 181, 161, 150, 158, 156, 142, 139, 140, 133, 125,
-        128, 128, 120, 128, 130, 126, 130, 137, 139, 136, 134, 133, 134, 136, 134, 126,
-        122, 125, 128, 131, 131, 136, 139, 145, 156, 156, 153, 159, 161, 159, 161, 159,
-        158, 156, 153, 155, 153, 147, 145, 145, 145, 145, 139, 134, 136, 136, 133, 131,
-        122, 111, 105, 101,  97,  92,  86,  81,  81,  83,  86,  89,  91,  92,  95,  97,
-        100, 100, 100, 101,  97,  95,  92,  92,  94,  92,  92,  91,  97, 109, 125, 137,
-        142, 153, 172, 178, 167, 165, 172, 165, 151, 145, 148, 142, 128, 128, 130, 126,
-        126, 130, 128, 126, 131, 136, 133, 134, 137, 136, 131, 130, 128, 126, 125, 122,
-        116, 114, 119, 125, 125, 128, 134, 142, 155, 162, 158, 155, 158, 156, 156, 155,
-        153, 148, 144, 140, 144, 144, 139, 140, 139, 140, 142, 140, 137, 134, 133, 130,
-        125, 114, 106, 101,  97,  89,  84,  81,  80,  81,  84,  89,  94,  97,  97,  97,
-         98, 103, 101, 100, 101, 100,  94,  92,  94,  95,  94,  91,  97, 114, 134, 147,
-        153, 169, 183, 176, 164, 170, 176, 159, 145, 145, 144, 136, 131, 136, 136, 131,
-        133, 139, 140, 139, 144, 144, 142, 144, 142, 142, 136, 128, 120, 120, 120, 117,
-        112, 116, 120, 126, 131, 136, 140, 144, 147, 150, 164, 192, 190, 155, 140, 145,
-        147, 147, 145, 144, 137, 122, 122, 142, 151, 150, 148, 140, 139, 139, 137, 133,
-        125, 109,  98,  95,  83,  75,  78,  81,  83,  77,  75,  83,  92,  97, 101, 108,
-        103, 101,  98, 100, 103, 100,  92,  89,  83,  73,  75,  86,  97, 106, 119, 131,
-        147, 165, 189, 194, 176, 165, 162, 153, 145, 150, 145, 131, 120, 119, 122, 125,
-        133, 140, 139, 136, 140, 144, 145, 151, 150, 144, 136, 126, 120, 120, 122, 119,
-        114, 111, 116, 123, 130, 136, 145, 159, 170, 165, 156, 159, 161, 153, 147, 144,
-        142, 140, 136, 137, 142, 142, 140, 147, 148, 150, 151, 148, 145, 144, 137, 133,
-        128, 114, 103,  98,  92,  86,  84,  87,  91,  91,  91,  95, 105, 106, 108, 109,
-        111, 109, 109, 108, 105,  98,  91,  86,  86,  84,  83,  86,  92, 101, 116, 134,
-        151, 167, 184, 190, 179, 169, 165, 158, 144, 137, 136, 130, 120, 120, 123, 122,
-        125, 134, 140, 145, 148, 148, 144, 142, 140, 139, 136, 131, 120, 111, 106, 105,
-        103, 106, 114, 120, 126, 130, 134, 142, 147, 151, 155, 161, 175, 176, 153, 137,
-        131, 123, 119, 125, 133, 139, 137, 139, 144, 145, 147, 150, 153, 148, 140, 134,
-        123, 109,  98,  95,  95,  87,  80,  80,  84,  86,  89,  97, 108, 112, 111, 111,
-        112, 109, 103,  98,  97,  97,  94,  92,  89,  87,  84,  86,  91, 101, 112, 128,
-        142, 156, 170, 187, 197, 184, 173, 162, 148, 131, 126, 130, 131, 130, 130, 126,
-        125, 131, 142, 150, 155, 159, 158, 150, 144, 139, 134, 134, 130, 122, 116, 112,
-        108, 105, 108, 120, 130, 139, 147, 151, 153, 153, 161, 169, 165, 159, 153, 140,
-        126, 117, 119, 126, 134, 142, 150, 151, 148, 147, 148, 151, 155, 155, 148, 137,
-        123, 114, 105,  97,  94,  95,  95,  92,  94,  94,  95, 101, 105, 111, 116, 117,
-        116, 109, 105,  98,  94,  94,  95,  95,  92,  89,  86,  84,  84,  89,  98, 111,
-        123, 137, 151, 164, 176, 183, 176, 167, 156, 142, 128, 120, 122, 123, 125, 130,
-        131, 130, 133, 139, 142, 145, 151, 153, 147, 140, 134, 131, 128, 122, 116, 112,
-        112, 109, 108, 111, 117, 123, 131, 139, 147, 150, 151, 148, 145, 144, 140, 139,
-        147, 158, 150, 142, 139, 136, 130, 128, 133, 144, 153, 158, 164, 159, 150, 144,
-        134, 126, 123, 122, 116, 105,  95,  89,  89,  87,  91, 103, 116, 120, 120, 119,
-        116, 112, 108, 109, 112, 112, 108, 103,  97,  92,  91,  91,  94,  95,  97, 101,
-        106, 114, 123, 137, 151, 165, 181, 190, 186, 173, 161, 140, 126, 116, 116, 123,
-        130, 136, 134, 134, 134, 134, 134, 137, 145, 151, 151, 148, 144, 136, 123, 116,
-        111, 111, 116, 116, 117, 116, 116, 119, 122, 130, 137, 147, 153, 155, 159, 161,
-        153, 142, 137, 130, 122, 122, 123, 128, 134, 139, 144, 145, 145, 148, 147, 144,
-        144, 144, 137, 128, 120, 114, 105,  97,  92,  94,  97,  98, 103, 105, 109, 111,
-        111, 114, 116, 116, 116, 114, 109, 106, 100,  95,  95,  97,  97,  95,  95,  97,
-         97,  98, 101, 105, 112, 123, 134, 147, 161, 173, 176, 172, 165, 158, 144, 131,
-        128, 126, 128, 133, 137, 139, 137, 136, 134, 133, 133, 139, 142, 140, 142, 140,
-        139, 133, 125, 119, 116, 114, 116, 117, 122, 126, 130, 133, 136, 137, 142, 145,
-        148, 155, 164, 164, 156, 150, 140, 130, 123, 122, 128, 137, 144, 151, 155, 153,
-        153, 148, 140, 139, 139, 137, 133, 130, 123, 117, 106,  98,  95,  94,  97, 101,
-        106, 109, 109, 111, 112, 112, 111, 111, 109, 108, 108, 108, 103,  97,  94,  89,
-         84,  83,  86,  92,  98, 106, 116, 125, 136, 147, 159, 169, 175, 173, 169, 159,
-        147, 133, 125, 120, 119, 126, 130, 134, 137, 136, 131, 126, 126, 128, 130, 131,
-        136, 137, 136, 131, 125, 119, 112, 109, 108, 111, 117, 123, 128, 133, 137, 140,
-        139, 139, 144, 151, 158, 159, 161, 158, 147, 136, 131, 128, 128, 134, 142, 151,
-        156, 161, 156, 148, 142, 134, 128, 123, 120, 120, 120, 116, 111, 105,  98,  95,
-         94,  94,  97, 101, 109, 112, 114, 116, 109, 106, 101, 100,  98,  97,  97,  98,
-         98,  95,  94,  95,  98, 105, 112, 123, 134, 147, 158, 167, 169, 169, 167, 162,
-        155, 148, 142, 136, 136, 137, 137, 139, 139, 139, 136, 131, 128, 128, 130, 128,
-        131, 133, 133, 131, 128, 125, 120, 119, 117, 116, 119, 123, 126, 131, 136, 139,
-        144, 148, 155, 156, 159, 158, 158, 155, 145, 144, 139, 139, 140, 144, 147, 150,
-        150, 147, 145, 142, 137, 130, 123, 119, 117, 112, 108, 105, 101,  97,  92,  89,
-         89,  91,  91,  94,  97,  98, 100,  98, 100, 101, 100,  98,  95,  92,  89,  89,
-         87,  87,  91,  97, 103, 111, 119, 128, 139, 151, 159, 164, 165, 162, 158, 150,
-        144, 136, 134, 134, 137, 140, 142, 144, 142, 139, 134, 133, 128, 126, 126, 130,
-        131, 131, 131, 130, 128, 125, 122, 119, 119, 120, 123, 130, 139, 151, 158, 162,
-        164, 161, 156, 148, 144, 142, 142, 145, 151, 156, 159, 159, 155, 151, 147, 145,
-        140, 139, 139, 140, 139, 134, 130, 122, 114, 105,  97,  91,  87,  86,  87,  92,
-         95,  95,  94,  95,  94,  92,  92,  94,  98, 101, 105, 105, 105, 105, 100, 101,
-        103, 106, 112, 120, 130, 139, 150, 158, 162, 164, 162, 158, 151, 147, 142, 139,
-        137, 139, 140, 142, 142, 140, 137, 133, 131, 128, 125, 123, 123, 123, 125, 126,
-        126, 126, 123, 122, 120, 119, 119, 120, 128, 137, 145, 153, 159, 162, 162, 158,
-        151, 145, 140, 137, 139, 140, 145, 150, 153, 155, 153, 148, 142, 134, 130, 126,
-        122, 120, 117, 114, 112, 108, 103,  97,  91,  86,  80,  78,  77,  78,  80,  81,
-         83,  84,  86,  87,  89,  91,  91,  91,  94,  95, 100, 103, 108, 116, 122, 126,
-        133, 137, 145, 151, 158, 161, 164, 164, 161, 156, 151, 145, 140, 139, 137, 137,
-        137, 139, 139, 140, 140, 140, 137, 133, 131, 130, 128, 126, 128, 130, 133, 134,
-        136, 139, 140, 145, 148, 150, 153, 155, 156, 158, 158, 159, 161, 161, 161, 159,
-        158, 155, 151, 151, 150, 147, 144, 142, 139, 136, 131, 128, 123, 119, 114, 109,
-        105, 100,  98,  95,  92,  89,  87,  86,  84,  84,  83,  81,  81,  83,  84,  86,
-         87,  91,  94,  98, 100, 103, 108, 112, 117, 125, 134, 142, 148, 150, 148, 147,
-        144, 139, 134, 131, 131, 136, 142, 145, 151, 153, 151, 148, 142, 134, 128, 123,
-        120, 122, 126, 131, 136, 140, 144, 145, 144, 140, 136, 134, 133, 134, 137, 142,
-        145, 150, 151, 153, 151, 151, 148, 145, 144, 142, 142, 140, 142, 140, 140, 139,
-        136, 133, 130, 123, 119, 114, 111, 108, 105, 103, 100,  97,  95,  92,  91,  87,
-         86,  89,  89,  91,  92,  95,  97,  98, 101, 100, 103, 103, 106, 109, 111, 114,
-        119, 122, 125, 128, 130, 133, 133, 134, 136, 137, 137, 139, 140, 140, 140, 140,
-        140, 140, 140, 140, 142, 140, 142, 142, 142, 142, 144, 145, 147, 147, 147, 148,
-        148, 150, 151, 151, 153, 155, 156, 158, 158, 156, 155, 151, 150, 148, 147, 145,
-        144, 144, 144, 142, 140, 137, 136, 134, 131, 128, 125, 122, 120, 116, 114, 111,
-        109, 108, 105, 105, 103, 101, 100,  98,  97,  97,  97,  98, 100, 100, 101, 103,
-        105, 105, 105, 105, 105, 105, 105, 106, 109, 111, 111, 112, 114, 117, 119, 120,
-        119, 120, 120, 122, 122, 125, 126, 130, 133, 134, 137, 136, 136, 137, 137, 137,
-        137, 139, 139, 139, 139, 139, 137, 140, 140, 140, 139, 139, 139, 137, 140, 137,
-        139, 140, 140, 142, 140, 140, 139, 140, 139, 139, 137, 137, 137, 137, 137, 137,
-        137, 137, 137, 137, 136, 134, 133, 130, 128, 125, 123, 123, 123, 122, 120, 117,
-        116, 112, 112, 111, 109, 109, 108, 108, 108, 106, 106, 106, 108, 108, 106, 106,
-        106, 108, 109, 112, 114, 119, 122, 123, 125, 128, 130, 131, 133, 133, 134, 136,
-        140, 142, 145, 147, 147, 147, 145, 144, 142, 139, 137, 137, 139, 140, 139, 139,
-        139, 137, 136, 131, 128, 125, 123, 123, 123, 125, 126, 128, 130, 130, 130, 128,
-        126, 126, 130, 130, 131, 133, 133, 133, 133, 131, 130, 130, 128, 126, 126, 126,
-        126, 126, 125, 123, 120, 119, 116, 112, 111, 109, 109, 109, 111, 111, 111, 111,
-        111, 111, 112, 111, 111, 111, 111, 114, 114, 116, 119, 120, 122, 123, 123, 125,
-        126, 128, 130, 131, 133, 134, 134, 136, 136, 136, 134, 136, 136, 137, 139, 137,
-        139, 137, 139, 137, 137, 137, 136, 136, 136, 136, 134, 134, 136, 134, 136, 137,
-        137, 139, 137, 137, 136, 134, 133, 133, 131, 131, 131, 133, 133, 133, 134, 133,
-        134, 133, 133, 128, 128, 125, 123, 126, 125, 126, 126, 126, 125, 123, 123, 122,
-        120, 120, 120, 120, 120, 120, 122, 122, 122, 123, 122, 122, 122, 122, 122, 123,
-        125, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 130, 131, 131, 131, 131,
-        131, 131, 131, 133, 134, 134, 134, 134, 134, 133, 131, 131, 131, 133, 133, 133,
-        133, 134, 136, 134, 134, 131, 133, 131, 130, 130, 128, 130, 128, 128, 126, 125,
-        123, 122, 122, 120, 120, 122, 122, 122, 122, 120, 122, 120, 120, 119, 117, 117,
-        117, 117, 117, 117, 117, 119, 120, 119, 119, 117, 119, 120, 120, 120, 120, 120,
-        120, 122, 122, 122, 122, 122, 122, 122, 123, 125, 125, 126, 126, 125, 126, 126,
-        126, 126, 128, 128, 131, 131, 133, 133, 133, 133, 134, 137, 134, 137, 137, 137,
-        139, 137, 137, 137, 137, 137, 137, 139, 137, 137, 136, 136, 137, 136, 134, 134,
-        131, 130, 130, 131, 131, 131, 131, 131, 128, 128, 126, 125, 123, 125, 125, 125,
-        125, 126, 126, 126, 126, 126, 125, 125, 123, 122, 122, 122, 122, 122, 122, 122,
-        123, 123, 123, 122, 122, 122, 123, 123, 122, 122, 122, 123, 125, 126, 125, 128,
-        126, 126, 125, 123, 122, 122, 123, 125, 126, 128, 130, 131, 133, 133, 133, 131,
-        131, 131, 131, 131, 131, 131, 133, 131, 133, 133, 133, 131, 130, 128, 128, 130,
-        130, 131, 130, 130, 128, 128, 128, 126, 126, 126, 128, 128, 126, 126, 123, 123,
-        123, 123, 123, 123, 125, 125, 125, 125, 125, 123, 123, 123, 123, 123, 125, 125,
-        123, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 122,
-        123, 125, 125, 126, 126, 126, 126, 126, 128, 128, 130, 130, 130, 131, 131, 133,
-        134, 134, 134, 134, 134, 134, 136, 136, 137, 137, 137, 137, 136, 136, 136, 134,
-        134, 133, 131, 133, 133, 134, 134, 133, 133, 133, 133, 133, 133, 131, 128, 128,
-        128, 130, 128, 130, 131, 130, 130, 128, 126, 125, 125, 125, 123, 123, 123, 125,
-        125, 125, 125, 123, 123, 123, 125, 125, 125, 125, 125, 123, 123, 122, 122, 123,
-        123, 125, 123, 123, 122, 122, 120, 120, 120, 120, 122, 123, 125, 125, 126, 126,
-        125, 123, 123, 122, 123, 123, 123, 125, 126, 126, 128, 128, 128, 128, 128, 130,
-        130, 130, 126, 130, 128, 130, 130, 128, 131, 128, 128, 126, 126, 126, 130, 130,
-        130, 130, 128, 130, 130, 128, 128, 126, 126, 126, 126, 128, 126, 126, 125, 125,
-        125, 126, 125, 125, 125, 125, 125, 123, 123, 123, 125, 126, 126, 126, 126, 128,
-        128, 126, 125, 125, 125, 123, 125, 125, 125, 126, 126, 126, 128, 126, 126, 126,
-        126, 126, 126, 128, 128, 131, 131, 131, 131, 131, 133, 131, 131, 131, 131, 133,
-        133, 134, 133, 134, 134, 134, 134, 133, 134, 136, 136, 136, 136, 134, 134, 134,
-        133, 133, 131, 133, 133, 131, 133, 130, 130, 130, 130, 131, 130, 128, 126, 126,
-        126, 126, 126, 126, 128, 126, 125, 125, 123, 123, 123, 123, 125, 125, 123, 123,
-        122, 120, 122, 123, 122, 123, 123, 125, 125, 125, 123, 123, 123, 123, 123, 123,
-        123, 123, 123, 123, 125, 123, 125, 123, 125, 125, 123, 123, 123, 125, 125, 125,
-        125, 254,
 };
 
 #define nop()  _asm nop _endasm;
index 26cfb7fd4cb6a13451a20a529473d0213160c61b..a67ca12da18dc86a9e052f2b09d4434dc70be88d 100644 (file)
 #define EE_CS          P1_2
 #define EE_CS_INDEX    2
 
-__xdata uint8_t ao_ee_dma_in_done;
-__xdata uint8_t ao_ee_dma_out_done;
 __xdata uint8_t ao_ee_mutex;
 
-uint8_t        ao_ee_dma_out_id;
-uint8_t ao_ee_dma_in_id;
-
-static __xdata uint8_t ao_ee_const = 0xff;
-
 #define ao_ee_delay() do { \
        _asm nop _endasm; \
        _asm nop _endasm; \
@@ -54,82 +47,6 @@ void ao_ee_cs_high(void)
        ao_ee_delay();
 }
 
-/* Send bytes over SPI.
- *
- * This sets up two DMA engines, one writing the data and another reading
- * bytes coming back.  We use the bytes coming back to tell when the transfer
- * is complete, as the transmit register is double buffered and hence signals
- * completion one byte before the transfer is actually complete
- */
-static void
-ao_ee_send(void __xdata *block, uint16_t len)
-{
-       ao_dma_set_transfer(ao_ee_dma_in_id,
-                           &U0DBUFXADDR,
-                           &ao_ee_const,
-                           len,
-                           DMA_CFG0_WORDSIZE_8 |
-                           DMA_CFG0_TMODE_SINGLE |
-                           DMA_CFG0_TRIGGER_URX0,
-                           DMA_CFG1_SRCINC_0 |
-                           DMA_CFG1_DESTINC_0 |
-                           DMA_CFG1_PRIORITY_NORMAL);
-
-       ao_dma_set_transfer(ao_ee_dma_out_id,
-                           block,
-                           &U0DBUFXADDR,
-                           len,
-                           DMA_CFG0_WORDSIZE_8 |
-                           DMA_CFG0_TMODE_SINGLE |
-                           DMA_CFG0_TRIGGER_UTX0,
-                           DMA_CFG1_SRCINC_1 |
-                           DMA_CFG1_DESTINC_0 |
-                           DMA_CFG1_PRIORITY_NORMAL);
-
-       ao_dma_start(ao_ee_dma_in_id);
-       ao_dma_start(ao_ee_dma_out_id);
-       ao_dma_trigger(ao_ee_dma_out_id);
-       __critical while (!ao_ee_dma_in_done)
-               ao_sleep(&ao_ee_dma_in_done);
-}
-
-/* Receive bytes over SPI.
- *
- * This sets up tow DMA engines, one reading the data and another
- * writing constant values to the SPI transmitter as that is what
- * clocks the data coming in.
- */
-static void
-ao_ee_recv(void __xdata *block, uint16_t len)
-{
-       ao_dma_set_transfer(ao_ee_dma_in_id,
-                           &U0DBUFXADDR,
-                           block,
-                           len,
-                           DMA_CFG0_WORDSIZE_8 |
-                           DMA_CFG0_TMODE_SINGLE |
-                           DMA_CFG0_TRIGGER_URX0,
-                           DMA_CFG1_SRCINC_0 |
-                           DMA_CFG1_DESTINC_1 |
-                           DMA_CFG1_PRIORITY_NORMAL);
-
-       ao_dma_set_transfer(ao_ee_dma_out_id,
-                           &ao_ee_const,
-                           &U0DBUFXADDR,
-                           len,
-                           DMA_CFG0_WORDSIZE_8 |
-                           DMA_CFG0_TMODE_SINGLE |
-                           DMA_CFG0_TRIGGER_UTX0,
-                           DMA_CFG1_SRCINC_0 |
-                           DMA_CFG1_DESTINC_0 |
-                           DMA_CFG1_PRIORITY_NORMAL);
-
-       ao_dma_start(ao_ee_dma_in_id);
-       ao_dma_start(ao_ee_dma_out_id);
-       ao_dma_trigger(ao_ee_dma_out_id);
-       __critical while (!ao_ee_dma_in_done)
-               ao_sleep(&ao_ee_dma_in_done);
-}
 
 #define EE_BLOCK       256
 
@@ -143,7 +60,7 @@ ao_ee_write_enable(void)
 {
        ao_ee_cs_low();
        ao_ee_instruction.instruction = EE_WREN;
-       ao_ee_send(&ao_ee_instruction, 1);
+       ao_spi_send(&ao_ee_instruction, 1);
        ao_ee_cs_high();
 }
 
@@ -152,8 +69,8 @@ ao_ee_rdsr(void)
 {
        ao_ee_cs_low();
        ao_ee_instruction.instruction = EE_RDSR;
-       ao_ee_send(&ao_ee_instruction, 1);
-       ao_ee_recv(&ao_ee_instruction, 1);
+       ao_spi_send(&ao_ee_instruction, 1);
+       ao_spi_recv(&ao_ee_instruction, 1);
        ao_ee_cs_high();
        return ao_ee_instruction.instruction;
 }
@@ -164,7 +81,7 @@ ao_ee_wrsr(uint8_t status)
        ao_ee_cs_low();
        ao_ee_instruction.instruction = EE_WRSR;
        ao_ee_instruction.address[0] = status;
-       ao_ee_send(&ao_ee_instruction, 2);
+       ao_spi_send(&ao_ee_instruction, 2);
        ao_ee_cs_high();
 }
 
@@ -191,8 +108,8 @@ ao_ee_write_block(void)
        ao_ee_instruction.address[0] = ao_ee_block >> 8;
        ao_ee_instruction.address[1] = ao_ee_block;
        ao_ee_instruction.address[2] = 0;
-       ao_ee_send(&ao_ee_instruction, 4);
-       ao_ee_send(ao_ee_data, EE_BLOCK);
+       ao_spi_send(&ao_ee_instruction, 4);
+       ao_spi_send(ao_ee_data, EE_BLOCK);
        ao_ee_cs_high();
        for (;;) {
                uint8_t status = ao_ee_rdsr();
@@ -210,8 +127,8 @@ ao_ee_read_block(void)
        ao_ee_instruction.address[0] = ao_ee_block >> 8;
        ao_ee_instruction.address[1] = ao_ee_block;
        ao_ee_instruction.address[2] = 0;
-       ao_ee_send(&ao_ee_instruction, 4);
-       ao_ee_recv(ao_ee_data, EE_BLOCK);
+       ao_spi_send(&ao_ee_instruction, 4);
+       ao_spi_recv(ao_ee_data, EE_BLOCK);
        ao_ee_cs_high();
 }
 
@@ -423,39 +340,6 @@ ao_ee_init(void)
        P1DIR |= (1 << EE_CS_INDEX);
        P1SEL &= ~(1 << EE_CS_INDEX);
 
-       /* Set up the USART pin assignment */
-       PERCFG = (PERCFG & ~PERCFG_U0CFG_ALT_MASK) | PERCFG_U0CFG_ALT_2;
-
-       /* Ensure that USART0 takes precidence over USART1 for pins that
-        * they share
-        */
-       P2SEL = (P2SEL & ~P2SEL_PRI3P1_MASK) | P2SEL_PRI3P1_USART0;
-
-       /* Make the SPI pins be controlled by the USART peripheral */
-       P1SEL |= ((1 << 5) | (1 << 4) | (1 << 3));
-
-       /* Set up OUT DMA */
-       ao_ee_dma_out_id = ao_dma_alloc(&ao_ee_dma_out_done);
-
-       /* Set up IN DMA */
-       ao_ee_dma_in_id = ao_dma_alloc(&ao_ee_dma_in_done);
-
-       /* Set up the USART.
-        *
-        * SPI master mode
-        */
-       U0CSR = (UxCSR_MODE_SPI | UxCSR_RE | UxCSR_MASTER);
-
-       /* Set the baud rate and signal parameters
-        *
-        * The cc1111 is limited to a 24/8 MHz SPI clock,
-        * while the 25LC1024 is limited to 20MHz. So,
-        * use the 3MHz clock (BAUD_E 17, BAUD_M 0)
-        */
-       U0BAUD = 0;
-       U0GCR = (UxGCR_CPOL_NEGATIVE |
-                UxGCR_CPHA_FIRST_EDGE |
-                UxGCR_ORDER_MSB |
-                (17 << UxGCR_BAUD_E_SHIFT));
+       ao_spi_init();
        ao_cmd_register(&ao_ee_cmds[0]);
 }
index 638e51e0ce7bc932e43b8c12cd5e81a332c97117..c3f45ee32c79e9d3e5abb6b8bfd6ba62823e1c93 100644 (file)
 #include "ao.h"
 #include "at45db161d.h"
 
-/*
- * Using SPI on USART 0, with P1_1 as the chip select
- */
-
 #define FLASH_CS               P1_1
 #define FLASH_CS_INDEX         1
 
-__xdata uint8_t ao_flash_dma_in_done;
-__xdata uint8_t ao_flash_dma_out_done;
 __xdata uint8_t ao_flash_mutex;
 
-uint8_t        ao_flash_dma_out_id;
-uint8_t ao_flash_dma_in_id;
-
-static __xdata uint8_t ao_flash_const = 0xff;
-
 #define ao_flash_delay() do { \
        _asm nop _endasm; \
        _asm nop _endasm; \
@@ -54,83 +43,6 @@ void ao_flash_cs_high(void)
        ao_flash_delay();
 }
 
-/* Send bytes over SPI.
- *
- * This sets up two DMA engines, one writing the data and another reading
- * bytes coming back.  We use the bytes coming back to tell when the transfer
- * is complete, as the transmit register is double buffered and hence signals
- * completion one byte before the transfer is actually complete
- */
-static void
-ao_flash_send(void __xdata *block, uint16_t len)
-{
-       ao_dma_set_transfer(ao_flash_dma_in_id,
-                           &U0DBUFXADDR,
-                           &ao_flash_const,
-                           len,
-                           DMA_CFG0_WORDSIZE_8 |
-                           DMA_CFG0_TMODE_SINGLE |
-                           DMA_CFG0_TRIGGER_URX0,
-                           DMA_CFG1_SRCINC_0 |
-                           DMA_CFG1_DESTINC_0 |
-                           DMA_CFG1_PRIORITY_NORMAL);
-
-       ao_dma_set_transfer(ao_flash_dma_out_id,
-                           block,
-                           &U0DBUFXADDR,
-                           len,
-                           DMA_CFG0_WORDSIZE_8 |
-                           DMA_CFG0_TMODE_SINGLE |
-                           DMA_CFG0_TRIGGER_UTX0,
-                           DMA_CFG1_SRCINC_1 |
-                           DMA_CFG1_DESTINC_0 |
-                           DMA_CFG1_PRIORITY_NORMAL);
-
-       ao_dma_start(ao_flash_dma_in_id);
-       ao_dma_start(ao_flash_dma_out_id);
-       ao_dma_trigger(ao_flash_dma_out_id);
-       __critical while (!ao_flash_dma_in_done)
-               ao_sleep(&ao_flash_dma_in_done);
-}
-
-/* Receive bytes over SPI.
- *
- * This sets up tow DMA engines, one reading the data and another
- * writing constant values to the SPI transmitter as that is what
- * clocks the data coming in.
- */
-static void
-ao_flash_recv(void __xdata *block, uint16_t len)
-{
-       ao_dma_set_transfer(ao_flash_dma_in_id,
-                           &U0DBUFXADDR,
-                           block,
-                           len,
-                           DMA_CFG0_WORDSIZE_8 |
-                           DMA_CFG0_TMODE_SINGLE |
-                           DMA_CFG0_TRIGGER_URX0,
-                           DMA_CFG1_SRCINC_0 |
-                           DMA_CFG1_DESTINC_1 |
-                           DMA_CFG1_PRIORITY_NORMAL);
-
-       ao_dma_set_transfer(ao_flash_dma_out_id,
-                           &ao_flash_const,
-                           &U0DBUFXADDR,
-                           len,
-                           DMA_CFG0_WORDSIZE_8 |
-                           DMA_CFG0_TMODE_SINGLE |
-                           DMA_CFG0_TRIGGER_UTX0,
-                           DMA_CFG1_SRCINC_0 |
-                           DMA_CFG1_DESTINC_0 |
-                           DMA_CFG1_PRIORITY_NORMAL);
-
-       ao_dma_start(ao_flash_dma_in_id);
-       ao_dma_start(ao_flash_dma_out_id);
-       ao_dma_trigger(ao_flash_dma_out_id);
-       __critical while (!ao_flash_dma_in_done)
-               ao_sleep(&ao_flash_dma_in_done);
-}
-
 struct ao_flash_instruction {
        uint8_t instruction;
        uint8_t address[3];
@@ -144,7 +56,7 @@ ao_flash_set_pagesize_512(void)
        ao_flash_instruction.address[0] = FLASH_SET_512_BYTE_0;
        ao_flash_instruction.address[1] = FLASH_SET_512_BYTE_1;
        ao_flash_instruction.address[2] = FLASH_SET_512_BYTE_2;
-       ao_flash_send(&ao_flash_instruction, 4);
+       ao_spi_send(&ao_flash_instruction, 4);
        ao_flash_cs_high();
 }
 
@@ -154,8 +66,8 @@ ao_flash_read_status(void)
 {
        ao_flash_cs_low();
        ao_flash_instruction.instruction = FLASH_READ_STATUS;
-       ao_flash_send(&ao_flash_instruction, 1);
-       ao_flash_recv(&ao_flash_instruction, 1);
+       ao_spi_send(&ao_flash_instruction, 1);
+       ao_spi_recv(&ao_flash_instruction, 1);
        ao_flash_cs_high();
        return ao_flash_instruction.instruction;
 }
@@ -268,8 +180,8 @@ ao_flash_write_block(void)
        ao_flash_instruction.address[0] = ao_flash_block >> (16 - ao_flash_block_shift);
        ao_flash_instruction.address[1] = ao_flash_block << (ao_flash_block_shift - 8);
        ao_flash_instruction.address[2] = 0;
-       ao_flash_send(&ao_flash_instruction, 4);
-       ao_flash_send(ao_flash_data, FLASH_BLOCK_SIZE);
+       ao_spi_send(&ao_flash_instruction, 4);
+       ao_spi_send(ao_flash_data, FLASH_BLOCK_SIZE);
        ao_flash_cs_high();
        ao_flash_write_pending = 1;
 }
@@ -286,8 +198,8 @@ ao_flash_read_block(void)
        ao_flash_instruction.address[0] = ao_flash_block >> (16 - ao_flash_block_shift);
        ao_flash_instruction.address[1] = ao_flash_block << (ao_flash_block_shift - 8);
        ao_flash_instruction.address[2] = 0;
-       ao_flash_send(&ao_flash_instruction, 4);
-       ao_flash_recv(ao_flash_data, FLASH_BLOCK_SIZE);
+       ao_spi_send(&ao_flash_instruction, 4);
+       ao_spi_recv(ao_flash_data, FLASH_BLOCK_SIZE);
        ao_flash_cs_high();
 }
 
@@ -544,39 +456,6 @@ ao_ee_init(void)
        P1DIR |= (1 << FLASH_CS_INDEX);
        P1SEL &= ~(1 << FLASH_CS_INDEX);
 
-       /* Set up the USART pin assignment */
-       PERCFG = (PERCFG & ~PERCFG_U0CFG_ALT_MASK) | PERCFG_U0CFG_ALT_2;
-
-       /* Ensure that USART0 takes precidence over USART1 for pins that
-        * they share
-        */
-       P2SEL = (P2SEL & ~P2SEL_PRI3P1_MASK) | P2SEL_PRI3P1_USART0;
-
-       /* Make the SPI pins be controlled by the USART peripheral */
-       P1SEL |= ((1 << 5) | (1 << 4) | (1 << 3));
-
-       /* Set up OUT DMA */
-       ao_flash_dma_out_id = ao_dma_alloc(&ao_flash_dma_out_done);
-
-       /* Set up IN DMA */
-       ao_flash_dma_in_id = ao_dma_alloc(&ao_flash_dma_in_done);
-
-       /* Set up the USART.
-        *
-        * SPI master mode
-        */
-       U0CSR = (UxCSR_MODE_SPI | UxCSR_RE | UxCSR_MASTER);
-
-       /* Set the baud rate and signal parameters
-        *
-        * The cc1111 is limited to a 24/8 MHz SPI clock,
-        * while the at45db161d.h is limited to 20MHz. So,
-        * use the 3MHz clock (BAUD_E 17, BAUD_M 0)
-        */
-       U0BAUD = 0;
-       U0GCR = (UxGCR_CPOL_NEGATIVE |
-                UxGCR_CPHA_FIRST_EDGE |
-                UxGCR_ORDER_MSB |
-                (17 << UxGCR_BAUD_E_SHIFT));
+       ao_spi_init();
        ao_cmd_register(&ao_flash_cmds[0]);
 }
diff --git a/src/ao_m25.c b/src/ao_m25.c
new file mode 100644 (file)
index 0000000..f0208a3
--- /dev/null
@@ -0,0 +1,360 @@
+/*
+ * Copyright © 2010 Keith Packard <keithp@keithp.com>
+ *
+ * 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; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao.h"
+
+/*
+ * Each flash chip is arranged in 64kB sectors; the
+ * chip cannot erase in units smaller than that.
+ *
+ * Writing happens in units of 256 byte pages and
+ * can only change bits from 1 to 0. So, you can rewrite
+ * the same contents, or append to an existing page easily enough
+ */
+
+#define M25_WREN       0x06    /* Write Enable */
+#define M25_WRDI       0x04    /* Write Disable */
+#define M25_RDID       0x9f    /* Read Identification */
+#define M25_RDSR       0x05    /* Read Status Register */
+#define M25_WRSR       0x01    /* Write Status Register */
+#define M25_READ       0x03    /* Read Data Bytes */
+#define M25_FAST_READ  0x0b    /* Read Data Bytes at Higher Speed */
+#define M25_PP         0x02    /* Page Program */
+#define M25_SE         0xd8    /* Sector Erase */
+#define M25_BE         0xc7    /* Bulk Erase */
+#define M25_DP         0xb9    /* Deep Power-down */
+
+/* RDID response */
+#define M25_MANUF_OFFSET       0
+#define M25_MEMORY_TYPE_OFFSET 1
+#define M25_CAPACITY_OFFSET    2
+#define M25_UID_OFFSET         3
+#define M25_CFI_OFFSET         4
+#define M25_RDID_LEN           4       /* that's all we need */
+
+#define M25_CAPACITY_128KB     0x11
+#define M25_CAPACITY_256KB     0x12
+#define M25_CAPACITY_512KB     0x13
+#define M25_CAPACITY_1MB       0x14
+#define M25_CAPACITY_2MB       0x15
+
+/*
+ * Status register bits
+ */
+
+#define M25_STATUS_SRWD                (1 << 7)        /* Status register write disable */
+#define M25_STATUS_BP_MASK     (7 << 2)        /* Block protect bits */
+#define M25_STATUS_BP_SHIFT    (2)
+#define M25_STATUS_WEL         (1 << 1)        /* Write enable latch */
+#define M25_STATUS_WIP         (1 << 0)        /* Write in progress */
+
+/*
+ * On teleterra, the m25 chip select pins are
+ * wired on P0_0 through P0_3.
+ */
+
+#define AO_M25_MAX_CHIPS       4
+
+static uint8_t ao_m25_size[AO_M25_MAX_CHIPS];  /* number of sectors in each chip */
+static uint8_t ao_m25_pin[AO_M25_MAX_CHIPS];   /* chip select pin for each chip */
+static uint8_t ao_m25_numchips;                        /* number of chips detected */
+static uint8_t ao_m25_total;                   /* total sectors available */
+static uint8_t ao_m25_wip;                     /* write in progress */
+
+static __xdata uint8_t ao_m25_mutex;
+
+/*
+ * This little array is abused to send and receive data. A particular
+ * caution -- the read and write addresses are written into the last
+ * three bytes of the array by ao_m25_set_page_address and then the
+ * first byte is used by ao_m25_wait_wip and ao_m25_write_enable, neither
+ * of which touch those last three bytes.
+ */
+
+static __xdata uint8_t ao_m25_instruction[4];
+
+#define AO_M25_SELECT(cs)              (SPI_CS_PORT &= ~(cs))
+#define AO_M25_DESELECT(cs)            (SPI_CS_PORT |= (cs))
+#define AO_M25_PAGE_TO_SECTOR(page)    ((page) >> 8)
+#define AO_M25_SECTOR_TO_PAGE(sector)  (((uint16_t) (sector)) << 8)
+
+/*
+ * Block until the specified chip is done writing
+ */
+static void
+ao_m25_wait_wip(uint8_t cs)
+{
+       if (ao_m25_wip & cs) {
+               AO_M25_SELECT(cs);
+               ao_m25_instruction[0] = M25_RDSR;
+               ao_spi_send(ao_m25_instruction, 1);
+               do {
+                       ao_spi_recv(ao_m25_instruction, 1);
+               } while (ao_m25_instruction[0] & M25_STATUS_WIP);
+               AO_M25_DESELECT(cs);
+               ao_m25_wip &= ~cs;
+       }
+}
+
+/*
+ * Set the write enable latch so that page program and sector
+ * erase commands will work. Also mark the chip as busy writing
+ * so that future operations will block until the WIP bit goes off
+ */
+static void
+ao_m25_write_enable(uint8_t cs)
+{
+       AO_M25_SELECT(cs);
+       ao_m25_instruction[0] = M25_WREN;
+       ao_spi_send(&ao_m25_instruction, 1);
+       AO_M25_DESELECT(cs);
+       ao_m25_wip |= cs;
+}
+
+
+/*
+ * Returns the number of 64kB sectors
+ */
+static uint8_t
+ao_m25_read_capacity(uint8_t cs)
+{
+       uint8_t capacity;
+       AO_M25_SELECT(cs);
+       ao_m25_instruction[0] = M25_RDID;
+       ao_spi_send(ao_m25_instruction, 1);
+       ao_spi_recv(ao_m25_instruction, M25_RDID_LEN);
+       AO_M25_DESELECT(cs);
+
+       /* Check to see if the chip is present */
+       if (ao_m25_instruction[0] == 0xff)
+               return 0;
+       capacity = ao_m25_instruction[M25_CAPACITY_OFFSET];
+
+       /* Sanity check capacity number */
+       if (capacity < 0x11 || 0x1f < capacity)
+               return 0;
+       return 1 << (capacity - 0x10);
+}
+
+static uint8_t
+ao_m25_set_page_address(uint16_t page)
+{
+       uint8_t chip, size;
+
+       for (chip = 0; chip < ao_m25_numchips; chip++) {
+               size = ao_m25_size[chip];
+               if (AO_M25_PAGE_TO_SECTOR(page) < size)
+                       break;
+               page -= AO_M25_SECTOR_TO_PAGE(size);
+       }
+       if (chip == ao_m25_numchips)
+               ao_panic(AO_PANIC_EE);
+
+       chip = ao_m25_pin[chip];
+       ao_m25_wait_wip(chip);
+
+       ao_m25_instruction[1] = page >> 8;
+       ao_m25_instruction[2] = page;
+       ao_m25_instruction[3] = 0;
+       return chip;
+}
+
+/*
+ * Erase the specified sector
+ */
+void
+ao_flash_erase_sector(uint8_t sector) __reentrant
+{
+       uint8_t cs;
+       uint16_t page = AO_M25_SECTOR_TO_PAGE(sector);
+
+       ao_mutex_get(&ao_m25_mutex);
+
+       cs = ao_m25_set_page_address(page);
+       ao_m25_wait_wip(cs);
+       ao_m25_write_enable(cs);
+
+       ao_m25_instruction[0] = M25_SE;
+       AO_M25_SELECT(cs);
+       ao_spi_send(ao_m25_instruction, 4);
+       AO_M25_DESELECT(cs);
+       ao_m25_wip |= cs;
+
+       ao_mutex_put(&ao_m25_mutex);
+}
+
+/*
+ * Write one page
+ */
+void
+ao_flash_write_page(uint16_t page, uint8_t __xdata *d) __reentrant
+{
+       uint8_t cs;
+
+       ao_mutex_get(&ao_m25_mutex);
+
+       cs = ao_m25_set_page_address(page);
+       ao_m25_write_enable(cs);
+
+       ao_m25_instruction[0] = M25_PP;
+       AO_M25_SELECT(cs);
+       ao_spi_send(ao_m25_instruction, 4);
+       ao_spi_send(d, 256);
+       AO_M25_DESELECT(cs);
+
+       ao_mutex_put(&ao_m25_mutex);
+}
+
+/*
+ * Read one page
+ */
+void
+ao_flash_read_page(uint16_t page, __xdata uint8_t *d) __reentrant
+{
+       uint8_t cs;
+
+       ao_mutex_get(&ao_m25_mutex);
+
+       cs = ao_m25_set_page_address(page);
+
+       /* No need to use the FAST_READ as we're running at only 8MHz */
+       ao_m25_instruction[0] = M25_READ;
+       AO_M25_SELECT(cs);
+       ao_spi_send(ao_m25_instruction, 4);
+       ao_spi_recv(d, 256);
+       AO_M25_DESELECT(cs);
+
+       ao_mutex_put(&ao_m25_mutex);
+}
+
+static __xdata uint8_t ao_flash_block[256];
+
+static void
+ao_flash_dump(void) __reentrant
+{
+       uint8_t i;
+
+       ao_cmd_hex();
+       if (ao_cmd_status != ao_cmd_success)
+               return;
+       ao_flash_read_page(ao_cmd_lex_i, ao_flash_block);
+       i = 0;
+       do {
+               if ((i & 7) == 0) {
+                       if (i)
+                               putchar('\n');
+                       ao_cmd_put16((uint16_t) i);
+               }
+               putchar(' ');
+               ao_cmd_put8(ao_flash_block[i]);
+               ++i;
+       } while (i != 0);
+       putchar('\n');
+}
+
+static void
+ao_flash_store(void) __reentrant
+{
+       uint16_t block;
+       uint8_t i;
+       uint16_t len;
+       uint8_t b;
+
+       ao_cmd_hex();
+       block = ao_cmd_lex_i;
+       ao_cmd_hex();
+       i = ao_cmd_lex_i;
+       ao_cmd_hex();
+       len = ao_cmd_lex_i;
+       if (ao_cmd_status != ao_cmd_success)
+               return;
+       ao_flash_read_page(block, ao_flash_block);
+       while (len--) {
+               ao_cmd_hex();
+               if (ao_cmd_status != ao_cmd_success)
+                       return;
+               b = ao_cmd_lex_i;
+               ao_flash_block[i] = ao_cmd_lex_i;
+               i++;
+       }
+       ao_flash_write_page(block, ao_flash_block);
+}
+
+static void
+ao_flash_info(void) __reentrant
+{
+       uint8_t chip, cs;
+
+       printf ("Detected chips %d size %d\n", ao_m25_numchips, ao_m25_total);
+       for (chip = 0; chip < ao_m25_numchips; chip++)
+               printf ("Flash chip %d select %02x size %d manf %02x type %02x cap %02x uid %02x\n",
+                       chip, ao_m25_pin[chip], ao_m25_size[chip]);
+
+       printf ("Available chips:\n");
+       for (cs = 1; cs != 0; cs <<= 1) {
+               if ((M25_CS_MASK & cs) == 0)
+                       continue;
+
+               ao_mutex_get(&ao_m25_mutex);
+               AO_M25_SELECT(cs);
+               ao_m25_instruction[0] = M25_RDID;
+               ao_spi_send(ao_m25_instruction, 1);
+               ao_spi_recv(ao_m25_instruction, M25_RDID_LEN);
+               AO_M25_DESELECT(cs);
+
+               printf ("Select %02x manf %02x type %02x cap %02x uid %02x\n",
+                       cs,
+                       ao_m25_instruction[M25_MANUF_OFFSET],
+                       ao_m25_instruction[M25_MEMORY_TYPE_OFFSET],
+                       ao_m25_instruction[M25_CAPACITY_OFFSET],
+                       ao_m25_instruction[M25_UID_OFFSET]);
+               ao_mutex_put(&ao_m25_mutex);
+       }
+}
+
+__code struct ao_cmds ao_flash_cmds[] = {
+       { 'e', ao_flash_dump,   "e <block>                          Dump a block of EEPROM data" },
+       { 'w', ao_flash_store,  "w <block> <start> <len> <data> ... Write data to EEPROM" },
+       { 'F', ao_flash_info,   "F                                  Display flash info" },
+       { 0,   ao_flash_store, NULL },
+};
+
+void
+ao_flash_init(void)
+{
+       uint8_t pin, size;
+
+       /* Set up chip select wires */
+       SPI_CS_PORT |= M25_CS_MASK;     /* raise all CS pins */
+       SPI_CS_DIR |= M25_CS_MASK;      /* set CS pins as outputs */
+       SPI_CS_SEL &= ~M25_CS_MASK;     /* set CS pins as GPIO */
+       ao_spi_init();
+
+       ao_m25_numchips = 0;
+       for (pin = 1; pin != 0; pin <<= 1) {
+               if (M25_CS_MASK & pin) {
+                       size = ao_m25_read_capacity(pin);
+                       if (size != 0) {
+                               ao_m25_size[ao_m25_numchips] = size;
+                               ao_m25_pin[ao_m25_numchips] = pin;
+                               ao_m25_total += size;
+                               ao_m25_numchips++;
+                       }
+               }
+       }
+       ao_cmd_register(&ao_flash_cmds[0]);
+}
index 9849dfe4766265cbdfb52634aed08d6d7bcb096c..8befd1fc55f5f28bdf5d6b42adc1db916e5aff50 100644 (file)
@@ -32,6 +32,9 @@
        #define LEDS_AVAILABLE          (AO_LED_RED)
        #define HAS_EXTERNAL_TEMP       0
         #define AUDIO_STANDBY_ON_P2_4  0
+       #define SPI_CS_ON_P1            1
+       #define SPI_CS_ON_P0            0
+       #define M25_CS_MASK             0x02
 #endif
 
 #if defined(TELEDONGLE_V_0_2)
@@ -47,6 +50,8 @@
        #define AO_LED_GREEN            2
        #define LEDS_AVAILABLE          (AO_LED_RED|AO_LED_GREEN)
         #define AUDIO_STANDBY_ON_P2_4  0
+       #define SPI_CS_ON_P1            1
+       #define SPI_CS_ON_P0            0
 #endif
 
 #if defined(TELEMETRUM_V_0_1)
@@ -63,6 +68,8 @@
        #define LEDS_AVAILABLE          (AO_LED_RED|AO_LED_GREEN)
        #define HAS_EXTERNAL_TEMP       1
         #define AUDIO_STANDBY_ON_P2_4  0
+       #define SPI_CS_ON_P1            1
+       #define SPI_CS_ON_P0            0
 #endif
 
 #if defined(TELEDONGLE_V_0_1)
@@ -78,6 +85,8 @@
        #define AO_LED_GREEN            1
        #define LEDS_AVAILABLE          (AO_LED_RED|AO_LED_GREEN)
         #define AUDIO_STANDBY_ON_P2_4  0
+       #define SPI_CS_ON_P1            1
+       #define SPI_CS_ON_P0            0
 #endif
 
 #if defined(TELETERRA_V_0_1)
        #define AO_LED_GREEN            2
        #define LEDS_AVAILABLE          (AO_LED_RED|AO_LED_GREEN)
         #define AUDIO_STANDBY_ON_P2_4  1
+       #define SPI_CS_ON_P1            0
+       #define SPI_CS_ON_P0            1
+       #define M25_CS_MASK             0x0f
 #endif
 
 #if defined(TIDONGLE)
        #define AO_LED_RED              2
        #define LEDS_AVAILABLE          (AO_LED_RED)
         #define AUDIO_STANDBY_ON_P2_4  0
+       #define SPI_CS_ON_P1            1
+       #define SPI_CS_ON_P0            0
 #endif
 
 #if DBG_ON_P1
 
 #endif /* DBG_ON_P0 */
 
+#if SPI_CS_ON_P1
+       #define SPI_CS_PORT     P1
+       #define SPI_CS_SEL      P1SEL
+       #define SPI_CS_DIR      P1DIR
+#endif
+
+#if SPI_CS_ON_P0
+       #define SPI_CS_PORT     P0
+       #define SPI_CS_SEL      P0SEL
+       #define SPI_CS_DIR      P0DIR
+#endif
+
 #ifndef HAS_SERIAL_1
 #error Please define HAS_SERIAL_1
 #endif
diff --git a/src/ao_spi.c b/src/ao_spi.c
new file mode 100644 (file)
index 0000000..bd52a0d
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * Copyright © 2010 Keith Packard <keithp@keithp.com>
+ *
+ * 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; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao.h"
+
+__xdata uint8_t        ao_spi_mutex;
+__xdata uint8_t ao_spi_dma_in_done;
+__xdata uint8_t ao_spi_dma_out_done;
+
+uint8_t        ao_spi_dma_out_id;
+uint8_t ao_spi_dma_in_id;
+
+static __xdata uint8_t ao_spi_const = 0xff;
+
+/* Send bytes over SPI.
+ *
+ * This sets up two DMA engines, one writing the data and another reading
+ * bytes coming back.  We use the bytes coming back to tell when the transfer
+ * is complete, as the transmit register is double buffered and hence signals
+ * completion one byte before the transfer is actually complete
+ */
+void
+ao_spi_send(void __xdata *block, uint16_t len) __reentrant
+{
+       ao_mutex_get(&ao_spi_mutex);
+       ao_dma_set_transfer(ao_spi_dma_in_id,
+                           &U0DBUFXADDR,
+                           &ao_spi_const,
+                           len,
+                           DMA_CFG0_WORDSIZE_8 |
+                           DMA_CFG0_TMODE_SINGLE |
+                           DMA_CFG0_TRIGGER_URX0,
+                           DMA_CFG1_SRCINC_0 |
+                           DMA_CFG1_DESTINC_0 |
+                           DMA_CFG1_PRIORITY_NORMAL);
+
+       ao_dma_set_transfer(ao_spi_dma_out_id,
+                           block,
+                           &U0DBUFXADDR,
+                           len,
+                           DMA_CFG0_WORDSIZE_8 |
+                           DMA_CFG0_TMODE_SINGLE |
+                           DMA_CFG0_TRIGGER_UTX0,
+                           DMA_CFG1_SRCINC_1 |
+                           DMA_CFG1_DESTINC_0 |
+                           DMA_CFG1_PRIORITY_NORMAL);
+
+       ao_dma_start(ao_spi_dma_in_id);
+       ao_dma_start(ao_spi_dma_out_id);
+       ao_dma_trigger(ao_spi_dma_out_id);
+       __critical while (!ao_spi_dma_in_done)
+               ao_sleep(&ao_spi_dma_in_done);
+       ao_mutex_put(&ao_spi_mutex);
+}
+
+/* Receive bytes over SPI.
+ *
+ * This sets up tow DMA engines, one reading the data and another
+ * writing constant values to the SPI transmitter as that is what
+ * clocks the data coming in.
+ */
+void
+ao_spi_recv(void __xdata *block, uint16_t len) __reentrant
+{
+       ao_mutex_get(&ao_spi_mutex);
+       ao_dma_set_transfer(ao_spi_dma_in_id,
+                           &U0DBUFXADDR,
+                           block,
+                           len,
+                           DMA_CFG0_WORDSIZE_8 |
+                           DMA_CFG0_TMODE_SINGLE |
+                           DMA_CFG0_TRIGGER_URX0,
+                           DMA_CFG1_SRCINC_0 |
+                           DMA_CFG1_DESTINC_1 |
+                           DMA_CFG1_PRIORITY_NORMAL);
+
+       ao_dma_set_transfer(ao_spi_dma_out_id,
+                           &ao_spi_const,
+                           &U0DBUFXADDR,
+                           len,
+                           DMA_CFG0_WORDSIZE_8 |
+                           DMA_CFG0_TMODE_SINGLE |
+                           DMA_CFG0_TRIGGER_UTX0,
+                           DMA_CFG1_SRCINC_0 |
+                           DMA_CFG1_DESTINC_0 |
+                           DMA_CFG1_PRIORITY_NORMAL);
+
+       ao_dma_start(ao_spi_dma_in_id);
+       ao_dma_start(ao_spi_dma_out_id);
+       ao_dma_trigger(ao_spi_dma_out_id);
+       __critical while (!ao_spi_dma_in_done)
+               ao_sleep(&ao_spi_dma_in_done);
+       ao_mutex_put(&ao_spi_mutex);
+}
+
+/*
+ * Initialize USART0 for SPI using config alt 2
+ *
+ *     MO      P1_5
+ *     MI      P1_4
+ *     CLK     P1_3
+ *
+ * Chip select is the responsibility of the caller
+ */
+
+void
+ao_spi_init(void)
+{
+       /* Set up the USART pin assignment */
+       PERCFG = (PERCFG & ~PERCFG_U0CFG_ALT_MASK) | PERCFG_U0CFG_ALT_2;
+
+       /* Ensure that USART0 takes precidence over USART1 for pins that
+        * they share
+        */
+       P2SEL = (P2SEL & ~P2SEL_PRI3P1_MASK) | P2SEL_PRI3P1_USART0;
+
+       /* Make the SPI pins be controlled by the USART peripheral */
+       P1SEL |= ((1 << 5) | (1 << 4) | (1 << 3));
+
+       /* Set up OUT DMA */
+       ao_spi_dma_out_id = ao_dma_alloc(&ao_spi_dma_out_done);
+
+       /* Set up IN DMA */
+       ao_spi_dma_in_id = ao_dma_alloc(&ao_spi_dma_in_done);
+
+       /* Set up the USART.
+        *
+        * SPI master mode
+        */
+       U0CSR = (UxCSR_MODE_SPI | UxCSR_RE | UxCSR_MASTER);
+
+       /* Set the baud rate and signal parameters
+        *
+        * The cc1111 is limited to a 24/8 MHz SPI clock.
+        * Every peripheral I've ever seen goes faster than that,
+        * so set the clock to 3MHz (BAUD_E 17, BAUD_M 0)
+        */
+       U0BAUD = 0;
+       U0GCR = (UxGCR_CPOL_NEGATIVE |
+                UxGCR_CPHA_FIRST_EDGE |
+                UxGCR_ORDER_MSB |
+                (17 << UxGCR_BAUD_E_SHIFT));
+}
index c697b5df2eb3cfc3bd75fa8fcdadf752b373a8c2..a1c8bef60926bb43d10bd14f7840a444db107021 100644 (file)
@@ -27,6 +27,8 @@ main(void)
        ao_led_init(AO_LED_RED|AO_LED_GREEN);
        ao_led_on(AO_LED_RED);
        ao_timer_init();
+       ao_spi_init();
+       ao_flash_init();
        ao_audio_init();
        ao_cmd_init();
        ao_usb_init();
index a7310fbc8ac6d00bbddc408d4531afa73e634fa4..ac8dcdb966df218140a9b92149174c59d0ee6cb5 100644 (file)
@@ -2,6 +2,7 @@ PROG = telemetrum-v0.1-sirf-$(VERSION).ihx
 
 SRC = \
        $(TM_BASE_SRC) \
+       $(SPI_DRIVER_SRC) \
        $(EE_DRIVER_SRC) \
        $(SIRF_DRIVER_SRC) \
        $(DBG_SRC)
index 000287ba2a983ac4c4f28f32afc2f1d3ec099149..e032d1eb488ffcef8fb33504af5dea7bff1a19db 100644 (file)
@@ -2,6 +2,7 @@ PROG = telemetrum-v0.1-sky-$(VERSION).ihx
 
 SRC = \
        $(TM_BASE_SRC) \
+       $(SPI_DRIVER_SRC) \
        $(EE_DRIVER_SRC) \
        $(SKY_DRIVER_SRC) \
        $(DBG_SRC)
index 010578df6bad6ec0928d5fecd79a8658302f7cd2..a60a501aabb42532e2ef594db94cbf6480d43fee 100644 (file)
@@ -2,6 +2,7 @@ PROG = telemetrum-v1.0-$(VERSION).ihx
 
 SRC = \
        $(TM_BASE_SRC) \
+       $(SPI_DRIVER_SRC) \
        $(FLASH_DRIVER_SRC) \
        $(SKY_DRIVER_SRC) \
        $(DBG_SRC)
index f347743e7833bfeb6006001b0ac9c3ac508df7aa..4601c0b0b5aafa23e8df2d5bb25c6c44bf6779ea 100644 (file)
@@ -2,6 +2,7 @@ PROG = teleterra-v0.1-$(VERSION).ihx
 
 SRC = \
        $(TT_SRC) \
+       $(SPI_DRIVER_SRC) \
        $(SKY_DRIVER_SRC) \
        $(DBG_SRC)