roneos
Operating System for the r-one robot
 All Data Structures Files Functions Variables Typedefs Groups
sd_card.h
1 /*
2  * sd_card.h
3  *
4  * Created on: Jun 28, 2011
5  * Author: Jeremy Hunt and Nathan Alison
6  */
7 
8 #ifndef SD_CARD_H_
9 #define SD_CARD_H_
10 
11 // The Card Specific Data structure for V1 SD cards
12 struct SDCardCSDSDV1 {
13  uint8 CSD_STRUCTURE : 2;
14  uint8 : 6;
15  uint8 TAAC : 8;
16  uint8 NSAC : 8;
17  uint8 TRAN_SPEED : 8;
18  uint16 CCC : 12;
19  uint8 READ_BL_LEN : 4;
20  boolean READ_BL_PARTIAL : 1;
21  boolean WRITE_BLK_MISALIGN : 1;
22  boolean READ_BLK_MISALIGN : 1;
23  boolean DSR_IMP : 1;
24  uint8 : 2;
25  uint16 C_SIZE : 12;
26  uint8 VDD_R_CURR_MIN : 3;
27  uint8 VDD_R_CURR_MAX : 3;
28  uint8 VDD_W_CURR_MIN : 3;
29  uint8 VDD_W_CURR_MAX : 3;
30  uint8 C_SIZE_MULT : 3;
31  boolean ERASE_BLK_EN : 1;
32  uint8 SECTOR_SIZE : 7;
33  uint8 WP_GRP_SIZE : 7;
34  boolean WP_GRP_ENABLE : 1;
35  uint8 : 2;
36  uint8 R2W_FACTOR : 3;
37  uint8 WRITE_BL_LEN : 4;
38  boolean WRITE_BL_PARTIAL : 1;
39  uint8 : 5;
40  uint8 FILE_FORMAT_GRP : 1;
41  boolean COPY : 1;
42  boolean PERM_WRITE_PROTECT : 1;
43  boolean TMP_WRITE_PROTECT : 1;
44  uint8 FILE_FORMAT : 2;
45  uint8 : 2;
46  uint8 CRC : 7;
47  uint8 : 1;
48 };
49 
50 // The Card Specific Data Structure for V2 SD Cards
51 struct SDCardCSDSDV2 {
52  uint8 CSD_STRUCTURE : 2;
53  uint8 TRAN_SPEED : 8;
54  uint16 CCC : 12;
55  uint8 DSR_IMP : 1;
56  uint32 C_SIZE : 22;
57  uint8 COPY : 1;
58  uint8 PERM_WRITE_PROTECT : 1;
59  uint8 TMP_WRITE_PROTECT : 1;
60  uint8 CRC : 7;
61 };
62 
63 typedef struct SDCardCSDSDV1 SDCardCSDSDV1;
64 typedef struct SDCardCSDSDV2 SDCardCSDSDV2;
65 
66 
67 /* Base SD Card Parameters */
68 #define SD_CARD_DEFAULT_FREQUENCY 350000
69 #define SD_CARD_INIT_FREQUENCY 350000
70 // Note that this fast frequency can probably go up to 20 MHz or higher, but this should work for all MMC/SD cards.
71 // ALthough this may be as fast as it can go
72 #define SD_CARD_FAST_FREQUENCY 12500000
73 // This is to allow non-byte aligned cards to synchronize with this system.
74 // This is the speed of the synchronization clock. Lower is faster.
75 #define SD_CARD_SYNCHRONIZE_WAIT 3
76 /*
77  * This defines which voltage ranges must be defined to work on the robot
78  * Currently set to 3.0V-3.5V
79  * Bit | Range
80  * 0-14 reserved
81  * 15 2.7-2.8
82  * 16 2.8-2.9
83  * 17 2.9-3.0
84  * 18 3.0-3.1
85  * 19 3.1-3.2
86  * 20 3.2-3.3
87  * 21 3.3-3.4
88  * 22 3.4-3.5
89  * 23 3.5-3.6
90  */
91 #define SD_CARD_MIN_VOLTAGE_RANGE 0x007C0000
92 // The length of each sector. Do not change this from 512 bytes if you want to maintain support with V2+ cards
93 #define SD_CARD_SECTOR_LEN 512
94 // The length of a block erase
95 #define SD_CARD_ERASE_BLOCK_LEN 128 /* In number of sectors */
96 
97 // Do we support (0x40000000) or not support (0x00) high capacity cards
98 #define SD_CARD_HCS 0x40000000 /* This code supports high capacity cards */
99 
100 // R1 Response Bits
101 #define SD_CARD_R1_OK 0x00
102 #define SD_CARD_R1_IDLE 0x01
103 #define SD_CARD_R1_ERASE_RST 0x02
104 #define SD_CARD_R1_ILLEGAL_CMD 0x04
105 #define SD_CARD_R1_CMD_CRC_ERROR 0x08
106 #define SD_CARD_R1_ERASE_SEQ_ERROR 0x10
107 #define SD_CARD_R1_ADDRESS_ERROR 0x20
108 #define SD_CARD_R1_PARAMETER_ERROR 0x40
109 
110 // Response Tokens
111 #define SD_CARD_READ_TOKEN 0xFE
112 #define SD_CARD_WRITE_BLOCK_TOKEN 0xFE
113 #define SD_CARD_WRITE_DATA_TOKEN 0xFC
114 #define SD_CARD_STOP_TRANS_TOKEN 0xFD
115 #define SD_CARD_WRITE_RESPONSE_OK 0x05
116 
117 // Operating Condition Register Bits
118 #define SD_CARD_OCD_CCS_BIT 0x40000000 /* Card Capacity Status Bit */
119 #define SD_CARD_OCD_POWER_ON_BIT 0x80000000 /* Fully initialized on bit */
120 
121 // SD Card Types
122 #define SD_CARD_TYPE_UNKNOWN 0
123 #define SD_CARD_TYPE_V1_SDSC 1 /* Older SD cards <=2 GB using the V1.0 Specs */
124 #define SD_CARD_TYPE_V2_SDSC 2 /* Newer small capcity (<=2 GB) using the V2.0+ Specs */
125 #define SD_CARD_TYPE_V2_SDHC_SDXC 3 /* Cards in the 4GB <= Capacity <= 32GB range using the V2.0+ Specs and Cards in the 32GB <= Capacity <= 2 TB range using the V2.0+ Specs */
126 
127 // Results of disk functions
128 #define SD_CARD_RESPONSE_OK 0 /* Successful */
129 #define SD_CARD_RESPONSE_ERROR 1 /* R/W Error */
130 #define SD_CARD_RESPONSE_WRPRT 2 /* Write Protected */
131 #define SD_CARD_RESPONSE_NOTRDY 3 /* Not Ready */
132 #define SD_CARD_RESPONSE_PARERR 4 /* Invalid Parameter */
133 
134 // SD Card Error Result Bits
135 /* Results of Disk Functions */
136 typedef enum {
137  SD_CARD_RESULT_OK = 0, /* The function succeeded. */
138  SD_CARD_RESULT_ERROR, /* Any hard error occured during the write operation and could not recover it. */
139  SD_CARD_RESULT_WRPRT, /* The medium is write protected. */
140  SD_CARD_RESULT_NOTRDY, /* The disk drive has not been initialized. */
141  SD_CARD_RESULT_PARERR, /* Invalid Parameter */
142  SD_CARD_RESULT_BAD_CRC, /* The received CRC is incorrect */
143 } SDCardResult;
144 
145 // Timeouts in number of attempts
146 #define SD_CARD_CMD_TIMEOUT 10 /* In bytes */
147 #define SD_CARD_CMD_RETRY_TIMEOUT 3 /* In number of attempts */
148 #define SD_CARD_INIT_TIMEOUT 2 /* In number of CMD0s sent */
149 #define SD_CARD_IDLE_WAIT_TIMEOUT 4000 /* Apparently, some cards can take a long time to initialize. This is about 1 Second */
150 #define SD_CARD_READ_TIMEOUT 7500 /* This is number of bytes. */
151 #define SD_CARD_BUSY_TIMEOUT 1200000 /* In number of bytes. SD cards take a loooong time... About 0.7 Seconds at 12.5MHz */
152 
153 /* Disk Status Bits */
154 #define SD_CARD_STATUS_OK 0x00 /* The SD Card is fine */
155 #define SD_CARD_STATUS_NOINIT 0x01 /* Drive not initialized */
156 #define SD_CARD_STATUS_NO_RESPONSE 0x02 /* No Response from the SD Card */
157 #define SD_CARD_STATUS_BAD_RESPONSE 0x04 /* The card gave an incorrect command response */
158 #define SD_CARD_STATUS_PROTECT 0x08 /* Write protected */
159 #define SD_CARD_STATUS_NOT_SUPPORTED 0x10 /* This SD card is not supported */
160 
161 
162 /* Definitions for SD Card command */
163 #define SD_CARD_CMD0 (0x40+0) /* GO_IDLE_STATE */
164 #define SD_CARD_CMD1 (0x40+1) /* SEND_OP_COND */
165 #define SD_CARD_CMD8 (0x40+8) /* SEND_IF_COND */
166 #define SD_CARD_CMD9 (0x40+9) /* SEND_CSD */
167 #define SD_CARD_CMD10 (0x40+10) /* SEND_CID */
168 #define SD_CARD_CMD12 (0x40+12) /* STOP_TRANSMISSION */
169 #define SD_CARD_CMD16 (0x40+16) /* SET_BLOCKLEN */
170 #define SD_CARD_CMD17 (0x40+17) /* READ_SINGLE_BLOCK */
171 #define SD_CARD_CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */
172 #define SD_CARD_ACMD23 (0x40+23) /* SET_BLOCK_COUNT */
173 #define SD_CARD_CMD24 (0x40+24) /* WRITE_BLOCK */
174 #define SD_CARD_CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */
175 #define SD_CARD_ACMD41 (0x40+41) /* SEND_OP_COND (ACMD) */
176 #define SD_CARD_CMD55 (0x40+55) /* APP_CMD */
177 #define SD_CARD_CMD58 (0x40+58) /* READ_OCR */
178 
179 /* Response Types */
180 #define SD_CARD_R1 0
181 #define SD_CARD_R1B 1
182 #define SD_CARD_R2 2
183 #define SD_CARD_R3 3
184 #define SD_CARD_R6 4
185 #define SD_CARD_R7 5
186 
187 /* Definitions for MMC/SDC command Responses*/
188 #define SD_CARD_CMD0_R SD_CARD_R1 /* GO_IDLE_STATE */
189 #define SD_CARD_CMD1_R SD_CARD_R1 /* SEND_OP_COND */
190 #define SD_CARD_CMD8_R SD_CARD_R7 /* SEND_IF_COND */
191 #define SD_CARD_CMD9_R SD_CARD_R1 /* SEND_CSD */
192 #define SD_CARD_CMD10_R SD_CARD_R1 /* SEND_CID */
193 #define SD_CARD_CMD12_R SD_CARD_R1B /* STOP_TRANSMISSION */
194 #define SD_CARD_CMD16_R SD_CARD_R1 /* SET_BLOCKLEN */
195 #define SD_CARD_CMD17_R SD_CARD_R1 /* READ_SINGLE_BLOCK */
196 #define SD_CARD_CMD18_R SD_CARD_R1 /* READ_MULTIPLE_BLOCK */
197 #define SD_CARD_ACMD23_R SD_CARD_R1 /* SET_BLOCK_COUNT */
198 #define SD_CARD_CMD24_R SD_CARD_R1 /* WRITE_BLOCK */
199 #define SD_CARD_CMD25_R SD_CARD_R1 /* WRITE_MULTIPLE_BLOCK */
200 #define SD_CARD_ACMD41_R SD_CARD_R1 /* SEND_OP_COND (ACMD) */
201 #define SD_CARD_CMD55_R SD_CARD_R1 /* APP_CMD */
202 #define SD_CARD_CMD58_R SD_CARD_R3 /* READ_OCR */
203 
204 
205 uint32 SDCardGetFrequency(void);
206 uint8 SDCardInit(void);
207 boolean SDCardWaitIdle(boolean selectCard);
208 boolean SDCardReadCSDSDV2(SDCardCSDSDV2 *CSDStruct, boolean selectCard);
209 boolean SDCardReadCSDSDV1(SDCardCSDSDV1 *CSDStruct, boolean selectCard);
210 uint8 SDCardRecvSPI(void);
211 boolean SDCardRecvDatablock(uint8 * buff, uint16 blockLen, uint16 * crcPtr, boolean littleEndian);
212 boolean SDCardXmitDatablock(const uint8 *buff, uint8 token);
213 boolean SDCardSendCmd(uint8 cmd, uint8 responseType, uint32 argument, uint8 * response, boolean selectCard);
214 boolean SDCardSendAcmd(uint8 acmd, uint8 responseType, uint32 argument, uint8 * response, boolean selectCard);
215 boolean SDCardSendCmdOnce(uint8 cmd, uint8 responseType, uint32 argument, uint8 * response, boolean selectCard);
216 uint8 SDCardGetStatus(void);
217 uint8 SDCardGetType(void);
218 uint8 SDCardRead(uint8 *buff, uint32 sector, uint8 count) ;
219 uint8 SDCardWrite(const uint8 *buff, uint32 sector, uint8 count);
220 boolean SDCardReadCSD(uint8 * CSDRaw, boolean selectCard);
221 boolean SDCardProcessCSDSDV1(uint8 * CSDRaw, SDCardCSDSDV1 *CSDStruct);
222 boolean SDCardProcessCSDSDV2(uint8 * CSDRaw, SDCardCSDSDV2 *CSDStruct);
223 
224 
225 #endif /* SD_CARD_H_ */