summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2005-05-17 22:10:51 +0000
committerJens Arnold <amiconn@rockbox.org>2005-05-17 22:10:51 +0000
commit27abc2a6411ac6f864529ff3783c8009e43074d0 (patch)
tree84dda92347a7a7b671a547e2e75851ca3d3a99e0
parent32be590e6db3e2c2bcdcc16d89bad22135bd9058 (diff)
downloadrockbox-27abc2a6411ac6f864529ff3783c8009e43074d0.zip
rockbox-27abc2a6411ac6f864529ff3783c8009e43074d0.tar.gz
rockbox-27abc2a6411ac6f864529ff3783c8009e43074d0.tar.bz2
rockbox-27abc2a6411ac6f864529ff3783c8009e43074d0.tar.xz
(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
-rw-r--r--apps/main.c38
-rw-r--r--apps/misc.c2
-rw-r--r--apps/screens.c1
-rw-r--r--apps/tree.c5
-rw-r--r--firmware/drivers/ata_mmc.c32
-rw-r--r--firmware/export/ata_mmc.h1
6 files changed, 61 insertions, 18 deletions
diff --git a/apps/main.c b/apps/main.c
index 25bc929..537c3da 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -127,6 +127,7 @@ void init(void)
void init(void)
{
int rc;
+ bool mounted = false;
#if defined(HAVE_CHARGING) && (CONFIG_CPU == SH7034)
/* if nobody initialized ATA before, I consider this a cold start */
bool coldstart = (PACR2 & 0x4000) != 0; /* starting from Flash */
@@ -216,22 +217,35 @@ void init(void)
}
usb_start_monitoring();
+ while (usb_detect())
+ { /* enter USB mode early, before trying to mount */
+ if (button_get_w_tmo(HZ/10) == SYS_USB_CONNECTED)
+#ifdef HAVE_MMC
+ if (!mmc_touched() || (mmc_remove_request() == SYS_MMC_EXTRACTED))
+#endif
+ {
+ usb_screen();
+ mounted = true; /* mounting done @ end of USB mode */
+ }
+ }
- /* FixMe: the same kind of mounting happens in usb.c, share the code. */
- rc = disk_mount_all();
- if (rc<=0)
+ if (!mounted)
{
- lcd_clear_display();
- lcd_puts(0, 0, "No partition");
- lcd_puts(0, 1, "found.");
+ rc = disk_mount_all();
+ if (rc<=0)
+ {
+ lcd_clear_display();
+ lcd_puts(0, 0, "No partition");
+ lcd_puts(0, 1, "found.");
#ifdef HAVE_LCD_BITMAP
- lcd_puts(0, 2, "Insert USB cable");
- lcd_puts(0, 3, "and fix it.");
- lcd_update();
+ lcd_puts(0, 2, "Insert USB cable");
+ lcd_puts(0, 3, "and fix it.");
+ lcd_update();
#endif
- while(button_get(true) != SYS_USB_CONNECTED) {};
- usb_screen();
- system_reboot();
+ while(button_get(true) != SYS_USB_CONNECTED) {};
+ usb_screen();
+ system_reboot();
+ }
}
settings_calc_config_sector();
diff --git a/apps/misc.c b/apps/misc.c
index e7438d6..bc2df3a 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -353,7 +353,7 @@ long default_event_handler_ex(long event, void (*callback)(void *), void *parame
if (callback != NULL)
callback(parameter);
#ifdef HAVE_MMC
- if (!mmc_detect() || (mmc_remove_request() == SYS_MMC_EXTRACTED))
+ if (!mmc_touched() || (mmc_remove_request() == SYS_MMC_EXTRACTED))
#endif
usb_screen();
return SYS_USB_CONNECTED;
diff --git a/apps/screens.c b/apps/screens.c
index b725f0a..7c00e94 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -97,6 +97,7 @@ void usb_display_info(void)
status_draw(true);
lcd_update();
#else
+ lcd_double_height(false);
lcd_puts(0, 0, "[USB Mode]");
status_set_param(false);
status_set_audio(false);
diff --git a/apps/tree.c b/apps/tree.c
index c7ff732..a49fb9b 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -434,11 +434,6 @@ static bool ask_resume(bool ask_once)
lcd_double_height(false);
#endif
- if (usb_detect()) {
- default_event_handler(SYS_USB_CONNECTED);
- return false;
- }
-
#ifdef HAVE_ALARM_MOD
if ( rtc_check_alarm_started(true) ) {
rtc_enable_alarm(false);
diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c
index 9c2e581..6876ce0 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 6f7fb2b..9da9390 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);