nlknlknln

Dependencies:   mbed

Fork of raw_sd_card_readsaswell by Pradeep Kotipalli

Committer:
pradeepvk2208
Date:
Sat Jun 13 10:30:01 2015 +0000
Revision:
5:e13062be9e7b
Parent:
4:003e6dfc288d
Child:
6:09923c817679
nnoioi

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