diff options
Diffstat (limited to 'firmware/target/arm/as3525')
-rw-r--r-- | firmware/target/arm/as3525/ata_sd_as3525.c | 25 | ||||
-rw-r--r-- | firmware/target/arm/as3525/clock-target.h | 5 | ||||
-rw-r--r-- | firmware/target/arm/as3525/debug-as3525.c | 6 |
3 files changed, 24 insertions, 12 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c index 472e0fe09a..ab247c86d9 100644 --- a/firmware/target/arm/as3525/ata_sd_as3525.c +++ b/firmware/target/arm/as3525/ata_sd_as3525.c | |||
@@ -121,6 +121,10 @@ static struct event_queue sd_queue; | |||
121 | bool sd_enabled = false; | 121 | bool sd_enabled = false; |
122 | #endif | 122 | #endif |
123 | 123 | ||
124 | #if defined(HAVE_MULTIDRIVE) | ||
125 | static bool hs_card = false; | ||
126 | #endif | ||
127 | |||
124 | static struct wakeup transfer_completion_signal; | 128 | static struct wakeup transfer_completion_signal; |
125 | static volatile unsigned int transfer_error[NUM_VOLUMES]; | 129 | static volatile unsigned int transfer_error[NUM_VOLUMES]; |
126 | #define PL180_MAX_TRANSFER_ERRORS 10 | 130 | #define PL180_MAX_TRANSFER_ERRORS 10 |
@@ -347,13 +351,18 @@ static int sd_init_card(const int drive) | |||
347 | 351 | ||
348 | sd_parse_csd(&card_info[drive]); | 352 | sd_parse_csd(&card_info[drive]); |
349 | 353 | ||
354 | #if defined(HAVE_MULTIDRIVE) | ||
355 | hs_card = (card_info[drive].speed == 50000000) ? true : false; | ||
356 | #endif | ||
357 | |||
350 | /* Boost MCICLK to operating speed */ | 358 | /* Boost MCICLK to operating speed */ |
351 | if(drive == INTERNAL_AS3525) | 359 | if(drive == INTERNAL_AS3525) |
352 | MCI_CLOCK(drive) = MCI_QUARTERSPEED; /* MCICLK = PCLK/4 = 15.5MHz */ | 360 | MCI_CLOCK(drive) = MCI_HALFSPEED; /* MCICLK = IDE_CLK/2 = 25 MHz */ |
361 | #if defined(HAVE_MULTIDRIVE) | ||
353 | else | 362 | else |
354 | /* MCICLK = PCLK/2 = 31MHz(HS) or PCLK/4 = 15.5 Mhz (STD)*/ | 363 | /* MCICLK = PCLK/2 = 31MHz(HS) or PCLK/4 = 15.5 Mhz (STD)*/ |
355 | MCI_CLOCK(drive) = ((card_info[drive].speed == 50000000) ? | 364 | MCI_CLOCK(drive) = (hs_card ? MCI_HALFSPEED : MCI_QUARTERSPEED); |
356 | MCI_HALFSPEED : MCI_QUARTERSPEED); | 365 | #endif |
357 | 366 | ||
358 | /* CMD7 w/rca: Select card to put it in TRAN state */ | 367 | /* CMD7 w/rca: Select card to put it in TRAN state */ |
359 | if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_ARG, NULL)) | 368 | if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_ARG, NULL)) |
@@ -733,10 +742,14 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, | |||
733 | dma_enable_channel(0, dma_buf, MCI_FIFO(drive), | 742 | dma_enable_channel(0, dma_buf, MCI_FIFO(drive), |
734 | (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT, | 743 | (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT, |
735 | DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL); | 744 | DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL); |
736 | 745 | #if defined(HAVE_MULTIDRIVE) | |
737 | /*Small delay for writes prevents data crc failures at lower freqs*/ | 746 | /*Small delay for writes prevents data crc failures at lower freqs*/ |
738 | int write_delay = 125; | 747 | if((drive == SD_SLOT_AS3525) && !hs_card) |
739 | while(write_delay--); | 748 | { |
749 | int write_delay = 125; | ||
750 | while(write_delay--); | ||
751 | } | ||
752 | #endif | ||
740 | } | 753 | } |
741 | else | 754 | else |
742 | dma_enable_channel(0, MCI_FIFO(drive), dma_buf, | 755 | dma_enable_channel(0, MCI_FIFO(drive), dma_buf, |
diff --git a/firmware/target/arm/as3525/clock-target.h b/firmware/target/arm/as3525/clock-target.h index 81926c1884..bc112fdea8 100644 --- a/firmware/target/arm/as3525/clock-target.h +++ b/firmware/target/arm/as3525/clock-target.h | |||
@@ -118,9 +118,8 @@ | |||
118 | 118 | ||
119 | #define AS3525_IDE_SEL AS3525_CLK_PLLA /* Input Source */ | 119 | #define AS3525_IDE_SEL AS3525_CLK_PLLA /* Input Source */ |
120 | #define AS3525_IDE_DIV (CLK_DIV(AS3525_PLLA_FREQ, AS3525_IDE_FREQ) - 1)/*div=1/(n+1)*/ | 120 | #define AS3525_IDE_DIV (CLK_DIV(AS3525_PLLA_FREQ, AS3525_IDE_FREQ) - 1)/*div=1/(n+1)*/ |
121 | #define AS3525_IDE_FREQ 90000000 /* The OF uses 66MHz maximal freq | 121 | #define AS3525_IDE_FREQ 50000000 /* The OF uses 66MHz maximal freq */ |
122 | but sd transfers fail on some | 122 | |
123 | players with this limit */ | ||
124 | 123 | ||
125 | //#define AS3525_USB_SEL AS3525_CLK_PLLA /* Input Source */ | 124 | //#define AS3525_USB_SEL AS3525_CLK_PLLA /* Input Source */ |
126 | //#define AS3525_USB_DIV /* div = 1/(n=0?1:2n)*/ | 125 | //#define AS3525_USB_DIV /* div = 1/(n=0?1:2n)*/ |
diff --git a/firmware/target/arm/as3525/debug-as3525.c b/firmware/target/arm/as3525/debug-as3525.c index 2606f68e82..f8f183d432 100644 --- a/firmware/target/arm/as3525/debug-as3525.c +++ b/firmware/target/arm/as3525/debug-as3525.c | |||
@@ -185,9 +185,9 @@ int calc_freq(int clk) | |||
185 | if(!(MCI_NAND & (1<<8))) | 185 | if(!(MCI_NAND & (1<<8))) |
186 | return 0; | 186 | return 0; |
187 | else if(MCI_NAND & (1<<10)) | 187 | else if(MCI_NAND & (1<<10)) |
188 | return calc_freq(CLK_PCLK); | 188 | return calc_freq(CLK_IDE); |
189 | else | 189 | else |
190 | return calc_freq(CLK_PCLK)/(((MCI_NAND & 0xff)+1)*2); | 190 | return calc_freq(CLK_IDE)/(((MCI_NAND & 0xff)+1)*2); |
191 | case CLK_SD_MCLK_MSD: | 191 | case CLK_SD_MCLK_MSD: |
192 | if(!(MCI_SD & (1<<8))) | 192 | if(!(MCI_SD & (1<<8))) |
193 | return 0; | 193 | return 0; |
@@ -304,7 +304,7 @@ bool __dbg_hw_info(void) | |||
304 | } | 304 | } |
305 | 305 | ||
306 | lcd_putsf(0, line++, "SD :%3dMHz %3dMHz", | 306 | lcd_putsf(0, line++, "SD :%3dMHz %3dMHz", |
307 | ((AS3525_PCLK_FREQ/ 1000000) / | 307 | ((AS3525_IDE_FREQ/ 1000000) / |
308 | ((last_nand & MCI_CLOCK_BYPASS)? 1:(((last_nand & 0xff)+1) * 2))), | 308 | ((last_nand & MCI_CLOCK_BYPASS)? 1:(((last_nand & 0xff)+1) * 2))), |
309 | calc_freq(CLK_SD_MCLK_NAND)/1000000); | 309 | calc_freq(CLK_SD_MCLK_NAND)/1000000); |
310 | #ifdef HAVE_MULTIDRIVE | 310 | #ifdef HAVE_MULTIDRIVE |