From 46a42fe5acee0361f59fe8b13d260ae5b44093b1 Mon Sep 17 00:00:00 2001 From: ikari Date: Mon, 4 Oct 2010 09:36:32 +0200 Subject: [PATCH] mk2 fw: iap preparation, so96 mapper, reduce db size, delay with real sleep mode, cli --- src/Makefile | 2 +- src/config.h | 18 +++++++++++++++--- src/crc32.c | 2 +- src/ffconf.h | 2 +- src/fileops.h | 2 +- src/filetypes.c | 4 +--- src/fpga.c | 4 ---- src/lpc1754.ld | 6 +++--- src/main.c | 25 +++++++++++++++++++------ src/smc.c | 29 +++++++++++++++++++++-------- src/snes.c | 4 ++++ src/timer.c | 36 +++++++++++++++++++++++++++++++++--- src/timer.h | 1 + src/uart.c | 1 - 14 files changed, 101 insertions(+), 35 deletions(-) diff --git a/src/Makefile b/src/Makefile index 03c82a3..f1c65dc 100644 --- a/src/Makefile +++ b/src/Makefile @@ -55,7 +55,7 @@ TARGET = $(OBJDIR)/sd2snes # List C source files here. (C dependencies are automatically generated.) -SRC = main.c ff.c ccsbcs.c clock.c uart.c power.c led.c timer.c printf.c sdcard.c spi.c fileops.c rtc.c fpga.c fpga_spi.c snes.c smc.c memory.c filetypes.c faulthandler.c sort.c crc32.c +SRC = main.c ff.c ccsbcs.c clock.c uart.c power.c led.c timer.c printf.c sdcard.c spi.c fileops.c rtc.c fpga.c fpga_spi.c snes.c smc.c memory.c filetypes.c faulthandler.c sort.c crc32.c cic.c cli.c # List Assembler source files here. diff --git a/src/config.h b/src/config.h index 03172dd..e0108d2 100644 --- a/src/config.h +++ b/src/config.h @@ -27,9 +27,21 @@ #define SSP_CLK_DIVISOR_FPGA_FAST 6 #define SSP_CLK_DIVISOR_FPGA_SLOW 16 -#define SNES_RESET_REG LPC_GPIO1 -#define SNES_RESET_BIT 29 -/* XXX Rev.B: 26 */ +#define SNES_RESET_REG LPC_GPIO1 +#define SNES_RESET_BIT 29 +/* XXX Rev.B: 1.26 */ +#define SNES_CIC_D0_REG LPC_GPIO1 +#define SNES_CIC_D0_BIT 26 +/* XXX Rev.B: 0.1 */ +#define SNES_CIC_D1_REG LPC_GPIO1 +#define SNES_CIC_D1_BIT 25 +/* XXX Rev.B: 0.0 */ +#define SNES_CIC_STATUS_REG LPC_GPIO0 +#define SNES_CIC_STATUS_BIT 1 +/* XXX Rev.B: 1.29 */ +#define SNES_CIC_PAIR_REG LPC_GPIO0 +#define SNES_CIC_PAIR_BIT 0 +/* XXX Rev.B: 1.25 */ #define QSORT_MAXELEM 1024 diff --git a/src/crc32.c b/src/crc32.c index 9e20dd9..7928cf2 100644 --- a/src/crc32.c +++ b/src/crc32.c @@ -22,7 +22,7 @@ /** * Static table used for the table_driven implementation. *****************************************************************************/ -static const uint32_t crc32_table[256] IN_AHBRAM = { +static const uint32_t crc32_table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, diff --git a/src/ffconf.h b/src/ffconf.h index ef00f65..14551ed 100644 --- a/src/ffconf.h +++ b/src/ffconf.h @@ -110,7 +110,7 @@ / enable LFN feature and set _LFN_UNICODE to 1. */ -#define _FS_RPATH 0 /* 0 to 2 */ +#define _FS_RPATH 2 /* 0 to 2 */ /* The _FS_RPATH option configures relative path feature. / / 0: Disable relative path feature and remove related functions. diff --git a/src/fileops.h b/src/fileops.h index 4cdee72..fca81dc 100644 --- a/src/fileops.h +++ b/src/fileops.h @@ -33,7 +33,7 @@ BYTE file_buf[512]; FATFS fatfs; FIL file_handle; FRESULT file_res; -uint8_t file_lfn[256]; +uint8_t file_lfn[258]; void file_init(void); void file_open(uint8_t* filename, BYTE flags); diff --git a/src/filetypes.c b/src/filetypes.c index 9ea8a84..271a189 100644 --- a/src/filetypes.c +++ b/src/filetypes.c @@ -184,7 +184,7 @@ uint32_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) { file_close(); */ /* write element pointer to current dir structure */ - printf("d=%d Saving %lX to Address %lX [file]\n", depth, db_tgt, dir_tgt); +/* printf("d=%d Saving %lX to Address %lX [file]\n", depth, db_tgt, dir_tgt); */ if((db_tgt&0xffff) > ((0x10000-(sizeof(romprops) + sizeof(len) + pathlen + 1))&0xffff)) { printf("switch! old=%lx ", db_tgt); db_tgt &= 0xffff0000; @@ -222,8 +222,6 @@ uint32_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) { } } else uart_putc(0x30+res); } -/*printf("%x\n", crc); - _delay_ms(50); */ sram_writelong(db_tgt, SRAM_DB_ADDR+4); sram_writelong(dir_end, SRAM_DB_ADDR+8); return crc; diff --git a/src/fpga.c b/src/fpga.c index 44a3751..b3a89f9 100644 --- a/src/fpga.c +++ b/src/fpga.c @@ -52,10 +52,6 @@ #include "led.h" #include "timer.h" -/* -DWORD get_fattime(void) { - return 0L; -}*/ void fpga_set_prog_b(uint8_t val) { if(val) BITBAND(PROGBREG->FIOSET, PROGBBIT) = 1; diff --git a/src/lpc1754.ld b/src/lpc1754.ld index 246fcee..78d899e 100644 --- a/src/lpc1754.ld +++ b/src/lpc1754.ld @@ -10,9 +10,9 @@ ENTRY(_start) MEMORY { - flash (rx) : ORIGIN = 0x00000000, LENGTH = 128K - ram (rwx) : ORIGIN = 0x10000000, LENGTH = 16K - ahbram (rwx) : ORIGIN = 0x2007C000, LENGTH = 16K + flash (rx) : ORIGIN = 0x00000000, LENGTH = 0x20000 + ram (rwx) : ORIGIN = 0x10000000, LENGTH = 0x03fe0 /* leave room for IAP */ + ahbram (rwx) : ORIGIN = 0x2007C000, LENGTH = 0x04000 } SECTIONS diff --git a/src/main.c b/src/main.c index d9d8d29..9cbe47c 100644 --- a/src/main.c +++ b/src/main.c @@ -19,8 +19,9 @@ #include "snes.h" #include "led.h" #include "sort.h" - +#include "cic.h" #include "tests.h" +#include "cli.h" #define EMC0TOGGLE (3<<4) #define MR0R (1<<1) @@ -29,7 +30,7 @@ int i; /* FIXME HACK */ volatile enum diskstates disk_state; - +extern volatile tick_t ticks; int main(void) { LPC_GPIO2->FIODIR = BV(0) | BV(1) | BV(2); LPC_GPIO1->FIODIR = 0; @@ -40,10 +41,11 @@ int main(void) { | BV(3) | BV(5); /* SSP0 (FPGA) except SS */ LPC_PINCON->PINSEL0 = BV(31) /* SSP0 */ | BV(13) | BV(15) | BV(17) | BV(19) /* SSP1 (SD) */ - | BV(20) | BV(21); /* MAT3.0 */ + | BV(20) | BV(21); /* MAT3.0 (FPGA clock) */ - /* enable pull-downs for CIC data lines */ + /* pull-down CIC data lines */ LPC_PINCON->PINMODE3 = BV(18) | BV(19) | BV(20) | BV(21); + clock_disconnect(); snes_init(); snes_reset(1); @@ -53,7 +55,7 @@ int main(void) { fpga_spi_init(); spi_preinit(SPI_FPGA); spi_preinit(SPI_SD); -/* do this last because the peripheral init()s change PCLK dividers */ + /* do this last because the peripheral init()s change PCLK dividers */ clock_init(); sd_init(); @@ -61,6 +63,8 @@ int main(void) { delay_ms(10); printf("\n\nsd2snes mk.2\n============\nfw ver.: " VER "\ncpu clock: %d Hz\n", CONFIG_CPU_FREQUENCY); file_init(); + cic_init(1); + /* uart_putc('S'); for(p1=0; p1<8192; p1++) { file_read(); @@ -80,6 +84,10 @@ int main(void) { fpga_init(); fpga_pgm((uint8_t*)"/sd2snes/main.bit"); restart: + if(get_cic_state() == CIC_PAIR) { + printf("PAIR MODE ENGAGED!\n"); + cic_pair(CIC_NTSC, CIC_NTSC); + } rdyled(1); readled(0); writeled(0); @@ -149,12 +157,13 @@ restart: uint8_t cmd = 0; printf("test sram\n"); - while(!sram_reliable()) uart_puts("DERP"); + while(!sram_reliable()); printf("ok\n"); sram_hexdump(SRAM_DB_ADDR, 0x200); while(!cmd) { cmd=menu_main_loop(); + sleep_ms(50); switch(cmd) { case SNES_CMD_LOADROM: get_selected_name(file_lfn); @@ -187,6 +196,10 @@ sram_hexdump(SRAM_DB_ADDR, 0x200); uint8_t snes_reset_prev=0, snes_reset_now=0, snes_reset_state=0; uint16_t reset_count=0; while(fpga_test() == FPGA_TEST_TOKEN) { + cli_entrycheck(); + sleep_ms(250); + sram_reliable(); + printf("%s ", get_cic_statename(get_cic_state())); snes_reset_now=get_snes_reset(); if(snes_reset_now) { if(!snes_reset_prev) { diff --git a/src/smc.c b/src/smc.c index bac6114..7e79de8 100644 --- a/src/smc.c +++ b/src/smc.c @@ -98,7 +98,7 @@ void smc_id(snes_romprops_t* props) { } } } -/* dprintf("%d: offset = %lX; score = %d\n", num, hdr_addr[num], score); */ +printf("%d: offset = %lX; score = %d\n", num, hdr_addr[num], score); // */ if(score>=maxscore) { score_idx=num; maxscore=score; @@ -111,19 +111,26 @@ void smc_id(snes_romprops_t* props) { props->offset = 0; } - /* restore the chosen one */ + /* restore the chosen one */ /*dprintf("winner is %d\n", score_idx); */ file_readblock(header, hdr_addr[score_idx], sizeof(snes_header_t)); switch(header->map & 0xef) { - case 0x20: - props->mapper_id = 1; - break; - case 0x21: + case 0x21: /* HiROM */ props->mapper_id = 0; break; - case 0x25: + case 0x20: /* LoROM */ + props->mapper_id = 1; + break; + case 0x25: /* ExHiROM */ props->mapper_id = 2; break; + case 0x22: /* ExLoROM */ + if(file_handle.fsize > 0x400200) { + props->mapper_id = 6; /* SO96 */ + } else { + props->mapper_id = 3; + } + break; default: /* invalid/unsupported mapper, use header location */ switch(score_idx) { case 0: @@ -132,7 +139,13 @@ void smc_id(snes_romprops_t* props) { break; case 2: case 3: - props->mapper_id = 1; + if(file_handle.fsize > 0x800200) { + props->mapper_id = 6; /* SO96 interleaved */ + } else if(file_handle.fsize > 0x400200) { + props->mapper_id = 3; /* ExLoROM */ + } else { + props->mapper_id = 1; /* LoROM */ + } break; case 4: case 5: diff --git a/src/snes.c b/src/snes.c index 83e77fb..76284fd 100644 --- a/src/snes.c +++ b/src/snes.c @@ -34,6 +34,8 @@ #include "ff.h" #include "led.h" #include "smc.h" +#include "timer.h" +#include "cli.h" uint8_t initloop=1; uint32_t saveram_crc, saveram_crc_old; @@ -124,6 +126,8 @@ uint8_t menu_main_loop() { if(get_snes_reset()) { cmd = 0; } + sleep_ms(20); + cli_entrycheck(); } return cmd; } diff --git a/src/timer.c b/src/timer.c index c0c2732..0b7da98 100644 --- a/src/timer.c +++ b/src/timer.c @@ -5,7 +5,7 @@ #include "config.h" #include "timer.h" #include "clock.h" - +#include "uart.h" /* bit definitions */ #define RITINT 0 @@ -14,6 +14,7 @@ #define PCRIT 16 volatile tick_t ticks; +volatile int wokefromrit; void __attribute__((weak,noinline)) SysTick_Hook(void) { /* Empty function for hooking the systick handler */ @@ -25,6 +26,16 @@ void SysTick_Handler(void) { SysTick_Hook(); } +void __attribute__((weak,noinline)) RIT_Hook(void) { +} + +void RIT_IRQHandler(void) { + LPC_RIT->RICTRL = BV(RITINT); + NVIC_ClearPendingIRQ(RIT_IRQn); + wokefromrit = 1; + RIT_Hook(); +} + void timer_init(void) { /* turn on power to RIT */ BITBAND(LPC_SC->PCONP, PCRIT) = 1; @@ -36,7 +47,7 @@ void timer_init(void) { BITBAND(LPC_SC->PCLKSEL1, 26) = 1; BITBAND(LPC_SC->PCLKSEL1, PCLK_TIMER3) = 1; /* enable SysTick */ - SysTick_Config(SysTick->CALIB & SysTick_CALIB_TENMS_Msk); +// XXX SysTick_Config(SysTick->CALIB & SysTick_CALIB_TENMS_Msk); } extern int testval; @@ -57,8 +68,8 @@ void delay_us(unsigned int time) { void delay_ms(unsigned int time) { /* Prepare RIT */ LPC_RIT->RICOUNTER = 0; - LPC_RIT->RICTRL = BV(RITEN) | BV(RITINT); LPC_RIT->RICOMPVAL = (CONFIG_CPU_FREQUENCY / 1000) * time; + LPC_RIT->RICTRL = BV(RITEN) | BV(RITINT); /* Wait until RIT signals an interrupt */ while (!(BITBAND(LPC_RIT->RICTRL, RITINT))) ; @@ -66,3 +77,22 @@ void delay_ms(unsigned int time) { /* Disable RIT */ LPC_RIT->RICTRL = 0; } + +void sleep_ms(unsigned int time) { + + wokefromrit = 0; + /* Prepare RIT */ + LPC_RIT->RICOUNTER = 0; + LPC_RIT->RICOMPVAL = (CONFIG_CPU_FREQUENCY / 1000) * time; + LPC_RIT->RICTRL = BV(RITEN) | BV(RITINT); + NVIC_EnableIRQ(RIT_IRQn); + + /* Wait until RIT signals an interrupt */ +//uart_putc(';'); + while(!wokefromrit) { + __WFI(); + } + NVIC_DisableIRQ(RIT_IRQn); + /* Disable RIT */ + LPC_RIT->RICTRL = BV(RITINT); +} diff --git a/src/timer.h b/src/timer.h index 75cc3ef..f775015 100644 --- a/src/timer.h +++ b/src/timer.h @@ -46,5 +46,6 @@ void delay_us(unsigned int time); /* delay for "time" milliseconds - uses the RIT */ void delay_ms(unsigned int time); +void sleep_ms(unsigned int time); #endif diff --git a/src/uart.c b/src/uart.c index a1eb37b..b5697f7 100644 --- a/src/uart.c +++ b/src/uart.c @@ -172,7 +172,6 @@ void uart_putc(char c) { unsigned char uart_getc(void) { /* wait for character */ while (!(BITBAND(UART_REGS->LSR, 0))) ; - return UART_REGS->RBR; }