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,
# 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].

View File

@ -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

View File

@ -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! */

View File

@ -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);

View File

@ -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"))) {

View File

@ -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 */

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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

View File

@ -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 {