some sanity checks, early status messages
This commit is contained in:
parent
2afcfcf742
commit
31d9e1a1d2
@ -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,
|
||||
# it will preserve the spelling of the filenames, and gcc itself does
|
||||
# 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].
|
||||
|
||||
@ -52,8 +52,8 @@ crc_xmodem_update:
|
||||
eor r0, r3, r0, lsl #8 // update CRC
|
||||
uxth r0, r0 // clear top bits of result
|
||||
bx lr // return
|
||||
|
||||
|
||||
|
||||
|
||||
crc_table:
|
||||
.short 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7
|
||||
.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 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
|
||||
|
||||
|
||||
.end
|
||||
|
||||
@ -62,7 +62,7 @@ void disk_init(void);
|
||||
/* Will be set to DISK_ERROR if any access on the card fails */
|
||||
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;
|
||||
|
||||
/* Disk type - part of the external API except for ATA2! */
|
||||
|
||||
@ -28,13 +28,23 @@
|
||||
#include "uart.h"
|
||||
#include "ff.h"
|
||||
#include "fileops.h"
|
||||
#include "diskio.h"
|
||||
|
||||
/*
|
||||
WCHAR ff_convert(WCHAR w, UINT dir) {
|
||||
return w;
|
||||
}*/
|
||||
|
||||
int newcard;
|
||||
|
||||
void file_init() {
|
||||
file_res=f_mount(0, &fatfs);
|
||||
newcard = 0;
|
||||
}
|
||||
|
||||
void file_reinit(void) {
|
||||
disk_init();
|
||||
file_init();
|
||||
}
|
||||
|
||||
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) {
|
||||
if (disk_state == DISK_CHANGED) {
|
||||
file_reinit();
|
||||
newcard = 1;
|
||||
}
|
||||
file_res = f_open(&file_handle, (TCHAR*)filename, flags);
|
||||
file_block_off = sizeof(file_buf);
|
||||
file_block_max = sizeof(file_buf);
|
||||
|
||||
@ -123,7 +123,7 @@ uint32_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
|
||||
}
|
||||
len = strlen((char*)path);
|
||||
for (;;) {
|
||||
toggle_read_led();
|
||||
// toggle_read_led();
|
||||
res = f_readdir(&dir, &fno);
|
||||
if (res != FR_OK || fno.fname[0] == 0) {
|
||||
if(pass) {
|
||||
@ -247,7 +247,10 @@ SNES_FTYPE determine_filetype(char* filename) {
|
||||
char* ext = strrchr(filename, '.');
|
||||
if(ext == NULL)
|
||||
return TYPE_UNKNOWN;
|
||||
if(!strcasecmp(ext+1, "SMC")) {
|
||||
if( (!strcasecmp(ext+1, "SMC"))
|
||||
||(!strcasecmp(ext+1, "SFC"))
|
||||
||(!strcasecmp(ext+1, "FIG"))
|
||||
) {
|
||||
return TYPE_SMC;
|
||||
}/* later
|
||||
if(!strcasecmp_P(ext+1, PSTR("SRM"))) {
|
||||
|
||||
47
src/fpga.c
47
src/fpga.c
@ -52,6 +52,7 @@
|
||||
#include "led.h"
|
||||
#include "timer.h"
|
||||
#include "rle.h"
|
||||
#include "cfgware.h"
|
||||
|
||||
void fpga_set_prog_b(uint8_t val) {
|
||||
if(val)
|
||||
@ -128,7 +129,7 @@ void fpga_pgm(uint8_t* filename) {
|
||||
|
||||
for (;;) {
|
||||
data = rle_file_getc();
|
||||
i++;
|
||||
i++;
|
||||
if (file_status || file_res) break; /* error or eof */
|
||||
FPGA_SEND_BYTE_SERIAL(data);
|
||||
}
|
||||
@ -145,6 +146,50 @@ i++;
|
||||
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) {
|
||||
if(!val) {
|
||||
/* shared mode */
|
||||
|
||||
@ -37,7 +37,7 @@ int fpga_get_initb(void);
|
||||
void fpga_init(void);
|
||||
void fpga_postinit(void);
|
||||
void fpga_pgm(uint8_t* filename);
|
||||
|
||||
void fpga_rompgm(void);
|
||||
void set_mcu_ovr(uint8_t val);
|
||||
|
||||
|
||||
|
||||
73
src/main.c
73
src/main.c
@ -76,11 +76,52 @@ led_pwm();
|
||||
LPC_TIM3->MR0=1;
|
||||
LPC_TIM3->TCR=1;
|
||||
fpga_init();
|
||||
fpga_pgm((uint8_t*)"/main.bit.rle");
|
||||
// fpga_pgm((uint8_t*)"/main.bit.rle");
|
||||
fpga_rompgm();
|
||||
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) {
|
||||
printf("PAIR MODE ENGAGED!\n");
|
||||
cic_pair(CIC_NTSC, CIC_NTSC);
|
||||
cic_pair(CIC_PAL, CIC_PAL);
|
||||
}
|
||||
rdyled(1);
|
||||
readled(0);
|
||||
@ -94,10 +135,9 @@ restart:
|
||||
|
||||
uint32_t mem_dir_id = sram_readlong(SRAM_DIRID);
|
||||
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);
|
||||
mem_magic=0x12938712; /* always rescan card for now */
|
||||
if((mem_magic != 0x12345678) || (mem_dir_id != saved_dir_id)) {
|
||||
if((mem_magic != 0x12345678) || (mem_dir_id != saved_dir_id) || (newcard)) {
|
||||
newcard = 0;
|
||||
/* generate fs footprint (interesting files only) */
|
||||
uint32_t curr_dir_id = scan_dir(fs_path, 0, 0);
|
||||
printf("curr dir id = %lx\n", curr_dir_id);
|
||||
@ -107,6 +147,7 @@ restart:
|
||||
/* rebuild database */
|
||||
printf("saved dir id = %lx\n", saved_dir_id);
|
||||
printf("rebuilding database...");
|
||||
snes_bootprint(" rebuilding database ... \0");
|
||||
curr_dir_id = scan_dir(fs_path, 1, 0);
|
||||
sram_writeblock(&curr_dir_id, SRAM_DB_ADDR, 4);
|
||||
uint32_t endaddr, direndaddr;
|
||||
@ -114,8 +155,10 @@ restart:
|
||||
sram_readblock(&direndaddr, SRAM_DB_ADDR+8, 4);
|
||||
printf("%lx %lx\n", endaddr, direndaddr);
|
||||
printf("sorting database...");
|
||||
snes_bootprint(" sorting database ... \0");
|
||||
sort_all_dir(direndaddr);
|
||||
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.dir", direndaddr-(SRAM_DIR_ADDR), SRAM_DIR_ADDR);
|
||||
printf("done\n");
|
||||
@ -147,16 +190,18 @@ restart:
|
||||
set_mcu_ovr(0);
|
||||
|
||||
printf("SNES GO!\n");
|
||||
snes_reset(1);
|
||||
delay_ms(1);
|
||||
snes_reset(0);
|
||||
|
||||
uint8_t cmd = 0;
|
||||
uint32_t filesize=0;
|
||||
sram_writebyte(32, SRAM_CMD_ADDR);
|
||||
printf("test sram\n");
|
||||
while(!sram_reliable());
|
||||
printf("ok\n");
|
||||
//sram_hexdump(SRAM_DB_ADDR, 0x200);
|
||||
//sram_hexdump(SRAM_MENU_ADDR, 0x400);
|
||||
|
||||
while(!cmd) {
|
||||
cmd=menu_main_loop();
|
||||
printf("cmd: %d\n", cmd);
|
||||
@ -195,10 +240,10 @@ restart:
|
||||
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()));
|
||||
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) {
|
||||
@ -228,7 +273,13 @@ restart:
|
||||
save_sram(file_lfn, romprops.ramsize_bytes, SRAM_SAVE_ADDR);
|
||||
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;
|
||||
}
|
||||
snes_reset_prev = snes_reset_now;
|
||||
|
||||
22
src/memory.c
22
src/memory.c
@ -41,6 +41,7 @@
|
||||
#include "timer.h"
|
||||
#include "rle.h"
|
||||
#include "diskio.h"
|
||||
#include "snesboot.h"
|
||||
|
||||
char* hex = "0123456789ABCDEF";
|
||||
|
||||
@ -190,7 +191,7 @@ tickstmp=getticks();
|
||||
ticks_read+=getticks()-tickstmp;
|
||||
if (file_res || !bytes_read) break;
|
||||
if(!(count++ % 512)) {
|
||||
toggle_read_led();
|
||||
// toggle_read_led();
|
||||
/* bounce_busy_led(); */
|
||||
uart_putc('.');
|
||||
}
|
||||
@ -270,6 +271,25 @@ uint32_t load_sram_rle(uint8_t* filename, uint32_t base_addr) {
|
||||
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) {
|
||||
uint32_t count = 0;
|
||||
|
||||
@ -46,6 +46,7 @@
|
||||
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_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);
|
||||
uint8_t sram_readbyte(uint32_t addr);
|
||||
uint16_t sram_readshort(uint32_t addr);
|
||||
|
||||
@ -723,10 +723,12 @@ DRESULT sdn_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) {
|
||||
if(drv >= MAX_CARDS) {
|
||||
return RES_PARERR;
|
||||
}
|
||||
readled(1);
|
||||
for(sec=0; sec<count; sec++) {
|
||||
read_block(sector+sec, buffer);
|
||||
buffer+=512;
|
||||
}
|
||||
readled(0);
|
||||
return RES_OK;
|
||||
}
|
||||
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) {
|
||||
return RES_NOTRDY;
|
||||
}
|
||||
writeled(1);
|
||||
for(sec=0; sec<count; sec++) {
|
||||
write_block(sector+sec, buf);
|
||||
buf+=512;
|
||||
}
|
||||
writeled(0);
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
@ -36,6 +36,7 @@
|
||||
#include "smc.h"
|
||||
#include "timer.h"
|
||||
#include "cli.h"
|
||||
#include "fpga.h"
|
||||
|
||||
uint8_t initloop=1;
|
||||
uint32_t saveram_crc, saveram_crc_old;
|
||||
@ -139,3 +140,11 @@ void get_selected_name(uint8_t* fn) {
|
||||
printf("fd addr=%lx\n", addr);
|
||||
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);
|
||||
}
|
||||
|
||||
@ -38,4 +38,5 @@ uint8_t get_snes_reset(void);
|
||||
void snes_main_loop(void);
|
||||
uint8_t menu_main_loop(void);
|
||||
void get_selected_name(uint8_t* lfn);
|
||||
void snes_bootprint(void* msg);
|
||||
#endif
|
||||
|
||||
@ -20,7 +20,7 @@ void xmodem_rxfile(FIL* fil) {
|
||||
FRESULT res;
|
||||
uart_flush();
|
||||
do {
|
||||
delay_ms(10000);
|
||||
delay_ms(3000);
|
||||
uart_putc(ASC_NAK);
|
||||
} while (uart_getc() != ASC_SOH);
|
||||
do {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user