diff options
Diffstat (limited to 'firmware/drivers/ata_mmc.c')
-rw-r--r-- | firmware/drivers/ata_mmc.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c index 9c2e5817f9..6876ce0ec9 100644 --- a/firmware/drivers/ata_mmc.c +++ b/firmware/drivers/ata_mmc.c | |||
@@ -103,6 +103,12 @@ static unsigned char delayed_sector[SECTOR_SIZE]; | |||
103 | static int delayed_sector_num; | 103 | static int delayed_sector_num; |
104 | 104 | ||
105 | static enum { | 105 | static enum { |
106 | MMC_UNKNOWN, | ||
107 | MMC_UNTOUCHED, | ||
108 | MMC_TOUCHED | ||
109 | } mmc_status = MMC_UNKNOWN; | ||
110 | |||
111 | static enum { | ||
106 | SER_POLL_WRITE, | 112 | SER_POLL_WRITE, |
107 | SER_POLL_READ, | 113 | SER_POLL_READ, |
108 | SER_DISABLED | 114 | SER_DISABLED |
@@ -429,6 +435,8 @@ static int initialize_card(int card_no) | |||
429 | 10000000, 100000000, 1000000000 | 435 | 10000000, 100000000, 1000000000 |
430 | }; | 436 | }; |
431 | 437 | ||
438 | if (card_no == 1) | ||
439 | mmc_status = MMC_TOUCHED; | ||
432 | /* switch to SPI mode */ | 440 | /* switch to SPI mode */ |
433 | send_cmd(CMD_GO_IDLE_STATE, 0, response); | 441 | send_cmd(CMD_GO_IDLE_STATE, 0, response); |
434 | if (response[0] != 0x01) | 442 | if (response[0] != 0x01) |
@@ -1046,6 +1054,27 @@ bool mmc_detect(void) | |||
1046 | return adc_read(ADC_MMC_SWITCH) < 0x200 ? true : false; | 1054 | return adc_read(ADC_MMC_SWITCH) < 0x200 ? true : false; |
1047 | } | 1055 | } |
1048 | 1056 | ||
1057 | bool mmc_touched(void) | ||
1058 | { | ||
1059 | if (mmc_status == MMC_UNKNOWN) /* try to detect */ | ||
1060 | { | ||
1061 | unsigned char response; | ||
1062 | |||
1063 | mutex_lock(&mmc_mutex); | ||
1064 | mmc_select_clock(1); | ||
1065 | setup_sci1(7); /* safe value */ | ||
1066 | and_b(~0x02, &PADRH); /* assert CS */ | ||
1067 | send_cmd(CMD_SEND_OP_COND, 0, &response); | ||
1068 | if (response == 0xFF) | ||
1069 | mmc_status = MMC_UNTOUCHED; | ||
1070 | else | ||
1071 | mmc_status = MMC_TOUCHED; | ||
1072 | |||
1073 | deselect_card(); | ||
1074 | } | ||
1075 | return mmc_status == MMC_TOUCHED; | ||
1076 | } | ||
1077 | |||
1049 | bool mmc_usb_active(int delayticks) | 1078 | bool mmc_usb_active(int delayticks) |
1050 | { | 1079 | { |
1051 | /* reading "inactive" is delayed by user-supplied monoflop value */ | 1080 | /* reading "inactive" is delayed by user-supplied monoflop value */ |
@@ -1094,6 +1123,7 @@ static void mmc_tick(void) | |||
1094 | else | 1123 | else |
1095 | { | 1124 | { |
1096 | queue_broadcast(SYS_MMC_EXTRACTED, NULL); | 1125 | queue_broadcast(SYS_MMC_EXTRACTED, NULL); |
1126 | mmc_status = MMC_UNTOUCHED; | ||
1097 | card_info[1].initialized = false; | 1127 | card_info[1].initialized = false; |
1098 | } | 1128 | } |
1099 | } | 1129 | } |
@@ -1157,6 +1187,8 @@ int ata_init(void) | |||
1157 | 1187 | ||
1158 | if ( !initialized ) | 1188 | if ( !initialized ) |
1159 | { | 1189 | { |
1190 | if (!last_mmc_status) | ||
1191 | mmc_status = MMC_UNTOUCHED; | ||
1160 | new_mmc_circuit = ((read_hw_mask() & MMC_CLOCK_POLARITY) != 0); | 1192 | new_mmc_circuit = ((read_hw_mask() & MMC_CLOCK_POLARITY) != 0); |
1161 | #ifdef HAVE_HOTSWAP | 1193 | #ifdef HAVE_HOTSWAP |
1162 | queue_init(&mmc_queue); | 1194 | queue_init(&mmc_queue); |