rendered paste body@@ -467,21 +511,37 @@
unsigned int dummy;
unsigned int response;
unsigned int i;
- tSDCardInfo *card = &card_info[current_card];
-
+ tSDCardInfo *card;
+
/* TODO: Add DMA support. */
-#ifdef HAVE_MULTIVOLUME
- (void)drive; /* unused for now */
-#endif
mutex_lock(&sd_mtx);
+ ata_enable(true);
+ ata_led(true);
+
+ if(drive && (GPIOA_INPUT_VAL & 0x80)) /* no external sd-card inserted */
+ {
+ ret = -9;
+ goto error;
+ }
+
+ if((drive != current_card) || !card_info[drive].initialized)
+ {
+ current_card = drive;
+ sd_init_device(drive);
+ }
+
+ card = &card_info[current_card];
+ if (!card->initialized)
+ {
+ ret = -9;
+ goto error;
+ }
+
last_disk_activity = current_tick;
spinup_start = current_tick;
- ata_enable(true);
- ata_led(true);
-
timeout = current_tick + READ_TIMEOUT;
/* TODO: Select device */
@@ -529,6 +589,9 @@
sd_wait_for_state(card, TRAN);
break;
}
+
+ error:
+
ata_led(false);
ata_enable(false);
@@ -551,11 +614,35 @@
int ret = 0;
unsigned int i;
long timeout;
- tSDCardInfo *card = &card_info[current_card];
+ tSDCardInfo *card;
mutex_lock(&sd_mtx);
+
ata_enable(true);
ata_led(true);
+
+ if(drive && (GPIOA_INPUT_VAL & 0x80)) /* no external sd-card inserted */
+ {
+ ret = -9;
+ goto error;
+ }
+
+ if((drive != current_card) || !card_info[drive].initialized)
+ {
+ current_card = drive;
+ sd_init_device(drive);
+ }
+
+ card = &card_info[current_card];
+ if (!card->initialized)
+ {
+ ret = -9;
+ goto error;
+ }
+
+
+ card = &card_info[current_card];
+
if(current_card == 0)
{
if(start < BLOCKS_PER_BANK)