From 4c3897eb154f67ec0231cb1b7a160954c57b6c14 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Mon, 8 Oct 2007 20:39:46 +0000 Subject: Hopefully take care of FS#7806 - Current Sansapatcher fails to boot OF by removing all hotswap support from the bootloader. It won't fully be closed until Sansapatcher is updated of course. There's still a report of the partition dump not working unless 20 bytes of padding are inserted at the start of main() but that's only a developer-enabled feature. Seems weird though. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15038 a1c6a512-1295-4272-9138-f99709370657 --- firmware/export/config-c200.h | 5 +-- firmware/export/config-e200.h | 5 +-- firmware/target/arm/sandisk/ata-c200_e200.c | 49 ++++++++++++++++++++++++----- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/firmware/export/config-c200.h b/firmware/export/config-c200.h index 6397dd8338..d4c594a91e 100644 --- a/firmware/export/config-c200.h +++ b/firmware/export/config-c200.h @@ -110,7 +110,10 @@ /* define this if you have a flash memory storage */ #define HAVE_FLASH_STORAGE +#ifndef BOOTLOADER #define HAVE_MULTIVOLUME +#define HAVE_HOTSWAP +#endif #define BATTERY_CAPACITY_DEFAULT 750 /* default battery capacity */ #define BATTERY_CAPACITY_MIN 750 /* min. capacity selectable */ @@ -146,8 +149,6 @@ /* Type of LCD TODO: hopefully the same as the x5 but check this*/ #define CONFIG_LCD LCD_C200 -#define HAVE_HOTSWAP - /* Offset ( in the firmware file's header ) to the file CRC and data. These are only used when loading the old format rockbox.e200 file */ #define FIRMWARE_OFFSET_FILE_CRC 0x0 diff --git a/firmware/export/config-e200.h b/firmware/export/config-e200.h index 3bde3fc204..2528cc0760 100644 --- a/firmware/export/config-e200.h +++ b/firmware/export/config-e200.h @@ -104,7 +104,10 @@ /* define this if you have a flash memory storage */ #define HAVE_FLASH_STORAGE +#ifndef BOOTLOADER #define HAVE_MULTIVOLUME +#define HAVE_HOTSWAP +#endif #define BATTERY_CAPACITY_DEFAULT 750 /* default battery capacity */ #define BATTERY_CAPACITY_MIN 750 /* min. capacity selectable */ @@ -140,8 +143,6 @@ /* Type of LCD TODO: hopefully the same as the x5 but check this*/ #define CONFIG_LCD LCD_X5 -#define HAVE_HOTSWAP - /* Offset ( in the firmware file's header ) to the file CRC and data. These are only used when loading the old format rockbox.e200 file */ #define FIRMWARE_OFFSET_FILE_CRC 0x0 diff --git a/firmware/target/arm/sandisk/ata-c200_e200.c b/firmware/target/arm/sandisk/ata-c200_e200.c index addc490417..14be27e19d 100644 --- a/firmware/target/arm/sandisk/ata-c200_e200.c +++ b/firmware/target/arm/sandisk/ata-c200_e200.c @@ -125,6 +125,11 @@ #define SD_APP_OP_COND 41 /** global, exported variables **/ +#ifdef HAVE_HOTSWAP +#define NUM_VOLUMES 2 +#else +#define NUM_VOLUMES 1 +#endif /* for compatibility */ int ata_spinup_time = 0; @@ -146,10 +151,12 @@ struct sd_card_status int retry_max; }; -static struct sd_card_status sd_status[2] = +static struct sd_card_status sd_status[NUM_VOLUMES] = { { 0, 1 }, +#ifdef HAVE_HOTSWAP { 0, 10 } +#endif }; /* Shoot for around 75% usage */ @@ -575,7 +582,9 @@ static void sd_card_mux(int card_no) static void sd_init_device(int card_no) { /* SD Protocol registers */ +#ifdef HAVE_HOTSWAP unsigned int response = 0; +#endif unsigned int i; unsigned int c_size; unsigned long c_mult; @@ -613,7 +622,8 @@ static void sd_init_device(int card_no) goto card_init_error; check_time[EC_POWER_UP] = USEC_TIMER; - + +#ifdef HAVE_HOTSWAP /* Check for SDHC: - non-SDHC cards simply ignore SEND_IF_COND (CMD8) and we get error -219, which we can just ignore and assume we're dealing with standard SD. @@ -623,6 +633,7 @@ static void sd_init_device(int card_no) ret = sd_command(SEND_IF_COND,0x1aa, &response,7); if ( (ret < 0) && (ret!=-219) ) goto card_init_error; +#endif while ((currcard->ocr & (1 << 31)) == 0) /* until card is powered up */ { @@ -630,15 +641,20 @@ static void sd_init_device(int card_no) if (ret < 0) goto card_init_error; +#ifdef HAVE_HOTSWAP if(response == 0x1aa) { /* SDHC */ ret = sd_command(SD_APP_OP_COND, (1<<30)|0x100000, &currcard->ocr, 3); - } else { + } + else +#endif /* HAVE_HOTSWAP */ + { /* SD Standard */ ret = sd_command(SD_APP_OP_COND, 0x100000, &currcard->ocr, 3); } + if (ret < 0) goto card_init_error; @@ -672,6 +688,7 @@ static void sd_init_device(int card_no) currcard->numblocks = c_size * c_mult * (currcard->max_read_bl_len/512); currcard->capacity = currcard->numblocks * currcard->block_size; } +#ifdef HAVE_HOTSWAP else if( (currcard->csd[3]>>30) == 1) { /* CSD version 2.0 */ @@ -681,6 +698,7 @@ static void sd_init_device(int card_no) currcard->numblocks = c_size; currcard->capacity = currcard->numblocks * currcard->block_size; } +#endif /* HAVE_HOTSWAP */ REG_1 = 0; @@ -771,9 +789,12 @@ void ata_led(bool onoff) led(onoff); } -int ata_read_sectors(int drive, unsigned long start, int incount, +int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int incount, void* inbuf) { +#ifndef HAVE_HOTSWAP + const int drive = 0; +#endif int ret; unsigned char *buf, *buf_end; int bank; @@ -823,12 +844,14 @@ ata_read_retry: BLOCK_COUNT_REG = incount; +#ifdef HAVE_HOTSWAP if(currcard->ocr & (1<<30) ) { /* SDHC */ ret = sd_command(READ_MULTIPLE_BLOCK, start, NULL, 0x1c25); } else +#endif { ret = sd_command(READ_MULTIPLE_BLOCK, start * BLOCK_SIZE, NULL, 0x1c25); } @@ -880,12 +903,15 @@ ata_read_error: } } -int ata_write_sectors(int drive, unsigned long start, int count, +int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* outbuf) { /* Write support is not finished yet */ /* TODO: The standard suggests using ACMD23 prior to writing multiple blocks to improve performance */ +#ifndef HAVE_HOTSWAP + const int drive = 0; +#endif int ret; const unsigned char *buf, *buf_end; int bank; @@ -933,12 +959,14 @@ ata_write_retry: BLOCK_COUNT_REG = count; +#ifdef HAVE_HOTSWAP if(currcard->ocr & (1<<30) ) { /* SDHC */ ret = sd_command(WRITE_MULTIPLE_BLOCK, start, NULL, 0x1c2d); } else +#endif { ret = sd_command(WRITE_MULTIPLE_BLOCK, start*BLOCK_SIZE, NULL, 0x1c2d); } @@ -1015,6 +1043,7 @@ static void sd_thread(void) switch ( ev.id ) { +#ifdef HAVE_HOTSWAP case SD_HOTSWAP: { int action = SDA_NONE; @@ -1046,6 +1075,7 @@ static void sd_thread(void) queue_broadcast(SYS_FS_CHANGED, 0); break; } /* SD_HOTSWAP */ +#endif /* HAVE_HOTSWAP */ case SYS_TIMEOUT: if (TIME_BEFORE(current_tick, last_disk_activity+(3*HZ))) { @@ -1138,12 +1168,13 @@ int ata_init(void) GPIOG_OUTPUT_EN |= (0x3 << 5); GPIOG_OUTPUT_VAL |= (0x3 << 5); +#ifdef HAVE_HOTSWAP /* enable card detection port - mask interrupt first */ GPIOA_INT_EN &= ~0x80; GPIOA_OUTPUT_EN &= ~0x80; GPIOA_ENABLE |= 0x80; - +#endif sd_select_device(0); if (currcard->initialized < 0) @@ -1155,7 +1186,7 @@ int ata_init(void) /* enable interupt for the mSD card */ sleep(HZ/10); - +#ifdef HAVE_HOTSWAP CPU_INT_EN = HI_MASK; CPU_HI_INT_EN = GPIO0_MASK; @@ -1163,7 +1194,7 @@ int ata_init(void) GPIOA_INT_CLR = 0x80; GPIOA_INT_EN |= 0x80; - +#endif spinlock_unlock(&sd_mtx); } @@ -1204,6 +1235,7 @@ tCardInfo *card_get_info_target(int card_no) return &card; } +#ifdef HAVE_HOTSWAP bool card_detect_target(void) { /* 0x00:inserted, 0x80:not inserted */ @@ -1231,3 +1263,4 @@ void microsd_int(void) timeout_register(&sd1_oneshot, sd1_oneshot_callback, detect ? 1 : HZ/2, detect == 0); } +#endif /* HAVE_HOTSWAP */ -- cgit v1.2.3