📄 sdmmc_spi.lst
字号:
160 // Cmd12 MCI + SPI
161 #define AT91C_STOP_TRANSMISSION_CMD (12)
162 // Cmd13 MCI + SPI
163 #define AT91C_SEND_STATUS_CMD (13)
164 // Cmd15 MCI
165 //#define AT91C_GO_INACTIVE_STATE_CMD (15)
166 // Cmd58 SPI
167 #define AT91C_READ_OCR_CMD (58)
168 // Cmd59 SPI
169 #define AT91C_CRC_ON_OFF_CMD (59)
170 //#define AT91C_MMC_ALL_SEND_CID_CMD (2)
171 //#define AT91C_MMC_SET_RELATIVE_ADDR_CMD (3)
172 //#define AT91C_MMC_READ_DAT_UNTIL_STOP_CMD (11)
173 //#define AT91C_STOP_TRANSMISSION_SYNC_CMD (12)
174
175 //*------------------------------------------------
176 //* Class 2 commands: Block oriented Read commands
177 //*------------------------------------------------
178 // Cmd16
179 #define AT91C_SET_BLOCKLEN_CMD (16)
180 // Cmd17
181 #define AT91C_READ_SINGLE_BLOCK_CMD (17)
182 // Cmd18
183 #define AT91C_READ_MULTIPLE_BLOCK_CMD (18)
184
185 //*------------------------------------------------
186 //* Class 4 commands: Block oriented write commands
187 //*------------------------------------------------
188 // Cmd24
189 #define AT91C_WRITE_BLOCK_CMD (24)
190 // Cmd25
191 #define AT91C_WRITE_MULTIPLE_BLOCK_CMD (25)
192 // Cmd27
193 //#define AT91C_PROGRAM_CSD_CMD (27)
194
195 //*----------------------------------------
196 //* Class 5 commands: Erase commands
197 //*----------------------------------------
198 // Cmd32
199 //#define AT91C_TAG_SECTOR_START_CMD (32)
200 // Cmd33
201 //#define AT91C_TAG_SECTOR_END_CMD (33)
202 // Cmd38
203 //#define AT91C_ERASE_CMD (38)
204
205 //*----------------------------------------
206 //* Class 7 commands: Lock commands
207 //*----------------------------------------
208 // Cmd42
209 //#define AT91C_LOCK_UNLOCK (42)
210
211 //*-----------------------------------------------
212 // Class 8 commands: Application specific commands
213 //*-----------------------------------------------
214 // Cmd55
215 #define AT91C_APP_CMD (55)
216 // cmd 56
217 //#define AT91C_GEN_CMD (56)
218 // ACMD6
219 #define AT91C_SDCARD_SET_BUS_WIDTH_CMD (6)
220 // ACMD13
221 //#define AT91C_SDCARD_STATUS_CMD (13)
222 // ACMD22
223 //#define AT91C_SDCARD_SEND_NUM_WR_BLOCKS_CMD (22)
224 // ACMD23
225 //#define AT91C_SDCARD_SET_WR_BLK_ERASE_COUNT_CMD (23)
226 // ACMD41
227 #define AT91C_SDCARD_APP_OP_COND_CMD (41)
228 // ACMD42
229 //#define AT91C_SDCARD_SET_CLR_CARD_DETECT_CMD (42)
230 // ACMD51
231 #define AT91C_SDCARD_SEND_SCR_CMD (51)
232
233 //------------------------------------------------------------------------------
234 // Local functions
235 //------------------------------------------------------------------------------
236
237 //------------------------------------------------------------------------------
238 /// Sends the current SD card driver command to the card.
239 /// Returns 0 if successful; Otherwise, returns the transfer status code or
240 /// SD_ERROR_DRIVER if there was a problem with the SD transfer.
241 /// \param pSd Pointer to a SdCard driver instance.
242 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
243 static unsigned char SendCommand(SdCard *pSd)
244 {
\ SendCommand:
\ 00000000 38402DE9 PUSH {R3-R5,LR}
245 SdCmd *pCommand = &(pSd->command);
\ 00000004 044080E2 ADD R4,R0,#+4
246 SdDriver *pSdDriver = pSd->pSdDriver;
\ 00000008 005090E5 LDR R5,[R0, #+0]
247 unsigned char error;
248 unsigned int i;
249
250 // Send command
251 SDSPI_NCS((SdSpi *)pSdDriver);
\ 0000000C 0500A0E1 MOV R0,R5
\ 00000010 ........ BL SDSPI_NCS
252
253 error = SDSPI_SendCommand((SdSpi *)pSdDriver, (SdSpiCmd *)pCommand);
\ 00000014 0410A0E1 MOV R1,R4
\ 00000018 0500A0E1 MOV R0,R5
\ 0000001C ........ BL SDSPI_SendCommand
\ 00000020 0010B0E1 MOVS R1,R0
254 if (error) {
\ 00000024 0300000A BEQ ??SendCommand_0
255 TRACE_ERROR("SPI SendCommand: Failed to send command (%d)\n\r", error);
\ 00000028 54009FE5 LDR R0,??SendCommand_1 ;; `?<Constant "-E- SPI SendCommand: ...">`
\ 0000002C ........ BL printf
256 return SD_ERROR_DRIVER;
\ 00000030 0100A0E3 MOV R0,#+1
\ 00000034 110000EA B ??SendCommand_2
257 }
258
259 // Wait for command to complete
260 while (!SDSPI_IsTxComplete((SdSpiCmd *)pCommand));
\ ??SendCommand_0:
\ 00000038 0400A0E1 MOV R0,R4
\ 0000003C ........ BL SDSPI_IsTxComplete
\ 00000040 000050E3 CMP R0,#+0
\ 00000044 FBFFFF0A BEQ ??SendCommand_0
261 if(pCommand->cmd == AT91C_STOP_TRANSMISSION_CMD) {
\ 00000048 040094E5 LDR R0,[R4, #+4]
\ 0000004C 0C0050E3 CMP R0,#+12
\ 00000050 0900001A BNE ??SendCommand_3
262 if( 1 == SDSPI_Wait((SdSpi *)pSdDriver, 2) ) {
\ 00000054 0210A0E3 MOV R1,#+2
\ 00000058 0500A0E1 MOV R0,R5
\ 0000005C ........ BL SDSPI_Wait
\ 00000060 010050E3 CMP R0,#+1
263 TRACE_ERROR("SPI \n\r");
\ 00000064 1C009F05 LDREQ R0,??SendCommand_1+0x4 ;; `?<Constant "-E- SPI \\n\\r">`
\ 00000068 ........ BLEQ printf
264 }
265 while (SDSPI_WaitDataBusy((SdSpi *)pSdDriver) == 1);
\ ??SendCommand_4:
\ 0000006C 0500A0E1 MOV R0,R5
\ 00000070 ........ BL SDSPI_WaitDataBusy
\ 00000074 010050E3 CMP R0,#+1
\ 00000078 FBFFFF0A BEQ ??SendCommand_4
266 }
267
268 // Delay between sending commands, only for MMC card test.
269 if((pSd->cardType == CARD_MMC)
270 ||(pSd->cardType == UNKNOWN_CARD)
271 ||(pSd->cardType == CARD_SD)) {
272
273 for(i=0; i < MMC_DELAY; i++);
274 }
275
276 return pCommand->status;
\ ??SendCommand_3:
\ 0000007C 0000D4E5 LDRB R0,[R4, #+0]
\ ??SendCommand_2:
\ 00000080 ........ B ??Subroutine6_0
\ ??SendCommand_1:
\ 00000084 ........ DC32 `?<Constant "-E- SPI SendCommand: ...">`
\ 00000088 ........ DC32 `?<Constant "-E- SPI \\n\\r">`
277 }
\ In section .text, align 4, keep-with-next
\ ??Subroutine6_0:
\ 00000000 3240BDE8 POP {R1,R4,R5,LR}
\ 00000004 1EFF2FE1 BX LR ;; return
278
279 //------------------------------------------------------------------------------
280 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
281 void DecodeR1(unsigned char R1)
282 {
283 if( (R1 & R1_SPI_IDLE)==R1_SPI_IDLE) {
284 TRACE_DEBUG("R1_SPI_IDLE\n\r");
285 }
286 if( (R1 & R1_SPI_ERASE_RESET)==R1_SPI_ERASE_RESET) {
287 TRACE_DEBUG("R1_SPI_ERASE_RESET\n\r");
288 }
289 if( (R1 & R1_SPI_ILLEGAL_COMMAND)==R1_SPI_ILLEGAL_COMMAND) {
290 TRACE_DEBUG("R1_SPI_ILLEGAL_COMMAND\n\r");
291 }
292 if( (R1 & R1_SPI_COM_CRC)==R1_SPI_COM_CRC) {
293 TRACE_DEBUG("R1_SPI_COM_CRC\n\r");
294 }
295 if( (R1 & R1_SPI_ERASE_SEQ)==R1_SPI_ERASE_SEQ) {
296 TRACE_DEBUG("R1_SPI_ERASE_SEQ\n\r");
297 }
298 if( (R1 & R1_SPI_ADDRESS)==R1_SPI_ADDRESS) {
299 TRACE_DEBUG("R1_SPI_ADDRESS\n\r");
300 }
301 if( (R1 & R1_SPI_PARAMETER)==R1_SPI_PARAMETER) {
302 TRACE_DEBUG("R1_SPI_PARAMETER\n\r");
303 }
304 }
\ DecodeR1:
\ 00000000 1EFF2FE1 BX LR ;; return
305
306 //------------------------------------------------------------------------------
307 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
308 void DecodeR2(unsigned char R2)
309 {
310 if( (R2 & R2_SPI_CARD_LOCKED)==R2_SPI_CARD_LOCKED) {
311 TRACE_DEBUG("R2_SPI_CARD_LOCKED\n\r");
312 }
313 if( (R2 & R2_SPI_WP_ERASE_SKIP)==R2_SPI_WP_ERASE_SKIP) {
314 TRACE_DEBUG("R2_SPI_WP_ERASE_SKIP/R2_SPI_LOCK_UNLOCK_FAIL\n\r");
315 }
316 if( (R2 & R2_SPI_ERROR)==R2_SPI_ERROR) {
317 TRACE_DEBUG("R2_SPI_ERROR\n\r");
318 }
319 if( (R2 & R2_SPI_CC_ERROR)==R2_SPI_CC_ERROR) {
320 TRACE_DEBUG("R2_SPI_CC_ERROR\n\r");
321 }
322 if( (R2 & R2_SPI_CARD_ECC_ERROR)==R2_SPI_CARD_ECC_ERROR) {
323 TRACE_DEBUG("R2_SPI_CARD_ECC_ERROR\n\r");
324 }
325 if( (R2 & R2_SPI_WP_VIOLATION)==R2_SPI_WP_VIOLATION) {
326 TRACE_DEBUG("R2_SPI_WP_VIOLATION\n\r");
327 }
328 if( (R2 & R2_SPI_ERASE_PARAM)==R2_SPI_ERASE_PARAM) {
329 TRACE_DEBUG("R2_SPI_ERASE_PARAM\n\r");
330 }
331 if( (R2 & R2_SPI_OUT_OF_RANGE)==R2_SPI_OUT_OF_RANGE) {
332 TRACE_DEBUG("R2_SPI_OUT_OF_RANGE/R2_SPI_CSD_OVERWRITE\n\r");
333 }
334 }
\ DecodeR2:
\ 00000000 1EFF2FE1 BX LR ;; return
335
336 //------------------------------------------------------------------------------
337 /// Check SPI mode response 1.
338 /// Returns 0 if no error; Otherwise, returns error.
339 /// \param pResp Pointer to response token.
340 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -