From 0b46b04dd9128a396791f1af01cafd246d51fd5e Mon Sep 17 00:00:00 2001 From: ikari Date: Sun, 15 Nov 2009 21:43:20 +0100 Subject: [PATCH] reset detection --- pcb/cart/sd2snes18.sch | Bin 384406 -> 384406 bytes src/main.c | 64 +++++++++++++++++++++++++---------------- src/memory.c | 28 ++++++++++++++++++ src/memory.h | 5 +++- src/snes.c | 59 ++++++++++++++++++++++++++++--------- src/snes.h | 2 ++ 6 files changed, 119 insertions(+), 39 deletions(-) diff --git a/pcb/cart/sd2snes18.sch b/pcb/cart/sd2snes18.sch index 1648ed0c888f13e3d4ba5b0ccc4f30ce282fb4fa..5e52ea3bf376058f4fa10b9194d55e7466aaf9db 100644 GIT binary patch delta 9377 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 delta 9355 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 aEI!$h;uIS&MgMH{6Q3e_d77jB;{OAW_>Z0d diff --git a/src/main.c b/src/main.c index 7c0b40e..b7c4021 100644 --- a/src/main.c +++ b/src/main.c @@ -154,40 +154,53 @@ int main(void) { set_avr_ena(0); snes_reset(1); - sram_writelong(0x12345678, SRAM_SCRATCHPAD); *fs_path=0; - uint16_t curr_dir_id = scan_dir(fs_path, 0, 0); // generate files footprint - dprintf("curr dir id = %x\n", curr_dir_id); uint16_t saved_dir_id; + get_db_id(&saved_dir_id); + uint16_t mem_dir_id = sram_readshort(SRAM_DIRID); + uint32_t mem_magic = sram_readlong(SRAM_SCRATCHPAD); led_pwm(); - if((get_db_id(&saved_dir_id) != FR_OK) // no database? - || saved_dir_id != curr_dir_id) { // files changed? // XXX - dprintf("saved dir id = %x\n", saved_dir_id); - _delay_ms(50); - dprintf("rebuilding database..."); - _delay_ms(50); - curr_dir_id = scan_dir(fs_path, 1, 0); // then rebuild database - sram_writeblock(&curr_dir_id, SRAM_DB_ADDR, 2); - uint32_t endaddr, direndaddr; - sram_readblock(&endaddr, SRAM_DB_ADDR+4, 4); - sram_readblock(&direndaddr, SRAM_DB_ADDR+8, 4); - dprintf("%lx %lx\n", endaddr, direndaddr); - save_sram((uint8_t*)"/sd2snes/sd2snes.db", endaddr-SRAM_DB_ADDR, SRAM_DB_ADDR); - save_sram((uint8_t*)"/sd2snes/sd2snes.dir", direndaddr-(SRAM_DIR_ADDR), SRAM_DIR_ADDR); - dprintf("done\n"); - sram_hexdump(SRAM_DB_ADDR, 0x400); - } else { - dprintf("loading db...\n"); - load_sram((uint8_t*)"/sd2snes/sd2snes.db", SRAM_DB_ADDR); - load_sram((uint8_t*)"/sd2snes/sd2snes.dir", SRAM_DIR_ADDR); - } + if((mem_magic != 0x12345678) || (mem_dir_id != saved_dir_id)) { + uint16_t curr_dir_id = scan_dir(fs_path, 0, 0); // generate files footprint + dprintf("curr dir id = %x\n", curr_dir_id); + + led_pwm(); + + if((get_db_id(&saved_dir_id) != FR_OK) // no database? + || saved_dir_id != curr_dir_id) { // files changed? // XXX + dprintf("saved dir id = %x\n", saved_dir_id); + _delay_ms(50); + dprintf("rebuilding database..."); + _delay_ms(50); + curr_dir_id = scan_dir(fs_path, 1, 0); // then rebuild database + sram_writeblock(&curr_dir_id, SRAM_DB_ADDR, 2); + uint32_t endaddr, direndaddr; + sram_readblock(&endaddr, SRAM_DB_ADDR+4, 4); + sram_readblock(&direndaddr, SRAM_DB_ADDR+8, 4); + dprintf("%lx %lx\n", endaddr, direndaddr); + save_sram((uint8_t*)"/sd2snes/sd2snes.db", endaddr-SRAM_DB_ADDR, SRAM_DB_ADDR); + save_sram((uint8_t*)"/sd2snes/sd2snes.dir", direndaddr-(SRAM_DIR_ADDR), SRAM_DIR_ADDR); + dprintf("done\n"); + sram_hexdump(SRAM_DB_ADDR, 0x400); + } else { + dprintf("different card, consistent db, loading db...\n"); + load_sram((uint8_t*)"/sd2snes/sd2snes.db", SRAM_DB_ADDR); + load_sram((uint8_t*)"/sd2snes/sd2snes.dir", SRAM_DIR_ADDR); + } // save_sram((uint8_t*)"/debug.smc", 0x400000, 0); // uart_putc('['); // load_sram((uint8_t*)"/test.srm", SRAM_SAVE_ADDR); // uart_putc(']'); + sram_writeshort(curr_dir_id, SRAM_DIRID); + sram_writelong(0x12345678, SRAM_SCRATCHPAD); + } else { + dprintf("same card, loading db...\n"); + load_sram((uint8_t*)"/sd2snes/sd2snes.db", SRAM_DB_ADDR); + load_sram((uint8_t*)"/sd2snes/sd2snes.dir", SRAM_DIR_ADDR); + } uart_putc('('); load_rom((uint8_t*)"/sd2snes/menu.bin"); set_rom_mask(0x3fffff); // force mirroring off @@ -229,6 +242,9 @@ int main(void) { dprintf("cmd was %x, going to snes main loop\n", cmd); cmd=0; while(1) { + if(get_snes_reset()) { + dprintf("RESET\n"); + } snes_main_loop(); } diff --git a/src/memory.c b/src/memory.c index 115c63f..e22320f 100644 --- a/src/memory.c +++ b/src/memory.c @@ -17,6 +17,7 @@ #include "smc.h" #include "fpga_spi.h" #include "memory.h" +#include "snes.h" char* hex = "0123456789ABCDEF"; @@ -48,6 +49,16 @@ uint8_t sram_readbyte(uint32_t addr) { return val; } +void sram_writeshort(uint16_t val, uint32_t addr) { + set_avr_addr(addr); + spi_fpga(); + spiTransferByte(0x91); // WRITE + spiTransferByte(val&0xff); // 7-0 + spiTransferByte((val>>8)&0xff); // 15-8 + spiTransferByte(0x00); // dummy + spi_none(); +} + void sram_writelong(uint32_t val, uint32_t addr) { set_avr_addr(addr); spi_fpga(); @@ -60,6 +71,18 @@ void sram_writelong(uint32_t val, uint32_t addr) { spi_none(); } +uint16_t sram_readshort(uint32_t addr) { + set_avr_addr(addr); + spi_fpga(); + spiTransferByte(0x81); + spiTransferByte(0x00); + + uint32_t val = spiTransferByte(0x00); + val |= ((uint32_t)spiTransferByte(0x00)<<8); + spi_none(); + return val; +} + uint32_t sram_readlong(uint32_t addr) { set_avr_addr(addr); spi_fpga(); @@ -227,12 +250,17 @@ uint32_t calc_sram_crc(uint32_t base_addr, uint32_t size) { uint32_t count; uint16_t crc; crc=0; + crc_valid=1; set_avr_addr(base_addr); spi_fpga(); spiTransferByte(0x81); spiTransferByte(0x00); for(count=0; count out - PORTD &= ~_BV(PD6); // /RESET = 0 - PORTD |= _BV(PD5); // RESET_DIR = 1; + PORTD &= ~_BV(PD6); // /RESET = 0 + PORTD |= _BV(PD5); // RESET_DIR = 1; } else { - PORTD &= ~_BV(PD5); // RESET_DIR = 0; - DDRD &= ~_BV(PD6); // /RESET pin -> in - PORTD |= _BV(PD6); // /RESET = 1 + PORTD &= ~_BV(PD5); // RESET_DIR = 0; + DDRD &= ~_BV(PD6); // /RESET pin -> in + PORTD |= _BV(PD6); // /RESET = pullup } } +/* + * gets the SNES reset state. + * + * returns: 1 when reset, 0 when not reset + */ +uint8_t get_snes_reset() { +// DDRD &= ~_BV(PD6); // /RESET pin -> in +// PORTD &= ~_BV(PD5); // RESET_DIR (external buffer) = 0 + return !(PIND & _BV(PD6)); +} + /* * SD2SNES main loop. * monitors SRAM changes and other things */ +uint32_t diffcount = 0, samecount = 0; void snes_main_loop() { if(initloop) { saveram_crc_old = calc_sram_crc(saveram_base_addr, saveram_size); initloop=0; } saveram_crc = calc_sram_crc(saveram_base_addr, saveram_size); - if(saveram_crc != saveram_crc_old) { - uart_putc('U'); - uart_puthexshort(saveram_crc); - uart_putcrlf(); - set_busy_led(1); - save_sram((uint8_t*)"/test.srm", saveram_size, saveram_base_addr); - set_busy_led(0); + if(crc_valid) { + if(saveram_crc != saveram_crc_old) { + if(samecount) { + diffcount=1; + } else { + diffcount++; + } + samecount=0; + } + if(saveram_crc == saveram_crc_old) { + samecount++; + } + if(diffcount>=1 && samecount==3) { + uart_putc('U'); + uart_puthexshort(saveram_crc); + uart_putcrlf(); + set_busy_led(1); + save_sram((uint8_t*)"/test.srm", saveram_size, saveram_base_addr); + set_busy_led(0); + } + saveram_crc_old = saveram_crc; } - saveram_crc_old = saveram_crc; + dprintf("valid=%d diffcount=%ld samecount=%ld\n", crc_valid, diffcount, samecount); } /* @@ -69,7 +95,12 @@ uint8_t menu_main_loop() { uint8_t cmd = 0; sram_writebyte(0, SRAM_CMD_ADDR); while(!cmd) { - cmd = sram_readbyte(SRAM_CMD_ADDR); + if(!get_snes_reset()) { + cmd = sram_readbyte(SRAM_CMD_ADDR); + } + if(get_snes_reset()) { + cmd = 0; + } } return cmd; } diff --git a/src/snes.h b/src/snes.h index 06ffe46..488537d 100644 --- a/src/snes.h +++ b/src/snes.h @@ -4,9 +4,11 @@ #ifndef SNES_H #define SNES_H +uint8_t crc_valid; void snes_init(void); void snes_reset(int state); +uint8_t get_snes_reset(void); void snes_main_loop(void); uint8_t menu_main_loop(void); void get_selected_name(uint8_t* lfn);