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 | |
| parent | 32be590e6db3e2c2bcdcc16d89bad22135bd9058 (diff) | |
| download | rockbox-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.c | 38 | ||||
| -rw-r--r-- | apps/misc.c | 2 | ||||
| -rw-r--r-- | apps/screens.c | 1 | ||||
| -rw-r--r-- | apps/tree.c | 5 | ||||
| -rw-r--r-- | firmware/drivers/ata_mmc.c | 32 | ||||
| -rw-r--r-- | firmware/export/ata_mmc.h | 1 |
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); |