00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <avr/io.h>
00024 #include <avr/signal.h>
00025 #include <avr/interrupt.h>
00026
00027 #include "global.h"
00028 #include "spi.h"
00029
00030 #include "rprintf.h"
00031
00032 #include "mmc.h"
00033
00034
00035 #include "mmcconf.h"
00036
00037
00038
00039
00040
00041 void mmcInit(void)
00042 {
00043
00044 spiInit();
00045
00046 sbi(MMC_CS_DDR, MMC_CS_PIN);
00047 sbi(MMC_CS_PORT,MMC_CS_PIN);
00048 }
00049
00050 u08 mmcReset(void)
00051 {
00052 u08 retry;
00053 u08 r1=0;
00054
00055 retry = 0;
00056 do
00057 {
00058
00059 spiTransferByte(0xFF);
00060 spiTransferByte(0xFF);
00061 spiTransferByte(0xFF);
00062 spiTransferByte(0xFF);
00063
00064 r1 = mmcSendCommand(MMC_GO_IDLE_STATE, 0);
00065 #ifdef MMC_DEBUG
00066 rprintf("MMC_GO_IDLE_STATE: R1=0x%x\r\n", r1);
00067 #endif
00068
00069 retry++;
00070 if(retry>10) return -1;
00071 } while(r1 != 0x01);
00072
00073
00074
00075
00076 retry = 0;
00077 do
00078 {
00079
00080 r1 = mmcSendCommand(MMC_SEND_OP_COND, 0);
00081 #ifdef MMC_DEBUG
00082 rprintf("MMC_SEND_OP_COND: R1=0x%x\r\n", r1);
00083 #endif
00084
00085 retry++;
00086 if(retry>100) return -1;
00087 } while(r1);
00088
00089
00090 r1 = mmcSendCommand(MMC_CRC_ON_OFF, 0);
00091 #ifdef MMC_DEBUG
00092 rprintf("MMC_CRC_ON_OFF: R1=0x%x\r\n", r1);
00093 #endif
00094
00095
00096 r1 = mmcSendCommand(MMC_SET_BLOCKLEN, 512);
00097 #ifdef MMC_DEBUG
00098 rprintf("MMC_SET_BLOCKLEN: R1=0x%x\r\n", r1);
00099 #endif
00100
00101
00102 return 0;
00103 }
00104
00105 u08 mmcSendCommand(u08 cmd, u32 arg)
00106 {
00107 u08 r1;
00108
00109
00110 cbi(MMC_CS_PORT,MMC_CS_PIN);
00111
00112 r1 = mmcCommand(cmd, arg);
00113
00114 sbi(MMC_CS_PORT,MMC_CS_PIN);
00115
00116 return r1;
00117 }
00118
00119 u08 mmcRead(u32 sector, u08* buffer)
00120 {
00121 u08 r1;
00122 u16 i;
00123
00124
00125 cbi(MMC_CS_PORT,MMC_CS_PIN);
00126
00127 r1 = mmcCommand(MMC_READ_SINGLE_BLOCK, sector<<9);
00128 #ifdef MMC_DEBUG
00129 rprintf("MMC Read Block R1=0x%x\r\n", r1);
00130 #endif
00131
00132 if(r1 != 0x00)
00133 return r1;
00134
00135 while(spiTransferByte(0xFF) != MMC_STARTBLOCK_READ);
00136
00137 for(i=0; i<0x200; i++)
00138 {
00139 *buffer++ = spiTransferByte(0xFF);
00140 }
00141
00142 spiTransferByte(0xFF);
00143 spiTransferByte(0xFF);
00144
00145 sbi(MMC_CS_PORT,MMC_CS_PIN);
00146
00147 return 0;
00148 }
00149
00150 u08 mmcWrite(u32 sector, u08* buffer)
00151 {
00152 u08 r1;
00153 u16 i;
00154
00155
00156 cbi(MMC_CS_PORT,MMC_CS_PIN);
00157
00158 r1 = mmcCommand(MMC_WRITE_BLOCK, sector<<9);
00159 #ifdef MMC_DEBUG
00160 rprintf("MMC Write Block R1=0x%x\r\n", r1);
00161 #endif
00162
00163 if(r1 != 0x00)
00164 return r1;
00165
00166 spiTransferByte(0xFF);
00167
00168 spiTransferByte(MMC_STARTBLOCK_WRITE);
00169
00170 for(i=0; i<0x200; i++)
00171 {
00172 spiTransferByte(*buffer++);
00173 }
00174
00175 spiTransferByte(0xFF);
00176 spiTransferByte(0xFF);
00177
00178 r1 = spiTransferByte(0xFF);
00179 if( (r1&MMC_DR_MASK) != MMC_DR_ACCEPT)
00180 return r1;
00181 #ifdef MMC_DEBUG
00182 rprintf("Data Response Token=0x%x\r\n", r1);
00183 #endif
00184
00185 while(!spiTransferByte(0xFF));
00186
00187 sbi(MMC_CS_PORT,MMC_CS_PIN);
00188
00189 return 0;
00190 }
00191
00192 u08 mmcCommand(u08 cmd, u32 arg)
00193 {
00194 u08 r1;
00195 u08 retry=0;
00196
00197 spiTransferByte(cmd | 0x40);
00198 spiTransferByte(arg>>24);
00199 spiTransferByte(arg>>16);
00200 spiTransferByte(arg>>8);
00201 spiTransferByte(arg);
00202 spiTransferByte(0x95);
00203
00204
00205
00206
00207 while((r1 = spiTransferByte(0xFF)) == 0xFF)
00208 if(retry++ > 8) break;
00209
00210 return r1;
00211 }