summaryrefslogtreecommitdiff
path: root/firmware/drivers/ata_mmc.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/ata_mmc.c')
-rw-r--r--firmware/drivers/ata_mmc.c32
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];
103static int delayed_sector_num; 103static int delayed_sector_num;
104 104
105static enum { 105static enum {
106 MMC_UNKNOWN,
107 MMC_UNTOUCHED,
108 MMC_TOUCHED
109} mmc_status = MMC_UNKNOWN;
110
111static 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
1057bool 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
1049bool mmc_usb_active(int delayticks) 1078bool 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);