nlknlknln

Dependencies:   mbed

Fork of raw_sd_card_readsaswell by Pradeep Kotipalli

Committer:
pradeepvk2208
Date:
Sat Jun 06 11:46:02 2015 +0000
Revision:
3:d4bb1e13a897
Parent:
2:aea18e9b89d8
Child:
4:003e6dfc288d
high

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pradeepvk2208 0:d4197e4552ea 1 #include "mbed.h"
pradeepvk2208 0:d4197e4552ea 2 #include "mbed_debug.h"
pradeepvk2208 0:d4197e4552ea 3
pradeepvk2208 0:d4197e4552ea 4 #define SD_COMMAND_TIMEOUT 5000
pradeepvk2208 0:d4197e4552ea 5
pradeepvk2208 0:d4197e4552ea 6 #define SD_DBG 0
pradeepvk2208 0:d4197e4552ea 7
pradeepvk2208 0:d4197e4552ea 8 #define R1_IDLE_STATE (1 << 0)
pradeepvk2208 0:d4197e4552ea 9 #define R1_ERASE_RESET (1 << 1)
pradeepvk2208 0:d4197e4552ea 10 #define R1_ILLEGAL_COMMAND (1 << 2)
pradeepvk2208 0:d4197e4552ea 11 #define R1_COM_CRC_ERROR (1 << 3)
pradeepvk2208 0:d4197e4552ea 12 #define R1_ERASE_SEQUENCE_ERROR (1 << 4)
pradeepvk2208 0:d4197e4552ea 13 #define R1_ADDRESS_ERROR (1 << 5)
pradeepvk2208 0:d4197e4552ea 14 #define R1_PARAMETER_ERROR (1 << 6)
pradeepvk2208 0:d4197e4552ea 15
pradeepvk2208 0:d4197e4552ea 16 int initialise_card();
pradeepvk2208 0:d4197e4552ea 17 int initialise_card_v1();
pradeepvk2208 0:d4197e4552ea 18 int initialise_card_v2();
pradeepvk2208 2:aea18e9b89d8 19 int disk_initialize();
pradeepvk2208 3:d4bb1e13a897 20 int disk_write(const uint8_t *, uint64_t);
pradeepvk2208 3:d4bb1e13a897 21
pradeepvk2208 2:aea18e9b89d8 22 uint64_t sd_sectors();
pradeepvk2208 2:aea18e9b89d8 23 uint64_t sectors;
pradeepvk2208 2:aea18e9b89d8 24
pradeepvk2208 0:d4197e4552ea 25 int cmd(int, int);
pradeepvk2208 0:d4197e4552ea 26 int cmd58();
pradeepvk2208 2:aea18e9b89d8 27 int cmdx(int, int);
pradeepvk2208 0:d4197e4552ea 28 int cmd8();
pradeepvk2208 2:aea18e9b89d8 29 int read(uint8_t*, uint32_t );
pradeepvk2208 3:d4bb1e13a897 30 int write(const uint8_t*, uint32_t );
pradeepvk2208 2:aea18e9b89d8 31 static uint32_t ext_bits(unsigned char *, int , int );
pradeepvk2208 0:d4197e4552ea 32
pradeepvk2208 0:d4197e4552ea 33 int cdv;
pradeepvk2208 0:d4197e4552ea 34
pradeepvk2208 0:d4197e4552ea 35 #define SDCARD_FAIL 0
pradeepvk2208 0:d4197e4552ea 36 #define SDCARD_V1 1
pradeepvk2208 0:d4197e4552ea 37 #define SDCARD_V2 2
pradeepvk2208 0:d4197e4552ea 38 #define SDCARD_V2HC 3
pradeepvk2208 0:d4197e4552ea 39
pradeepvk2208 0:d4197e4552ea 40
pradeepvk2208 0:d4197e4552ea 41
pradeepvk2208 0:d4197e4552ea 42 SPI spi(PTD6, PTD7, PTD5); // mosi, miso, sclk
pradeepvk2208 0:d4197e4552ea 43 DigitalOut cs(PTD2);
pradeepvk2208 3:d4bb1e13a897 44 int count_bro;
pradeepvk2208 0:d4197e4552ea 45
pradeepvk2208 0:d4197e4552ea 46
pradeepvk2208 0:d4197e4552ea 47
pradeepvk2208 0:d4197e4552ea 48 int main()
pradeepvk2208 0:d4197e4552ea 49 {
pradeepvk2208 3:d4bb1e13a897 50
pradeepvk2208 3:d4bb1e13a897 51 initialise_card();
pradeepvk2208 0:d4197e4552ea 52 int result= initialise_card();
pradeepvk2208 2:aea18e9b89d8 53 printf("initialise card result=%d\n",result);
pradeepvk2208 2:aea18e9b89d8 54 disk_initialize();
pradeepvk2208 3:d4bb1e13a897 55 uint8_t buffer[512];
pradeepvk2208 3:d4bb1e13a897 56 for(count_bro=0;count_bro<512;count_bro++)
pradeepvk2208 3:d4bb1e13a897 57 {buffer[count_bro]='a';}
pradeepvk2208 3:d4bb1e13a897 58 disk_write(buffer, 2);
pradeepvk2208 3:d4bb1e13a897 59
pradeepvk2208 3:d4bb1e13a897 60
pradeepvk2208 3:d4bb1e13a897 61
pradeepvk2208 0:d4197e4552ea 62 }
pradeepvk2208 0:d4197e4552ea 63
pradeepvk2208 0:d4197e4552ea 64
pradeepvk2208 0:d4197e4552ea 65
pradeepvk2208 0:d4197e4552ea 66
pradeepvk2208 0:d4197e4552ea 67 int initialise_card() {
pradeepvk2208 0:d4197e4552ea 68 // Set to 100kHz for initialisation, and clock card with cs = 1
pradeepvk2208 0:d4197e4552ea 69 spi.frequency(100000);
pradeepvk2208 0:d4197e4552ea 70 cs = 1;
pradeepvk2208 0:d4197e4552ea 71 for (int i = 0; i < 16; i++) {
pradeepvk2208 0:d4197e4552ea 72 spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 73 }
pradeepvk2208 0:d4197e4552ea 74
pradeepvk2208 0:d4197e4552ea 75 // send CMD0, should return with all zeros except IDLE STATE set (bit 0)
pradeepvk2208 0:d4197e4552ea 76 if (cmd(0, 0) != R1_IDLE_STATE) {
pradeepvk2208 0:d4197e4552ea 77 debug("No disk, or could not put SD card in to SPI idle state\n");
pradeepvk2208 0:d4197e4552ea 78 return SDCARD_FAIL;
pradeepvk2208 0:d4197e4552ea 79 }
pradeepvk2208 0:d4197e4552ea 80
pradeepvk2208 0:d4197e4552ea 81 // send CMD8 to determine whther it is ver 2.x
pradeepvk2208 0:d4197e4552ea 82 int r = cmd8();
pradeepvk2208 0:d4197e4552ea 83 if (r == R1_IDLE_STATE) {
pradeepvk2208 2:aea18e9b89d8 84 printf("Entering v2 bro\n");
pradeepvk2208 0:d4197e4552ea 85 return initialise_card_v2();
pradeepvk2208 2:aea18e9b89d8 86
pradeepvk2208 0:d4197e4552ea 87 } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
pradeepvk2208 2:aea18e9b89d8 88 printf("Entering v1 bro\n");
pradeepvk2208 0:d4197e4552ea 89 return initialise_card_v1();
pradeepvk2208 2:aea18e9b89d8 90
pradeepvk2208 0:d4197e4552ea 91 } else {
pradeepvk2208 0:d4197e4552ea 92 debug("Not in idle state after sending CMD8 (not an SD card?)\n");
pradeepvk2208 0:d4197e4552ea 93 return SDCARD_FAIL;
pradeepvk2208 0:d4197e4552ea 94 }
pradeepvk2208 0:d4197e4552ea 95 }
pradeepvk2208 0:d4197e4552ea 96
pradeepvk2208 0:d4197e4552ea 97 int initialise_card_v1() {
pradeepvk2208 0:d4197e4552ea 98 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
pradeepvk2208 0:d4197e4552ea 99 cmd(55, 0);
pradeepvk2208 0:d4197e4552ea 100 if (cmd(41, 0) == 0) {
pradeepvk2208 3:d4bb1e13a897 101 printf("Yuppie v1 successful\n");
pradeepvk2208 0:d4197e4552ea 102 cdv = 512;
pradeepvk2208 0:d4197e4552ea 103 debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r");
pradeepvk2208 1:1843a53b51a8 104
pradeepvk2208 0:d4197e4552ea 105 return SDCARD_V1;
pradeepvk2208 0:d4197e4552ea 106 }
pradeepvk2208 0:d4197e4552ea 107 }
pradeepvk2208 0:d4197e4552ea 108
pradeepvk2208 0:d4197e4552ea 109 debug("Timeout waiting for v1.x card\n");
pradeepvk2208 0:d4197e4552ea 110 return SDCARD_FAIL;
pradeepvk2208 0:d4197e4552ea 111 }
pradeepvk2208 0:d4197e4552ea 112
pradeepvk2208 0:d4197e4552ea 113
pradeepvk2208 0:d4197e4552ea 114 int initialise_card_v2() {
pradeepvk2208 0:d4197e4552ea 115 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
pradeepvk2208 0:d4197e4552ea 116 wait_ms(50);
pradeepvk2208 0:d4197e4552ea 117 cmd58();
pradeepvk2208 0:d4197e4552ea 118 cmd(55, 0);
pradeepvk2208 0:d4197e4552ea 119 if (cmd(41, 0x40000000) == 0) {
pradeepvk2208 3:d4bb1e13a897 120 printf("Yuppie,v2 successful\n");
pradeepvk2208 0:d4197e4552ea 121 cmd58();
pradeepvk2208 0:d4197e4552ea 122 debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r");
pradeepvk2208 0:d4197e4552ea 123 cdv = 1;
pradeepvk2208 1:1843a53b51a8 124
pradeepvk2208 0:d4197e4552ea 125 return SDCARD_V2;
pradeepvk2208 0:d4197e4552ea 126 }
pradeepvk2208 0:d4197e4552ea 127 }
pradeepvk2208 0:d4197e4552ea 128
pradeepvk2208 0:d4197e4552ea 129 debug("Timeout waiting for v2.x card\n");
pradeepvk2208 0:d4197e4552ea 130 return SDCARD_FAIL;
pradeepvk2208 0:d4197e4552ea 131 }
pradeepvk2208 0:d4197e4552ea 132
pradeepvk2208 0:d4197e4552ea 133 int cmd(int cmd, int arg) {
pradeepvk2208 0:d4197e4552ea 134 cs = 0;
pradeepvk2208 0:d4197e4552ea 135
pradeepvk2208 0:d4197e4552ea 136 // send a command
pradeepvk2208 0:d4197e4552ea 137 spi.write(0x40 | cmd);
pradeepvk2208 0:d4197e4552ea 138 spi.write(arg >> 24);
pradeepvk2208 0:d4197e4552ea 139 spi.write(arg >> 16);
pradeepvk2208 0:d4197e4552ea 140 spi.write(arg >> 8);
pradeepvk2208 0:d4197e4552ea 141 spi.write(arg >> 0);
pradeepvk2208 0:d4197e4552ea 142 spi.write(0x95);
pradeepvk2208 0:d4197e4552ea 143
pradeepvk2208 0:d4197e4552ea 144 // wait for the repsonse (response[7] == 0)
pradeepvk2208 0:d4197e4552ea 145 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
pradeepvk2208 0:d4197e4552ea 146 int response = spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 147 if (!(response & 0x80)) {
pradeepvk2208 0:d4197e4552ea 148 cs = 1;
pradeepvk2208 0:d4197e4552ea 149 spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 150 return response;
pradeepvk2208 0:d4197e4552ea 151 }
pradeepvk2208 0:d4197e4552ea 152 }
pradeepvk2208 0:d4197e4552ea 153 cs = 1;
pradeepvk2208 0:d4197e4552ea 154 spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 155 return -1; // timeout
pradeepvk2208 0:d4197e4552ea 156 }
pradeepvk2208 0:d4197e4552ea 157
pradeepvk2208 0:d4197e4552ea 158
pradeepvk2208 0:d4197e4552ea 159 int cmd58() {
pradeepvk2208 0:d4197e4552ea 160 cs = 0;
pradeepvk2208 0:d4197e4552ea 161 int arg = 0;
pradeepvk2208 0:d4197e4552ea 162
pradeepvk2208 0:d4197e4552ea 163 // send a command
pradeepvk2208 0:d4197e4552ea 164 spi.write(0x40 | 58);
pradeepvk2208 0:d4197e4552ea 165 spi.write(arg >> 24);
pradeepvk2208 0:d4197e4552ea 166 spi.write(arg >> 16);
pradeepvk2208 0:d4197e4552ea 167 spi.write(arg >> 8);
pradeepvk2208 0:d4197e4552ea 168 spi.write(arg >> 0);
pradeepvk2208 0:d4197e4552ea 169 spi.write(0x95);
pradeepvk2208 0:d4197e4552ea 170
pradeepvk2208 0:d4197e4552ea 171 // wait for the repsonse (response[7] == 0)
pradeepvk2208 0:d4197e4552ea 172 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
pradeepvk2208 0:d4197e4552ea 173 int response = spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 174 if (!(response & 0x80)) {
pradeepvk2208 0:d4197e4552ea 175 int ocr = spi.write(0xFF) << 24;
pradeepvk2208 0:d4197e4552ea 176 ocr |= spi.write(0xFF) << 16;
pradeepvk2208 0:d4197e4552ea 177 ocr |= spi.write(0xFF) << 8;
pradeepvk2208 0:d4197e4552ea 178 ocr |= spi.write(0xFF) << 0;
pradeepvk2208 0:d4197e4552ea 179 cs = 1;
pradeepvk2208 0:d4197e4552ea 180 spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 181 return response;
pradeepvk2208 0:d4197e4552ea 182 }
pradeepvk2208 0:d4197e4552ea 183 }
pradeepvk2208 0:d4197e4552ea 184 cs = 1;
pradeepvk2208 0:d4197e4552ea 185 spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 186 return -1; // timeout
pradeepvk2208 0:d4197e4552ea 187 }
pradeepvk2208 0:d4197e4552ea 188
pradeepvk2208 0:d4197e4552ea 189
pradeepvk2208 0:d4197e4552ea 190 int cmd8() {
pradeepvk2208 0:d4197e4552ea 191 cs = 0;
pradeepvk2208 0:d4197e4552ea 192
pradeepvk2208 0:d4197e4552ea 193 // send a command
pradeepvk2208 0:d4197e4552ea 194 spi.write(0x40 | 8); // CMD8
pradeepvk2208 0:d4197e4552ea 195 spi.write(0x00); // reserved
pradeepvk2208 0:d4197e4552ea 196 spi.write(0x00); // reserved
pradeepvk2208 0:d4197e4552ea 197 spi.write(0x01); // 3.3v
pradeepvk2208 0:d4197e4552ea 198 spi.write(0xAA); // check pattern
pradeepvk2208 0:d4197e4552ea 199 spi.write(0x87); // crc
pradeepvk2208 0:d4197e4552ea 200
pradeepvk2208 0:d4197e4552ea 201 // wait for the repsonse (response[7] == 0)
pradeepvk2208 0:d4197e4552ea 202 for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) {
pradeepvk2208 0:d4197e4552ea 203 char response[5];
pradeepvk2208 0:d4197e4552ea 204 response[0] = spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 205 if (!(response[0] & 0x80)) {
pradeepvk2208 0:d4197e4552ea 206 for (int j = 1; j < 5; j++) {
pradeepvk2208 0:d4197e4552ea 207 response[i] = spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 208 }
pradeepvk2208 0:d4197e4552ea 209 cs = 1;
pradeepvk2208 0:d4197e4552ea 210 spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 211 return response[0];
pradeepvk2208 0:d4197e4552ea 212 }
pradeepvk2208 0:d4197e4552ea 213 }
pradeepvk2208 0:d4197e4552ea 214 cs = 1;
pradeepvk2208 0:d4197e4552ea 215 spi.write(0xFF);
pradeepvk2208 0:d4197e4552ea 216 return -1; // timeout
pradeepvk2208 2:aea18e9b89d8 217 }
pradeepvk2208 2:aea18e9b89d8 218
pradeepvk2208 2:aea18e9b89d8 219 uint64_t sd_sectors() {
pradeepvk2208 2:aea18e9b89d8 220 uint32_t c_size, c_size_mult, read_bl_len;
pradeepvk2208 2:aea18e9b89d8 221 uint32_t block_len, mult, blocknr, capacity;
pradeepvk2208 2:aea18e9b89d8 222 uint32_t hc_c_size;
pradeepvk2208 2:aea18e9b89d8 223 uint64_t blocks;
pradeepvk2208 2:aea18e9b89d8 224
pradeepvk2208 2:aea18e9b89d8 225 // CMD9, Response R2 (R1 byte + 16-byte block read)
pradeepvk2208 2:aea18e9b89d8 226 if (cmdx(9, 0) != 0) {
pradeepvk2208 2:aea18e9b89d8 227 debug("Didn't get a response from the disk\n");
pradeepvk2208 2:aea18e9b89d8 228 return 0;
pradeepvk2208 2:aea18e9b89d8 229 }
pradeepvk2208 2:aea18e9b89d8 230
pradeepvk2208 2:aea18e9b89d8 231 uint8_t csd[16];
pradeepvk2208 2:aea18e9b89d8 232 if (read(csd, 16) != 0) {
pradeepvk2208 2:aea18e9b89d8 233 debug("Couldn't read csd response from disk\n");
pradeepvk2208 2:aea18e9b89d8 234 return 0;
pradeepvk2208 2:aea18e9b89d8 235 }
pradeepvk2208 2:aea18e9b89d8 236
pradeepvk2208 2:aea18e9b89d8 237 // csd_structure : csd[127:126]
pradeepvk2208 2:aea18e9b89d8 238 // c_size : csd[73:62]
pradeepvk2208 2:aea18e9b89d8 239 // c_size_mult : csd[49:47]
pradeepvk2208 2:aea18e9b89d8 240 // read_bl_len : csd[83:80] - the *maximum* read block length
pradeepvk2208 2:aea18e9b89d8 241
pradeepvk2208 2:aea18e9b89d8 242 int csd_structure = ext_bits(csd, 127, 126);
pradeepvk2208 2:aea18e9b89d8 243
pradeepvk2208 2:aea18e9b89d8 244 switch (csd_structure) {
pradeepvk2208 2:aea18e9b89d8 245 case 0:
pradeepvk2208 2:aea18e9b89d8 246 cdv = 512;
pradeepvk2208 2:aea18e9b89d8 247 c_size = ext_bits(csd, 73, 62);
pradeepvk2208 2:aea18e9b89d8 248 c_size_mult = ext_bits(csd, 49, 47);
pradeepvk2208 2:aea18e9b89d8 249 read_bl_len = ext_bits(csd, 83, 80);
pradeepvk2208 2:aea18e9b89d8 250
pradeepvk2208 2:aea18e9b89d8 251 block_len = 1 << read_bl_len;
pradeepvk2208 2:aea18e9b89d8 252 mult = 1 << (c_size_mult + 2);
pradeepvk2208 2:aea18e9b89d8 253 blocknr = (c_size + 1) * mult;
pradeepvk2208 2:aea18e9b89d8 254 capacity = blocknr * block_len;
pradeepvk2208 2:aea18e9b89d8 255 blocks = capacity / 512;
pradeepvk2208 2:aea18e9b89d8 256 debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks);
pradeepvk2208 2:aea18e9b89d8 257 break;
pradeepvk2208 2:aea18e9b89d8 258
pradeepvk2208 2:aea18e9b89d8 259 case 1:
pradeepvk2208 2:aea18e9b89d8 260 cdv = 1;
pradeepvk2208 2:aea18e9b89d8 261 hc_c_size = ext_bits(csd, 63, 48);
pradeepvk2208 2:aea18e9b89d8 262 blocks = (hc_c_size+1)*1024;
pradeepvk2208 2:aea18e9b89d8 263 debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks*512, blocks);
pradeepvk2208 2:aea18e9b89d8 264 break;
pradeepvk2208 2:aea18e9b89d8 265
pradeepvk2208 2:aea18e9b89d8 266 default:
pradeepvk2208 2:aea18e9b89d8 267 debug("CSD struct unsupported\r\n");
pradeepvk2208 2:aea18e9b89d8 268 return 0;
pradeepvk2208 2:aea18e9b89d8 269 };
pradeepvk2208 2:aea18e9b89d8 270 return blocks;
pradeepvk2208 2:aea18e9b89d8 271 }
pradeepvk2208 2:aea18e9b89d8 272
pradeepvk2208 2:aea18e9b89d8 273 int cmdx(int cmd, int arg) {
pradeepvk2208 2:aea18e9b89d8 274 cs = 0;
pradeepvk2208 2:aea18e9b89d8 275
pradeepvk2208 2:aea18e9b89d8 276 // send a command
pradeepvk2208 2:aea18e9b89d8 277 spi.write(0x40 | cmd);
pradeepvk2208 2:aea18e9b89d8 278 spi.write(arg >> 24);
pradeepvk2208 2:aea18e9b89d8 279 spi.write(arg >> 16);
pradeepvk2208 2:aea18e9b89d8 280 spi.write(arg >> 8);
pradeepvk2208 2:aea18e9b89d8 281 spi.write(arg >> 0);
pradeepvk2208 2:aea18e9b89d8 282 spi.write(0x95);
pradeepvk2208 2:aea18e9b89d8 283
pradeepvk2208 2:aea18e9b89d8 284 // wait for the repsonse (response[7] == 0)
pradeepvk2208 2:aea18e9b89d8 285 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
pradeepvk2208 2:aea18e9b89d8 286 int response = spi.write(0xFF);
pradeepvk2208 2:aea18e9b89d8 287 if (!(response & 0x80)) {
pradeepvk2208 2:aea18e9b89d8 288 return response;
pradeepvk2208 2:aea18e9b89d8 289 }
pradeepvk2208 2:aea18e9b89d8 290 }
pradeepvk2208 2:aea18e9b89d8 291 cs = 1;
pradeepvk2208 2:aea18e9b89d8 292 spi.write(0xFF);
pradeepvk2208 2:aea18e9b89d8 293 return -1; // timeout
pradeepvk2208 2:aea18e9b89d8 294 }
pradeepvk2208 2:aea18e9b89d8 295
pradeepvk2208 2:aea18e9b89d8 296
pradeepvk2208 2:aea18e9b89d8 297 int read(uint8_t *buffer, uint32_t length) {
pradeepvk2208 2:aea18e9b89d8 298 cs = 0;
pradeepvk2208 2:aea18e9b89d8 299
pradeepvk2208 2:aea18e9b89d8 300 // read until start byte (0xFF)
pradeepvk2208 2:aea18e9b89d8 301 while (spi.write(0xFF) != 0xFE);
pradeepvk2208 2:aea18e9b89d8 302
pradeepvk2208 2:aea18e9b89d8 303 // read data
pradeepvk2208 2:aea18e9b89d8 304 for (int i = 0; i < length; i++) {
pradeepvk2208 2:aea18e9b89d8 305 buffer[i] = spi.write(0xFF);
pradeepvk2208 2:aea18e9b89d8 306 }
pradeepvk2208 2:aea18e9b89d8 307 spi.write(0xFF); // checksum
pradeepvk2208 2:aea18e9b89d8 308 spi.write(0xFF);
pradeepvk2208 2:aea18e9b89d8 309
pradeepvk2208 2:aea18e9b89d8 310 cs = 1;
pradeepvk2208 2:aea18e9b89d8 311 spi.write(0xFF);
pradeepvk2208 2:aea18e9b89d8 312 return 0;
pradeepvk2208 2:aea18e9b89d8 313 }
pradeepvk2208 2:aea18e9b89d8 314
pradeepvk2208 2:aea18e9b89d8 315 static uint32_t ext_bits(unsigned char *data, int msb, int lsb) {
pradeepvk2208 2:aea18e9b89d8 316 uint32_t bits = 0;
pradeepvk2208 2:aea18e9b89d8 317 uint32_t size = 1 + msb - lsb;
pradeepvk2208 2:aea18e9b89d8 318 for (int i = 0; i < size; i++) {
pradeepvk2208 2:aea18e9b89d8 319 uint32_t position = lsb + i;
pradeepvk2208 2:aea18e9b89d8 320 uint32_t byte = 15 - (position >> 3);
pradeepvk2208 2:aea18e9b89d8 321 uint32_t bit = position & 0x7;
pradeepvk2208 2:aea18e9b89d8 322 uint32_t value = (data[byte] >> bit) & 1;
pradeepvk2208 2:aea18e9b89d8 323 bits |= value << i;
pradeepvk2208 2:aea18e9b89d8 324 }
pradeepvk2208 2:aea18e9b89d8 325 return bits;
pradeepvk2208 2:aea18e9b89d8 326 }
pradeepvk2208 2:aea18e9b89d8 327
pradeepvk2208 2:aea18e9b89d8 328 int disk_initialize() {
pradeepvk2208 2:aea18e9b89d8 329 int i = initialise_card();
pradeepvk2208 2:aea18e9b89d8 330 debug_if(SD_DBG, "init card = %d\n", i);
pradeepvk2208 2:aea18e9b89d8 331 sectors = sd_sectors();
pradeepvk2208 2:aea18e9b89d8 332
pradeepvk2208 2:aea18e9b89d8 333 // Set block length to 512 (CMD16)
pradeepvk2208 2:aea18e9b89d8 334 if (cmd(16, 512) != 0) {
pradeepvk2208 2:aea18e9b89d8 335 debug("Set 512-byte block timed out\n");
pradeepvk2208 2:aea18e9b89d8 336 return 1;
pradeepvk2208 2:aea18e9b89d8 337 }
pradeepvk2208 2:aea18e9b89d8 338 else
pradeepvk2208 2:aea18e9b89d8 339 {
pradeepvk2208 3:d4bb1e13a897 340 printf("Hey,block init succesful\n");
pradeepvk2208 2:aea18e9b89d8 341 }
pradeepvk2208 2:aea18e9b89d8 342
pradeepvk2208 2:aea18e9b89d8 343 spi.frequency(1000000); // Set to 1MHz for data transfer
pradeepvk2208 2:aea18e9b89d8 344 return 0;
pradeepvk2208 2:aea18e9b89d8 345 }
pradeepvk2208 2:aea18e9b89d8 346
pradeepvk2208 3:d4bb1e13a897 347 int disk_write(const uint8_t *buffer, uint64_t block_number)
pradeepvk2208 3:d4bb1e13a897 348
pradeepvk2208 3:d4bb1e13a897 349 {
pradeepvk2208 3:d4bb1e13a897 350 // set write address for single block (CMD24)
pradeepvk2208 3:d4bb1e13a897 351 if (cmd(24, block_number * cdv) != 0) {
pradeepvk2208 3:d4bb1e13a897 352 return 1;
pradeepvk2208 3:d4bb1e13a897 353 }
pradeepvk2208 3:d4bb1e13a897 354
pradeepvk2208 3:d4bb1e13a897 355 // send the data block
pradeepvk2208 3:d4bb1e13a897 356 write(buffer, 512);
pradeepvk2208 3:d4bb1e13a897 357 printf("Written Successfully bro \n");
pradeepvk2208 3:d4bb1e13a897 358 return 0;
pradeepvk2208 3:d4bb1e13a897 359 }
pradeepvk2208 3:d4bb1e13a897 360
pradeepvk2208 3:d4bb1e13a897 361 int write(const uint8_t*buffer, uint32_t length) {
pradeepvk2208 3:d4bb1e13a897 362 cs = 0;
pradeepvk2208 3:d4bb1e13a897 363
pradeepvk2208 3:d4bb1e13a897 364 // indicate start of block
pradeepvk2208 3:d4bb1e13a897 365 spi.write(0xFE);
pradeepvk2208 3:d4bb1e13a897 366
pradeepvk2208 3:d4bb1e13a897 367 // write the data
pradeepvk2208 3:d4bb1e13a897 368 for (int i = 0; i < length; i++) {
pradeepvk2208 3:d4bb1e13a897 369 spi.write(buffer[i]);
pradeepvk2208 3:d4bb1e13a897 370 }
pradeepvk2208 3:d4bb1e13a897 371
pradeepvk2208 3:d4bb1e13a897 372 // write the checksum
pradeepvk2208 3:d4bb1e13a897 373 spi.write(0xFF);
pradeepvk2208 3:d4bb1e13a897 374 spi.write(0xFF);
pradeepvk2208 3:d4bb1e13a897 375
pradeepvk2208 3:d4bb1e13a897 376 // check the response token
pradeepvk2208 3:d4bb1e13a897 377 if ((spi.write(0xFF) & 0x1F) != 0x05) {
pradeepvk2208 3:d4bb1e13a897 378 cs = 1;
pradeepvk2208 3:d4bb1e13a897 379 spi.write(0xFF);
pradeepvk2208 3:d4bb1e13a897 380 return 1;
pradeepvk2208 3:d4bb1e13a897 381 }
pradeepvk2208 3:d4bb1e13a897 382
pradeepvk2208 3:d4bb1e13a897 383 // wait for write to finish
pradeepvk2208 3:d4bb1e13a897 384 while (spi.write(0xFF) == 0);
pradeepvk2208 3:d4bb1e13a897 385
pradeepvk2208 3:d4bb1e13a897 386 cs = 1;
pradeepvk2208 3:d4bb1e13a897 387 spi.write(0xFF);
pradeepvk2208 3:d4bb1e13a897 388 return 0;
pradeepvk2208 3:d4bb1e13a897 389 }
pradeepvk2208 3:d4bb1e13a897 390