Added simple memory wrapper code.
authorethereal <ethereal@ethv.net>
Sat, 15 Mar 2014 07:58:14 +0000 (01:58 -0600)
committerethereal <ethereal@ethv.net>
Sat, 15 Mar 2014 07:58:14 +0000 (01:58 -0600)
vm/src/mem.c [new file with mode: 0644]
vm/src/mem.h [new file with mode: 0644]
vm/src/spi.c
vm/src/spi.h
vm/src/startup.c

diff --git a/vm/src/mem.c b/vm/src/mem.c
new file mode 100644 (file)
index 0000000..c0a6c48
--- /dev/null
@@ -0,0 +1,48 @@
+#include "mem.h"
+#include "spi.h"
+
+void *sram_23lc1024_init(void *params) {
+    return params;
+}
+
+uint32_t sram_23lc1024_size(void __attribute__((unused)) *mem) {
+    return 1<<14;
+}
+
+uint32_t sram_23lc1024_read_word(void *mem, uint32_t address) {
+    spi_setwhich((uint32_t)mem);
+
+    uint8_t tx_buffer[8] =
+        {0x03, address >> 16, address >> 8, address, 0xff, 0xff, 0xff, 0xff};
+    uint8_t rx_buffer[8];
+
+    spi_xfer(tx_buffer, rx_buffer, 8);
+
+    return *(uint32_t *)(&rx_buffer[4]);
+}
+
+void sram_23lc1024_write_word(void *mem, uint32_t address, uint32_t value) {
+    spi_setwhich((uint32_t)mem);
+
+    uint8_t tx_buffer[8] =
+        {0x02, address >> 16, address >> 8, address, 0, 0, 0, 0};
+    *(uint32_t *)(&tx_buffer[4]) = value;
+    uint8_t rx_buffer[8];
+
+    spi_xfer(tx_buffer, rx_buffer, 8);
+}
+
+const struct mem_interface sram_23lc1024 = {
+    sram_23lc1024_init,
+    sram_23lc1024_size,
+    sram_23lc1024_read_word,
+    sram_23lc1024_write_word
+};
+
+const struct mem_interface *mem_interfaces[] = {
+    &sram_23lc1024
+};
+
+const struct mem_interface *mem_interface(enum mem_type mem) {
+    return mem_interfaces[mem];
+}
diff --git a/vm/src/mem.h b/vm/src/mem.h
new file mode 100644 (file)
index 0000000..2fb8e45
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef MEM_H
+#define MEM_H
+
+#include <stdint.h>
+
+struct mem_interface {
+    void *(*init)(void *params);
+    uint32_t (*size)(void *mem);
+    uint32_t (*read_word)(void *mem, uint32_t address);
+    void (*write_word)(void *mem, uint32_t address, uint32_t value);
+};
+
+enum mem_type {
+    MEM_SRAM_23LC1024
+};
+
+const struct mem_interface *mem_interface(enum mem_type mem);
+
+#endif
index 6796a93..627be0c 100644 (file)
@@ -19,17 +19,10 @@ void spi_init(void) {
     pio_set_per(0, 13, PIO_PER_A);
     pio_set_per(0, 14, PIO_PER_A);
     
-    pio_set_pur(0, 11, PIO_PUR_OFF);
-    pio_set_pur(0, 12, PIO_PUR_OFF);
-    pio_set_pur(0, 13, PIO_PUR_OFF);
-    pio_set_pur(0, 14, PIO_PUR_OFF);
-
     /* set master mode, fixed-peripheral mode, no decoder, no fault detection */
     register_write(SPI_MR, (1<<0) | (1<<4));
 
-    /* configure slave 0 */
-    /* !CSAAT, CSNAAT, SPCK = MCK/2 */
-    //register_write(SPI_CSR0, (1<<2) | (2<<8));
+    /* configure slaves */
     register_write(SPI_CSR0, (1<<1) | (255<<8));
     register_write(SPI_CSR1, (1<<1) | (255<<8));
     register_write(SPI_CSR2, (1<<1) | (255<<8));
@@ -39,220 +32,24 @@ void spi_init(void) {
     register_write(SPI_CR, 1);
 }
 
-static void spi_wait_tdre(void) {
-    while(!(register_read(SPI_SR) & 2)) {}
-}
-
-static void spi_wait_rdrf(void) {
-    while(!(register_read(SPI_SR) & 1)) {}
-}
-
-#if 0
-void spi_test(void) {
-    uint8_t val[] = {0x03, 0x0, 0x0, 0x0, 0x55, 0x0};
-    uint8_t ret[5];
-    DEBUG("about to send");
-    for(int i = 0; i < sizeof(val); i ++) {
-        spi_wait_tdre();
-        register_write(SPI_TDR, val[i]);
-        spi_wait_rdrf();
-        ret[i] = register_read(SPI_RDR) & 0xff;
-    }
-    DEBUG("sent! waiting for response...");
-    //spi_wait_rdrf();
-    /*register_read(SPI_RDR) & 0xff;*/
-    DEBUG("received:");
-
-    const char *hex = "0123456789abcdef";
-
-    for(int i = 0; i < 5; i ++) {
-        uart_send((uint8_t *)&hex[(ret[i]>>4) & 0xf], 1);
-        uart_send((uint8_t *)&hex[ret[i] & 0xf], 1);
-    }
-
-    DEBUG(".");
-
-    DEBUG("SPI_SR:");
-    uint32_t v = register_read(SPI_SR);
-    for(int i = 0; i < 4; i ++) {
-        uint8_t vv = (v & 0xff000000) >> 24;
-        uart_send((uint8_t *)&hex[vv & 0xf], 1);
-        uart_send((uint8_t *)&hex[(vv>>4) & 0xf], 1);
-        v >>= 8;
-    }
-    DEBUG(".");
-}
-#endif
-
-#if 0
-void spi_test(void) {
-    DEBUG("Status register: 0x%x", register_read(SPI_PTSR));
-    uint8_t tx_buffer[128];
-    uint8_t recv_buffer[128];
-
-    tx_buffer[1] = 0;
-    tx_buffer[2] = 0;
-    tx_buffer[3] = 0;
-    tx_buffer[4] = 0;
-
-    //for(int i = 0; i < 8; i ++) recv_buffer[i] = 0xaa;
-
-    for(int i = 0; i < 256; i ++) {
-        tx_buffer[i] = i;
-
-        register_write(SPI_RPR, (uint32_t)recv_buffer);
-        register_write(SPI_RCR, 5);
-
-        register_write(SPI_TPR, (uint32_t)tx_buffer);
-        register_write(SPI_TCR, 5);
-
-        DEBUG("initializing PDC transfers . . .");
-        DEBUG("SPI_RPR: 0x%x (recv_buffer: %p)", register_read(SPI_RPR), recv_buffer);
-        DEBUG("SPI_RCR: 0x%x", register_read(SPI_RCR));
-        /* begin in/out PDC transfers */
-        register_write(SPI_PTCR, (1<<0) | (1<<8));
-        DEBUG("SPI_PTSR: 0x%x", register_read(SPI_PTSR));
-
-        DEBUG("SPI_RCR: 0x%x", register_read(SPI_RCR));
-        DEBUG("SPI_SR: 0x%x", register_read(SPI_SR));
-
-        /* wait for read to finish */
-        while((register_read(SPI_SR) & (1<<4)) == 0) {
-            for(int ii = 0; ii < 3000000; ii ++) {}
-            DEBUG("SPI_RPR: 0x%x", register_read(SPI_RPR));
-            DEBUG("SPI_RCR: 0x%x", register_read(SPI_RCR));
-            DEBUG("SPI_SR: 0x%x", register_read(SPI_SR));
-        }
-        // disable PDC requests
-        register_write(SPI_PTCR, (1<<1) | (1<<9));
-
-        DEBUG("SPI_RCR: 0x%x", register_read(SPI_RCR));
-        
-        DEBUG(" -- finished!");
-        DEBUG("result: %x %x %x %x", recv_buffer[0], recv_buffer[1],
-            recv_buffer[2], recv_buffer[3]);
-        for(int j = 0; j < 5; j ++) if(recv_buffer[j] != 0xff) {
-            DEBUG("i: %x recv_buffer[%i] != 0xff!", i, j);
-            break;
-        }
-    }
-    DEBUG("SPI_PTSR: 0x%x", register_read(SPI_PTSR));
+void spi_setwhich(uint8_t which) {
+    uint32_t base = register_read(SPI_MR) | 0xf0000;
+    register_write(SPI_MR, base ^ (1<<(which+16)));
 }
-#endif
-
-void spi_test(void) {
-    DEBUG("Status register: 0x%x", register_read(SPI_PTSR));
-    uint8_t tx_buffer[8];
-    uint8_t rx_buffer[8];
-
-    for(int i = 0; i < 8; i ++) rx_buffer[i] = 0xa5;
 
-    tx_buffer[0] = 0x02;
-    tx_buffer[1] = 0;
-    tx_buffer[2] = 0;
-    tx_buffer[3] = 0;
-    tx_buffer[4] = 0xcc;
-    tx_buffer[5] = 0xcd;
-    tx_buffer[6] = 0xce;
-    tx_buffer[7] = 0xcf;
+void spi_xfer(const void *tx, void *rx, uint16_t len) {
+    /* Set up the requests in the appropriate registers */
+    register_write(SPI_TPR, (uint32_t)tx);
+    register_write(SPI_TCR, len);
 
-    register_write(SPI_TPR, (uint32_t)tx_buffer);
-    register_write(SPI_TCR, 8);
+    register_write(SPI_RPR, (uint32_t)rx);
+    register_write(SPI_RCR, len);
 
-    register_write(SPI_RPR, (uint32_t)rx_buffer);
-    register_write(SPI_RCR, 8);
-
-    /* begin in/out PDC transfers */
-    register_write(SPI_PTCR, (1<<0) | (1<<8));
-
-    /* wait for read to finish */
-    while((register_read(SPI_SR) & (1<<4)) == 0) {}
-    // disable PDC requests
-    register_write(SPI_PTCR, (1<<1) | (1<<9));
-
-    for(int i = 0; i < 5; i ++) if(rx_buffer[i] != 0xff) DEBUG("non-ff!");
-
-    for(int i = 0; i < 8; i ++) rx_buffer[i] = 0xa5;
-
-    tx_buffer[0] = 0x03;
-    tx_buffer[1] = 0;
-    tx_buffer[2] = 0;
-    tx_buffer[3] = 0;
-    tx_buffer[4] = 0;
-    tx_buffer[5] = 0;
-    tx_buffer[6] = 0;
-    tx_buffer[7] = 0;
-
-    register_write(SPI_TPR, (uint32_t)tx_buffer);
-    register_write(SPI_TCR, 8);
-
-    register_write(SPI_RPR, (uint32_t)rx_buffer);
-    register_write(SPI_RCR, 8);
-
-    /* begin in/out PDC transfers */
+    /* enable in/out PDC transfers (begin both at the same time) */
     register_write(SPI_PTCR, (1<<0) | (1<<8));
 
     /* wait for read to finish */
     while((register_read(SPI_SR) & (1<<4)) == 0) {}
-    // disable PDC requests
+    /* disable PDC requests so future requests can be synch'd */
     register_write(SPI_PTCR, (1<<1) | (1<<9));
-    /*for(int i = 0; i < 5; i ++) if(rx_buffer[i] != 0xff) DEBUG("non-ff! value: %x", rx_buffer[i]);*/
-
-    for(int i = 0; i < 8; i ++) {
-        DEBUG("rx_buffer[%x] = %x", i, rx_buffer[i]);
-    }
 }
-
-#if 0
-void spi_test(void) {
-    uint8_t tx_buffer[8];
-    uint8_t rx_buffer[8];
-
-    tx_buffer[0] = 0x02;
-    tx_buffer[1] = 0;
-    tx_buffer[2] = 0;
-    tx_buffer[3] = 0;
-    tx_buffer[4] = 0xcc;
-    tx_buffer[5] = 0xcd;
-    tx_buffer[6] = 0xce;
-    tx_buffer[7] = 0xcf;
-
-    for(int i = 0; i < 8; i ++) {
-        while((register_read(SPI_SR) & (1<<9)) == 0) {}
-        register_write(SPI_TDR, tx_buffer[i]);
-        if(i == 7) register_write(SPI_CR, 1<<24);
-        while((register_read(SPI_SR) & (1<<1)) == 0) {}
-        while((register_read(SPI_SR) & (1<<0)) == 0) {}
-        rx_buffer[i] = register_read(SPI_RDR) & 0xff;
-    }
-
-    DEBUG("write command sent. rx_buffer:");
-    for(int i = 0; i < 8; i ++) {
-        DEBUG("rx_buffer[%x] = %x", i, rx_buffer[i]);
-    }
-
-    tx_buffer[0] = 0x03;
-    tx_buffer[1] = 0;
-    tx_buffer[2] = 0;
-    tx_buffer[3] = 0;
-    tx_buffer[4] = 0x0;
-    tx_buffer[5] = 0x0;
-    tx_buffer[6] = 0x0;
-    tx_buffer[7] = 0x0;
-
-    for(int i = 0; i < 8; i ++) {
-        while((register_read(SPI_SR) & (1<<9)) == 0) {}
-        register_write(SPI_TDR, tx_buffer[i]);
-        if(i == 7) register_write(SPI_CR, 1<<24);
-        while((register_read(SPI_SR) & (1<<1)) == 0) {}
-        while((register_read(SPI_SR) & (1<<0)) == 0) {}
-        rx_buffer[i] = register_read(SPI_RDR) & 0xff;
-    }
-
-    DEBUG("read command sent. rx_buffer:");
-    for(int i = 0; i < 8; i ++) {
-        DEBUG("rx_buffer[%x] = %x", i, rx_buffer[i]);
-    }
-}
-#endif
-
index aa23f8e..f4d8659 100644 (file)
@@ -1,7 +1,12 @@
 #ifndef SPI_H
 #define SPI_H
 
+#include <stdint.h>
+
 void spi_init(void);
 void spi_test(void);
 
+void spi_setwhich(uint8_t which);
+void spi_xfer(const void *tx, void *rx, uint16_t len);
+
 #endif
index a814c0e..5b4ac92 100644 (file)
@@ -1,5 +1,6 @@
 #include "interrupt.h"
 #include "spi.h"
+#include "mem.h"
 
 #include "pmc.h"
 #include "debug.h"
@@ -103,8 +104,15 @@ static void startup_reset_handler(void) {
     debug_init();
 
     spi_init();
-    spi_test();
+    const struct mem_interface *sram_int = mem_interface(MEM_SRAM_23LC1024);
+    /* SPI port zero */
+    void *sram_obj = sram_int->init(0);
 
+    sram_int->write_word(sram_obj, 0x0, 0xdeadc0de);
+
+    DEBUG("word 0: %x", sram_int->read_word(sram_obj, 0x0));
+
+    /* turn on LED on PA3 */
     *(uint32_t *)(0x400e0e00) = 0x8;
     *(uint32_t *)(0x400e0e10) = 0x8;
     *(uint32_t *)(0x400e0e30) = 0x8;