#include "timer.h"
#include "spi.h"
#include "diskio.h"
-//#include "debug.h"
+#include "debug.h"
#define MAX_DRV 2
#define SD_CS_1_DDR SBIT(DDRG,4)
-#define FCLK_SLOW() SPISetMMCInitClock() /* Set slow clock (100k-400k) */
-#define FCLK_FAST() SPISetFastClock() /* Set fast clock (depends on the CSD) */
-
+#define SPI_CLK_SLOW() SPISetMMCInitClock() /* Set slow clock (100k-400k) */
+#define SPI_CLK_FAST() SPISetFastClock() /* Set fast clock (depends on the CSD) */
/*--------------------------------------------------------------------------
Definitions for MMC/SDC command
static
void deselect(BYTE drv)
{
-// debug("*** enter deselect()\n");
+ debug("*** enter deselect()\n");
if (drv == 0)
SD_CS_0 = 1;
- else
+ else {
SD_CS_1 = 1;
+ }
+
/* Dummy clock (TODO: force DO hi-z for multiple slave SPI) */
+ if (socket[drv].stat & STA_FAST)
+ SPI_CLK_FAST();
+ else
+ SPI_CLK_SLOW();
spi_rcvr();
-// debug("*** exit deselect()\n");
+ SPI_OFF();
+
+ if (drv == 0) {
+#ifndef SD_CD_0
+ // SD_CS_0 = 1;
+#endif
+ } else {
+#ifndef SD_CD_1
+ SD_CS_1_DDR = 0;
+ SD_CS_1 = 0;
+#endif
+ }
+ debug("*** exit deselect()\n");
}
/*-----------------------------------------------------------------------*/
static
int select(BYTE drv) /* 1:Successful, 0:Timeout */
{
-// debug("*** enter select()\n");
+ debug("*** enter select()\n");
if (drv == 0)
SD_CS_0 = 0;
- else
+ else {
+#ifndef SD_CD_1
+ SD_CS_1 = 1;
+ SD_CS_1_DDR = 1;
+#endif
SD_CS_1 = 0;
+ }
+
+ if (socket[drv].stat & STA_FAST)
+ SPI_CLK_FAST();
+ else
+ SPI_CLK_SLOW();
+
/* Dummy clock (force DO enabled) */
spi_rcvr();
if (wait_ready()) {
-// debug("*** exit select() == 1\n");
+ debug("*** exit select() == 1\n");
return 1; /* OK */
}
deselect(drv);
-// debug("*** exit select() == 0\n");
+ debug("*** exit select() == 0\n");
return 0; /* Timeout */
}
static
void power_on(BYTE drv)
{
-// debug("*** enter power_on()\n");
+ debug("*** enter power_on()\n");
if (drv == 0) {
#ifdef SD_PWR_0
; /* Wait for 30ms */
#endif
+#ifdef SD_WP_0
+ SD_WP_0_DDR = 0;
+ SD_WP_0 = 1;
+#endif
#ifdef SD_CD_0
/* Card detect, input with pullup */
SD_CD_0_DDR = 0;
SD_CD_0 = 1;
-#endif
-#ifdef SD_WP_0
- SD_WP_0_DDR = 0;
- SD_WP_0 = 1;
#endif
SD_CS_0 = 1;
SD_CS_0_DDR = 1;
; /* Wait for 30ms */
#endif
-#ifdef SD_CD_1
- /* Card detect, input with pullup */
- SD_CD_1_DDR = 0;
- SD_CD_1 = 1;
-#endif
#ifdef SD_WP_1
SD_WP_1_DDR = 0;
SD_WP_1 = 1;
#endif
+#ifdef SD_CD_1
+ /* Card detect, input with pullup */
+ SD_CD_1_DDR = 0;
+ SD_CD_1 = 1;
SD_CS_1 = 1;
SD_CS_1_DDR = 1;
+#else
+ /* Input, no pullup */
+ SD_CS_1 = 0;
+ SD_CS_1_DDR = 0;
+#endif
}
-// debug("*** exit power_on()\n");
+ debug("*** exit power_on()\n");
}
static
void power_off(BYTE drv)
{
-// debug("*** enter power_off()\n");
+ debug("*** enter power_off()\n");
select(drv); /* Wait for card ready */
deselect(drv);
#endif
}
socket[drv].stat |= STA_NOINIT;
-// debug("*** exit power_off()\n");
+ debug("*** exit power_off()\n");
}
#if 0
} argtmp;
BYTE n, res;
-// debug("*** send_cmd( %.2x )\n", cmd);
+ debug("*** send_cmd( %.2x )\n", cmd);
if (cmd & 0x80) { /* ACMD<n> is the command sequense of CMD55-CMD<n> */
cmd &= 0x7F;
return socket[drv].stat; /* No card in the socket */
power_on(drv); /* Force socket power on */
- FCLK_SLOW();
+ socket[drv].stat &= ~STA_FAST;
+ SPI_CLK_SLOW();
for (n = 10; n; n--)
spi_rcvr(); /* 80 dummy clocks */
/* Convert to byte address if needed */
if (!(socket[drv].CardType & CT_BLOCK))
sector *= 512;
- FCLK_FAST();
+ socket[drv].stat |= STA_FAST;
/* READ_MULTIPLE_BLOCK : READ_SINGLE_BLOCK */
cmd = count > 1 ? CMD18 : CMD17;
/* Convert to byte address if needed */
if (!(socket[drv].CardType & CT_BLOCK))
sector *= 512;
- FCLK_FAST();
+ socket[drv].stat |= STA_FAST;
if (count == 1) {
/* Single block write */
if (socket[drv].stat & STA_NOINIT)
return RES_NOTRDY;
- FCLK_FAST();
+ /* TODO: SPI clock? */
+
switch (cmd) {
case CTRL_SYNC : /* Make sure that no pending write process. Do not remove this or written sector might not left updated. */
if (select(drv))
s &= ~STA_NODISK;
else /* Socket empty */
s |= (STA_NODISK | STA_NOINIT);
+#else
+ if (SD_CS_1_DDR == 0) {
+ if (SD_CS_1_IN == 1) /* Card inserted */
+ s &= ~STA_NODISK;
+ else /* Socket empty */
+ s |= (STA_NODISK | STA_NOINIT);
+ }
#endif
socket[1].stat = s; /* Update MMC status */
}
#define SPI_SET_SPEED_F_128 do {SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0); SPSR = (0<<SPI2X); } while(0)
/** switch to fast SPI Clock */
-#define SPISetFastClock() SPI_SET_SPEED_F_2
-#define SPISetSlowClock() SPI_SET_SPEED_F_8
-#define SPISetMMCInitClock() SPI_SET_SPEED_F_64
+#define SPISetFastClock() SPI_SET_SPEED_F_2
+#define SPISetSlowClock() SPI_SET_SPEED_F_8
+#define SPISetMMCInitClock() SPI_SET_SPEED_F_64
+#define SPI_OFF() do { SPCR = 0; } while(0)
static inline void spi_wait() {
loop_until_bit_is_set(SPSR,SPIF);