diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-05-17 22:10:51 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-05-17 22:10:51 +0000 |
commit | 27abc2a6411ac6f864529ff3783c8009e43074d0 (patch) | |
tree | 84dda92347a7a7b671a547e2e75851ca3d3a99e0 /firmware | |
parent | 32be590e6db3e2c2bcdcc16d89bad22135bd9058 (diff) | |
download | rockbox-27abc2a6411ac6f864529ff3783c8009e43074d0.tar.gz rockbox-27abc2a6411ac6f864529ff3783c8009e43074d0.zip |
(1) Early USB detection on boot, before trying to mount the partitions. Cleaner & quicker; removes the need for the extra USB check at the top of ask_resume() which caused a deadlock in screenshot mode (see patch #1110332). On Ondio, this allows to leave an MMC in the slot when booting with USB connected for instant access. (2) Ondio: Track MMC status, only ask to remove the card if required. Probe MMC status if unknown.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6488 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/ata_mmc.c | 32 | ||||
-rw-r--r-- | firmware/export/ata_mmc.h | 1 |
2 files changed, 33 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]; static int delayed_sector_num; static enum { + MMC_UNKNOWN, + MMC_UNTOUCHED, + MMC_TOUCHED +} mmc_status = MMC_UNKNOWN; + +static enum { SER_POLL_WRITE, SER_POLL_READ, SER_DISABLED @@ -429,6 +435,8 @@ static int initialize_card(int card_no) 10000000, 100000000, 1000000000 }; + if (card_no == 1) + mmc_status = MMC_TOUCHED; /* switch to SPI mode */ send_cmd(CMD_GO_IDLE_STATE, 0, response); if (response[0] != 0x01) @@ -1046,6 +1054,27 @@ bool mmc_detect(void) return adc_read(ADC_MMC_SWITCH) < 0x200 ? true : false; } +bool mmc_touched(void) +{ + if (mmc_status == MMC_UNKNOWN) /* try to detect */ + { + unsigned char response; + + mutex_lock(&mmc_mutex); + mmc_select_clock(1); + setup_sci1(7); /* safe value */ + and_b(~0x02, &PADRH); /* assert CS */ + send_cmd(CMD_SEND_OP_COND, 0, &response); + if (response == 0xFF) + mmc_status = MMC_UNTOUCHED; + else + mmc_status = MMC_TOUCHED; + + deselect_card(); + } + return mmc_status == MMC_TOUCHED; +} + bool mmc_usb_active(int delayticks) { /* reading "inactive" is delayed by user-supplied monoflop value */ @@ -1094,6 +1123,7 @@ static void mmc_tick(void) else { queue_broadcast(SYS_MMC_EXTRACTED, NULL); + mmc_status = MMC_UNTOUCHED; card_info[1].initialized = false; } } @@ -1157,6 +1187,8 @@ int ata_init(void) if ( !initialized ) { + if (!last_mmc_status) + mmc_status = MMC_UNTOUCHED; new_mmc_circuit = ((read_hw_mask() & MMC_CLOCK_POLARITY) != 0); #ifdef HAVE_HOTSWAP queue_init(&mmc_queue); diff --git a/firmware/export/ata_mmc.h b/firmware/export/ata_mmc.h index 6f7fb2bdb5..9da93906ad 100644 --- a/firmware/export/ata_mmc.h +++ b/firmware/export/ata_mmc.h @@ -44,6 +44,7 @@ bool mmc_detect(void); unsigned long mmc_extract_bits(const unsigned long *p, unsigned int start, unsigned int size); tCardInfo *mmc_card_info(int card_no); +bool mmc_touched(void); bool mmc_usb_active(int delayticks); #ifdef HAVE_HOTSWAP void mmc_enable_monitoring(bool on); |