some sanity checks, early status messages

This commit is contained in:
ikari
2010-12-12 03:03:25 +01:00
parent 2afcfcf742
commit 31d9e1a1d2
14 changed files with 170 additions and 21 deletions

View File

@@ -65,7 +65,7 @@ SRC = main.c ff.c ccsbcs.c clock.c uart.c power.c led.c timer.c printf.c spi.c f
# Even though the DOS/Win* filesystem matches both .s and .S the same, # Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does # it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line. # care about how the name is spelled on its command-line.
ASRC = startup.S crc.S ASRC = startup.S crctab.S crc.S
# Optimization level, can be [0, 1, 2, 3, s]. # Optimization level, can be [0, 1, 2, 3, s].

View File

@@ -52,8 +52,8 @@ crc_xmodem_update:
eor r0, r3, r0, lsl #8 // update CRC eor r0, r3, r0, lsl #8 // update CRC
uxth r0, r0 // clear top bits of result uxth r0, r0 // clear top bits of result
bx lr // return bx lr // return
crc_table: crc_table:
.short 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7 .short 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7
.short 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef .short 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
@@ -88,4 +88,5 @@ crc_table:
.short 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8 .short 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8
.short 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 .short 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
.end .end

View File

@@ -62,7 +62,7 @@ void disk_init(void);
/* Will be set to DISK_ERROR if any access on the card fails */ /* Will be set to DISK_ERROR if any access on the card fails */
enum diskstates { DISK_CHANGED = 0, DISK_REMOVED, DISK_OK, DISK_ERROR }; enum diskstates { DISK_CHANGED = 0, DISK_REMOVED, DISK_OK, DISK_ERROR };
extern int sd_offload, ff_sd_offload; extern int sd_offload, ff_sd_offload, newcard;
extern volatile enum diskstates disk_state; extern volatile enum diskstates disk_state;
/* Disk type - part of the external API except for ATA2! */ /* Disk type - part of the external API except for ATA2! */

View File

