diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index 5fb62a9..3c6a185 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -164,3 +164,6 @@ md5sum.c lua.c #endif +test_codec.c +test_disk.c +test_fps.c diff --git a/apps/plugins/plugin.lds b/apps/plugins/plugin.lds index 57b2faf..508f4d2 100644 --- a/apps/plugins/plugin.lds +++ b/apps/plugins/plugin.lds @@ -1,4 +1,5 @@ #include "config.h" +#include "cpu.h" /* These output formats should be in the config-files */ diff --git a/apps/plugins/test_disk.c b/apps/plugins/test_disk.c index 2fa841b..b5d1664 100644 --- a/apps/plugins/test_disk.c +++ b/apps/plugins/test_disk.c @@ -32,7 +32,7 @@ PLUGIN_HEADER #if (CONFIG_STORAGE & STORAGE_MMC) #define TEST_SIZE (20*1024*1024) #else -#define TEST_SIZE (300*1024*1024) +#define TEST_SIZE (30*1024*1024) #endif #define TEST_TIME 10 /* in seconds */ diff --git a/firmware/SOURCES b/firmware/SOURCES index 3a78f55..b946d5a 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -372,6 +372,7 @@ target/arm/as3525/usb-as3525.c target/arm/as3525/dma-pl081.c target/arm/as3525/ascodec-as3525.c #ifndef BOOTLOADER +target/arm/mmu-arm.S drivers/generic_i2c.c target/arm/adc-as3514.c target/arm/as3525/audio-as3525.c diff --git a/firmware/export/as3525.h b/firmware/export/as3525.h index 21bf2bd..7fddeb4 100644 --- a/firmware/export/as3525.h +++ b/firmware/export/as3525.h @@ -41,7 +41,7 @@ /* AS352X MMU Page Table Entries */ /* to be implemented */ -#define TTB_SIZE 0x0 +#define TTB_SIZE 0x4000 #define TTB_BASE_ADDR (DRAM_ORIG + DRAM_SIZE - TTB_SIZE) diff --git a/firmware/target/arm/as3525/ascodec-as3525.c b/firmware/target/arm/as3525/ascodec-as3525.c index 668c001..4ba4234 100644 --- a/firmware/target/arm/as3525/ascodec-as3525.c +++ b/firmware/target/arm/as3525/ascodec-as3525.c @@ -103,6 +103,10 @@ int ascodec_write(unsigned int index, unsigned int value) { int retval; + int delay = 100; + while(delay--) + asm volatile("nop\nnop\nnop\nnop\nnop\n"); + ascodec_lock(); /* check if still busy */ @@ -138,6 +142,10 @@ int ascodec_read(unsigned int index) { int data; + int delay = 100; + while(delay--) + asm volatile("nop\nnop\nnop\nnop\nnop\n"); + ascodec_lock(); /* check if still busy */ diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c index a0b9b13..7c74a07 100644 --- a/firmware/target/arm/as3525/ata_sd_as3525.c +++ b/firmware/target/arm/as3525/ata_sd_as3525.c @@ -41,6 +41,7 @@ #include "stdbool.h" #include "ata_idle_notify.h" #include "sd.h" +#include "mmu-arm.h" #ifdef HAVE_HOTSWAP #include "disk.h" @@ -150,7 +151,13 @@ void INT_NAND(void) const int status = MCI_STATUS(INTERNAL_AS3525); if(status & MCI_ERROR) + { + char buf[50]; + snprintf(buf, 50, "FUCK 0x%x, status", status); + lcd_puts(0,0, buf); + lcd_update(); retry = true; + } wakeup_signal(&transfer_completion_signal); MCI_CLEAR(INTERNAL_AS3525) = status; @@ -590,6 +597,15 @@ static int sd_select_bank(signed char bank) else card_data[0] = bank; +#if 0 /* using an uncached buffer instead */ +#ifndef BOOTLOADER + if(write) + clean_dcache_range(dma_buf, transfer * BLOCK_SIZE); + else + dump_dcache_range(dma_buf, transfer * BLOCK_SIZE); +#endif +#endif + dma_retain(); dma_enable_channel(0, card_data, MCI_FIFO(INTERNAL_AS3525), DMA_PERI_SD, DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL); @@ -617,7 +633,7 @@ static int sd_select_bank(signed char bank) } #define UNALIGNED_NUM_SECTORS 10 -static int32_t aligned_buffer[UNALIGNED_NUM_SECTORS* (SECTOR_SIZE / 4)]; +static unsigned char aligned_buffer[UNALIGNED_NUM_SECTORS * SECTOR_SIZE] __attribute__((aligned(32))); static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf, const bool write) @@ -626,7 +642,7 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, const int drive = 0; #endif int ret = 0; - bool unaligned_transfer = (int)buf & 3; + bool unaligned_transfer = true/*(int)buf & 3*/; /* skip SanDisk OF */ if (drive == INTERNAL_AS3525) @@ -660,6 +676,7 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, /* 128 * 512 = 2^16, and doesn't fit in the 16 bits of DATA_LENGTH * register, so we have to transfer maximum 127 sectors at a time. */ unsigned int transfer = (count >= 128) ? 127 : count; /* sectors */ + unsigned char* uncached_buffer = UNCACHED_ADDR(aligned_buffer); void *dma_buf; const int cmd = write ? SD_WRITE_MULTIPLE_BLOCK : SD_READ_MULTIPLE_BLOCK; @@ -698,7 +715,7 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, if(transfer > UNALIGNED_NUM_SECTORS) transfer = UNALIGNED_NUM_SECTORS; if(write) - memcpy(aligned_buffer, buf, transfer * SECTOR_SIZE); + memcpy(uncached_buffer, buf, transfer * SECTOR_SIZE); } else /* Aligned transfers are faster : no memcpy */ dma_buf = buf; @@ -722,7 +739,7 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT, DMAC_FLOWCTRL_PERI_PERI_TO_MEM, false, true, 0, DMA_S8, NULL); - MCI_DATA_TIMER(drive) = 0x1000000; /* FIXME: arbitrary */ + MCI_DATA_TIMER(drive) = 0xffffffff; /* FIXME: arbitrary */ MCI_DATA_LENGTH(drive) = transfer * card_info[drive].block_size; MCI_DATA_CTRL(drive) = (1<<0) /* enable */ | (!write<<1) /* transfer direction */ | @@ -734,7 +751,7 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, if(!retry) { if(unaligned_transfer && !write) - memcpy(buf, aligned_buffer, transfer * SECTOR_SIZE); + memcpy(buf, uncached_buffer, transfer * SECTOR_SIZE); buf += transfer * SECTOR_SIZE; start += transfer; count -= transfer; diff --git a/firmware/target/arm/as3525/clock-target.h b/firmware/target/arm/as3525/clock-target.h index 7dab037..43086d8 100644 --- a/firmware/target/arm/as3525/clock-target.h +++ b/firmware/target/arm/as3525/clock-target.h @@ -53,17 +53,17 @@ /* PLL frequencies and settings*/ -#define AS3525_PLLA_FREQ 248000000 /*124,82.7,62,49.6,41.3,35.4 */ +//#define AS3525_PLLA_FREQ 248000000 /*124,82.7,62,49.6,41.3,35.4 */ /* FCLK_PREDIV-> *7/8 = 217MHz 108.5 ,72.3, 54.25, 43.4, 36.17 */ /* *6/8 = 186MHz 93, 62, 46.5, 37.2 */ /* *5/8 = 155MHz 77.5, 51.67, 38.75 */ -#define AS3525_PLLA_SETTING 0x261F +//#define AS3525_PLLA_SETTING 0x261F -//#define AS3525_PLLA_FREQ 384000000 /*192,128,96,76.8,64,54.9,48,42.7,38.4*/ +#define AS3525_PLLA_FREQ 192000000 /*192,128,96,76.8,64,54.9,48,42.7,38.4*/ /* FCLK_PREDIV-> *7/8 = 336MHz 168, 112, 84, 67.2, 56, 48, 42, 37.3*/ /* *6/8 = 288MHz 144, 96, 72, 57.6, 48, 41.1, */ /* *5/8 = 240MHz 120, 80, 60, 48, 40 */ -//#define AS3525_PLLA_SETTING 0x2630 +#define AS3525_PLLA_SETTING 0x4630 /* PLLB not used at this time! */ //#define AS3525_PLLB_FREQ @@ -71,8 +71,8 @@ /** ************ Change these to reconfigure clocking scheme *******************/ -#define AS3525_FCLK_FREQ 248000000 /* Boosted FCLK frequency */ -#define AS3525_PCLK_FREQ 62000000 /* Initial PCLK frequency */ +#define AS3525_FCLK_FREQ 192000000 /* Boosted FCLK frequency */ +#define AS3525_PCLK_FREQ 64000000 /* Initial PCLK frequency */ #define AS3525_DBOP_FREQ AS3525_PCLK_FREQ /* Initial DBOP frequency */ /** ****************************************************************************/ @@ -89,7 +89,7 @@ /* FCLK */ #define AS3525_FCLK_SEL AS3525_CLK_PLLA -#define AS3525_FCLK_PREDIV 0 /* div = (8-n)/8 acts strange when used!*/ +#define AS3525_FCLK_PREDIV 3 /* div = (8-n)/8 acts strange when used!*/ #define AS3525_FCLK_POSTDIV (CLK_DIV(AS3525_PLLA_FREQ, AS3525_FCLK_FREQ) - 1) /*div=1/(n+1)*/ /* PCLK */ diff --git a/firmware/target/arm/as3525/pcm-as3525.c b/firmware/target/arm/as3525/pcm-as3525.c index 5074941..6024633 100644 --- a/firmware/target/arm/as3525/pcm-as3525.c +++ b/firmware/target/arm/as3525/pcm-as3525.c @@ -28,6 +28,7 @@ #include "panic.h" #include "as3514.h" #include "audiohw.h" +#include "mmu-arm.h" #define MAX_TRANSFER (4*((1<<11)-1)) /* maximum data we can transfer via DMA * i.e. 32 bits at once (size of I2SO_DATA) @@ -69,6 +70,7 @@ static void play_start_pcm(void) CGU_PERI |= CGU_I2SOUT_APB_CLOCK_ENABLE; CGU_AUDIO |= (1<<11); + clean_dcache_range((void*)addr, size); /* force write back */ dma_enable_channel(1, (void*)addr, (void*)I2SOUT_DATA, DMA_PERI_I2SOUT, DMAC_FLOWCTRL_DMAC_MEM_TO_PERI, true, false, size >> 2, DMA_S1, dma_callback); diff --git a/firmware/target/arm/as3525/sansa-clip/button-clip.c b/firmware/target/arm/as3525/sansa-clip/button-clip.c index b6da130..2d2a3a6 100644 --- a/firmware/target/arm/as3525/sansa-clip/button-clip.c +++ b/firmware/target/arm/as3525/sansa-clip/button-clip.c @@ -46,8 +46,9 @@ int button_read_device(void) /* This is a keypad using C4-C6 as columns and B0-B2 as rows */ GPIOC_PIN(4) = (1<<4); + asm volatile("nop\nnop\nnop\nnop\nnop\n"); /* small delay */ - /* C4B0 is unused */ + (void)GPIOB_PIN(0); /* C4B0 is unused */ if (GPIOB_PIN(1)) result |= BUTTON_VOL_UP; @@ -58,6 +59,7 @@ int button_read_device(void) GPIOC_PIN(4) = 0x00; GPIOC_PIN(5) = (1<<5); + asm volatile("nop\nnop\nnop\nnop\nnop\n"); /* small delay */ if (GPIOB_PIN(0)) result |= BUTTON_LEFT; @@ -71,6 +73,7 @@ int button_read_device(void) GPIOC_PIN(5) = 0x00; GPIOC_PIN(6) = (1<<6); + asm volatile("nop\nnop\nnop\nnop\nnop\n"); /* small delay */ if (GPIOB_PIN(0)) result |= BUTTON_DOWN; diff --git a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c index f713425..0859ffc 100644 --- a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c +++ b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c @@ -39,7 +39,7 @@ #define R_ENTRY_MODE_HORZ 0x7030 #define R_ENTRY_MODE_VERT 0x7038 -static unsigned lcd_yuv_options SHAREDBSS_ATTR = 0; +static unsigned lcd_yuv_options = 0; static bool display_on = false; /* is the display turned on? */ static bool display_flipped = false; static int xoffset = 20; /* needed for flip */ diff --git a/firmware/target/arm/as3525/system-as3525.c b/firmware/target/arm/as3525/system-as3525.c index 2f320e9..c774c47 100644 --- a/firmware/target/arm/as3525/system-as3525.c +++ b/firmware/target/arm/as3525/system-as3525.c @@ -28,6 +28,9 @@ #include "clock-target.h" #include "fmradio_i2c.h" #include "button-target.h" +#ifndef BOOTLOADER +#include "mmu-arm.h" +#endif #define default_interrupt(name) \ extern __attribute__((weak,alias("UIRQ"))) void name (void) @@ -244,15 +247,21 @@ void system_init(void) asm volatile( "mov r0, #0 \n" - "mcr p15, 0, r0, c7, c7 \n" /* invalidate icache & dcache */ "mrc p15, 0, r0, c1, c0 \n" /* control register */ - "bic r0, r0, #3<<30 \n" /* clears bus bits & sets fastbus */ - "orr r0, r0, #1<<12 \n" /* enable icache */ + "bic r0, r0, #3<<30 \n" /* clears bus bits : sets fastbus */ "mcr p15, 0, r0, c1, c0 \n" : : : "r0" ); #ifdef BOOTLOADER sdram_init(); +#else + ttb_init(); + map_section(0, 0, 0x1000, CACHE_NONE); + map_section(0, 0, 1, CACHE_ALL); /* IRAM */ + map_section(0, 0x10000000, 1, CACHE_NONE); /* IRAM */ + map_section(0x30000000, 0x30000000, MEMORYSIZE, CACHE_ALL); /* sdram */ + map_section(0x30000000, 0x40000000, MEMORYSIZE, CACHE_NONE); /* sdram */ + enable_mmu(); #endif /* BOOTLOADER */ #if 0 /* the GPIO clock is already enabled by the dualboot function */ diff --git a/firmware/target/arm/as3525/system-target.h b/firmware/target/arm/as3525/system-target.h index 713e96c..8639162 100644 --- a/firmware/target/arm/as3525/system-target.h +++ b/firmware/target/arm/as3525/system-target.h @@ -25,4 +25,13 @@ #include "clock-target.h" /* CPUFREQ_* are defined here */ +#define PROC_NEEDS_CACHEALIGN +#define CACHEALIGN_BITS 5 /* 2^5 = 32 bytes = cacheline size */ + +#ifdef BOOTLOADER +#define UNCACHED_ADDR(a) (a) +#else +#define UNCACHED_ADDR(a) (a + 0x10000000) +#endif + #endif /* SYSTEM_TARGET_H */