bugfixes for SD card compatibility in DMA mode
This commit is contained in:
parent
63febb92c6
commit
1b65c4fd88
@ -5,9 +5,9 @@ GAME_MAIN:
|
|||||||
sep #$20 : .as
|
sep #$20 : .as
|
||||||
jsr snes_init
|
jsr snes_init
|
||||||
jsr setup_gfx
|
jsr setup_gfx
|
||||||
|
jsr colortest
|
||||||
jsr setup_hdma
|
jsr setup_hdma
|
||||||
jsr tests
|
jsr tests
|
||||||
jsr colortest
|
|
||||||
sep #$20 : .as
|
sep #$20 : .as
|
||||||
lda #$00
|
lda #$00
|
||||||
sta @AVR_CMD
|
sta @AVR_CMD
|
||||||
@ -154,8 +154,8 @@ snes_init:
|
|||||||
stz $2101 ;
|
stz $2101 ;
|
||||||
stz $2102 ;
|
stz $2102 ;
|
||||||
stz $2103 ;
|
stz $2103 ;
|
||||||
stz $2104 ; (OAM Data?!)
|
; stz $2104 ; (OAM Data?!)
|
||||||
stz $2104 ; (OAM Data?!)
|
; stz $2104 ; (OAM Data?!)
|
||||||
stz $2105 ;
|
stz $2105 ;
|
||||||
stz $2106 ;
|
stz $2106 ;
|
||||||
stz $2107 ;
|
stz $2107 ;
|
||||||
@ -185,8 +185,8 @@ snes_init:
|
|||||||
sta $2115 ;
|
sta $2115 ;
|
||||||
stz $2116 ;
|
stz $2116 ;
|
||||||
stz $2117 ;
|
stz $2117 ;
|
||||||
stz $2118 ;(VRAM Data?!)
|
; stz $2118 ;(VRAM Data?!)
|
||||||
stz $2119 ;(VRAM Data?!)
|
; stz $2119 ;(VRAM Data?!)
|
||||||
stz $211a ;
|
stz $211a ;
|
||||||
stz $211b ;
|
stz $211b ;
|
||||||
lda #$01
|
lda #$01
|
||||||
@ -202,8 +202,8 @@ snes_init:
|
|||||||
stz $2120 ;
|
stz $2120 ;
|
||||||
stz $2120 ;
|
stz $2120 ;
|
||||||
stz $2121 ;
|
stz $2121 ;
|
||||||
stz $2122 ; (CG Data?!)
|
; stz $2122 ; (CG Data?!)
|
||||||
stz $2122 ; (CG Data?!)
|
; stz $2122 ; (CG Data?!)
|
||||||
stz $2123 ;
|
stz $2123 ;
|
||||||
stz $2124 ;
|
stz $2124 ;
|
||||||
stz $2125 ;
|
stz $2125 ;
|
||||||
|
|||||||
7
src/ff.c
7
src/ff.c
@ -1504,8 +1504,6 @@ FRESULT f_open (
|
|||||||
}
|
}
|
||||||
|
|
||||||
fp->dir_sect = FSBUF.sect; /* Pointer to the directory entry */
|
fp->dir_sect = FSBUF.sect; /* Pointer to the directory entry */
|
||||||
/* Moved sync from mode & FA_CREATE_ALWAYS because it can reset FSBUF.sect */
|
|
||||||
sync(fs); /* not sure if this is needed in all cases, but kept */
|
|
||||||
fp->dir_ptr = dir;
|
fp->dir_ptr = dir;
|
||||||
#endif
|
#endif
|
||||||
fp->flag = mode; /* File access mode */
|
fp->flag = mode; /* File access mode */
|
||||||
@ -1516,6 +1514,11 @@ FRESULT f_open (
|
|||||||
fp->csect = 1; /* Sector counter */
|
fp->csect = 1; /* Sector counter */
|
||||||
fp->fs = fs; //fp->id = fs->id; /* Owner file system object of the file */
|
fp->fs = fs; //fp->id = fs->id; /* Owner file system object of the file */
|
||||||
|
|
||||||
|
#if !_FS_READONLY
|
||||||
|
if (mode & (FA_CREATE_ALWAYS|FA_OPEN_ALWAYS|FA_CREATE_NEW))
|
||||||
|
sync(fs); /* sync buffer in case the file was just created */
|
||||||
|
/* can't sync earlier, modifies FSBUF.sect */
|
||||||
|
#endif
|
||||||
return FR_OK;
|
return FR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -186,7 +186,8 @@ restart:
|
|||||||
|
|
||||||
while(0) {
|
while(0) {
|
||||||
SD_SPI_OFFLOAD=1;
|
SD_SPI_OFFLOAD=1;
|
||||||
sd_read(0, file_buf, 32L, 1);
|
set_avr_addr(0L);
|
||||||
|
sd_read(0, file_buf, 8L, 1);
|
||||||
// sram_writeblock((void*)file_buf, 0, 0x200);
|
// sram_writeblock((void*)file_buf, 0, 0x200);
|
||||||
sram_hexdump(0,0x10);
|
sram_hexdump(0,0x10);
|
||||||
uart_putc('+');
|
uart_putc('+');
|
||||||
@ -264,7 +265,8 @@ restart:
|
|||||||
set_rom_mask(0x3fffff); // force mirroring off
|
set_rom_mask(0x3fffff); // force mirroring off
|
||||||
uart_putc(')');
|
uart_putc(')');
|
||||||
uart_putcrlf();
|
uart_putcrlf();
|
||||||
// sram_hexdump(0, 0x200);
|
// sram_hexdump(0x7ffff0, 0x10);
|
||||||
|
// sram_hexdump(0, 0x400);
|
||||||
// save_sram((uint8_t*)"/sd2snes/dump", 65536, 0);
|
// save_sram((uint8_t*)"/sd2snes/dump", 65536, 0);
|
||||||
|
|
||||||
sram_writebyte(0, SRAM_CMD_ADDR);
|
sram_writebyte(0, SRAM_CMD_ADDR);
|
||||||
|
|||||||
13
src/memory.c
13
src/memory.c
@ -207,18 +207,19 @@ uint32_t load_sram(uint8_t* filename, uint32_t base_addr) {
|
|||||||
filesize = file_handle.fsize;
|
filesize = file_handle.fsize;
|
||||||
if(file_res) return 0;
|
if(file_res) return 0;
|
||||||
for(;;) {
|
for(;;) {
|
||||||
FPGA_SS_HIGH();
|
// FPGA_SS_HIGH();
|
||||||
SPI_SS_LOW();
|
// SPI_SS_LOW();
|
||||||
|
SPI_OFFLOAD=1;
|
||||||
bytes_read = file_read();
|
bytes_read = file_read();
|
||||||
SPI_SS_HIGH();
|
// SPI_SS_HIGH();
|
||||||
if (file_res || !bytes_read) break;
|
if (file_res || !bytes_read) break;
|
||||||
FPGA_SS_LOW();
|
// FPGA_SS_LOW();
|
||||||
spiTransferByte(0x91);
|
/* spiTransferByte(0x91);
|
||||||
for(int j=0; j<bytes_read; j++) {
|
for(int j=0; j<bytes_read; j++) {
|
||||||
spiTransferByte(file_buf[j]);
|
spiTransferByte(file_buf[j]);
|
||||||
}
|
}
|
||||||
spiTransferByte(0x00); // dummy tx
|
spiTransferByte(0x00); // dummy tx
|
||||||
FPGA_SS_HIGH();
|
FPGA_SS_HIGH(); // */
|
||||||
}
|
}
|
||||||
file_close();
|
file_close();
|
||||||
return (uint32_t)filesize;
|
return (uint32_t)filesize;
|
||||||
|
|||||||
18
src/sdcard.c
18
src/sdcard.c
@ -68,7 +68,7 @@
|
|||||||
#include "spi.h"
|
#include "spi.h"
|
||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
#include "sdcard.h"
|
#include "sdcard.h"
|
||||||
|
#include "fpga_spi.h"
|
||||||
#ifndef TRUE
|
#ifndef TRUE
|
||||||
#define TRUE -1
|
#define TRUE -1
|
||||||
#endif
|
#endif
|
||||||
@ -540,6 +540,7 @@ DRESULT sd_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) {
|
|||||||
|
|
||||||
if (res != 0) {
|
if (res != 0) {
|
||||||
uart_putc('?');
|
uart_putc('?');
|
||||||
|
dprintf("SD error: %02x\n", res);
|
||||||
SPI_SS_HIGH(drv);
|
SPI_SS_HIGH(drv);
|
||||||
disk_state = DISK_ERROR;
|
disk_state = DISK_ERROR;
|
||||||
return RES_ERROR;
|
return RES_ERROR;
|
||||||
@ -565,19 +566,18 @@ DRESULT sd_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) {
|
|||||||
// uart_putc('O');
|
// uart_putc('O');
|
||||||
PORTB |= _BV(PB2);
|
PORTB |= _BV(PB2);
|
||||||
DDRB |= _BV(PB2);
|
DDRB |= _BV(PB2);
|
||||||
|
_delay_us(1);
|
||||||
PORTB &= ~_BV(PB2);
|
PORTB &= ~_BV(PB2);
|
||||||
PORTB |= _BV(PB2);
|
|
||||||
PORTB &= ~_BV(PB7);
|
|
||||||
DDRB &= ~_BV(PB7); // tristate SCK
|
DDRB &= ~_BV(PB7); // tristate SCK
|
||||||
// SPCR=0;
|
PORTB |= _BV(PB2);
|
||||||
DDRB &= ~_BV(PB2);
|
DDRB &= ~_BV(PB2);
|
||||||
_delay_us(1);
|
_delay_us(1);
|
||||||
loop_until_bit_is_set(PINB, PB2);
|
while(!(PINB & _BV(PB2)));
|
||||||
DDRB |= _BV(PB2);
|
|
||||||
// SPCR=0b01010000;
|
|
||||||
SD_SPI_OFFLOAD = 0;
|
|
||||||
deselectCard(drv);
|
|
||||||
DDRB |= _BV(PB7);
|
DDRB |= _BV(PB7);
|
||||||
|
DDRB |= _BV(PB2);
|
||||||
|
// _delay_us(1);
|
||||||
|
deselectCard(drv);
|
||||||
|
SD_SPI_OFFLOAD = 0;
|
||||||
return RES_OK;
|
return RES_OK;
|
||||||
SPDR = 0xff;
|
SPDR = 0xff;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -188,5 +188,7 @@ NET "SRAM_OE" IOSTANDARD = LVCMOS33;
|
|||||||
NET "SRAM_WE" IOSTANDARD = LVCMOS33;
|
NET "SRAM_WE" IOSTANDARD = LVCMOS33;
|
||||||
NET "SPI_DMA_CTRL" LOC = P41;
|
NET "SPI_DMA_CTRL" LOC = P41;
|
||||||
NET "SPI_DMA_CTRL" IOSTANDARD = LVCMOS33;
|
NET "SPI_DMA_CTRL" IOSTANDARD = LVCMOS33;
|
||||||
|
NET "SPI_DMA_CTRL" PULLUP;
|
||||||
NET "SPI_SCK" IOSTANDARD = LVCMOS33;
|
NET "SPI_SCK" IOSTANDARD = LVCMOS33;
|
||||||
NET "SPI_SCK" PULLDOWN;
|
NET "SPI_SCK" DRIVE = 16;
|
||||||
|
NET "SPI_SCK" PULLUP;
|
||||||
|
|||||||
@ -41,7 +41,7 @@ reg [9:0] spi_dma_bytecnt;
|
|||||||
reg [3:0] spi_dma_clkcnt;
|
reg [3:0] spi_dma_clkcnt;
|
||||||
reg [3:0] spi_dma_sck_int_r;
|
reg [3:0] spi_dma_sck_int_r;
|
||||||
reg [5:0] spi_dma_trig_r;
|
reg [5:0] spi_dma_trig_r;
|
||||||
reg [1:0] spi_dma_miso_r;
|
reg [4:0] spi_dma_miso_r;
|
||||||
reg spi_dma_sck_out_r;
|
reg spi_dma_sck_out_r;
|
||||||
reg spi_dma_sck_out_r2;
|
reg spi_dma_sck_out_r2;
|
||||||
|
|
||||||
@ -62,23 +62,24 @@ end
|
|||||||
// synthesize clock
|
// synthesize clock
|
||||||
wire spi_dma_sck_int = spi_dma_clkcnt[1];
|
wire spi_dma_sck_int = spi_dma_clkcnt[1];
|
||||||
assign spi_dma_sck = spi_dma_sck_out_r & spi_dma_sck_out_r2;
|
assign spi_dma_sck = spi_dma_sck_out_r & spi_dma_sck_out_r2;
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
spi_dma_clkcnt <= spi_dma_clkcnt + 1;
|
spi_dma_clkcnt <= spi_dma_clkcnt + 1;
|
||||||
spi_dma_sck_int_r <= {spi_dma_sck_int_r[2:0], spi_dma_sck_int};
|
spi_dma_sck_int_r <= {spi_dma_sck_int_r[2:0], spi_dma_sck_int};
|
||||||
spi_dma_trig_r <= {spi_dma_trig_r[4:0], spi_dma_trig};
|
spi_dma_trig_r <= {spi_dma_trig_r[4:0], spi_dma_trig};
|
||||||
spi_dma_miso_r <= {spi_dma_miso_r[0], spi_dma_miso};
|
spi_dma_miso_r <= {spi_dma_miso_r[3:0], spi_dma_miso};
|
||||||
end
|
end
|
||||||
|
|
||||||
wire spi_dma_trig_rising = (spi_dma_trig_r[5:1] == 5'b00011);
|
wire spi_dma_trig_rising = (spi_dma_trig_r[5:1] == 5'b00011);
|
||||||
wire spi_dma_trig_falling = (spi_dma_trig_r[5:1] == 5'b11100);
|
wire spi_dma_trig_falling = (spi_dma_trig_r[5:1] == 5'b11100);
|
||||||
wire spi_dma_sck_rising = (spi_dma_sck_int_r[1:0] == 2'b01);
|
wire spi_dma_sck_rising = (spi_dma_sck_int_r[2:1] == 2'b01);
|
||||||
wire spi_dma_sck_falling = (spi_dma_sck_int_r[1:0] == 2'b10);
|
wire spi_dma_sck_falling = (spi_dma_sck_int_r[2:1] == 2'b10);
|
||||||
wire spi_dma_sck_rising2 = (spi_dma_sck_int_r[1:0] == 2'b01);
|
wire spi_dma_sck_rising2 = (spi_dma_sck_int_r[2:1] == 2'b01);
|
||||||
wire spi_dma_sck_falling2 = (spi_dma_sck_int_r[1:0] == 2'b10);
|
wire spi_dma_sck_falling2 = (spi_dma_sck_int_r[2:1] == 2'b10);
|
||||||
|
|
||||||
assign spi_dma_nextaddr = spi_dma_nextaddr_r;
|
assign spi_dma_nextaddr = spi_dma_nextaddr_r & (spi_dma_bytecnt < 512);
|
||||||
assign spi_dma_sram_data = spi_dma_sram_data_r;
|
assign spi_dma_sram_data = spi_dma_sram_data_r;
|
||||||
assign spi_dma_sram_we = spi_dma_sram_we_r;
|
assign spi_dma_sram_we = spi_dma_sram_we_r | (spi_dma_bytecnt > 511);
|
||||||
assign spi_dma_done = spi_dma_done_r;
|
assign spi_dma_done = spi_dma_done_r;
|
||||||
assign spi_dma_ovr = spi_dma_ovr_r;
|
assign spi_dma_ovr = spi_dma_ovr_r;
|
||||||
|
|
||||||
@ -86,7 +87,7 @@ always @(posedge clk) begin
|
|||||||
if (spi_dma_trig_falling & !spi_dma_ovr_r) begin
|
if (spi_dma_trig_falling & !spi_dma_ovr_r) begin
|
||||||
spi_dma_done_r <= 0;
|
spi_dma_done_r <= 0;
|
||||||
spi_dma_ovr_r <= 1;
|
spi_dma_ovr_r <= 1;
|
||||||
end else if (spi_dma_bitcnt == 0 && spi_dma_bytecnt == 512) begin
|
end else if (spi_dma_bitcnt == 0 && spi_dma_bytecnt == 514) begin
|
||||||
spi_dma_done_r <= 1;
|
spi_dma_done_r <= 1;
|
||||||
spi_dma_ovr_r <= 0;
|
spi_dma_ovr_r <= 0;
|
||||||
end
|
end
|
||||||
@ -99,30 +100,33 @@ always @(posedge clk) begin
|
|||||||
spi_dma_sck_out_r2 <= 1;
|
spi_dma_sck_out_r2 <= 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
always @(posedge clk) begin
|
// fetch a little later
|
||||||
if (spi_dma_sck_rising & spi_dma_ovr_r & spi_dma_bitcnt < 8)
|
//always @(posedge spi_dma_sck) begin
|
||||||
spi_dma_sram_data_r <= {spi_dma_sram_data_r[6:0], spi_dma_miso};
|
// if (/*spi_dma_sck_rising & */spi_dma_ovr_r & spi_dma_bitcnt <= 8)
|
||||||
end
|
// spi_dma_sram_data_r <= {spi_dma_sram_data_r[6:0], spi_dma_miso_r[0]};
|
||||||
|
//end
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
if(spi_dma_sck_rising & spi_dma_ovr_r) begin
|
if(spi_dma_sck_rising & spi_dma_ovr_r) begin
|
||||||
if (spi_dma_bitcnt < 8) begin
|
if (spi_dma_bitcnt < 8) begin
|
||||||
spi_dma_sck_out_r <= 1;
|
spi_dma_sck_out_r <= 1;
|
||||||
spi_dma_bitcnt <= spi_dma_bitcnt + 1;
|
spi_dma_bitcnt <= spi_dma_bitcnt + 1;
|
||||||
|
spi_dma_sram_data_r <= {spi_dma_sram_data_r[6:0], spi_dma_miso_r[0]};
|
||||||
end else if (spi_dma_bitcnt == 8) begin
|
end else if (spi_dma_bitcnt == 8) begin
|
||||||
spi_dma_sck_out_r <= 0;
|
spi_dma_sck_out_r <= 0;
|
||||||
spi_dma_bitcnt <= spi_dma_bitcnt + 1;
|
spi_dma_bitcnt <= spi_dma_bitcnt + 1;
|
||||||
spi_dma_sram_we_r <= 0;
|
spi_dma_sram_data_r <= {spi_dma_sram_data_r[6:0], spi_dma_miso_r[0]};
|
||||||
end else if (spi_dma_bitcnt == 9) begin
|
end else if (spi_dma_bitcnt == 9) begin
|
||||||
spi_dma_sck_out_r <= 0;
|
spi_dma_sck_out_r <= 0;
|
||||||
spi_dma_sram_we_r <= 1;
|
spi_dma_sram_we_r <= 0;
|
||||||
spi_dma_bytecnt <= spi_dma_bytecnt + 1;
|
|
||||||
spi_dma_bitcnt <= 10;
|
spi_dma_bitcnt <= 10;
|
||||||
end else if (spi_dma_bitcnt == 10) begin
|
end else if (spi_dma_bitcnt == 10) begin
|
||||||
|
spi_dma_sram_we_r <= 1;
|
||||||
spi_dma_nextaddr_r <= 1;
|
spi_dma_nextaddr_r <= 1;
|
||||||
spi_dma_bitcnt <= spi_dma_bitcnt + 1;
|
spi_dma_bitcnt <= spi_dma_bitcnt + 1;
|
||||||
end else if (spi_dma_bitcnt == 11) begin
|
end else if (spi_dma_bitcnt == 11) begin
|
||||||
spi_dma_nextaddr_r <= 0;
|
spi_dma_nextaddr_r <= 0;
|
||||||
|
spi_dma_bytecnt <= spi_dma_bytecnt + 1;
|
||||||
spi_dma_bitcnt <= spi_dma_bitcnt + 1;
|
spi_dma_bitcnt <= spi_dma_bitcnt + 1;
|
||||||
end else if (spi_dma_bitcnt == 12) begin
|
end else if (spi_dma_bitcnt == 12) begin
|
||||||
spi_dma_bitcnt <= 0;
|
spi_dma_bitcnt <= 0;
|
||||||
@ -134,7 +138,7 @@ always @(posedge clk) begin
|
|||||||
end else if (spi_dma_bitcnt == 4'b1111) begin
|
end else if (spi_dma_bitcnt == 4'b1111) begin
|
||||||
spi_dma_bitcnt <= 0;
|
spi_dma_bitcnt <= 0;
|
||||||
end
|
end
|
||||||
end else if (spi_dma_sck_rising & !spi_dma_ovr_r) begin
|
end else if (spi_dma_trig_falling & !spi_dma_ovr_r) begin
|
||||||
spi_dma_bitcnt <= 4'b1101;
|
spi_dma_bitcnt <= 4'b1101;
|
||||||
spi_dma_bytecnt <= 10'b0000000000;
|
spi_dma_bytecnt <= 10'b0000000000;
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user