@@ -28,13 +28,23 @@
#include "uart.h" #include "uart.h"
#include "ff.h" #include "ff.h"
#include "fileops.h" #include "fileops.h"
#include "diskio.h"
/* /*
WCHAR ff_convert(WCHAR w, UINT dir) { WCHAR ff_convert(WCHAR w, UINT dir) {
return w; return w;
}*/ }*/
int newcard;
void file_init() { void file_init() {
file_res=f_mount(0, &fatfs); file_res=f_mount(0, &fatfs);
newcard = 0;
}
void file_reinit(void) {
disk_init();
file_init();
} }
void file_open_by_filinfo(FILINFO* fno) { void file_open_by_filinfo(FILINFO* fno) {
@@ -42,6 +52,10 @@ void file_open_by_filinfo(FILINFO* fno) {
} }
void file_open(uint8_t* filename, BYTE flags) { void file_open(uint8_t* filename, BYTE flags) {
if (disk_state == DISK_CHANGED) {
file_reinit();
newcard = 1;
}
file_res = f_open(&file_handle, (TCHAR*)filename, flags); file_res = f_open(&file_handle, (TCHAR*)filename, flags);
file_block_off = sizeof(file_buf); file_block_off = sizeof(file_buf);
file_block_max = sizeof(file_buf); file_block_max = sizeof(file_buf);

View File

@@ -123,7 +123,7 @@ uint32_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
} }
len = strlen((char*)path); len = strlen((char*)path);
for (;;) { for (;;) {
toggle_read_led(); // toggle_read_led();
res = f_readdir(&dir, &fno); res = f_readdir(&dir, &fno);
if (res != FR_OK || fno.fname[0] == 0) { if (res != FR_OK || fno.fname[0] == 0) {
if(pass) { if(pass) {
@@ -247,7 +247,10 @@ SNES_FTYPE determine_filetype(char* filename) {
char* ext = strrchr(filename, '.'); char* ext = strrchr(filename, '.');
if(ext == NULL) if(ext == NULL)
return TYPE_UNKNOWN; return TYPE_UNKNOWN;
if(!strcasecmp(ext+1, "SMC")) { if( (!strcasecmp(ext+1, "SMC"))
||(!strcasecmp(ext+1, "SFC"))
||(!strcasecmp(ext+1, "FIG"))
) {
return TYPE_SMC; return TYPE_SMC;
}/* later }/* later
if(!strcasecmp_P(ext+1, PSTR("SRM"))) { if(!strcasecmp_P(ext+1, PSTR("SRM"))) {

View File

@@ -52,6 +52,7 @@
#include "led.h" #include "led.h"
#include "timer.h" #include "timer.h"
#include "rle.h" #include "rle.h"
#include "cfgware.h"
void fpga_set_prog_b(uint8_t val) { void fpga_set_prog_b(uint8_t val) {
if(val) if(val)
@@ -128,7 +129,7 @@ void fpga_pgm(uint8_t* filename) {
for (;;) { for (;;) {
data = rle_file_getc(); data = rle_file_getc();
i++; i++;
if (file_status || file_res) break; /* error or eof */ if (file_status || file_res) break; /* error or eof */
FPGA_SEND_BYTE_SERIAL(data); FPGA_SEND_BYTE_SERIAL(data);
} }
@@ -145,6 +146,50 @@ i++;
fpga_postinit(); fpga_postinit();
} }
void fpga_rompgm() {
int MAXRETRIES = 10;
int retries = MAXRETRIES;
uint8_t data;
int i;
tick_t timeout;
// UINT bytes_read;
// uint16_t j;
do {
i=0;
timeout = getticks() + 100;
fpga_set_prog_b(0);
uart_putc('P');
fpga_set_prog_b(1);
while(!fpga_get_initb()){
if(getticks() > timeout) {
printf("no response from FPGA trying to initiate configuration!\n");
led_panic();
}
};
LPC_GPIO2->FIOMASK1 = ~(BV(0));
uart_putc('p');
/* open configware file */
rle_mem_init(cfgware, sizeof(cfgware));
printf("sizeof(cfgware) = %d\n", sizeof(cfgware));
for (;;) {
data = rle_mem_getc();
if(rle_state) break;
i++;
FPGA_SEND_BYTE_SERIAL(data);
}
uart_putc('c');
printf("fpga_pgm: %d bytes programmed\n", i);
delay_ms(1);
} while (!fpga_get_done() && retries--);
if(!fpga_get_done()) {
printf("FPGA failed to configure after %d tries.\n", MAXRETRIES);
led_panic();
}
printf("FPGA configured\n");
fpga_postinit();
}
void set_mcu_ovr(uint8_t val) { void set_mcu_ovr(uint8_t val) {
if(!val) { if(!val) {
/* shared mode */ /* shared mode */

View File

@@ -37,7 +37,7 @@ int fpga_get_initb(void);
void fpga_init(void); void fpga_init(void);
void fpga_postinit(void); void fpga_postinit(void);
void fpga_pgm(uint8_t* filename); void fpga_pgm(uint8_t* filename);
void fpga_rompgm(void);
void set_mcu_ovr(uint8_t val); void set_mcu_ovr(uint8_t val);

View File

@@ -76,11 +76,52 @@ led_pwm();
LPC_TIM3->MR0=1; LPC_TIM3->MR0=1;
LPC_TIM3->TCR=1; LPC_TIM3->TCR=1;
fpga_init(); fpga_init();
fpga_pgm((uint8_t*)"/main.bit.rle"); // fpga_pgm((uint8_t*)"/main.bit.rle");
fpga_rompgm();
restart: restart:
if(disk_state == DISK_CHANGED) {
sdn_init();
newcard = 1;
}
load_bootrle(SRAM_MENU_ADDR);
set_saveram_mask(0x1fff);
set_rom_mask(0x3fffff);
set_mapper(0x7);
set_mcu_ovr(0);
snes_reset(0);
delay_ms(15); /* allow CIC to settle */
while(get_cic_state() == CIC_FAIL) {
rdyled(0);
readled(0);
writeled(0);
delay_ms(500);
rdyled(1);
readled(1);
writeled(1);
delay_ms(500);
}
/* some sanity checks */
uint8_t card_go = 0;
while(!card_go) {
if(disk_status(0) & (STA_NOINIT|STA_NODISK)) {
snes_bootprint(" No Card! \0");
while(disk_status(0) & (STA_NOINIT|STA_NODISK));
delay_ms(200);
}
file_open((uint8_t*)"/sd2snes/menu.bin", FA_READ);
if(file_status != FILE_OK) {
snes_bootprint(" /sd2snes/menu.bin not found! \0");
while(disk_status(0) == RES_OK);
} else {
card_go = 1;
}
file_close();
}
snes_bootprint(" Loading ... \0");
if(get_cic_state() == CIC_PAIR) { if(get_cic_state() == CIC_PAIR) {
printf("PAIR MODE ENGAGED!\n"); printf("PAIR MODE ENGAGED!\n");
cic_pair(CIC_NTSC, CIC_NTSC); cic_pair(CIC_PAL, CIC_PAL);
} }
rdyled(1); rdyled(1);
readled(0); readled(0);
@@ -94,10 +135,9 @@ restart:
uint32_t mem_dir_id = sram_readlong(SRAM_DIRID); uint32_t mem_dir_id = sram_readlong(SRAM_DIRID);
uint32_t mem_magic = sram_readlong(SRAM_SCRATCHPAD); uint32_t mem_magic = sram_readlong(SRAM_SCRATCHPAD);
printf("mem_magic=%lx mem_dir_id=%lx saved_dir_id=%lx\n", mem_magic, mem_dir_id, saved_dir_id); printf("mem_magic=%lx mem_dir_id=%lx saved_dir_id=%lx\n", mem_magic, mem_dir_id, saved_dir_id);
mem_magic=0x12938712; /* always rescan card for now */ if((mem_magic != 0x12345678) || (mem_dir_id != saved_dir_id) || (newcard)) {
if((mem_magic != 0x12345678) || (mem_dir_id != saved_dir_id)) { newcard = 0;
/* generate fs footprint (interesting files only) */ /* generate fs footprint (interesting files only) */
uint32_t curr_dir_id = scan_dir(fs_path, 0, 0); uint32_t curr_dir_id = scan_dir(fs_path, 0, 0);
printf("curr dir id = %lx\n", curr_dir_id); printf("curr dir id = %lx\n", curr_dir_id);
@@ -107,6 +147,7 @@ restart:
/* rebuild database */ /* rebuild database */
printf("saved dir id = %lx\n", saved_dir_id); printf("saved dir id = %lx\n", saved_dir_id);
printf("rebuilding database..."); printf("rebuilding database...");
snes_bootprint(" rebuilding database ... \0");
curr_dir_id = scan_dir(fs_path, 1, 0); curr_dir_id = scan_dir(fs_path, 1, 0);
sram_writeblock(&curr_dir_id, SRAM_DB_ADDR, 4); sram_writeblock(&curr_dir_id, SRAM_DB_ADDR, 4);
uint32_t endaddr, direndaddr; uint32_t endaddr, direndaddr;
@@ -114,8 +155,10 @@ restart:
sram_readblock(&direndaddr, SRAM_DB_ADDR+8, 4); sram_readblock(&direndaddr, SRAM_DB_ADDR+8, 4);
printf("%lx %lx\n", endaddr, direndaddr); printf("%lx %lx\n", endaddr, direndaddr);
printf("sorting database..."); printf("sorting database...");
snes_bootprint(" sorting database ... \0");
sort_all_dir(direndaddr); sort_all_dir(direndaddr);
printf("done\n"); printf("done\n");
snes_bootprint(" saving database ... \0");
save_sram((uint8_t*)"/sd2snes/sd2snes.db", endaddr-SRAM_DB_ADDR, SRAM_DB_ADDR); 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); save_sram((uint8_t*)"/sd2snes/sd2snes.dir", direndaddr-(SRAM_DIR_ADDR), SRAM_DIR_ADDR);
printf("done\n"); printf("done\n");
@@ -147,16 +190,18 @@ restart:
set_mcu_ovr(0); set_mcu_ovr(0);
printf("SNES GO!\n"); printf("SNES GO!\n");
snes_reset(1);
delay_ms(1);
snes_reset(0); snes_reset(0);
uint8_t cmd = 0; uint8_t cmd = 0;
uint32_t filesize=0; uint32_t filesize=0;
sram_writebyte(32, SRAM_CMD_ADDR);
printf("test sram\n"); printf("test sram\n");
while(!sram_reliable()); while(!sram_reliable());
printf("ok\n"); printf("ok\n");
//sram_hexdump(SRAM_DB_ADDR, 0x200); //sram_hexdump(SRAM_DB_ADDR, 0x200);
//sram_hexdump(SRAM_MENU_ADDR, 0x400); //sram_hexdump(SRAM_MENU_ADDR, 0x400);
while(!cmd) { while(!cmd) {
cmd=menu_main_loop(); cmd=menu_main_loop();
printf("cmd: %d\n", cmd); printf("cmd: %d\n", cmd);
@@ -195,10 +240,10 @@ restart:
uint8_t snes_reset_prev=0, snes_reset_now=0, snes_reset_state=0; uint8_t snes_reset_prev=0, snes_reset_now=0, snes_reset_state=0;
uint16_t reset_count=0; uint16_t reset_count=0;
while(fpga_test() == FPGA_TEST_TOKEN) { while(fpga_test() == FPGA_TEST_TOKEN) {
cli_entrycheck(); cli_entrycheck();
sleep_ms(250); sleep_ms(250);
sram_reliable(); sram_reliable();
printf("%s ", get_cic_statename(get_cic_state())); printf("%s ", get_cic_statename(get_cic_state()));
snes_reset_now=get_snes_reset(); snes_reset_now=get_snes_reset();
if(snes_reset_now) { if(snes_reset_now) {
if(!snes_reset_prev) { if(!snes_reset_prev) {
@@ -228,7 +273,13 @@ restart:
save_sram(file_lfn, romprops.ramsize_bytes, SRAM_SAVE_ADDR); save_sram(file_lfn, romprops.ramsize_bytes, SRAM_SAVE_ADDR);
writeled(0); writeled(0);
} }
delay_ms(1000); rdyled(1);
readled(1);
writeled(1);
snes_reset(0);
while(get_snes_reset());
snes_reset(1);
delay_ms(200);
goto restart; goto restart;
} }
snes_reset_prev = snes_reset_now; snes_reset_prev = snes_reset_now;

View File

@@ -41,6 +41,7 @@
#include "timer.h" #include "timer.h"
#include "rle.h" #include "rle.h"
#include "diskio.h" #include "diskio.h"
#include "snesboot.h"
char* hex = "0123456789ABCDEF"; char* hex = "0123456789ABCDEF";
@@ -190,7 +191,7 @@ tickstmp=getticks();
ticks_read+=getticks()-tickstmp; ticks_read+=getticks()-tickstmp;
if (file_res || !bytes_read) break; if (file_res || !bytes_read) break;
if(!(count++ % 512)) { if(!(count++ % 512)) {
toggle_read_led(); // toggle_read_led();
/* bounce_busy_led(); */ /* bounce_busy_led(); */
uart_putc('.'); uart_putc('.');
} }
@@ -270,6 +271,25 @@ uint32_t load_sram_rle(uint8_t* filename, uint32_t base_addr) {
return (uint32_t)filesize; return (uint32_t)filesize;
} }
uint32_t load_bootrle(uint32_t base_addr) {
uint8_t data;
set_mcu_addr(base_addr);
DWORD filesize = 0;
rle_mem_init(bootrle, sizeof(bootrle));
FPGA_SELECT();
FPGA_TX_BYTE(0x91);
for(;;) {
data = rle_mem_getc();
if(rle_state) break;
FPGA_TX_BYTE(data);
filesize++;
}
FPGA_TX_BYTE(0x00); /* dummy tx */
FPGA_DESELECT();
return (uint32_t)filesize;
}
void save_sram(uint8_t* filename, uint32_t sram_size, uint32_t base_addr) { void save_sram(uint8_t* filename, uint32_t sram_size, uint32_t base_addr) {
uint32_t count = 0; uint32_t count = 0;

View File

@@ -46,6 +46,7 @@
uint32_t load_rom(uint8_t* filename, uint32_t base_addr); uint32_t load_rom(uint8_t* filename, uint32_t base_addr);
uint32_t load_sram(uint8_t* filename, uint32_t base_addr); uint32_t load_sram(uint8_t* filename, uint32_t base_addr);
uint32_t load_sram_rle(uint8_t* filename, uint32_t base_addr); uint32_t load_sram_rle(uint8_t* filename, uint32_t base_addr);
uint32_t load_bootrle(uint32_t base_addr);
void sram_hexdump(uint32_t addr, uint32_t len); void sram_hexdump(uint32_t addr, uint32_t len);
uint8_t sram_readbyte(uint32_t addr); uint8_t sram_readbyte(uint32_t addr);
uint16_t sram_readshort(uint32_t addr); uint16_t sram_readshort(uint32_t addr);

View File

@@ -723,10 +723,12 @@ DRESULT sdn_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) {
if(drv >= MAX_CARDS) { if(drv >= MAX_CARDS) {
return RES_PARERR; return RES_PARERR;
} }
readled(1);
for(sec=0; sec<count; sec++) { for(sec=0; sec<count; sec++) {
read_block(sector+sec, buffer); read_block(sector+sec, buffer);
buffer+=512; buffer+=512;
} }
readled(0);
return RES_OK; return RES_OK;
} }
DRESULT disk_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) __attribute__ ((weak, alias("sdn_read"))); DRESULT disk_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) __attribute__ ((weak, alias("sdn_read")));
@@ -880,10 +882,12 @@ DRESULT sdn_write(BYTE drv, const BYTE *buffer, DWORD sector, BYTE count) {
if (sdn_status(drv) & STA_NODISK) { if (sdn_status(drv) & STA_NODISK) {
return RES_NOTRDY; return RES_NOTRDY;
} }
writeled(1);
for(sec=0; sec<count; sec++) { for(sec=0; sec<count; sec++) {
write_block(sector+sec, buf); write_block(sector+sec, buf);
buf+=512; buf+=512;
} }
writeled(0);
return RES_OK; return RES_OK;
} }

View File

@@ -36,6 +36,7 @@
#include "smc.h" #include "smc.h"
#include "timer.h" #include "timer.h"
#include "cli.h" #include "cli.h"
#include "fpga.h"
uint8_t initloop=1; uint8_t initloop=1;
uint32_t saveram_crc, saveram_crc_old; uint32_t saveram_crc, saveram_crc_old;
@@ -139,3 +140,11 @@ void get_selected_name(uint8_t* fn) {
printf("fd addr=%lx\n", addr); printf("fd addr=%lx\n", addr);
sram_readblock(fn, addr + 7 + SRAM_MENU_ADDR, 256); sram_readblock(fn, addr + 7 + SRAM_MENU_ADDR, 256);
} }
void snes_bootprint(void* msg) {
set_mcu_ovr(1);
sram_writeblock(msg, SRAM_CMD_ADDR, 33);
set_mcu_ovr(0);
delay_ms(30);
set_mcu_ovr(1);
}

View File

@@ -38,4 +38,5 @@ uint8_t get_snes_reset(void);
void snes_main_loop(void); void snes_main_loop(void);
uint8_t menu_main_loop(void); uint8_t menu_main_loop(void);
void get_selected_name(uint8_t* lfn); void get_selected_name(uint8_t* lfn);
void snes_bootprint(void* msg);
#endif #endif

View File

@@ -20,7 +20,7 @@ void xmodem_rxfile(FIL* fil) {
FRESULT res; FRESULT res;
uart_flush(); uart_flush();
do { do {
delay_ms(10000); delay_ms(3000);
uart_putc(ASC_NAK); uart_putc(ASC_NAK);
} while (uart_getc() != ASC_SOH); } while (uart_getc() != ASC_SOH);
do { do {