mirror of
https://github.com/tpunix/SAROO.git
synced 2024-06-01 11:57:19 -04:00
FPGA bugfix
MCU bugfix
This commit is contained in:
parent
19b2e5c180
commit
d12cadbbc1
|
@ -5,6 +5,10 @@
|
|||
|
||||
// version 0.1: first step.
|
||||
// 0.2: for HW1.2
|
||||
// 0.3:
|
||||
// 0.4: support put_sector_data
|
||||
// 0.5: CDC bug fix
|
||||
|
||||
|
||||
module SSMaster(
|
||||
// System
|
||||
|
@ -227,9 +231,10 @@ module SSMaster(
|
|||
if(NRESET==0) begin
|
||||
st_reg_ctrl <= 0;
|
||||
st_reg_spi <= 3'b111;
|
||||
st_reg_sdram <= 12'b11_1100001101; // type:64MB refcnt: 0x30d(7.81us)
|
||||
end else if(st_wr_start==1) begin
|
||||
if(fsmc_addr[24]==0 && fsmc_addr[7:0]==8'h04) st_reg_ctrl <= ST_AD;
|
||||
if(fsmc_addr[24]==0 && fsmc_addr[7:0]==8'h16) st_reg_spi <= ST_AD[3:1];
|
||||
if(fsmc_addr[24]==0 && fsmc_addr[7:0]==8'h16) {st_reg_sdram, st_reg_spi} <= ST_AD[15:1];
|
||||
if(fsmc_addr[24]==0 && fsmc_addr[7:0]==8'h20) ss_resp1 <= ST_AD;
|
||||
if(fsmc_addr[24]==0 && fsmc_addr[7:0]==8'h22) ss_resp2 <= ST_AD;
|
||||
if(fsmc_addr[24]==0 && fsmc_addr[7:0]==8'h24) ss_resp3 <= ST_AD;
|
||||
|
@ -369,16 +374,17 @@ module SSMaster(
|
|||
begin
|
||||
st_reg_data_out <=
|
||||
(fsmc_addr[7:0]==8'h00)? 16'h5253 : // ID: "SR"
|
||||
(fsmc_addr[7:0]==8'h02)? 16'h1204 : // ver: HW1.2 && SW0.4
|
||||
(fsmc_addr[7:0]==8'h02)? 16'h1205 : // ver: HW1.2 && SW0.5
|
||||
(fsmc_addr[7:0]==8'h04)? st_reg_ctrl :
|
||||
(fsmc_addr[7:0]==8'h06)? st_reg_stat :
|
||||
(fsmc_addr[7:0]==8'h08)? st_fifo_data_out :
|
||||
(fsmc_addr[7:0]==8'h0a)? st_fifo_data_out :
|
||||
(fsmc_addr[7:0]==8'h0c)? st_fifo_stat :
|
||||
(fsmc_addr[7:0]==8'h0e)? st_fifo_rcnt :
|
||||
(fsmc_addr[7:0]==8'h10)? ss_reg_cmd :
|
||||
(fsmc_addr[7:0]==8'h12)? ss_reg_data :
|
||||
(fsmc_addr[7:0]==8'h14)? ss_reg_ctrl :
|
||||
(fsmc_addr[7:0]==8'h16)? {12'b0, EPCS_CS, EPCS_CLK, EPCS_DI, EPCS_DO} :
|
||||
(fsmc_addr[7:0]==8'h16)? {st_reg_sdram, EPCS_CS, EPCS_CLK, EPCS_DI, EPCS_DO} :
|
||||
|
||||
(fsmc_addr[7:0]==8'h18)? ss_resp1 :
|
||||
(fsmc_addr[7:0]==8'h1a)? ss_resp2 :
|
||||
|
@ -440,7 +446,7 @@ module SSMaster(
|
|||
|
||||
always @(posedge mclk)
|
||||
begin
|
||||
sscs_s0 <= (SS_CS0 & SS_CS1 & SS_CS2);
|
||||
sscs_s0 <= (SS_CS0 & SS_CS1 & SS_CS2) | ~SS_FC1;
|
||||
sscs_s1 <= sscs_s0;
|
||||
sscs_s2 <= sscs_s1;
|
||||
sscs_s3 <= sscs_s2;
|
||||
|
@ -463,7 +469,7 @@ module SSMaster(
|
|||
(SS_RD==0 && ss_cdc_cs==1)? ss_cdc_data_out :
|
||||
16'hzzzz;
|
||||
|
||||
assign SS_DATA_OE = (SS_CS0==1 && SS_CS1==1 && (SS_CS2==1 || (ss_cdc_cs==1 && SS_RD==0 && ss_cdc_en==0)));
|
||||
assign SS_DATA_OE = ~SS_FC1 | (SS_CS0==1 && SS_CS1==1 && (SS_CS2==1 || (ss_cdc_cs==1 && SS_RD==0 && ss_cdc_en==0)));
|
||||
|
||||
assign SS_DATA_DIR = (SS_WR0 & SS_WR1);
|
||||
|
||||
|
@ -497,7 +503,7 @@ module SSMaster(
|
|||
begin
|
||||
ss_bcr_data_out <=
|
||||
(SS_ADDR[5:1]==5'b00_000)? 16'h5253 : // ID: "SR"
|
||||
(SS_ADDR[5:1]==5'b00_001)? 16'h1204 : // ver: HW1.2 && SW0.4
|
||||
(SS_ADDR[5:1]==5'b00_001)? 16'h1205 : // ver: HW1.2 && SW0.5
|
||||
(SS_ADDR[5:2]==4'b00_01 )? ss_reg_ctrl :
|
||||
(SS_ADDR[5:2]==4'b00_10 )? ss_reg_stat :
|
||||
(SS_ADDR[5:1]==5'b00_110)? ss_reg_timer[31:16] :
|
||||
|
@ -594,6 +600,19 @@ module SSMaster(
|
|||
.full(fifo_full)
|
||||
);
|
||||
|
||||
// Saturn set and STM32 reset
|
||||
reg[15:0] st_fifo_rcnt;
|
||||
always @(negedge NRESET or posedge mclk)
|
||||
begin
|
||||
if(NRESET==0)
|
||||
st_fifo_rcnt <= 4'b0000;
|
||||
else if(st_wr_start==1 && fsmc_addr[24]==0 && fsmc_addr[7:0]==8'h0e)
|
||||
st_fifo_rcnt <= 0;
|
||||
else if(ss_fifo_read)
|
||||
st_fifo_rcnt <= st_fifo_rcnt+1'b1;
|
||||
end
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// SATURN CDC //
|
||||
///////////////////////////////////////////////////////
|
||||
|
@ -649,7 +668,8 @@ module SSMaster(
|
|||
// SDRAM //
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
|
||||
reg[11:0] st_reg_sdram;
|
||||
|
||||
// STM32 is LittleEndian system
|
||||
wire[25:0] st_ram_addr = {2'b0, fsmc_addr[23:0]};
|
||||
wire[ 1:0] st_mask = {ST_BL1,ST_BL0};
|
||||
|
@ -689,7 +709,7 @@ module SSMaster(
|
|||
NRESET, mclk,
|
||||
ss_ram_cs, ss_rd_start, ss_wr_start, ss_mask, ss_ram_wait, ss_ram_addr, ss_ram_din, ss_ram_dout,
|
||||
st_ram_cs, st_rd_start, st_wr_start, st_mask, st_ram_wait, st_ram_addr, ST_AD, st_ram_data_out,
|
||||
SD_CKE, SD_CS, SD_RAS, SD_CAS, SD_WE, SD_ADDR, SD_BA, SD_DQM, SD_DQ, ss_refresh
|
||||
SD_CKE, SD_CS, SD_RAS, SD_CAS, SD_WE, SD_ADDR, SD_BA, SD_DQM, SD_DQ, ss_refresh, st_reg_sdram
|
||||
);
|
||||
|
||||
assign SD_CLK = sdclk;
|
||||
|
|
|
@ -8,7 +8,7 @@ module memhub(
|
|||
cs_a, rd_a, wr_a, mask_a, nwait_a, addr_a, wdata_a, rdata_a,
|
||||
cs_b, rd_b, wr_b, mask_b, nwait_b, addr_b, wdata_b, rdata_b,
|
||||
sd_cke, sd_cs, sd_ras, sd_cas, sd_we, sd_addr, sd_ba, sd_dqm, sd_data,
|
||||
ext_refresh
|
||||
ext_refresh, reg_sdram
|
||||
);
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
|
@ -50,6 +50,7 @@ module memhub(
|
|||
output[ 1:0] sd_dqm;
|
||||
inout [15:0] sd_data;
|
||||
input ext_refresh;
|
||||
input [11:0] reg_sdram;
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
|
@ -186,7 +187,7 @@ module memhub(
|
|||
wire sd_oe;
|
||||
|
||||
tsdram _tsd(
|
||||
reset, clk,
|
||||
reset, clk, reg_sdram,
|
||||
ext_refresh, cmd_req, cmd_ack, cmd_mask, cmd_addr, cmd_din, cmd_dout, data_valid,
|
||||
sd_cke, sd_cs, sd_ras, sd_cas, sd_we, sd_addr, sd_ba, sd_dqm, sd_data, sd_dout, sd_oe
|
||||
);
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
module tsdram(
|
||||
reset,
|
||||
clk,
|
||||
reg_sdram,
|
||||
|
||||
ext_refresh,
|
||||
cmd_req,
|
||||
|
@ -37,6 +38,7 @@ module tsdram(
|
|||
|
||||
input reset;
|
||||
input clk;
|
||||
input [11:0] reg_sdram;
|
||||
|
||||
input ext_refresh;
|
||||
input [ 1:0] cmd_req;
|
||||
|
@ -87,15 +89,40 @@ module tsdram(
|
|||
///////////////////////////////////////////////////////
|
||||
|
||||
// A31 - A26 [A25 - A13] [A12 A11] [A10 - A1] A0
|
||||
// [R12 - R0] [ B1 B0] [ C9 - C0]
|
||||
// [R12 - R0] [ B1 B0] [ C9 - C0] 64MB
|
||||
//
|
||||
// A31 - A25 [A24 - A12] [A11 A10] [ A9 - A1] A0
|
||||
// [R12 - R0] [ B1 B0] [ C8 - C0] 32MB
|
||||
//
|
||||
// A31 - A24 [A23 - A12] [A11 A10] [ A9 - A1] A0
|
||||
// [R11 - R0] [ B1 B0] [ C8 - C0] 16MB
|
||||
//
|
||||
// A31 - A23 [A22 - A11] [A10 A9] [ A8 - A1] A0
|
||||
// [R11 - R0] [ B1 B0] [ C7 - C0] 8MB
|
||||
|
||||
localparam BANK_POS = COL_BITS+1;
|
||||
localparam ROW_POS = BANK_POS+2;
|
||||
|
||||
wire[ROW_BITS-1:0] col_addr = {3'b001, {(10-COL_BITS){1'b0}}, cmd_addr[COL_BITS:1]};
|
||||
// wire[ROW_BITS-1:0] col_addr = {3'b001, {(10-COL_BITS){1'b0}}, cmd_addr[COL_BITS:1]};
|
||||
// wire[1:0] bank_addr = cmd_addr[COL_BITS+2:COL_BITS+1];
|
||||
// wire[ROW_BITS-1:0] row_addr = cmd_addr[ROW_BITS+COL_BITS+2:COL_BITS+3];
|
||||
|
||||
wire[1:0] bank_addr = cmd_addr[COL_BITS+2:COL_BITS+1];
|
||||
wire[ROW_BITS-1:0] row_addr = cmd_addr[ROW_BITS+COL_BITS+2:COL_BITS+3];
|
||||
wire[1:0] sdtype = reg_sdram[11:10];
|
||||
wire[12:0] col_addr =
|
||||
(sdtype==2'b11)? {3'b001, cmd_addr[10:1]} :
|
||||
(sdtype==2'b10)? {4'b0010, cmd_addr[ 9:1]} :
|
||||
(sdtype==2'b01)? {4'b0010, cmd_addr[ 9:1]} :
|
||||
{5'b00100, cmd_addr[ 8:1]} ;
|
||||
wire[1:0] bank_addr =
|
||||
(sdtype==2'b11)? cmd_addr[12:11] :
|
||||
(sdtype==2'b10)? cmd_addr[11:10] :
|
||||
(sdtype==2'b01)? cmd_addr[11:10] :
|
||||
cmd_addr[10: 9] ;
|
||||
wire[12:0] row_addr =
|
||||
(sdtype==2'b11)? cmd_addr[25:13] :
|
||||
(sdtype==2'b10)? cmd_addr[24:12] :
|
||||
(sdtype==2'b01)? {1'b0, cmd_addr[23:12]} :
|
||||
{1'b0, cmd_addr[22:11]} ;
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
|
@ -110,7 +137,8 @@ module tsdram(
|
|||
if(reset==0) begin
|
||||
ref_count <= tPOR_count[15:0];
|
||||
end else if(ref_ack) begin
|
||||
ref_count <= tREF_count[15:0];
|
||||
// ref_count <= tREF_count[15:0];
|
||||
ref_count <= {6'b0, reg_sdram[9:0]};
|
||||
end else if(ref_count) begin
|
||||
ref_count <= ref_count-1'b1;
|
||||
end
|
||||
|
|
|
@ -244,25 +244,53 @@ int flash_update(int check)
|
|||
_puts("erase ...\n");
|
||||
retv = flash_erase(firm_addr);
|
||||
if(retv){
|
||||
restore_irq(key);
|
||||
_puts(" faile!\n");
|
||||
return -2;
|
||||
retv = -2;
|
||||
goto _exit;
|
||||
}
|
||||
|
||||
_puts("write ...\n");
|
||||
for(i=0; i<fsize; i+=32){
|
||||
retv = flash_write32(firm_addr+i, fbuf+i);
|
||||
if(retv){
|
||||
restore_irq(key);
|
||||
_puts(" faile!\n");
|
||||
return -3;
|
||||
retv = -3;
|
||||
goto _exit;
|
||||
}
|
||||
}
|
||||
|
||||
_exit:
|
||||
if(retv){
|
||||
_puts(" faile!\n");
|
||||
}
|
||||
*(volatile u16*)(0x60000012) = retv;
|
||||
*(volatile u16*)(0x60000010) = 0;
|
||||
|
||||
restore_irq(key);
|
||||
|
||||
printk("MCU update OK!\n");
|
||||
f_unlink("/SAROO/update/ssmaster.bin");
|
||||
if(retv==0){
|
||||
_puts("MCU update OK!\n");
|
||||
f_unlink("/SAROO/update/ssmaster.bin");
|
||||
}
|
||||
|
||||
return retv;
|
||||
}
|
||||
|
||||
|
||||
int flash_write_config(u8 *cfgbuf)
|
||||
{
|
||||
int retv;
|
||||
|
||||
retv = flash_erase(0x080e0000);
|
||||
if(retv){
|
||||
printk("erase failed! %08x\n", retv);
|
||||
return retv;
|
||||
}
|
||||
|
||||
retv = flash_write32(0x080e0000, cfgbuf);
|
||||
if(retv){
|
||||
printk("write failed! %08x\n", retv);
|
||||
return retv;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -296,6 +296,17 @@ void simple_shell(void)
|
|||
CMD(flu){
|
||||
flash_update(0);
|
||||
}
|
||||
CMD(sdram){
|
||||
void sdram_config(int type, int reftime);
|
||||
int type=3, reftime=64;
|
||||
if(argc>=1){
|
||||
type = arg[0];
|
||||
}
|
||||
if(argc>=2){
|
||||
reftime = arg[1];
|
||||
}
|
||||
sdram_config(type, reftime);
|
||||
}
|
||||
|
||||
CMD(mmt){
|
||||
u32 addr = 0x61000000;
|
||||
|
@ -378,6 +389,10 @@ void simple_shell(void)
|
|||
printk("create exram.bin failed! %d\n", retv);
|
||||
}
|
||||
}
|
||||
CMD(pt){
|
||||
void show_pt(int id);
|
||||
show_pt(arg[0]);
|
||||
}
|
||||
|
||||
CMD(q){
|
||||
break;
|
||||
|
|
|
@ -24,7 +24,7 @@ void fspi_setcs(int val)
|
|||
if(val)
|
||||
ctrl |= 0x08;
|
||||
else
|
||||
ctrl &= 0x07;
|
||||
ctrl &= ~0x08;
|
||||
*(volatile u16*)(0x60000016) = ctrl;
|
||||
}
|
||||
|
||||
|
@ -34,7 +34,7 @@ void fspi_setclk(int val)
|
|||
if(val)
|
||||
ctrl |= 0x04;
|
||||
else
|
||||
ctrl &= 0x0b;
|
||||
ctrl &= ~0x04;
|
||||
*(volatile u16*)(0x60000016) = ctrl;
|
||||
}
|
||||
|
||||
|
@ -44,7 +44,7 @@ void fspi_setdi(int val)
|
|||
if(val)
|
||||
ctrl |= 0x02;
|
||||
else
|
||||
ctrl &= 0x0d;
|
||||
ctrl &= ~0x02;
|
||||
*(volatile u16*)(0x60000016) = ctrl;
|
||||
}
|
||||
|
||||
|
@ -124,6 +124,25 @@ int epcs_status(void)
|
|||
return status;
|
||||
}
|
||||
|
||||
int epcs_wstat(int stat)
|
||||
{
|
||||
// status write enable
|
||||
fspi_setcs(0);
|
||||
fspi_delay();
|
||||
fspi_trans(0x50);
|
||||
fspi_setcs(1);
|
||||
fspi_delay();
|
||||
|
||||
fspi_setcs(0);
|
||||
fspi_delay();
|
||||
fspi_trans(0x01);
|
||||
fspi_trans(stat);
|
||||
fspi_setcs(1);
|
||||
fspi_delay();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int epcs_wen(int en)
|
||||
{
|
||||
fspi_setcs(0);
|
||||
|
@ -173,7 +192,7 @@ int epcs_sector_erase(int addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int epcs_page_write(int addr, u8 *buf)
|
||||
int epcs_page_write(int addr, u8 *buf, int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -187,7 +206,7 @@ int epcs_page_write(int addr, u8 *buf)
|
|||
fspi_trans((addr>> 8)&0xff);
|
||||
fspi_trans((addr>> 0)&0xff);
|
||||
|
||||
for(i=0; i<256; i++){
|
||||
for(i=0; i<size; i++){
|
||||
fspi_trans(buf[i]);
|
||||
}
|
||||
|
||||
|
@ -253,20 +272,35 @@ int fpga_update(int check)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int fid = epcs_readid();
|
||||
printk("EPCS ID: %08x\n", fid);
|
||||
|
||||
printk("EPCS ID: %08x\n", epcs_readid());
|
||||
if(fid==0xbf8e){
|
||||
// SST25VF080 上电默认写保护
|
||||
epcs_wstat(0);
|
||||
}
|
||||
printk("EPCS SR: %02x\n", epcs_status());
|
||||
|
||||
printk("Erase ...\n");
|
||||
for(addr=0; addr<fsize; addr+=4096){
|
||||
epcs_sector_erase(addr);
|
||||
}
|
||||
|
||||
printk("Write ...\n");
|
||||
for(addr=0; addr<fsize; addr+=256){
|
||||
u32 rv;
|
||||
f_read(&fp, fbuf, 256, &rv);
|
||||
for(i=0; i<256; i++){ // Altera need LSB first
|
||||
fbuf[i] = rbit_u8(fbuf[i]);
|
||||
}
|
||||
epcs_page_write(addr, fbuf);
|
||||
if(fid==0xbf8e){
|
||||
// SST25VF080 的02命令只能写一个字节
|
||||
for(i=0; i<256; i++){
|
||||
epcs_page_write(addr+i, fbuf+i, 1);
|
||||
}
|
||||
}else{
|
||||
epcs_page_write(addr, fbuf, 256);
|
||||
}
|
||||
}
|
||||
f_close(&fp);
|
||||
|
||||
|
@ -279,6 +313,53 @@ int fpga_update(int check)
|
|||
/******************************************************************************/
|
||||
|
||||
|
||||
void sdram_config(int type, int reftime)
|
||||
{
|
||||
u32 cfgbuf[8];
|
||||
int div, rcnt;
|
||||
|
||||
if(type==3 || type==2){
|
||||
// 64MB/32MB, row=13
|
||||
rcnt = reftime*100000/8192;
|
||||
}else if(type==1 || type==0){
|
||||
// 16MB/8MB, row=12
|
||||
rcnt = reftime*100000/4096;
|
||||
}else{
|
||||
printk("Invalid sdram config!\n");
|
||||
return;
|
||||
}
|
||||
printk("SDRAM type: %d refcnt: %d\n", type, rcnt);
|
||||
|
||||
memset(cfgbuf, 0xff, 32);
|
||||
cfgbuf[0] = 0x43524453; // "SDRC"
|
||||
cfgbuf[1] = (type<<10) | (rcnt&0x3ff);
|
||||
|
||||
flash_write_config((u8*)cfgbuf);
|
||||
}
|
||||
|
||||
|
||||
void sdram_set(void)
|
||||
{
|
||||
u32 *cfgbuf = (u32*)0x080e0000;
|
||||
int type, rcnt;
|
||||
|
||||
if(cfgbuf[0]!=0x43524453)
|
||||
return;
|
||||
|
||||
type = (cfgbuf[1]>>10)&3;
|
||||
rcnt = (cfgbuf[1])&0x3ff;
|
||||
printk("SDRAM type: %d refcnt: %d\n", type, rcnt);
|
||||
|
||||
int ctrl = *(volatile u16*)(0x60000016);
|
||||
ctrl &= 0x000f;
|
||||
ctrl |= (type<<14) | (rcnt<<4);
|
||||
*(volatile u16*)(0x60000016) = ctrl;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
int fpga_config_done(void)
|
||||
{
|
||||
return (GPIOB->IDR&0x0800)? 1 : 0;
|
||||
|
@ -342,6 +423,8 @@ void fpga_config(void)
|
|||
printk(" status: %d\n", fpga_status());
|
||||
printk("\n");
|
||||
|
||||
sdram_set();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -218,6 +218,7 @@ void uart4_init(void)
|
|||
UART4->BRR = 0x0; // Reset
|
||||
// UART4->BRR = 0x0364; // 设置波特比率寄存器为115200(100M/115200)
|
||||
UART4->BRR = 0x0064; // 设置波特比率寄存器为1M(100M/1M)
|
||||
// UART4->BRR = 0x0032; // 设置波特比率寄存器为2M(100M/2M)
|
||||
UART4->RQR = 0x0018;
|
||||
UART4->CR1 |= 0x0001; // Enable UART4
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#define ST_STAT REG16(FPGA_BASE+0x06)
|
||||
#define FIFO_DATA REG16(FPGA_BASE+0x08)
|
||||
#define FIFO_STAT REG16(FPGA_BASE+0x0c)
|
||||
#define FIFO_RCNT REG16(FPGA_BASE+0x0e)
|
||||
#define SS_CMD REG16(FPGA_BASE+0x10)
|
||||
#define SS_ARG REG16(FPGA_BASE+0x12)
|
||||
#define SS_CTRL REG16(FPGA_BASE+0x14)
|
||||
|
|
|
@ -176,6 +176,7 @@ void trans_start(void)
|
|||
cdb.trans_size = 24;
|
||||
}
|
||||
|
||||
FIFO_RCNT = 0;
|
||||
ST_CTRL &= ~0x0200;
|
||||
fill_fifo(dp, cdb.trans_size);
|
||||
ST_STAT = STIRQ_DAT;
|
||||
|
@ -216,17 +217,16 @@ void trans_handle(void)
|
|||
ST_CTRL &= ~STIRQ_DAT;
|
||||
//printk("trans_put: FIFO_STAT=%04x\n", FIFO_STAT);
|
||||
int cnt = 2048;
|
||||
int offs = 0;
|
||||
if(cdb.put_sector_size==2048){
|
||||
offs = 24;
|
||||
}else if(cdb.put_sector_size==2336){
|
||||
offs = 16;
|
||||
}else if(cdb.put_sector_size==2340){
|
||||
offs= 12;
|
||||
}
|
||||
while(cnt){
|
||||
if(bt->size==0){
|
||||
if(cdb.put_sector_size==2048){
|
||||
bt->size = 24;
|
||||
}else if(cdb.put_sector_size==2336){
|
||||
bt->size = 16;
|
||||
}else if(cdb.put_sector_size==2340){
|
||||
bt->size = 12;
|
||||
}
|
||||
}
|
||||
*(u16*)(bt->data + bt->size) = FIFO_DATA;
|
||||
*(u16*)(bt->data + offs + bt->size) = FIFO_DATA;
|
||||
bt->size += 2;
|
||||
cnt -= 2;
|
||||
if(bt->size == cdb.put_sector_size){
|
||||
|
@ -300,6 +300,7 @@ void trans_handle(void)
|
|||
HIRQ = HIRQ_SCDQ;
|
||||
}
|
||||
}else{
|
||||
cdb.trans_finish = 1;
|
||||
ST_CTRL &= ~STIRQ_DAT;
|
||||
}
|
||||
}
|
||||
|
@ -450,11 +451,15 @@ int filter_sector(TRACK_INFO *track, BLOCK *wblk)
|
|||
// 普通命令
|
||||
|
||||
|
||||
static int old_status;
|
||||
// 0x00 [SR]
|
||||
int get_cd_status(void)
|
||||
{
|
||||
set_report(cdb.status);
|
||||
SSLOG(_DEBUG, " %02x\n", cdb.status);
|
||||
if(old_status!=cdb.status){
|
||||
SSLOG(_DEBUG, " %02x\n", cdb.status);
|
||||
old_status = cdb.status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -478,7 +483,7 @@ int get_toc_info(void)
|
|||
SSLOG(_INFO, "get_toc_info\n");
|
||||
|
||||
if(cdb.trans_type){
|
||||
set_status(STAT_WAIT);
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -599,7 +604,7 @@ int end_trans(void)
|
|||
}
|
||||
}
|
||||
}else{
|
||||
SSLOG(_BUFIO, "end_trans: cdwnum=%08x FIFO_STAT=%08x min_num=%d\n", cdb.cdwnum, FIFO_STAT, min_num);
|
||||
SSLOG(_BUFIO, "end_trans: cdwnum=%08x FIFO_STAT=%08x RCNT=%04x min_num=%d\n", cdb.cdwnum, FIFO_STAT, FIFO_RCNT, min_num);
|
||||
fifo_remain = (FIFO_STAT&0x0fff)*2; // FIFO中还有多少字节未读
|
||||
if(fifo_remain>=512){
|
||||
//FIFO中的数据大于512字节,不会产生中断。cdwnum会少记一次。
|
||||
|
@ -667,6 +672,7 @@ int play_cd(void)
|
|||
|
||||
HIRQ_CLR = HIRQ_PEND;
|
||||
|
||||
int play_tno = 0;
|
||||
if(start_pos==0xffffff){
|
||||
// PTYPE_NOCHG
|
||||
}else if(start_pos&0x800000){
|
||||
|
@ -681,7 +687,7 @@ int play_cd(void)
|
|||
cdb.play_fad_start = track_to_fad(start_pos);
|
||||
cdb.track = (start_pos>>8)&0xff;
|
||||
cdb.index = start_pos&0xff;
|
||||
mode &= 0x7f;
|
||||
play_tno = 1;
|
||||
}
|
||||
|
||||
if(end_pos==0xffffff){
|
||||
|
@ -695,6 +701,11 @@ int play_cd(void)
|
|||
cdb.play_fad_end = track_to_fad(end_pos);
|
||||
else
|
||||
cdb.play_fad_end = track_to_fad((end_pos&0xff00)|0x63);
|
||||
if(play_tno){
|
||||
// STEAM-HEART'S fixup
|
||||
// 明确指定start与stop的情况下,强制更新fad.
|
||||
cdb.fad = cdb.play_fad_start;
|
||||
}
|
||||
}else{
|
||||
// PTYPE_DFL
|
||||
cdb.play_fad_end = track_to_fad(0xffff);
|
||||
|
@ -744,6 +755,10 @@ int seek_cd(void)
|
|||
cdb.index = 1;
|
||||
cdb.options = 0x00;
|
||||
cdb.repcnt = 0;
|
||||
// 三国志: 吞食天地2
|
||||
// Seek后, Play(00ffffff, 00ffffff, ff).
|
||||
// 需要指定play_fad_end以免Play多读数据.
|
||||
cdb.play_fad_end = 0;
|
||||
}else{
|
||||
// PTYPE_TNO
|
||||
if(pos){
|
||||
|
@ -800,7 +815,7 @@ int get_subcode(void)
|
|||
int rel_fad, rm, rs, rf, m, s, f;
|
||||
|
||||
if(cdb.trans_type){
|
||||
set_status(STAT_WAIT);
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1243,7 +1258,7 @@ int get_sector_data(void)
|
|||
PARTITION *pp;
|
||||
|
||||
if(cdb.trans_type){
|
||||
set_status(STAT_WAIT);
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1260,18 +1275,20 @@ int get_sector_data(void)
|
|||
snum = pp->numblocks-spos;
|
||||
}
|
||||
SSLOG(_BUFIO, "get_sector_data: part=%d(%d) spos=%d snum=%d\n", pt, pp->numblocks, spos, snum);
|
||||
if(spos<0 || snum<=0 || (spos+snum) > pp->numblocks){
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
gs_spos = spos;
|
||||
gs_snum = snum;
|
||||
|
||||
if(pp->numblocks){
|
||||
cdb.trans_type = TRANS_DATA;
|
||||
cdb.trans_part_index = pt;
|
||||
cdb.trans_block_start = spos;
|
||||
cdb.trans_block_end = spos+snum;
|
||||
cdb.trans_type = TRANS_DATA;
|
||||
cdb.trans_part_index = pt;
|
||||
cdb.trans_block_start = spos;
|
||||
cdb.trans_block_end = spos+snum;
|
||||
trans_start();
|
||||
|
||||
trans_start();
|
||||
}
|
||||
set_status(0x4000 | cdb.status);
|
||||
set_status(STAT_TRNS | cdb.status);
|
||||
return HIRQ_DRDY|HIRQ_EHST;
|
||||
}
|
||||
|
||||
|
@ -1293,14 +1310,15 @@ int del_sector_data(void)
|
|||
if(spos==0xffff){
|
||||
spos = pp->numblocks-1;
|
||||
}
|
||||
if(spos>=pp->numblocks){
|
||||
// 梦幻之星1会传入spos=180导致后续错误
|
||||
spos = 0;
|
||||
}
|
||||
if(snum==0xffff){
|
||||
snum = pp->numblocks-spos;
|
||||
}
|
||||
SSLOG(_BUFIO, "del_sector_data: part=%d spos=%d snum=%d\n", pt, spos, snum);
|
||||
if(spos<0 || snum<=0 || (spos+snum) > pp->numblocks){
|
||||
// 梦幻之星1会传入spos=180导致后续错误
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
while(snum){
|
||||
remove_block(pp, spos);
|
||||
|
@ -1319,7 +1337,7 @@ int get_del_sector_data(void)
|
|||
gs_snum = 0;
|
||||
|
||||
if(cdb.trans_type){
|
||||
set_status(STAT_WAIT);
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1328,47 +1346,27 @@ int get_del_sector_data(void)
|
|||
snum = cdb.cr4;
|
||||
pp = &cdb.part[pt];
|
||||
|
||||
if(pp->numblocks){
|
||||
if(spos==0xffff){
|
||||
spos = pp->numblocks-1;
|
||||
}
|
||||
if(snum==0xffff){
|
||||
snum = pp->numblocks-spos;
|
||||
}
|
||||
}else{
|
||||
if(spos==0xffff){
|
||||
spos = 0;
|
||||
}
|
||||
if(snum==0xffff){
|
||||
snum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
SSLOG(_BUFIO, "get_del_sector_data: part=%d(%d) spos=%d snum=%d\n", pt, pp->numblocks, spos, snum);
|
||||
if(snum==0){
|
||||
// 针对<重装机兵2雷诺斯>的临时处理
|
||||
while(cdb.play_type){
|
||||
cdc_delay(10);
|
||||
}
|
||||
snum = pp->numblocks;
|
||||
}else{
|
||||
while(pp->numblocks<snum){
|
||||
// 在这里等待并不是个好办法.
|
||||
cdc_delay(10);
|
||||
}
|
||||
if(spos==0xffff){
|
||||
spos = pp->numblocks-1;
|
||||
}
|
||||
if(snum==0xffff){
|
||||
snum = pp->numblocks-spos;
|
||||
}
|
||||
SSLOG(_BUFIO, " : part=%d(%d) spos=%d snum=%d\n", pt, pp->numblocks, spos, snum);
|
||||
|
||||
if(pp->numblocks){
|
||||
cdb.trans_type = TRANS_DATA_DEL;
|
||||
cdb.trans_part_index = pt;
|
||||
cdb.trans_block_start = spos;
|
||||
cdb.trans_block_end = spos+snum;
|
||||
|
||||
trans_start();
|
||||
if(spos<0 || snum<=0 || (spos+snum) > pp->numblocks){
|
||||
// 格兰蒂亚: 传入了snum=0. 似乎应该直接返回.
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
set_status(0x4000 | cdb.status);
|
||||
cdb.trans_type = TRANS_DATA_DEL;
|
||||
cdb.trans_part_index = pt;
|
||||
cdb.trans_block_start = spos;
|
||||
cdb.trans_block_end = spos+snum;
|
||||
trans_start();
|
||||
|
||||
set_status(STAT_TRNS | cdb.status);
|
||||
return HIRQ_DRDY|HIRQ_EHST;
|
||||
}
|
||||
|
||||
|
@ -1380,7 +1378,7 @@ int put_sector_data(void)
|
|||
PARTITION *pp;
|
||||
|
||||
if(cdb.trans_type){
|
||||
set_status(STAT_WAIT);
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1525,9 +1523,9 @@ int handle_diread(void)
|
|||
SSLOG(_FILEIO, " cdir_lba=%08x size=%08x\n", cdb.cdir_lba, cdb.cdir_size);
|
||||
fill_fileinfo();
|
||||
free_partition(pt);
|
||||
HIRQ = HIRQ_EFLS;
|
||||
}
|
||||
|
||||
HIRQ = HIRQ_EFLS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1661,7 +1659,7 @@ int get_file_info(void)
|
|||
int i;
|
||||
|
||||
if(cdb.trans_type){
|
||||
set_status(STAT_WAIT);
|
||||
set_status(STAT_WAIT | cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1760,10 +1758,11 @@ int read_file(void)
|
|||
_set_filter(selnum, 0x40, cdb.play_fad_start, lba_size-offset);
|
||||
disk_task_wakeup();
|
||||
|
||||
set_report(0x4000 | cdb.status);
|
||||
return HIRQ_EFLS;
|
||||
set_report(cdb.status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// 0x75 [SR]
|
||||
int abort_file(void)
|
||||
{
|
||||
|
|
|
@ -153,6 +153,8 @@ int get_sector(int fad, BLOCK *wblk)
|
|||
return -1;
|
||||
}
|
||||
}
|
||||
if(wblk==NULL)
|
||||
return 0;
|
||||
|
||||
if(fad>=buf_fad_start && fad<buf_fad_end){
|
||||
// 在内部缓存中找到了要play的扇区
|
||||
|
@ -206,20 +208,19 @@ int get_sector(int fad, BLOCK *wblk)
|
|||
/******************************************************************************/
|
||||
|
||||
|
||||
void show_pt(void)
|
||||
void show_pt(int id)
|
||||
{
|
||||
PARTITION *pt;
|
||||
FILTER *ft;
|
||||
BLOCK *bk;
|
||||
int i;
|
||||
|
||||
if(cdb.cddev_filter==0xff){
|
||||
return;
|
||||
pt = &cdb.part[id];
|
||||
SSLOG(_INFO, "Part_%d: nblks=%d\n", pt->numblocks);
|
||||
bk = pt->head;
|
||||
for(i=0; i<pt->numblocks; i++){
|
||||
SSLOG(_INFO, " %2d: size=%4d fad=%08x data=%08x\n", i, bk->size, bk->fad, bk->data);
|
||||
bk = bk->next;
|
||||
}
|
||||
ft = &cdb.filter[cdb.cddev_filter];
|
||||
pt = &cdb.part[ft->c_true];
|
||||
|
||||
SSLOG(_INFO, " : Part_%d: nblks=%d\n", ft->c_true, pt->numblocks);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -281,6 +282,9 @@ _restart_nowait:
|
|||
set_pause_ok();
|
||||
goto _restart_wait;
|
||||
}
|
||||
|
||||
get_sector(cdb.fad, NULL);
|
||||
|
||||
if(cdb.play_fad_start==0 || cdb.play_type==0){
|
||||
SSLOG(_DTASK, "play_task: play_type=%d! play_fad_start=%08x!\n", cdb.play_type, cdb.play_fad_start);
|
||||
cdb.status = STAT_PAUSE;
|
||||
|
@ -291,8 +295,9 @@ _restart_nowait:
|
|||
}else{
|
||||
SSLOG(_DTASK, "\nplay_task! fad_start=%08x(lba_%d) fad_end=%08x fad=%08x type=%d free=%d\n",
|
||||
cdb.play_fad_start, cdb.play_fad_start-150, cdb.play_fad_end, cdb.fad, cdb.play_type, cdb.block_free);
|
||||
if(cdb.play_fad_start == cdb.fad){
|
||||
if(cdb.play_type==PLAYTYPE_SECTOR && cdb.play_fad_start == cdb.fad){
|
||||
if(play_delay){
|
||||
cdb.status = STAT_SEEK;
|
||||
hw_delay(play_delay);
|
||||
}
|
||||
}
|
||||
|
@ -329,7 +334,7 @@ _restart_nowait:
|
|||
}else
|
||||
{
|
||||
//printk("filter sector %08x...\n", cdb.fad);
|
||||
if(sector_delay){
|
||||
if(cdb.play_type==PLAYTYPE_SECTOR && sector_delay){
|
||||
hw_delay(sector_delay);
|
||||
}
|
||||
retv = filter_sector(play_track, &wblk);
|
||||
|
@ -341,6 +346,9 @@ _restart_nowait:
|
|||
SSLOG(_DTASK, "buffer full! wait ...\n");
|
||||
// block缓存已满, 需要等待某个事件再继续
|
||||
HIRQ = HIRQ_BFUL;
|
||||
if(cdb.play_type==PLAYTYPE_FILE){
|
||||
HIRQ = HIRQ_EFLS;
|
||||
}
|
||||
cdb.status = STAT_PAUSE;
|
||||
cdb.play_wait = 1;
|
||||
goto _restart_wait;
|
||||
|
|
|
@ -62,6 +62,7 @@ void saturn_config(void);
|
|||
|
||||
int flash_update(int check);
|
||||
int fpga_update(int check);
|
||||
int flash_write_config(u8 *cfgbuf);
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
|
|
|
@ -165,6 +165,15 @@ void Metal_Slug_patch(void)
|
|||
}
|
||||
|
||||
|
||||
/*********************************************************/
|
||||
//Metal_Slug A ºÏ½ðµ¯Í·1.005°æ
|
||||
void Metal_Slug_A_patch(void)
|
||||
{
|
||||
ssctrl_set(MASK_EXMEM, CS0_RAM1M);
|
||||
*(u32*)(0x06079FBC) = 0x34403440;
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************/
|
||||
// KOF96
|
||||
// 1MB RAM cart only
|
||||
|
@ -331,6 +340,26 @@ void xmvsf_patch(void)
|
|||
}
|
||||
|
||||
|
||||
/**********************************************************/
|
||||
// Marvel Super Heroes vs. Street Fighter (Japan)
|
||||
void mshvssf_handle1(void)
|
||||
{
|
||||
if(*(u16*)(0x600286e)== 0x2012)
|
||||
*(u16*)(0x600286e) = 0x0009;
|
||||
if(*(u16*)(0x600205A)== 0x2102)
|
||||
*(u16*)(0x600205A) = 0x0009;
|
||||
__asm volatile("jmp @%0"::"r"(0x6002000));
|
||||
__asm volatile ("nop" :: );
|
||||
}
|
||||
|
||||
void mshvssf_patch(void)
|
||||
{
|
||||
*(u8*)0x060F000B = 0x46;
|
||||
*(u8*)0x060F001D = 0x41;
|
||||
*(u32*)(0x60F0124) = (u32)mshvssf_handle1;
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************/
|
||||
// WAKUWAKU7 »ðÈÈ»ðÈÈ7 δÐÞ¸´
|
||||
void WAKU7_patch(void)
|
||||
|
@ -361,7 +390,7 @@ void FIGHTERS_HISTORY_patch(void)
|
|||
{
|
||||
*(u16*)0x060507C4 = 0x9;
|
||||
*(u16*)0x060507d8 = 0x9;
|
||||
SS_CTRL = (SAROO_EN | CS0_RAM1M);
|
||||
ssctrl_set(MASK_EXMEM, CS0_RAM1M);
|
||||
*(u32*)0x060500C8 = 0x34403440;
|
||||
*(u32*)0x06057000 = 0x34403440;
|
||||
*(u32*)0x0605707C = 0x34403440;
|
||||
|
@ -404,7 +433,8 @@ GAME_DB game_dbs[] = {
|
|||
{"T-1230G", "POCKET_FIGHTER", POCKET_FIGHTER_patch},
|
||||
{"T-1246G", "SF_ZERO3", SF_ZERO3_patch},
|
||||
|
||||
{"T-3111G", "Metal_Slug", Metal_Slug_patch},
|
||||
{"T-3111G V1.002", "Metal_Slug", Metal_Slug_patch},
|
||||
{"T-3111G V1.005", "Metal_Slug_A", Metal_Slug_A_patch},
|
||||
{"T-3108G", "KOF96", kof96_patch},
|
||||
{"T-3121G", "KOF97", kof97_patch},
|
||||
{"T-3104G", "SamuraiSp3", smrsp3_patch},
|
||||
|
@ -422,6 +452,7 @@ GAME_DB game_dbs[] = {
|
|||
{"T-1248G", "FINAL_FIGHT_REVENGE", FINAL_FIGHT_REVENGE_patch},
|
||||
{"T-1226G", "XMENVSSF", xmvsf_patch},
|
||||
{"T-1215G", "MARVEL_SUPER", MARVEL_SUPER_patch},
|
||||
{"T-1238G V1.000", "MSH_VS_SF", mshvssf_patch},
|
||||
{NULL,},
|
||||
};
|
||||
|
||||
|
|
|
@ -421,7 +421,7 @@ int bup_dir(int dev, char *file_name, int tbsize, BUPDIR *dir)
|
|||
|
||||
printk("bup_dir(%d): %s %d\n", dev, file_name, tbsize);
|
||||
if(dev>0)
|
||||
return BUP_NON;
|
||||
return 0;
|
||||
|
||||
fnum = 0;
|
||||
while(1){
|
||||
|
|
Loading…
Reference in a new issue