Moved insertion check and write protection check to functions.

This commit is contained in:
Mario Hüttel 2016-09-27 15:21:48 +02:00
parent 9c8eb5cc41
commit 1004efa300

View File

@ -42,23 +42,29 @@ int SDIO_send_CMD3(uint16_t* rca);
int SDIO_send_CMD0();
CMD8_RESP_t SDIO_send_CMD8();
void initDetectandProtectionPins();
int checkNotInserted(); // Returns 0 if inserted!
int checkWriteProtection(); // returns 0 if write protected
//BYTE rxtxbuffer[1<<BLOCKSIZE]; //Data RX and TX Buffer not needed anymore. thanks to DMA
SDInfo_t cardInfo; // = {.type = CARD_NONE};
DSTATUS SDIO_status(){
#if SDIO_ENABLE_INS==1
if (!((INS_PORT->IDR & INS_PIN) == INS_ACTIVE_LEVEL))
return STA_NODISK;
#endif /* SDIO_ENABLE_INS */
if (cardInfo.type == CARD_NONE) {
return STA_NOINIT;
DSTATUS returnval = 0;
if (checkNotInserted()) {
returnval |= STA_NODISK;
}
#if SDIO_ENABLE_WRITEPROT==1
if (!((WRITEPROT_PORT->IDR & WRITEPROT_PIN) == WRITEPROT_ACTIVE_LEVEL))
return STA_PROTECT;
#endif /* SDIO_ENABLE_WRITEPROT */
return 0;
if (cardInfo.type == CARD_NONE) {
returnval |= STA_NOINIT;
}
if (checkWriteProtection()) {
returnval |= STA_PROTECT;
}
return returnval;
}
DSTATUS SDIO_initialize(){
CMD8_RESP_t res8;
ACMD41_RESP_t resa41;
@ -68,20 +74,14 @@ DSTATUS SDIO_initialize(){
SDIO_InitModule();
initDetectandProtectionPins();
#if SDIO_ENABLE_WRITEPROT==1
WRITEPROT_PORT->PUPDR |= ((WRITEPROT_PULLUP ? 1 : 0)<<WRITEPROT_PIN*2);
#endif /* SDIO_ENABLE_WRITEPROT */
#if SDIO_ENABLE_INS==1
INS_PORT->PUPDR |= ((INS_PULLUP? 1 : 0)<<INS_PIN*2);
#endif /* SDIO_ENABLE_INS */
__DSB();
#if SDIO_ENABLE_INS==1
if (!((INS_PORT->IDR & INS_PIN) == INS_ACTIVE_LEVEL))
return STA_NODISK;
#endif /* SDIO_ENABLE_INS */
if (checkNotInserted()) {
return STA_NOINIT | STA_NODISK;
}
SDIO_send_CMD0();
res8 = SDIO_send_CMD8();
@ -126,10 +126,9 @@ DSTATUS SDIO_initialize(){
//TODO: Set 4 bit mode
//TODO:
#if SDIO_ENABLE_WRITEPROT==1
if (!((WRITEPROT_PORT->IDR & WRITEPROT_PIN) == WRITEPROT_ACTIVE_LEVEL))
if (checkWriteProtection()) {
return STA_PROTECT;
#endif /* SDIO_ENABLE_WRITEPROT */
} else
return 0;
}
DRESULT SDIO_disk_read(BYTE *buff, DWORD sector, UINT count){
@ -236,7 +235,7 @@ int SDIO_getResp(uint8_t expectedCMD, uint8_t typeOfAns, uint32_t *responseBuffe
while (1) {
if (SDIO->STA & SDIO_STA_CMDREND) break; //Correct Respone Received
//Exclude ACMD41 from valid CRC check
//Exclude ACMD41 and CMD2 from valid CRC check
if ((SDIO->STA & SDIO_STA_CCRCFAIL)) {
if(expectedCMD == 0x3f) {
//This command does not have a CRC...Doushite....
@ -356,3 +355,29 @@ CMD8_RESP_t SDIO_send_CMD8() {
}while(retry-- > 0);
return CMD8_RESP_TIMEOUT;
}
void initDetectandProtectionPins() {
#if SDIO_ENABLE_WRITEPROT==1
WRITEPROT_PORT->PUPDR |= ((WRITEPROT_PULLUP ? 1 : 0)<<WRITEPROT_PIN*2);
#endif /* SDIO_ENABLE_WRITEPROT */
#if SDIO_ENABLE_INS==1
INS_PORT->PUPDR |= ((INS_PULLUP? 1 : 0)<<INS_PIN*2);
#endif /* SDIO_ENABLE_INS */
__DSB();
}
int checkNotInserted() {
#if SDIO_ENABLE_INS
return ((INS_PORT->IDR & INS_PIN) == INS_ACTIVE_LEVEL ? 0 : 1);
#else
return 0; // Assume Card is inserted
#endif
}
int checkWriteProtection() {
#if SDIO_ENABLE_WRITEPROT
return ((WRITEPROT_PORT->IDR & WRITEPROT_PIN) == WRITEPROT_ACTIVE_LEVEL ? 1 : 0);
#else
return 0; // Assume Card is not write protected
#endif
}