3 * Copyright 2008 Ettus Research LLC
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "memory_map.h"
25 sd_packarg(unsigned char *argument,unsigned int value)
27 argument[3] = (unsigned char)(value >> 24);
28 argument[2] = (unsigned char)(value >> 16);
29 argument[1] = (unsigned char)(value >> 8);
30 argument[0] = (unsigned char)(value);
36 unsigned char response[5];
37 unsigned char argument[4];
43 // Set clock to less than 400 kHz to start out
44 sdspi_regs->clkdiv = 128;
46 // Delay at least 74 cycles
48 for(i = 0; i < 100; i++)
49 sd_send_byte(SD_IDLE);
52 // Initialization Sequence -- CMD0 CMD55 ACMD41 CMD58
53 // Put card in idle state
54 if(sd_send_command(SD_CMD0,SD_CMD0_R,response,argument)==0)
55 return 0; // Something went wrong in command
60 if(sd_send_command(SD_CMD55,SD_CMD55_R,response,argument)==1)
61 sd_send_command(SD_ACMD41,SD_ACMD41_R,response,argument);
65 while(((response[0] & SD_MSK_IDLE) == SD_MSK_IDLE) && (j < SD_IDLE_WAIT_MAX));
67 if(j>= SD_IDLE_WAIT_MAX) // IDLE timeout exceeded, card asleep
70 // CMD58 reads the SD card capabilities
71 if(sd_send_command(SD_CMD58,SD_CMD58_R,response,argument)==0)
72 return 0; // CMD58 FAIL
74 if((response[2] & SD_MSK_OCR_33) != SD_MSK_OCR_33)
75 return 0; // Card doesn't do 3.3V
77 //printf("OCR = %x %x %x %x\n",response[0],response[1],response[2],response[3]);
80 sd_packarg(argument,SD_BLOCKLEN);
81 if(sd_send_command(SD_CMD16,SD_CMD16_R,response,argument)==0)
82 return 0; // Set Blocklen failed
84 // Reset back to high speed
85 sdspi_regs->clkdiv = 4;
86 //puts("finished init\n");
90 int sd_send_command(unsigned char cmd,unsigned char response_type,
91 unsigned char *response,unsigned char *argument)
98 sd_send_byte((cmd & 0x3F) | 0x40);
100 sd_send_byte(argument[i]);
101 sd_send_byte(SD_CRC); // Always the same
104 switch(response_type)
120 // Wait for a response, which will have a 0 start bit
127 while(((tmp & 0x80) != 0) && i < SD_CMD_TIMEOUT);
129 if(i>= SD_CMD_TIMEOUT)
132 //puts("cmd send timeout\n");
136 for(i=response_length-1; i>=0; i--)
142 if(response_type == SD_R1B)
149 while(tmp != SD_IDLE);
150 sd_send_byte(SD_IDLE);
153 //puts("send cmd success\n");
159 sd_read_block (unsigned int blockaddr, unsigned char *buf)
161 unsigned char response[5];
162 unsigned char argument[4];
166 blockaddr <<= SD_BLOCKLEN_NBITS;
167 sd_packarg(argument,blockaddr);
168 if(sd_send_command(SD_CMD17,SD_CMD17_R,response,argument)==0)
169 return 0; //Failed READ;
171 return 0; //Misaligned READ
180 while((tmp == 0xFF) && (i < SD_RD_TIMEOUT));
181 if((i>= SD_RD_TIMEOUT) ||((tmp & SD_MSK_TOK_DATAERROR) == 0))
183 sd_send_byte(SD_IDLE); // Send a dummy before quitting
184 return 0; // Data ERROR
186 for(i=0;i<SD_BLOCKLEN;i++)
187 buf[i] = sd_rcv_byte();
193 sd_write_block(unsigned int blockaddr, const unsigned char *buf)
195 // FIXME not implemented yet