mirror of
https://github.com/array-in-a-matrix/SAROO.git
synced 2025-04-02 10:31:43 -04:00
1.Read pad by SMPC
2.Add key repeat mode 3.Add File R/W from SD 4.CDC bugfix
This commit is contained in:
parent
51621a8dbe
commit
415cd5bd5b
9 changed files with 281 additions and 78 deletions
|
@ -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_pdat = 0;
|
||||||
|
static u32 last_value;
|
||||||
static u32 curr_pdat = 0;
|
static u32 curr_pdat = 0;
|
||||||
static int pdat_state = 0;
|
static int pdat_state = 0;
|
||||||
|
static int pdat_count = 0;
|
||||||
|
static int pdat_wait;
|
||||||
|
|
||||||
u32 conio_getc(void)
|
u32 conio_getc(void)
|
||||||
{
|
{
|
||||||
u32 pdat;
|
u32 pdat = pad_read();
|
||||||
|
|
||||||
while(1){
|
switch(pdat_state){
|
||||||
if(pdat_state==0){
|
case 0:
|
||||||
pdat = pad_read();
|
// 空闲检测
|
||||||
if(pdat != curr_pdat){
|
if(pdat != curr_pdat){
|
||||||
curr_pdat = pdat;
|
curr_pdat = pdat;
|
||||||
pdat_state = 1;
|
pdat_state = 1;
|
||||||
}
|
pdat_count = 0;
|
||||||
}else if(pdat_state<100){
|
}
|
||||||
pdat = pad_read();
|
break;
|
||||||
if(pdat == curr_pdat){
|
case 1:
|
||||||
pdat_state += 1;
|
// 等待稳定
|
||||||
}else{
|
if(pdat == curr_pdat){
|
||||||
pdat_state = 0;
|
pdat_count += 1;
|
||||||
|
if(pdat_count==2){
|
||||||
|
pdat_state = 2;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
pdat = last_pdat ^ curr_pdat;
|
|
||||||
last_pdat = curr_pdat;
|
|
||||||
pdat_state = 0;
|
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
|
#if 1
|
||||||
while(1){
|
while(1){
|
||||||
ctrl = conio_getc();
|
ctrl = conio_getc();
|
||||||
|
if(ctrl==0)
|
||||||
|
continue;
|
||||||
retv = menu->handle(ctrl);
|
retv = menu->handle(ctrl);
|
||||||
if(retv==MENU_EXIT)
|
if(retv==MENU_EXIT)
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -12,32 +12,63 @@
|
||||||
#include "smpc.h"
|
#include "smpc.h"
|
||||||
#include "vdp2.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 pad_read(void)
|
||||||
{
|
{
|
||||||
u32 bits;
|
u32 bits = 0;
|
||||||
|
|
||||||
PDR1 = 0x60;
|
while(SF&0x01);
|
||||||
bits = (PDR1 & 0x8) << 9;
|
SF = 0x01;
|
||||||
PDR1 = 0x40;
|
COMREG = 0x10;
|
||||||
bits |= (PDR1 & 0xf) << 8;
|
while(SF&0x01);
|
||||||
PDR1 = 0x20;
|
|
||||||
bits |= (PDR1 & 0xf) << 4;
|
|
||||||
PDR1 = 0x00;
|
|
||||||
bits |= (PDR1 & 0xf);
|
|
||||||
|
|
||||||
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)
|
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;
|
static int total_disc, total_page, page;
|
||||||
|
@ -311,15 +373,17 @@ static int sel_handle(int ctrl)
|
||||||
page_update(0);
|
page_update(0);
|
||||||
}
|
}
|
||||||
}else if(BUTTON_DOWN(ctrl, PAD_LT)){
|
}else if(BUTTON_DOWN(ctrl, PAD_LT)){
|
||||||
if(page>0){
|
page -= 1;
|
||||||
page -= 1;
|
if(page<0){
|
||||||
page_update(0);
|
page = total_page-1;
|
||||||
}
|
}
|
||||||
|
page_update(0);
|
||||||
}else if(BUTTON_DOWN(ctrl, PAD_RT)){
|
}else if(BUTTON_DOWN(ctrl, PAD_RT)){
|
||||||
if((page+1)<total_page){
|
page += 1;
|
||||||
page += 1;
|
if(page>=total_page){
|
||||||
page_update(0);
|
page = 0;
|
||||||
}
|
}
|
||||||
|
page_update(0);
|
||||||
}else if(BUTTON_DOWN(ctrl, PAD_A)){
|
}else if(BUTTON_DOWN(ctrl, PAD_A)){
|
||||||
int index = page*11 + menu->current;
|
int index = page*11 + menu->current;
|
||||||
|
|
||||||
|
@ -401,7 +465,7 @@ int main_handle(int ctrl)
|
||||||
menu_status(&main_menu, NULL);
|
menu_status(&main_menu, NULL);
|
||||||
return MENU_EXIT;
|
return MENU_EXIT;
|
||||||
}else if(index==3){
|
}else if(index==3){
|
||||||
menu_status(&main_menu, NULL);
|
menu_status(&main_menu, "TODO");
|
||||||
}else if(index==update_index){
|
}else if(index==update_index){
|
||||||
menu_status(&main_menu, "升级中,请勿断电...");
|
menu_status(&main_menu, "升级中,请勿断电...");
|
||||||
SS_ARG = 0;
|
SS_ARG = 0;
|
||||||
|
@ -436,7 +500,7 @@ void menu_init(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memset(&main_menu, 0, sizeof(main_menu));
|
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++){
|
for(i=0; i<4; i++){
|
||||||
add_menu_item(&main_menu, menu_str[i]);
|
add_menu_item(&main_menu, menu_str[i]);
|
||||||
|
|
|
@ -18,8 +18,8 @@ typedef unsigned long long u64;
|
||||||
#define NULL ((void*)0)
|
#define NULL ((void*)0)
|
||||||
|
|
||||||
|
|
||||||
#define SS_ID REG16(0x25897000)
|
#define SS_ID REG16(0x25807000)
|
||||||
#define SS_VER REG16(0x25897002)
|
#define SS_VER REG16(0x25807002)
|
||||||
#define SS_CTRL REG16(0x25897004)
|
#define SS_CTRL REG16(0x25897004)
|
||||||
#define SS_STAT REG16(0x25897008)
|
#define SS_STAT REG16(0x25897008)
|
||||||
#define SS_TIMER REG32(0x2589700c)
|
#define SS_TIMER REG32(0x2589700c)
|
||||||
|
@ -40,6 +40,8 @@ typedef unsigned long long u64;
|
||||||
#define SSCMD_LOADDISC 0x0003
|
#define SSCMD_LOADDISC 0x0003
|
||||||
#define SSCMD_CHECK 0x0004
|
#define SSCMD_CHECK 0x0004
|
||||||
#define SSCMD_UPDATE 0x0005
|
#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_START (1<<11)
|
||||||
#define PAD_A (1<<10)
|
#define PAD_A (1<<10)
|
||||||
#define PAD_C (1<<9)
|
#define PAD_C (1<<9)
|
||||||
#define PAD_B (1<<8)
|
#define PAD_B (1<<8)
|
||||||
#define PAD_RIGHT (1<<7)
|
#define PAD_RT (1<<7)
|
||||||
#define PAD_LEFT (1<<6)
|
#define PAD_X (1<<6)
|
||||||
#define PAD_DOWN (1<<5)
|
#define PAD_Y (1<<5)
|
||||||
#define PAD_UP (1<<4)
|
#define PAD_Z (1<<4)
|
||||||
#define PAD_RT (1<<3)
|
#define PAD_LT (1<<3)
|
||||||
#define PAD_X (1<<2)
|
|
||||||
#define PAD_Y (1<<1)
|
|
||||||
#define PAD_Z (1<<0)
|
|
||||||
|
|
||||||
u32 pad_read(void);
|
u32 pad_read(void);
|
||||||
|
|
||||||
|
@ -143,6 +145,9 @@ int str2hex(char *str, int *hex);
|
||||||
void dump(int argc, int *args, int width);
|
void dump(int argc, int *args, int width);
|
||||||
void mem_dump(char *str, void *addr, int size);
|
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 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(int break_pc, void *handle);
|
||||||
void break_in_game_next(int break_pc, void *handle);
|
void break_in_game_next(int break_pc, void *handle);
|
||||||
void install_ubr_isr(void);
|
void install_ubr_isr(void);
|
||||||
|
@ -192,7 +199,7 @@ void set_break_rw(u32 addr, u32 mask, int rw);
|
||||||
typedef struct menu_desc_t {
|
typedef struct menu_desc_t {
|
||||||
int num;
|
int num;
|
||||||
int current;
|
int current;
|
||||||
char title[32];
|
char title[64];
|
||||||
char items[11][64];
|
char items[11][64];
|
||||||
int (*handle)(int index);
|
int (*handle)(int index);
|
||||||
}MENU_DESC;
|
}MENU_DESC;
|
||||||
|
|
|
@ -331,6 +331,14 @@ void sci_shell(void)
|
||||||
printk("CDOFF ...\n");
|
printk("CDOFF ...\n");
|
||||||
REG16(0x25897004) = 0x8000;
|
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) {
|
CMD(z) {
|
||||||
/* 下载到ram并运行. 如果指定了地址, 则只下载. */
|
/* 下载到ram并运行. 如果指定了地址, 则只下载. */
|
||||||
|
|
|
@ -126,6 +126,7 @@ static int sd_card_insert(void)
|
||||||
|
|
||||||
void SDIO_IRQHandler(void)
|
void SDIO_IRQHandler(void)
|
||||||
{
|
{
|
||||||
|
#if 1
|
||||||
u32 cmd, mask, stat;
|
u32 cmd, mask, stat;
|
||||||
|
|
||||||
stat = SDIO->STA;
|
stat = SDIO->STA;
|
||||||
|
@ -133,12 +134,16 @@ void SDIO_IRQHandler(void)
|
||||||
cmd = SDIO->CMD;
|
cmd = SDIO->CMD;
|
||||||
|
|
||||||
if(stat&SDMMC_STA_BUSYD0){
|
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;
|
SDIO->MASK = SDMMC_STA_BUSYD0END;
|
||||||
}else{
|
}else{
|
||||||
SDIO->MASK = 0;
|
SDIO->MASK = 0;
|
||||||
osSemaphoreRelease(cmd_sem);
|
osSemaphoreRelease(cmd_sem);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
SDIO->MASK = 0;
|
||||||
|
osSemaphoreRelease(cmd_sem);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "ff.h"
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
@ -278,6 +279,18 @@ void simple_shell(void)
|
||||||
void cdc_dump();
|
void cdc_dump();
|
||||||
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){
|
CMD(q){
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -93,6 +93,15 @@
|
||||||
#define PLAYTYPE_DIR 3
|
#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)
|
#define MSF_TO_FAD(m,s,f) ((m * 4500) + (s * 75) + f)
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,6 +210,7 @@ typedef struct
|
||||||
u8 trans_block_end; // 分区中最后一个要传输的扇区+1
|
u8 trans_block_end; // 分区中最后一个要传输的扇区+1
|
||||||
BLOCK *trans_block;
|
BLOCK *trans_block;
|
||||||
u16 trans_size;
|
u16 trans_size;
|
||||||
|
u8 trans_finish;
|
||||||
|
|
||||||
u8 last_buffer;
|
u8 last_buffer;
|
||||||
|
|
||||||
|
|
|
@ -130,10 +130,13 @@ void trans_start(void)
|
||||||
tcnt = 0;
|
tcnt = 0;
|
||||||
min_num = 40960;
|
min_num = 40960;
|
||||||
cdb.cdwnum = 0;
|
cdb.cdwnum = 0;
|
||||||
|
cdb.trans_finish = 0;
|
||||||
|
|
||||||
if(cdb.trans_type==TRANS_DATA || cdb.trans_type==TRANS_DATA_DEL){
|
if(cdb.trans_type==TRANS_DATA || cdb.trans_type==TRANS_DATA_DEL){
|
||||||
PARTITION *pt = &cdb.part[cdb.trans_part_index];
|
PARTITION *pt = &cdb.part[cdb.trans_part_index];
|
||||||
BLOCK *bt = find_block(pt, cdb.trans_block_start);
|
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);
|
//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;
|
cdb.trans_bk = cdb.trans_block_start;
|
||||||
|
@ -179,12 +182,16 @@ void trans_start(void)
|
||||||
void trans_handle(void)
|
void trans_handle(void)
|
||||||
{
|
{
|
||||||
tcnt += 1;
|
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_type==TRANS_DATA || cdb.trans_type==TRANS_DATA_DEL){
|
||||||
|
|
||||||
if(cdb.trans_bk==cdb.trans_block_end){
|
if(cdb.trans_bk==cdb.trans_block_end){
|
||||||
//printk(" trans end!\n");
|
//printk(" trans end!\n");
|
||||||
|
cdb.trans_finish = 1;
|
||||||
ST_CTRL &= ~STIRQ_DAT;
|
ST_CTRL &= ~STIRQ_DAT;
|
||||||
}else{
|
}else{
|
||||||
BLOCK *bt = cdb.trans_block->next;
|
BLOCK *bt = cdb.trans_block->next;
|
||||||
|
@ -215,7 +222,7 @@ void trans_handle(void)
|
||||||
fill_fifo(dp, cdb.trans_size);
|
fill_fifo(dp, cdb.trans_size);
|
||||||
ST_STAT = STIRQ_DAT;
|
ST_STAT = STIRQ_DAT;
|
||||||
ST_CTRL |= STIRQ_DAT;
|
ST_CTRL |= STIRQ_DAT;
|
||||||
HIRQ = HIRQ_DRDY | HIRQ_SCDQ;
|
HIRQ = HIRQ_SCDQ;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
ST_CTRL &= ~STIRQ_DAT;
|
ST_CTRL &= ~STIRQ_DAT;
|
||||||
|
@ -509,8 +516,12 @@ int end_trans(void)
|
||||||
ST_CTRL &= ~STIRQ_DAT;
|
ST_CTRL &= ~STIRQ_DAT;
|
||||||
ST_STAT = 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中还有多少字节未读
|
fifo_remain = (FIFO_STAT&0x0fff)*2; // FIFO中还有多少字节未读
|
||||||
|
if(fifo_remain>=512){
|
||||||
|
//FIFO中的数据大于512字节,不会产生中断。cdwnum会少记一次。
|
||||||
|
cdb.cdwnum += 0x800;
|
||||||
|
}
|
||||||
cdb.cdwnum -= fifo_remain;
|
cdb.cdwnum -= fifo_remain;
|
||||||
|
|
||||||
// reset fifo
|
// 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){
|
if(cdb.cdwnum){
|
||||||
SSCR1 = (cdb.status<<8) | ((cdb.cdwnum>>17)&0xff);
|
SSCR1 = (cdb.status<<8) | ((cdb.cdwnum>>17)&0xff);
|
||||||
SSCR2 = (cdb.cdwnum>>1)&0xffff;
|
SSCR2 = (cdb.cdwnum>>1)&0xffff;
|
||||||
|
|
|
@ -295,6 +295,13 @@ _restart_nowait:
|
||||||
{
|
{
|
||||||
//printk("filter sector %08x...\n", fad);
|
//printk("filter sector %08x...\n", fad);
|
||||||
retv = filter_sector(play_track, &wblk);
|
retv = filter_sector(play_track, &wblk);
|
||||||
|
{
|
||||||
|
// "Final Fight Revenge" need this!
|
||||||
|
int i;
|
||||||
|
for(i=0; i<500000; i++){
|
||||||
|
NOTHING();
|
||||||
|
}
|
||||||
|
}
|
||||||
HIRQ = HIRQ_CSCT;
|
HIRQ = HIRQ_CSCT;
|
||||||
if(retv==0){
|
if(retv==0){
|
||||||
// 送到某个过滤器成功
|
// 送到某个过滤器成功
|
||||||
|
@ -388,24 +395,24 @@ void ss_cmd_handle(void)
|
||||||
printk("scmd_task: %04x\n", SS_CMD);
|
printk("scmd_task: %04x\n", SS_CMD);
|
||||||
|
|
||||||
switch(cmd){
|
switch(cmd){
|
||||||
case 0x0001:
|
case SSCMD_PRINTF:
|
||||||
// 输出信息
|
// 输出信息
|
||||||
printk("%s", (char*)0x61820010);
|
printk("%s", (char*)0x61820010);
|
||||||
SS_CMD = 0;
|
SS_CMD = 0;
|
||||||
break;
|
break;
|
||||||
case 0x0002:
|
case SSCMD_LISTDISC:
|
||||||
// 列出镜像信息
|
// 列出镜像信息
|
||||||
retv = list_disc(0);
|
retv = list_disc(0);
|
||||||
SS_ARG = retv;
|
SS_ARG = retv;
|
||||||
SS_CMD = 0;
|
SS_CMD = 0;
|
||||||
break;
|
break;
|
||||||
case 0x0003:
|
case SSCMD_LOADDISC:
|
||||||
// 装载镜像
|
// 装载镜像
|
||||||
retv = load_disc(SS_ARG);
|
retv = load_disc(SS_ARG);
|
||||||
SS_ARG = retv;
|
SS_ARG = retv;
|
||||||
SS_CMD = 0;
|
SS_CMD = 0;
|
||||||
break;
|
break;
|
||||||
case 0x0004:
|
case SSCMD_CHECK:
|
||||||
{
|
{
|
||||||
// 检查是否有升级固件
|
// 检查是否有升级固件
|
||||||
int fpga = (fpga_update(1)==0)? 1: 0;
|
int fpga = (fpga_update(1)==0)? 1: 0;
|
||||||
|
@ -414,7 +421,7 @@ void ss_cmd_handle(void)
|
||||||
SS_CMD = 0;
|
SS_CMD = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x0005:
|
case SSCMD_UPDATE:
|
||||||
{
|
{
|
||||||
// 固件升级
|
// 固件升级
|
||||||
int fpga = (fpga_update(0)>=-1)? 0: 1;
|
int fpga = (fpga_update(0)>=-1)? 0: 1;
|
||||||
|
@ -423,6 +430,47 @@ void ss_cmd_handle(void)
|
||||||
SS_CMD = 0;
|
SS_CMD = 0;
|
||||||
break;
|
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:
|
default:
|
||||||
printk("[SS] unkonw cmd: %04x\n", cmd);
|
printk("[SS] unkonw cmd: %04x\n", cmd);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Reference in a new issue