From d00b072e5f8e628dc3e24dac3b5c6d5bd7ccb530 Mon Sep 17 00:00:00 2001 From: ikari Date: Wed, 29 Feb 2012 21:57:15 +0100 Subject: [PATCH] firmware: query reset button in timer ISR --- src/sdnative.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/sdnative.h | 2 +- src/snes.c | 1 + src/timer.c | 3 +++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/sdnative.c b/src/sdnative.c index f28d8f6..4913826 100644 --- a/src/sdnative.c +++ b/src/sdnative.c @@ -12,6 +12,7 @@ #include "fileops.h" #include "bits.h" #include "fpga_spi.h" +#include "memory.h" #define MAX_CARDS 1 @@ -112,6 +113,7 @@ uint8_t cmd[6]={0,0,0,0,0,0}; uint8_t rsp[17]; uint8_t csd[17]; uint8_t cid[17]; +diskinfo0_t di; uint8_t ccs=0; uint32_t rca; @@ -929,6 +931,7 @@ DRESULT sdn_initialize(BYTE drv) { /* record CSD for getinfo */ cmd_slow(SEND_CSD, rca, 0, NULL, csd); + sdn_getinfo(drv, 0, &di); /* record CID */ cmd_slow(SEND_CID, rca, 0, NULL, cid); @@ -1057,3 +1060,55 @@ void sdn_changed() { } } +/* measure sd access time */ +void sdn_gettacc(uint32_t *tacc_max, uint32_t *tacc_avg) { + uint32_t sec1 = 0; + uint32_t sec2 = 0; + uint32_t time, time_max = 0; + uint32_t time_avg = 0LL; + uint32_t numread = 16384; + int i; + int sec_step = di.sectorcount / numread - 1; + if(disk_state == DISK_REMOVED) return; + sdn_checkinit(0); + for (i=0; i < 128; i++) { + sd_offload_tgt=2; + sd_offload=1; + sdn_read(0, NULL, 0, 1); + sd_offload_tgt=2; + sd_offload=1; + sdn_read(0, NULL, i*sec_step, 1); + } + for (i=0; i < numread && sram_readbyte(SRAM_CMD_ADDR) != 0x00 && disk_state != DISK_REMOVED; i++) { + /* reset timer */ + LPC_RIT->RICTRL = 0; + sd_offload_tgt=2; + sd_offload=1; + sdn_read(0, NULL, sec1, 2); + sec1 += 2; + /* start timer */ + LPC_RIT->RICOUNTER = 0; + LPC_RIT->RICTRL = BV(RITEN); + sd_offload_tgt=2; + sd_offload=1; + sdn_read(0, NULL, sec2, 1); + /* read timer */ + time = LPC_RIT->RICOUNTER; +/* sd_offload_tgt=2; + sd_offload=1; + sdn_read(0, NULL, sec2, 15);*/ + time_avg += time/16; + if(time > time_max) { + time_max = time; + } + sec2 += sec_step; + } + time_avg = time_avg / (i+1) * 16; + sd_offload=0; + LPC_RIT->RICTRL = 0; + if(disk_state != DISK_REMOVED) { + *tacc_max = time_max/(CONFIG_CPU_FREQUENCY / 1000000)-114; + *tacc_avg = time_avg/(CONFIG_CPU_FREQUENCY / 1000000)-114; + } +} + diff --git a/src/sdnative.h b/src/sdnative.h index 3deff21..39a76e5 100644 --- a/src/sdnative.h +++ b/src/sdnative.h @@ -25,6 +25,6 @@ DRESULT sdn_getinfo(BYTE drv, BYTE page, void *buffer); void sdn_changed(void); uint8_t* sdn_getcid(void); - +void sdn_gettacc(uint32_t *tacc_max, uint32_t *tacc_avg); #endif diff --git a/src/snes.c b/src/snes.c index 3171502..67e5f6b 100644 --- a/src/snes.c +++ b/src/snes.c @@ -44,6 +44,7 @@ uint32_t saveram_crc, saveram_crc_old; extern snes_romprops_t romprops; volatile int reset_changed; +volatile int reset_pressed; void prepare_reset() { snes_reset(1); diff --git a/src/timer.c b/src/timer.c index 0480d5b..78fdff4 100644 --- a/src/timer.c +++ b/src/timer.c @@ -17,6 +17,8 @@ extern volatile int sd_changed; extern volatile int reset_changed; +extern volatile int reset_pressed; + volatile tick_t ticks; volatile int wokefromrit; @@ -35,6 +37,7 @@ void SysTick_Handler(void) { } reset_state = (reset_state << 1) | get_snes_reset() | 0xe000; if((reset_state == 0xf000) || (reset_state == 0xefff)) { + reset_pressed = (reset_state == 0xf000); reset_changed = 1; } sdn_changed();