diff --git a/src/fpga_spi.c b/src/fpga_spi.c index 94d3d3e..8dc2757 100644 --- a/src/fpga_spi.c +++ b/src/fpga_spi.c @@ -1,6 +1,6 @@ /* sd2snes - SD card based universal cartridge for the SNES - Copyright (C) 2009-2010 Maximilian Rehkopf - AVR firmware portion + Copyright (C) 2009-2012 Maximilian Rehkopf + uC firmware portion Inspired by and based on code from sd2iec, written by Ingo Korb et al. See sdcard.c|h, config.h. @@ -149,7 +149,7 @@ void fpga_spi_init(void) { void set_msu_addr(uint16_t address) { FPGA_SELECT(); - FPGA_TX_BYTE(0x02); + FPGA_TX_BYTE(FPGA_CMD_SETADDR | FPGA_TGT_MSUBUF); FPGA_TX_BYTE((address>>8)&0xff); FPGA_TX_BYTE((address)&0xff); FPGA_DESELECT(); @@ -157,7 +157,7 @@ void set_msu_addr(uint16_t address) { void set_dac_addr(uint16_t address) { FPGA_SELECT(); - FPGA_TX_BYTE(0x01); + FPGA_TX_BYTE(FPGA_CMD_SETADDR | FPGA_TGT_DACBUF); FPGA_TX_BYTE((address>>8)&0xff); FPGA_TX_BYTE((address)&0xff); FPGA_DESELECT(); @@ -165,7 +165,7 @@ void set_dac_addr(uint16_t address) { void set_mcu_addr(uint32_t address) { FPGA_SELECT(); - FPGA_TX_BYTE(0x00); + FPGA_TX_BYTE(FPGA_CMD_SETADDR | FPGA_TGT_MEM); FPGA_TX_BYTE((address>>16)&0xff); FPGA_TX_BYTE((address>>8)&0xff); FPGA_TX_BYTE((address)&0xff); @@ -174,7 +174,7 @@ void set_mcu_addr(uint32_t address) { void set_saveram_mask(uint32_t mask) { FPGA_SELECT(); - FPGA_TX_BYTE(0x20); + FPGA_TX_BYTE(FPGA_CMD_SETRAMMASK); FPGA_TX_BYTE((mask>>16)&0xff); FPGA_TX_BYTE((mask>>8)&0xff); FPGA_TX_BYTE((mask)&0xff); @@ -183,7 +183,7 @@ void set_saveram_mask(uint32_t mask) { void set_rom_mask(uint32_t mask) { FPGA_SELECT(); - FPGA_TX_BYTE(0x10); + FPGA_TX_BYTE(FPGA_CMD_SETROMMASK); FPGA_TX_BYTE((mask>>16)&0xff); FPGA_TX_BYTE((mask>>8)&0xff); FPGA_TX_BYTE((mask)&0xff); @@ -192,13 +192,13 @@ void set_rom_mask(uint32_t mask) { void set_mapper(uint8_t val) { FPGA_SELECT(); - FPGA_TX_BYTE(0x30 | (val & 0x0f)); + FPGA_TX_BYTE(FPGA_CMD_SETMAPPER(val)); FPGA_DESELECT(); } uint8_t fpga_test() { FPGA_SELECT(); - FPGA_TX_BYTE(0xF0); /* TEST */ + FPGA_TX_BYTE(FPGA_CMD_TEST); uint8_t result = FPGA_RX_BYTE(); FPGA_DESELECT(); return result; @@ -206,7 +206,7 @@ uint8_t fpga_test() { uint16_t fpga_status() { FPGA_SELECT(); - FPGA_TX_BYTE(0xF1); /* STATUS */ + FPGA_TX_BYTE(FPGA_CMD_GETSTATUS); uint16_t result = (FPGA_RX_BYTE()) << 8; result |= FPGA_RX_BYTE(); FPGA_DESELECT(); @@ -215,64 +215,48 @@ uint16_t fpga_status() { void fpga_set_sddma_range(uint16_t start, uint16_t end) { FPGA_SELECT(); - FPGA_TX_BYTE(0x60); /* DMA_RANGE */ + FPGA_TX_BYTE(FPGA_CMD_SDDMA_RANGE); FPGA_TX_BYTE(start>>8); FPGA_TX_BYTE(start&0xff); FPGA_TX_BYTE(end>>8); FPGA_TX_BYTE(end&0xff); -//if(tgt==1 && (test=FPGA_RX_BYTE()) != 0x41) printf("!!!!!!!!!!!!!!! -%02x- \n", test); FPGA_DESELECT(); } void fpga_sddma(uint8_t tgt, uint8_t partial) { - uint32_t test = 0; - uint8_t status = 0; BITBAND(SD_CLKREG->FIODIR, SD_CLKPIN) = 0; FPGA_SELECT(); - FPGA_TX_BYTE(0x40 | (tgt & 0x3) | ((partial & 1) << 2) ); /* DO DMA */ + FPGA_TX_BYTE(FPGA_CMD_SDDMA | (tgt & 3) | partial ? FPGA_SDDMA_PARTIAL : 0); FPGA_TX_BYTE(0x00); /* dummy for falling DMA_EN edge */ -//if(tgt==1 && (test=FPGA_RX_BYTE()) != 0x41) printf("!!!!!!!!!!!!!!! -%02x- \n", test); FPGA_DESELECT(); FPGA_SELECT(); - FPGA_TX_BYTE(0xF1); /* STATUS */ + FPGA_TX_BYTE(FPGA_CMD_GETSTATUS); DBG_SD printf("FPGA DMA request sent, wait for completion..."); - while((status=FPGA_RX_BYTE()) & 0x80) { + while(FPGA_RX_BYTE() & 0x80) { FPGA_RX_BYTE(); /* eat the 2nd status byte */ - test++; } - DBG_SD printf("...complete\n"); FPGA_DESELECT(); -// if(test<5)printf("loopy: %ld %02x\n", test, status); BITBAND(SD_CLKREG->FIODIR, SD_CLKPIN) = 1; } -void set_dac_vol(uint8_t volume) { - FPGA_SELECT(); - FPGA_TX_BYTE(0x50); - FPGA_TX_BYTE(volume); - FPGA_TX_BYTE(0x00); /* latch rise */ - FPGA_TX_BYTE(0x00); /* latch fall */ - FPGA_DESELECT(); -} - void dac_play() { FPGA_SELECT(); - FPGA_TX_BYTE(0xe2); + FPGA_TX_BYTE(FPGA_CMD_DACPLAY); FPGA_TX_BYTE(0x00); /* latch reset */ FPGA_DESELECT(); } void dac_pause() { FPGA_SELECT(); - FPGA_TX_BYTE(0xe1); + FPGA_TX_BYTE(FPGA_CMD_DACPAUSE); FPGA_TX_BYTE(0x00); /* latch reset */ FPGA_DESELECT(); } void dac_reset() { FPGA_SELECT(); - FPGA_TX_BYTE(0xe3); + FPGA_TX_BYTE(FPGA_CMD_DACRESETPTR); FPGA_TX_BYTE(0x00); /* latch reset */ FPGA_TX_BYTE(0x00); /* latch reset */ FPGA_DESELECT(); @@ -280,7 +264,7 @@ void dac_reset() { void msu_reset(uint16_t address) { FPGA_SELECT(); - FPGA_TX_BYTE(0xe4); + FPGA_TX_BYTE(FPGA_CMD_MSUSETPTR); FPGA_TX_BYTE((address>>8) & 0xff); /* address hi */ FPGA_TX_BYTE(address & 0xff); /* address lo */ FPGA_TX_BYTE(0x00); /* latch reset */ @@ -290,24 +274,16 @@ void msu_reset(uint16_t address) { void set_msu_status(uint8_t set, uint8_t reset) { FPGA_SELECT(); - FPGA_TX_BYTE(0xe0); + FPGA_TX_BYTE(FPGA_CMD_MSUSETBITS); FPGA_TX_BYTE(set); FPGA_TX_BYTE(reset); FPGA_TX_BYTE(0x00); /* latch reset */ FPGA_DESELECT(); } -uint8_t get_msu_volume() { - FPGA_SELECT(); - FPGA_TX_BYTE(0xF4); /* MSU_VOLUME */ - uint8_t result = FPGA_RX_BYTE(); - FPGA_DESELECT(); - return result; -} - uint16_t get_msu_track() { FPGA_SELECT(); - FPGA_TX_BYTE(0xF3); /* MSU_TRACK */ + FPGA_TX_BYTE(FPGA_CMD_MSUGETTRACK); uint16_t result = (FPGA_RX_BYTE()) << 8; result |= FPGA_RX_BYTE(); FPGA_DESELECT(); @@ -316,7 +292,7 @@ uint16_t get_msu_track() { uint32_t get_msu_offset() { FPGA_SELECT(); - FPGA_TX_BYTE(0xF2); /* MSU_OFFSET */ + FPGA_TX_BYTE(FPGA_CMD_MSUGETADDR); uint32_t result = (FPGA_RX_BYTE()) << 24; result |= (FPGA_RX_BYTE()) << 16; result |= (FPGA_RX_BYTE()) << 8; @@ -327,7 +303,7 @@ uint32_t get_msu_offset() { uint32_t get_snes_sysclk() { FPGA_SELECT(); - FPGA_TX_BYTE(0xFE); /* GET_SYSCLK */ + FPGA_TX_BYTE(FPGA_CMD_GETSYSCLK); FPGA_TX_BYTE(0x00); /* dummy (copy current sysclk count to register) */ uint32_t result = (FPGA_RX_BYTE()) << 24; result |= (FPGA_RX_BYTE()) << 16; @@ -339,7 +315,7 @@ uint32_t get_snes_sysclk() { void set_bsx_regs(uint8_t set, uint8_t reset) { FPGA_SELECT(); - FPGA_TX_BYTE(0xe6); + FPGA_TX_BYTE(FPGA_CMD_BSXSETBITS); FPGA_TX_BYTE(set); FPGA_TX_BYTE(reset); FPGA_TX_BYTE(0x00); /* latch reset */ @@ -348,7 +324,7 @@ void set_bsx_regs(uint8_t set, uint8_t reset) { void set_fpga_time(uint64_t time) { FPGA_SELECT(); - FPGA_TX_BYTE(0xe5); + FPGA_TX_BYTE(FPGA_CMD_RTCSET); FPGA_TX_BYTE((time >> 48) & 0xff); FPGA_TX_BYTE((time >> 40) & 0xff); FPGA_TX_BYTE((time >> 32) & 0xff); @@ -362,7 +338,7 @@ void set_fpga_time(uint64_t time) { void fpga_reset_srtc_state() { FPGA_SELECT(); - FPGA_TX_BYTE(0xe7); + FPGA_TX_BYTE(FPGA_CMD_SRTCRESET); FPGA_TX_BYTE(0x00); FPGA_TX_BYTE(0x00); FPGA_DESELECT(); @@ -370,7 +346,7 @@ void fpga_reset_srtc_state() { void fpga_reset_dspx_addr() { FPGA_SELECT(); - FPGA_TX_BYTE(0xe8); + FPGA_TX_BYTE(FPGA_CMD_DSPRESETPTR); FPGA_TX_BYTE(0x00); FPGA_TX_BYTE(0x00); FPGA_DESELECT(); @@ -378,7 +354,7 @@ void fpga_reset_dspx_addr() { void fpga_write_dspx_pgm(uint32_t data) { FPGA_SELECT(); - FPGA_TX_BYTE(0xe9); + FPGA_TX_BYTE(FPGA_CMD_DSPWRITEPGM); FPGA_TX_BYTE((data>>16)&0xff); FPGA_TX_BYTE((data>>8)&0xff); FPGA_TX_BYTE((data)&0xff); @@ -389,7 +365,7 @@ void fpga_write_dspx_pgm(uint32_t data) { void fpga_write_dspx_dat(uint16_t data) { FPGA_SELECT(); - FPGA_TX_BYTE(0xea); + FPGA_TX_BYTE(FPGA_CMD_DSPWRITEDAT); FPGA_TX_BYTE((data>>8)&0xff); FPGA_TX_BYTE((data)&0xff); FPGA_TX_BYTE(0x00); @@ -399,7 +375,7 @@ void fpga_write_dspx_dat(uint16_t data) { void fpga_dspx_reset(uint8_t reset) { FPGA_SELECT(); - FPGA_TX_BYTE(reset ? 0xeb : 0xec); + FPGA_TX_BYTE(reset ? FPGA_CMD_DSPRESET : FPGA_CMD_DSPUNRESET); FPGA_TX_BYTE(0x00); FPGA_DESELECT(); } @@ -407,7 +383,7 @@ void fpga_dspx_reset(uint8_t reset) { void fpga_set_features(uint8_t feat) { printf("set features: %02x\n", feat); FPGA_SELECT(); - FPGA_TX_BYTE(0xed); + FPGA_TX_BYTE(FPGA_CMD_SETFEATURE); FPGA_TX_BYTE(feat); FPGA_DESELECT(); } @@ -415,7 +391,7 @@ void fpga_set_features(uint8_t feat) { void fpga_set_213f(uint8_t data) { printf("set 213f: %d\n", data); FPGA_SELECT(); - FPGA_TX_BYTE(0xee); + FPGA_TX_BYTE(FPGA_CMD_SET213F); FPGA_TX_BYTE(data); FPGA_DESELECT(); } diff --git a/src/fpga_spi.h b/src/fpga_spi.h index f4e8f28..58cd065 100644 --- a/src/fpga_spi.h +++ b/src/fpga_spi.h @@ -57,6 +57,44 @@ #define FPGA_WAIT_RDY() do {while(BITBAND(SSP_REGS->SR, SSP_BSY)); while(!BITBAND(FPGA_MCU_RDY_REG->FIOPIN, FPGA_MCU_RDY_BIT));} while (0) +/* command parameters */ +#define FPGA_MEM_AUTOINC (0x8) +#define FPGA_SDDMA_PARTIAL (0x4) +#define FPGA_TGT_MEM (0x0) +#define FPGA_TGT_DACBUF (0x1) +#define FPGA_TGT_MSUBUF (0x2) + +/* commands */ +#define FPGA_CMD_SETADDR (0x00) +#define FPGA_CMD_SETROMMASK (0x10) +#define FPGA_CMD_SETRAMMASK (0x20) +#define FPGA_CMD_SETMAPPER(x) (0x30 | (x & 15)) +#define FPGA_CMD_SDDMA (0x40) +#define FPGA_CMD_SDDMA_RANGE (0x60) +#define FPGA_CMD_READMEM (0x80) +#define FPGA_CMD_WRITEMEM (0x90) +#define FPGA_CMD_MSUSETBITS (0xe0) +#define FPGA_CMD_DACPAUSE (0xe1) +#define FPGA_CMD_DACPLAY (0xe2) +#define FPGA_CMD_DACRESETPTR (0xe3) +#define FPGA_CMD_MSUSETPTR (0xe4) +#define FPGA_CMD_RTCSET (0xe5) +#define FPGA_CMD_BSXSETBITS (0xe6) +#define FPGA_CMD_SRTCRESET (0xe7) +#define FPGA_CMD_DSPRESETPTR (0xe8) +#define FPGA_CMD_DSPWRITEPGM (0xe9) +#define FPGA_CMD_DSPWRITEDAT (0xea) +#define FPGA_CMD_DSPRESET (0xeb) +#define FPGA_CMD_DSPUNRESET (0xec) +#define FPGA_CMD_SETFEATURE (0xed) +#define FPGA_CMD_SET213F (0xee) +#define FPGA_CMD_TEST (0xf0) +#define FPGA_CMD_GETSTATUS (0xf1) +#define FPGA_CMD_MSUGETADDR (0xf2) +#define FPGA_CMD_MSUGETTRACK (0xf3) +#define FPGA_CMD_GETSYSCLK (0xfe) +#define FPGA_CMD_ECHO (0xff) + void fpga_spi_init(void); uint8_t fpga_test(void); uint16_t fpga_status(void); @@ -65,7 +103,6 @@ void spi_sd(void); void spi_none(void); void set_mcu_addr(uint32_t); void set_dac_addr(uint16_t); -void set_dac_vol(uint8_t); void dac_play(void); void dac_pause(void); void dac_reset(void); @@ -77,7 +114,6 @@ void set_rom_mask(uint32_t); void set_mapper(uint8_t val); void fpga_sddma(uint8_t tgt, uint8_t partial); void fpga_set_sddma_range(uint16_t start, uint16_t end); -uint8_t get_msu_volume(void); uint16_t get_msu_track(void); uint32_t get_msu_offset(void); uint32_t get_snes_sysclk(void); diff --git a/src/msu1.c b/src/msu1.c index 5e663a3..8f26436 100644 --- a/src/msu1.c +++ b/src/msu1.c @@ -161,7 +161,6 @@ int msu1_check(uint8_t* filename) { int msu1_loop() { /* it is assumed that the MSU file is already opened by calling msu1_check(). */ - set_dac_vol(0x00); while(fpga_status() & 0x4000); uint16_t dac_addr = 0; uint16_t msu_addr = 0;