From 415cd5bd5bdcd4efe211f39d9e94bd39de7b6372 Mon Sep 17 00:00:00 2001 From: tpu Date: Sat, 25 Mar 2023 23:02:18 +0800 Subject: [PATCH] 1.Read pad by SMPC 2.Add key repeat mode 3.Add File R/W from SD 4.CDC bugfix --- Firm_Saturn/conio.c | 71 +++++++++--- Firm_Saturn/main.c | 142 +++++++++++++++++------- Firm_Saturn/main.h | 31 ++++-- Firm_Saturn/sci_shell.c | 8 ++ Firm_v12_STM32H750/Main/sdio_h7.c | 7 +- Firm_v12_STM32H750/Main/shell.c | 13 +++ Firm_v12_STM32H750/Saturn/cdc.h | 10 ++ Firm_v12_STM32H750/Saturn/saturn_cdc.c | 19 +++- Firm_v12_STM32H750/Saturn/saturn_main.c | 58 +++++++++- 9 files changed, 281 insertions(+), 78 deletions(-) diff --git a/Firm_Saturn/conio.c b/Firm_Saturn/conio.c index 16b4984..af508e8 100644 --- a/Firm_Saturn/conio.c +++ b/Firm_Saturn/conio.c @@ -358,35 +358,70 @@ void put_box(int x1, int y1, int x2, int y2, int c) /******************************************************************************/ static u32 last_pdat = 0; +static u32 last_value; static u32 curr_pdat = 0; static int pdat_state = 0; +static int pdat_count = 0; +static int pdat_wait; u32 conio_getc(void) { - u32 pdat; + u32 pdat = pad_read(); - while(1){ - if(pdat_state==0){ - pdat = pad_read(); - if(pdat != curr_pdat){ - curr_pdat = pdat; - pdat_state = 1; - } - }else if(pdat_state<100){ - pdat = pad_read(); - if(pdat == curr_pdat){ - pdat_state += 1; - }else{ - pdat_state = 0; + switch(pdat_state){ + case 0: + // 空闲检测 + if(pdat != curr_pdat){ + curr_pdat = pdat; + pdat_state = 1; + pdat_count = 0; + } + break; + case 1: + // 等待稳定 + if(pdat == curr_pdat){ + pdat_count += 1; + if(pdat_count==2){ + pdat_state = 2; } }else{ - pdat = last_pdat ^ curr_pdat; - last_pdat = curr_pdat; pdat_state = 0; - return (pdat<<16) | curr_pdat; } + break; + case 2: + // 稳定状态 + pdat = last_pdat ^ curr_pdat; + last_pdat = curr_pdat; + if(curr_pdat){ + // 转入重复状态 + pdat_state = 3; + pdat_count = 0; + pdat_wait = 500; + }else{ + pdat_state = 0; + } + last_value = (pdat<<16) | curr_pdat; + //printk("key0: %08x\n", last_value); + return last_value; + case 3: + // 重复状态 + if(pdat != curr_pdat){ + pdat_state = 0; + }else{ + pdat_count += 1; + if(pdat_count==pdat_wait){ + pdat_wait = 30; + pdat_count = 0; + //printk("keyr: %08x\n", last_value); + return last_value; + } + } + break; + default: + break; } + return 0; } @@ -484,6 +519,8 @@ _restart: #if 1 while(1){ ctrl = conio_getc(); + if(ctrl==0) + continue; retv = menu->handle(ctrl); if(retv==MENU_EXIT) break; diff --git a/Firm_Saturn/main.c b/Firm_Saturn/main.c index e71e6aa..4c3d6ea 100644 --- a/Firm_Saturn/main.c +++ b/Firm_Saturn/main.c @@ -12,32 +12,63 @@ #include "smpc.h" #include "vdp2.h" +/**********************************************************/ + + +u32 BE32(void *ptr) +{ + u8 *b = (u8*)ptr; + return (b[0]<<24) | (b[1]<<16) | (b[2]<<8) | b[3]; +} + + +u32 LE32(void *ptr) +{ + u8 *b = (u8*)ptr; + return (b[3]<<24) | (b[2]<<16) | (b[1]<<8) | b[0]; +} + +void LE32W(void *ptr, u32 val) +{ + u8 *b = (u8*)ptr; + b[0] = (val>> 0)&0xff; + b[1] = (val>> 8)&0xff; + b[2] = (val>>16)&0xff; + b[3] = (val>>24)&0xff; +} + /**********************************************************/ -void pad_init(void) -{ - PDR1 = 0; - DDR1 = 0x60; - IOSEL = IOSEL1; -} u32 pad_read(void) { - u32 bits; + u32 bits = 0; - PDR1 = 0x60; - bits = (PDR1 & 0x8) << 9; - PDR1 = 0x40; - bits |= (PDR1 & 0xf) << 8; - PDR1 = 0x20; - bits |= (PDR1 & 0xf) << 4; - PDR1 = 0x00; - bits |= (PDR1 & 0xf); + while(SF&0x01); + SF = 0x01; + COMREG = 0x10; + while(SF&0x01); - return bits ^ 0x1FFF; + bits = (OREG2<<8) | (OREG3); + IREG0 = 0x40; + + return bits ^ 0xFFFF; } + +void pad_init(void) +{ + DDR1 = 0; + EXLE = 0; + IOSEL = 0; + + IREG0 = 0x00; + IREG1 = 0x0a; + IREG2 = 0xf0; +} + + /**********************************************************/ int smpc_cmd(int cmd) @@ -164,6 +195,52 @@ int sci_getc(int timeout) } +/**********************************************************/ + +int read_file (char *name, int offset, int size, void *buf) +{ + int retv; + + LE32W((void*)0x22820000, offset); + LE32W((void*)0x22820004, size); + strcpy((void*)0x22820010, name); + + SS_ARG = 0; + SS_CMD = SSCMD_FILERD; + while(SS_CMD); + + retv = (signed short)SS_ARG; + if(retv<0) + return retv; + + size = LE32((void*)0x22820004); + memcpy(buf, (void*)0x22820100, size); + return size; +} + + +int write_file(char *name, int offset, int size, void *buf) +{ + int retv; + + LE32W((void*)0x22820000, offset); + LE32W((void*)0x22820004, size); + strcpy((void*)0x22820010, name); + memcpy((void*)0x22820100, buf, size); + + SS_ARG = 0; + SS_CMD = SSCMD_FILEWR; + while(SS_CMD); + + retv = (signed short)SS_ARG; + if(retv<0) + return retv; + + size = LE32((void*)0x22820004); + return size; +} + + /**********************************************************/ @@ -229,21 +306,6 @@ int mem_test(int size) } -/**********************************************************/ - -u32 BE32(void *ptr) -{ - u8 *b = (u8*)ptr; - return (b[0]<<24) | (b[1]<<16) | (b[2]<<8) | b[3]; -} - -u32 LE32(void *ptr) -{ - u8 *b = (u8*)ptr; - return (b[3]<<24) | (b[2]<<16) | (b[1]<<8) | b[0]; -} - - /**********************************************************/ static int total_disc, total_page, page; @@ -311,15 +373,17 @@ static int sel_handle(int ctrl) page_update(0); } }else if(BUTTON_DOWN(ctrl, PAD_LT)){ - if(page>0){ - page -= 1; - page_update(0); + page -= 1; + if(page<0){ + page = total_page-1; } + page_update(0); }else if(BUTTON_DOWN(ctrl, PAD_RT)){ - if((page+1)=total_page){ + page = 0; } + page_update(0); }else if(BUTTON_DOWN(ctrl, PAD_A)){ int index = page*11 + menu->current; @@ -401,7 +465,7 @@ int main_handle(int ctrl) menu_status(&main_menu, NULL); return MENU_EXIT; }else if(index==3){ - menu_status(&main_menu, NULL); + menu_status(&main_menu, "TODO"); }else if(index==update_index){ menu_status(&main_menu, "鍗囩骇涓,璇峰嬁鏂數..."); SS_ARG = 0; @@ -436,7 +500,7 @@ void menu_init(void) int i; memset(&main_menu, 0, sizeof(main_menu)); - strcpy(main_menu.title, "SAROO Boot Menu"); + sprintf(main_menu.title, "SAROO Boot Menu V%02x0000", SS_VER&0xff); for(i=0; i<4; i++){ add_menu_item(&main_menu, menu_str[i]); diff --git a/Firm_Saturn/main.h b/Firm_Saturn/main.h index 82c9891..5404cb3 100644 --- a/Firm_Saturn/main.h +++ b/Firm_Saturn/main.h @@ -18,8 +18,8 @@ typedef unsigned long long u64; #define NULL ((void*)0) -#define SS_ID REG16(0x25897000) -#define SS_VER REG16(0x25897002) +#define SS_ID REG16(0x25807000) +#define SS_VER REG16(0x25807002) #define SS_CTRL REG16(0x25897004) #define SS_STAT REG16(0x25897008) #define SS_TIMER REG32(0x2589700c) @@ -40,6 +40,8 @@ typedef unsigned long long u64; #define SSCMD_LOADDISC 0x0003 #define SSCMD_CHECK 0x0004 #define SSCMD_UPDATE 0x0005 +#define SSCMD_FILERD 0x0006 +#define SSCMD_FILEWR 0x0007 /*****************************************************************************/ @@ -67,19 +69,19 @@ void msleep(u32 ms); /*****************************************************************************/ -#define PAD_LT (1<<12) +#define PAD_RIGHT (1<<15) +#define PAD_LEFT (1<<14) +#define PAD_DOWN (1<<13) +#define PAD_UP (1<<12) #define PAD_START (1<<11) #define PAD_A (1<<10) #define PAD_C (1<<9) #define PAD_B (1<<8) -#define PAD_RIGHT (1<<7) -#define PAD_LEFT (1<<6) -#define PAD_DOWN (1<<5) -#define PAD_UP (1<<4) -#define PAD_RT (1<<3) -#define PAD_X (1<<2) -#define PAD_Y (1<<1) -#define PAD_Z (1<<0) +#define PAD_RT (1<<7) +#define PAD_X (1<<6) +#define PAD_Y (1<<5) +#define PAD_Z (1<<4) +#define PAD_LT (1<<3) u32 pad_read(void); @@ -143,6 +145,9 @@ int str2hex(char *str, int *hex); void dump(int argc, int *args, int width); void mem_dump(char *str, void *addr, int size); +int read_file (char *name, int offset, int size, void *buf); +int write_file(char *name, int offset, int size, void *buf); + /*****************************************************************************/ @@ -175,6 +180,8 @@ typedef struct { u32 crc32(u8 *buf, int len, u32 crc); +u32 get_sr(void); +void set_sr(u32 sr); void break_in_game(int break_pc, void *handle); void break_in_game_next(int break_pc, void *handle); void install_ubr_isr(void); @@ -192,7 +199,7 @@ void set_break_rw(u32 addr, u32 mask, int rw); typedef struct menu_desc_t { int num; int current; - char title[32]; + char title[64]; char items[11][64]; int (*handle)(int index); }MENU_DESC; diff --git a/Firm_Saturn/sci_shell.c b/Firm_Saturn/sci_shell.c index 75968c1..e9a4fd8 100644 --- a/Firm_Saturn/sci_shell.c +++ b/Firm_Saturn/sci_shell.c @@ -331,6 +331,14 @@ void sci_shell(void) printk("CDOFF ...\n"); REG16(0x25897004) = 0x8000; } + CMD(frt){ + int retv = read_file("/ramimage.bin", 0, 0, (void*)0x00280000); + printk("read /ramimage.bin to 0x00280000: %d\n", retv); + } + CMD(fwt){ + int retv = write_file("/saturn_save.bin", 0, 0x10000, (void*)0x00180000); + printk("write 0x00180000 to /saturn_save.bin: %d\n", retv); + } CMD(z) { /* 涓嬭浇鍒皉am骞惰繍琛. 濡傛灉鎸囧畾浜嗗湴鍧, 鍒欏彧涓嬭浇. */ diff --git a/Firm_v12_STM32H750/Main/sdio_h7.c b/Firm_v12_STM32H750/Main/sdio_h7.c index a990674..a66f5db 100644 --- a/Firm_v12_STM32H750/Main/sdio_h7.c +++ b/Firm_v12_STM32H750/Main/sdio_h7.c @@ -126,6 +126,7 @@ static int sd_card_insert(void) void SDIO_IRQHandler(void) { +#if 1 u32 cmd, mask, stat; stat = SDIO->STA; @@ -133,12 +134,16 @@ void SDIO_IRQHandler(void) cmd = SDIO->CMD; if(stat&SDMMC_STA_BUSYD0){ - printk("SD_IRQ: cmd=%08x stat=%08x mask=%08x Busy!\n", cmd, stat, mask); + //printk("SD_IRQ: cmd=%08x stat=%08x mask=%08x Busy!\n", cmd, stat, mask); SDIO->MASK = SDMMC_STA_BUSYD0END; }else{ SDIO->MASK = 0; osSemaphoreRelease(cmd_sem); } +#else + SDIO->MASK = 0; + osSemaphoreRelease(cmd_sem); +#endif } diff --git a/Firm_v12_STM32H750/Main/shell.c b/Firm_v12_STM32H750/Main/shell.c index 57f27c2..f292305 100644 --- a/Firm_v12_STM32H750/Main/shell.c +++ b/Firm_v12_STM32H750/Main/shell.c @@ -1,5 +1,6 @@ #include "main.h" +#include "ff.h" /******************************************************************************/ @@ -278,6 +279,18 @@ void simple_shell(void) void cdc_dump(); cdc_dump(); } + CMD(seram){ + FIL fp; + int retv = f_open(&fp, "/exram.bin", FA_CREATE_ALWAYS|FA_WRITE); + if(retv==FR_OK){ + u32 wsize = 0x00400000; + retv = f_write(&fp, (void*)0x61400000, 0x00400000, &wsize); + f_close(&fp); + printk("save to exram.bin: %d %d\n", retv, wsize); + }else{ + printk("create exram.bin failed! %d\n", retv); + } + } CMD(q){ break; diff --git a/Firm_v12_STM32H750/Saturn/cdc.h b/Firm_v12_STM32H750/Saturn/cdc.h index d83ca83..dc4859d 100644 --- a/Firm_v12_STM32H750/Saturn/cdc.h +++ b/Firm_v12_STM32H750/Saturn/cdc.h @@ -93,6 +93,15 @@ #define PLAYTYPE_DIR 3 +#define SSCMD_PRINTF 0x0001 +#define SSCMD_LISTDISC 0x0002 +#define SSCMD_LOADDISC 0x0003 +#define SSCMD_CHECK 0x0004 +#define SSCMD_UPDATE 0x0005 +#define SSCMD_FILERD 0x0006 +#define SSCMD_FILEWR 0x0007 + + #define MSF_TO_FAD(m,s,f) ((m * 4500) + (s * 75) + f) @@ -201,6 +210,7 @@ typedef struct u8 trans_block_end; // 鍒嗗尯涓渶鍚庝竴涓浼犺緭鐨勬墖鍖+1 BLOCK *trans_block; u16 trans_size; + u8 trans_finish; u8 last_buffer; diff --git a/Firm_v12_STM32H750/Saturn/saturn_cdc.c b/Firm_v12_STM32H750/Saturn/saturn_cdc.c index 3246f8e..bf6ad02 100644 --- a/Firm_v12_STM32H750/Saturn/saturn_cdc.c +++ b/Firm_v12_STM32H750/Saturn/saturn_cdc.c @@ -130,10 +130,13 @@ void trans_start(void) tcnt = 0; min_num = 40960; cdb.cdwnum = 0; + cdb.trans_finish = 0; if(cdb.trans_type==TRANS_DATA || cdb.trans_type==TRANS_DATA_DEL){ PARTITION *pt = &cdb.part[cdb.trans_part_index]; BLOCK *bt = find_block(pt, cdb.trans_block_start); + //printk("trans_start: pt=%d start=%d size=%d\n", + // cdb.trans_part_index, cdb.trans_block_start, cdb.trans_block_end-cdb.trans_block_start); //printk(" trans pt_%d: blks=%d bt=%08x size=%04x\n", cdb.trans_part_index, pt->numblocks, bt, bt->size); cdb.trans_bk = cdb.trans_block_start; @@ -179,12 +182,16 @@ void trans_start(void) void trans_handle(void) { tcnt += 1; - cdb.cdwnum += cdb.trans_size; + if(cdb.trans_finish==0){ + // 涓柇鍦ㄤ紶杈撶粨鏉熸椂浼氶噸澶嶈繘鍏ヤ竴娆°傝繖閲屽仛涓垽鏂紝浠ュ厤璇姞銆 + cdb.cdwnum += cdb.trans_size; + } if(cdb.trans_type==TRANS_DATA || cdb.trans_type==TRANS_DATA_DEL){ if(cdb.trans_bk==cdb.trans_block_end){ //printk(" trans end!\n"); + cdb.trans_finish = 1; ST_CTRL &= ~STIRQ_DAT; }else{ BLOCK *bt = cdb.trans_block->next; @@ -215,7 +222,7 @@ void trans_handle(void) fill_fifo(dp, cdb.trans_size); ST_STAT = STIRQ_DAT; ST_CTRL |= STIRQ_DAT; - HIRQ = HIRQ_DRDY | HIRQ_SCDQ; + HIRQ = HIRQ_SCDQ; } }else{ ST_CTRL &= ~STIRQ_DAT; @@ -509,8 +516,12 @@ int end_trans(void) ST_CTRL &= ~STIRQ_DAT; ST_STAT = STIRQ_DAT; - //printk(" cdwnum=%08x FIFO_STAT=%08x min_num=%d\n", cdb.cdwnum, FIFO_STAT, min_num); + //printk("end_trans: cdwnum=%08x FIFO_STAT=%08x min_num=%d\n", cdb.cdwnum, FIFO_STAT, min_num); fifo_remain = (FIFO_STAT&0x0fff)*2; // FIFO涓繕鏈夊灏戝瓧鑺傛湭璇 + if(fifo_remain>=512){ + //FIFO涓殑鏁版嵁澶т簬512瀛楄妭锛屼笉浼氫骇鐢熶腑鏂俢dwnum浼氬皯璁颁竴娆° + cdb.cdwnum += 0x800; + } cdb.cdwnum -= fifo_remain; // reset fifo @@ -528,7 +539,7 @@ int end_trans(void) } } - //printk("end_trans: cdwnum=%08x\n", cdb.cdwnum); + //printk(" : cdwnum=%08x\n", cdb.cdwnum); if(cdb.cdwnum){ SSCR1 = (cdb.status<<8) | ((cdb.cdwnum>>17)&0xff); SSCR2 = (cdb.cdwnum>>1)&0xffff; diff --git a/Firm_v12_STM32H750/Saturn/saturn_main.c b/Firm_v12_STM32H750/Saturn/saturn_main.c index e368ae8..6f0fb6d 100644 --- a/Firm_v12_STM32H750/Saturn/saturn_main.c +++ b/Firm_v12_STM32H750/Saturn/saturn_main.c @@ -295,6 +295,13 @@ _restart_nowait: { //printk("filter sector %08x...\n", fad); retv = filter_sector(play_track, &wblk); + { + // "Final Fight Revenge" need this! + int i; + for(i=0; i<500000; i++){ + NOTHING(); + } + } HIRQ = HIRQ_CSCT; if(retv==0){ // 閫佸埌鏌愪釜杩囨护鍣ㄦ垚鍔 @@ -388,24 +395,24 @@ void ss_cmd_handle(void) printk("scmd_task: %04x\n", SS_CMD); switch(cmd){ - case 0x0001: + case SSCMD_PRINTF: // 杈撳嚭淇℃伅 printk("%s", (char*)0x61820010); SS_CMD = 0; break; - case 0x0002: + case SSCMD_LISTDISC: // 鍒楀嚭闀滃儚淇℃伅 retv = list_disc(0); SS_ARG = retv; SS_CMD = 0; break; - case 0x0003: + case SSCMD_LOADDISC: // 瑁呰浇闀滃儚 retv = load_disc(SS_ARG); SS_ARG = retv; SS_CMD = 0; break; - case 0x0004: + case SSCMD_CHECK: { // 妫鏌ユ槸鍚︽湁鍗囩骇鍥轰欢 int fpga = (fpga_update(1)==0)? 1: 0; @@ -414,7 +421,7 @@ void ss_cmd_handle(void) SS_CMD = 0; break; } - case 0x0005: + case SSCMD_UPDATE: { // 鍥轰欢鍗囩骇 int fpga = (fpga_update(0)>=-1)? 0: 1; @@ -423,6 +430,47 @@ void ss_cmd_handle(void) SS_CMD = 0; break; } + case SSCMD_FILERD: + { + FIL fp; + int offset = *(u32*)(0x61820000); + int size = *(u32*)(0x61820004); + char *name = (char*)(0x61820010); + int retv = f_open(&fp, name, FA_READ); + if(retv==FR_OK){ + u32 rsize = 0; + f_lseek(&fp, offset); + if(size==0) + size = f_size(&fp); + retv = f_read(&fp, (void*)0x61820100, size, &rsize); + *(u32*)(0x61820004) = rsize; + f_close(&fp); + printk("\nSSCMD_FILERD: retv=%d rsize=%08x %s\n", retv, rsize, name); + } + SS_ARG = -retv; + SS_CMD = 0; + break; + } + case SSCMD_FILEWR: + { + FIL fp; + int offset = *(u32*)(0x61820000); + int size = *(u32*)(0x61820004); + char *name = (char*)(0x61820010); + int flags = (offset==0)? FA_CREATE_ALWAYS : FA_OPEN_ALWAYS; + int retv = f_open(&fp, name, flags|FA_WRITE); + if(retv==FR_OK){ + u32 wsize = 0; + f_lseek(&fp, offset); + retv = f_write(&fp, (void*)0x61820100, size, &wsize); + *(u32*)(0x61820004) = wsize; + f_close(&fp); + printk("\nSSCMD_FILEWR: retv=%d wsize=%08x %s\n", retv, wsize, name); + } + SS_ARG = -retv; + SS_CMD = 0; + break; + } default: printk("[SS] unkonw cmd: %04x\n", cmd); break;