From 7e1d36f35b7757c7d3482d973370e71a9dfc9504 Mon Sep 17 00:00:00 2001 From: Jörg Hohensohn Date: Sat, 19 Feb 2005 14:45:34 +0000 Subject: Ondio: disk activity indication in USB mode, too git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6020 a1c6a512-1295-4272-9138-f99709370657 --- apps/screens.c | 3 +++ firmware/drivers/ata_mmc.c | 22 +++++++++++++++++++--- firmware/export/adc.h | 1 + firmware/export/ata_mmc.h | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/apps/screens.c b/apps/screens.c index 10f9dd234d..145d2bbaca 100644 --- a/apps/screens.c +++ b/apps/screens.c @@ -111,6 +111,9 @@ void usb_screen(void) usb_display_info(); while(usb_wait_for_disconnect_w_tmo(&button_queue, HZ)) { if(usb_inserted()) { +#ifdef HAVE_MMC /* USB-MMC bridge can report activity */ + led(mmc_usb_active(HZ)); +#endif status_draw(false); } } diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c index 7139f0394f..2ba465f63d 100644 --- a/firmware/drivers/ata_mmc.c +++ b/firmware/drivers/ata_mmc.c @@ -121,6 +121,8 @@ static int current_card = 0; #endif static bool last_mmc_status = false; static int countdown; /* for mmc switch debouncing */ +static bool usb_activity; /* monitoring the USB bridge */ +static long last_activity; /* private function declarations */ @@ -708,7 +710,7 @@ int ata_write_sectors(IF_MV2(int drive,) addr = start * SECTOR_SIZE; mutex_lock(&mmc_mutex); - led(true); + led(true); #ifdef HAVE_MULTIVOLUME card = &card_info[drive]; ret = select_card(drive); @@ -753,7 +755,7 @@ int ata_write_sectors(IF_MV2(int drive,) } deselect_card(); - led(false); + led(false); mutex_unlock(&mmc_mutex); /* only flush if writing went ok */ @@ -842,12 +844,26 @@ bool mmc_detect(void) return adc_read(ADC_MMC_SWITCH) < 0x200 ? true : false; } +bool mmc_usb_active(int delayticks) +{ + /* reading "inactive" is delayed by user-supplied monoflop value */ + return (usb_activity || + TIME_BEFORE(current_tick, last_activity+delayticks)); +} + static void mmc_tick(void) { bool current_status; + /* USB bridge activity is 0 on idle, ~527 on active */ + current_status = adc_read(ADC_USB_ACTIVE) > 0x100; + if (!current_status && usb_activity) + { + last_activity = current_tick; + } + usb_activity = current_status; + current_status = mmc_detect(); - /* Only report when the status has changed */ if (current_status != last_mmc_status) { diff --git a/firmware/export/adc.h b/firmware/export/adc.h index b1d78eac8f..a18cb1995a 100644 --- a/firmware/export/adc.h +++ b/firmware/export/adc.h @@ -40,6 +40,7 @@ #define ADC_BUTTON_ONOFF 3 /* the on/off button, high value if pressed */ #define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different voltages for different keys */ +#define ADC_USB_ACTIVE 5 /* USB bridge activity */ #define ADC_UNREG_POWER 7 /* Battery voltage */ #else diff --git a/firmware/export/ata_mmc.h b/firmware/export/ata_mmc.h index 957849925b..6c5141dd05 100644 --- a/firmware/export/ata_mmc.h +++ b/firmware/export/ata_mmc.h @@ -41,5 +41,6 @@ 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_usb_active(int delayticks); #endif -- cgit v1.2.3