--- /dev/null
+
+#include "spi.h"
+#include "portconf.h"
+
+#define CK_H() do { *PORTCONF_PBDR |= PORTCONF_PBBIT_SCLK; } while (0) /* Set MMC SCLK "high" */
+#define CK_L() do { *PORTCONF_PBDR &= ~PORTCONF_PBBIT_SCLK; } while (0) /* Set MMC SCLK "low" */
+#define DI_H() do { *PORTCONF_PBDR |= PORTCONF_PBBIT_MOSI; } while (0) /* Set MMC DI "high" */
+#define DI_L() do { *PORTCONF_PBDR &= ~PORTCONF_PBBIT_MOSI; } while (0) /* Set MMC DI "low" */
+#define DO ((*PORTCONF_PBDR & PORTCONF_PBBIT_MISO) ? 1 : 0) /* Get MMC DO value (high:true, low:false) */
+
+void spi_init(void)
+{
+}
+
+void spi_tx(uint8 d)
+{
+ if (d & 0x80) DI_H(); else DI_L(); /* bit7 */
+ CK_H(); CK_L();
+ if (d & 0x40) DI_H(); else DI_L(); /* bit6 */
+ CK_H(); CK_L();
+ if (d & 0x20) DI_H(); else DI_L(); /* bit5 */
+ CK_H(); CK_L();
+ if (d & 0x10) DI_H(); else DI_L(); /* bit4 */
+ CK_H(); CK_L();
+ if (d & 0x08) DI_H(); else DI_L(); /* bit3 */
+ CK_H(); CK_L();
+ if (d & 0x04) DI_H(); else DI_L(); /* bit2 */
+ CK_H(); CK_L();
+ if (d & 0x02) DI_H(); else DI_L(); /* bit1 */
+ CK_H(); CK_L();
+ if (d & 0x01) DI_H(); else DI_L(); /* bit0 */
+ CK_H(); CK_L();
+}
+
+uint8 spi_rx(void)
+{
+ uint8 r;
+
+ DI_H(); /* Send 0xFF */
+
+ r = 0; if (DO) r++; /* bit7 */
+ CK_H(); CK_L();
+ r <<= 1; if (DO) r++; /* bit6 */
+ CK_H(); CK_L();
+ r <<= 1; if (DO) r++; /* bit5 */
+ CK_H(); CK_L();
+ r <<= 1; if (DO) r++; /* bit4 */
+ CK_H(); CK_L();
+ r <<= 1; if (DO) r++; /* bit3 */
+ CK_H(); CK_L();
+ r <<= 1; if (DO) r++; /* bit2 */
+ CK_H(); CK_L();
+ r <<= 1; if (DO) r++; /* bit1 */
+ CK_H(); CK_L();
+ r <<= 1; if (DO) r++; /* bit0 */
+ CK_H(); CK_L();
+
+ return r;
+}
+
#include "vs1011e.h"
#include "portconf.h"
+#include "spi.h"
#define VS1011E_OPCODE_READ 0x03
#define VS1011E_OPCODE_WRITE 0x02
#define VS1011E_CHK_DREQ() (((*PORTCONF_P4DR) & PORTCONF_P4BIT_VSDREQ) ? 0 : 1)
-#define CK_H() do { *PORTCONF_PBDR |= PORTCONF_PBBIT_SCLK; } while (0) /* Set MMC SCLK "high" */
-#define CK_L() do { *PORTCONF_PBDR &= ~PORTCONF_PBBIT_SCLK; } while (0) /* Set MMC SCLK "low" */
-#define DI_H() do { *PORTCONF_PBDR |= PORTCONF_PBBIT_MOSI; } while (0) /* Set MMC DI "high" */
-#define DI_L() do { *PORTCONF_PBDR &= ~PORTCONF_PBBIT_MOSI; } while (0) /* Set MMC DI "low" */
-#define DO ((*PORTCONF_PBDR & PORTCONF_PBBIT_MISO) ? 1 : 0) /* Get MMC DO value (high:true, low:false) */
-
static void _delay_ms(int ms)
{
int i;
}
}
-static void SPI_TX(uint8 d)
-{
- if (d & 0x80) DI_H(); else DI_L(); /* bit7 */
- CK_H(); CK_L();
- if (d & 0x40) DI_H(); else DI_L(); /* bit6 */
- CK_H(); CK_L();
- if (d & 0x20) DI_H(); else DI_L(); /* bit5 */
- CK_H(); CK_L();
- if (d & 0x10) DI_H(); else DI_L(); /* bit4 */
- CK_H(); CK_L();
- if (d & 0x08) DI_H(); else DI_L(); /* bit3 */
- CK_H(); CK_L();
- if (d & 0x04) DI_H(); else DI_L(); /* bit2 */
- CK_H(); CK_L();
- if (d & 0x02) DI_H(); else DI_L(); /* bit1 */
- CK_H(); CK_L();
- if (d & 0x01) DI_H(); else DI_L(); /* bit0 */
- CK_H(); CK_L();
-}
-static uint8 SPI_RX()
-{
- uint8 r;
-
- DI_H(); /* Send 0xFF */
-
- r = 0; if (DO) r++; /* bit7 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit6 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit5 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit4 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit3 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit2 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit1 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit0 */
- CK_H(); CK_L();
-
- return r;
-}
-
static void vs1011e_read(uint8 addr, uint16 * stat);
static void vs1011e_write(uint8 addr, uint16 stat);
while (VS1011E_CHK_DREQ()) {
}
// Send 0x53 to SPI
- SPI_TX(0x53);
+ spi_tx(0x53);
// Send 1024 nulls
for (i = 0; i < 1024; i++) {
// Check the DREQ.
while (VS1011E_CHK_DREQ()) {
}
- SPI_TX(0x00);
+ spi_tx(0x00);
}
// Deassert DCS
VS1011E_VSDAT1();
for (i = 0; i < 2048; i++) {
while (VS1011E_CHK_DREQ()) {
}
- SPI_TX(0x00);
+ spi_tx(0x00);
}
VS1011E_VSDAT1();
}
for (i = 0; i < UNITBYTE; i++) {
while (VS1011E_CHK_DREQ()) { }
VS1011E_VSDAT0();
- SPI_TX(*(buf + i));
+ spi_tx(*(buf + i));
VS1011E_VSDAT1();
}
}
}
VS1011E_VSDAT0();
- SPI_TX(0x53);
- SPI_TX(0xEF);
- SPI_TX(0x6E);
- SPI_TX(0xF0);
- SPI_TX(0x00);
- SPI_TX(0x00);
- SPI_TX(0x00);
- SPI_TX(0x00);
+ spi_tx(0x53);
+ spi_tx(0xEF);
+ spi_tx(0x6E);
+ spi_tx(0xF0);
+ spi_tx(0x00);
+ spi_tx(0x00);
+ spi_tx(0x00);
+ spi_tx(0x00);
VS1011E_VSDAT1();
}
}
VS1011E_VSDAT0();
- SPI_TX(0x45);
- SPI_TX(0x78);
- SPI_TX(0x69);
- SPI_TX(0x74);
- SPI_TX(0x00);
- SPI_TX(0x00);
- SPI_TX(0x00);
- SPI_TX(0x00);
+ spi_tx(0x45);
+ spi_tx(0x78);
+ spi_tx(0x69);
+ spi_tx(0x74);
+ spi_tx(0x00);
+ spi_tx(0x00);
+ spi_tx(0x00);
+ spi_tx(0x00);
VS1011E_VSDAT1();
vs1011e_cancel_data();
VS1011E_VSCTL0();
- SPI_TX(VS1011E_OPCODE_READ);
- SPI_TX(addr);
+ spi_tx(VS1011E_OPCODE_READ);
+ spi_tx(addr);
*stat = 0;
- *stat |= SPI_RX() << 8;
- *stat |= SPI_RX();
+ *stat |= spi_rx() << 8;
+ *stat |= spi_rx();
VS1011E_VSCTL1();
}
VS1011E_VSCTL0();
- SPI_TX(VS1011E_OPCODE_WRITE);
- SPI_TX(addr);
+ spi_tx(VS1011E_OPCODE_WRITE);
+ spi_tx(addr);
- SPI_TX(stat >> 8);
- SPI_TX(stat >> 0);
+ spi_tx(stat >> 8);
+ spi_tx(stat >> 0);
VS1011E_VSCTL1();
}