Firmware/FPGA: replace magic numbers with constants

This commit is contained in:
Maximilian Rehkopf 2012-11-07 11:03:58 +01:00
parent 605fc2dfb1
commit c204aa9a0b
3 changed files with 69 additions and 58 deletions

View File

@ -1,6 +1,6 @@
/* sd2snes - SD card based universal cartridge for the SNES /* sd2snes - SD card based universal cartridge for the SNES
Copyright (C) 2009-2010 Maximilian Rehkopf <otakon@gmx.net> Copyright (C) 2009-2012 Maximilian Rehkopf <otakon@gmx.net>
AVR firmware portion uC firmware portion
Inspired by and based on code from sd2iec, written by Ingo Korb et al. Inspired by and based on code from sd2iec, written by Ingo Korb et al.
See sdcard.c|h, config.h. See sdcard.c|h, config.h.
@ -149,7 +149,7 @@ void fpga_spi_init(void) {
void set_msu_addr(uint16_t address) { void set_msu_addr(uint16_t address) {
FPGA_SELECT(); 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>>8)&0xff);
FPGA_TX_BYTE((address)&0xff); FPGA_TX_BYTE((address)&0xff);
FPGA_DESELECT(); FPGA_DESELECT();
@ -157,7 +157,7 @@ void set_msu_addr(uint16_t address) {
void set_dac_addr(uint16_t address) { void set_dac_addr(uint16_t address) {
FPGA_SELECT(); 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>>8)&0xff);
FPGA_TX_BYTE((address)&0xff); FPGA_TX_BYTE((address)&0xff);
FPGA_DESELECT(); FPGA_DESELECT();
@ -165,7 +165,7 @@ void set_dac_addr(uint16_t address) {
void set_mcu_addr(uint32_t address) { void set_mcu_addr(uint32_t address) {
FPGA_SELECT(); 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>>16)&0xff);
FPGA_TX_BYTE((address>>8)&0xff); FPGA_TX_BYTE((address>>8)&0xff);
FPGA_TX_BYTE((address)&0xff); FPGA_TX_BYTE((address)&0xff);
@ -174,7 +174,7 @@ void set_mcu_addr(uint32_t address) {
void set_saveram_mask(uint32_t mask) { void set_saveram_mask(uint32_t mask) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0x20); FPGA_TX_BYTE(FPGA_CMD_SETRAMMASK);
FPGA_TX_BYTE((mask>>16)&0xff); FPGA_TX_BYTE((mask>>16)&0xff);
FPGA_TX_BYTE((mask>>8)&0xff); FPGA_TX_BYTE((mask>>8)&0xff);
FPGA_TX_BYTE((mask)&0xff); FPGA_TX_BYTE((mask)&0xff);
@ -183,7 +183,7 @@ void set_saveram_mask(uint32_t mask) {
void set_rom_mask(uint32_t mask) { void set_rom_mask(uint32_t mask) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0x10); FPGA_TX_BYTE(FPGA_CMD_SETROMMASK);
FPGA_TX_BYTE((mask>>16)&0xff); FPGA_TX_BYTE((mask>>16)&0xff);
FPGA_TX_BYTE((mask>>8)&0xff); FPGA_TX_BYTE((mask>>8)&0xff);
FPGA_TX_BYTE((mask)&0xff); FPGA_TX_BYTE((mask)&0xff);
@ -192,13 +192,13 @@ void set_rom_mask(uint32_t mask) {
void set_mapper(uint8_t val) { void set_mapper(uint8_t val) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0x30 | (val & 0x0f)); FPGA_TX_BYTE(FPGA_CMD_SETMAPPER(val));
FPGA_DESELECT(); FPGA_DESELECT();
} }
uint8_t fpga_test() { uint8_t fpga_test() {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xF0); /* TEST */ FPGA_TX_BYTE(FPGA_CMD_TEST);
uint8_t result = FPGA_RX_BYTE(); uint8_t result = FPGA_RX_BYTE();
FPGA_DESELECT(); FPGA_DESELECT();
return result; return result;
@ -206,7 +206,7 @@ uint8_t fpga_test() {
uint16_t fpga_status() { uint16_t fpga_status() {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xF1); /* STATUS */ FPGA_TX_BYTE(FPGA_CMD_GETSTATUS);
uint16_t result = (FPGA_RX_BYTE()) << 8; uint16_t result = (FPGA_RX_BYTE()) << 8;
result |= FPGA_RX_BYTE(); result |= FPGA_RX_BYTE();
FPGA_DESELECT(); FPGA_DESELECT();
@ -215,64 +215,48 @@ uint16_t fpga_status() {
void fpga_set_sddma_range(uint16_t start, uint16_t end) { void fpga_set_sddma_range(uint16_t start, uint16_t end) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0x60); /* DMA_RANGE */ FPGA_TX_BYTE(FPGA_CMD_SDDMA_RANGE);
FPGA_TX_BYTE(start>>8); FPGA_TX_BYTE(start>>8);
FPGA_TX_BYTE(start&0xff); FPGA_TX_BYTE(start&0xff);
FPGA_TX_BYTE(end>>8); FPGA_TX_BYTE(end>>8);
FPGA_TX_BYTE(end&0xff); FPGA_TX_BYTE(end&0xff);
//if(tgt==1 && (test=FPGA_RX_BYTE()) != 0x41) printf("!!!!!!!!!!!!!!! -%02x- \n", test);
FPGA_DESELECT(); FPGA_DESELECT();
} }
void fpga_sddma(uint8_t tgt, uint8_t partial) { void fpga_sddma(uint8_t tgt, uint8_t partial) {
uint32_t test = 0;
uint8_t status = 0;
BITBAND(SD_CLKREG->FIODIR, SD_CLKPIN) = 0; BITBAND(SD_CLKREG->FIODIR, SD_CLKPIN) = 0;
FPGA_SELECT(); 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 */ 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_DESELECT();
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xF1); /* STATUS */ FPGA_TX_BYTE(FPGA_CMD_GETSTATUS);
DBG_SD printf("FPGA DMA request sent, wait for completion..."); 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 */ FPGA_RX_BYTE(); /* eat the 2nd status byte */
test++;
} }
DBG_SD printf("...complete\n"); DBG_SD printf("...complete\n");
FPGA_DESELECT(); FPGA_DESELECT();
// if(test<5)printf("loopy: %ld %02x\n", test, status);
BITBAND(SD_CLKREG->FIODIR, SD_CLKPIN) = 1; 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() { void dac_play() {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe2); FPGA_TX_BYTE(FPGA_CMD_DACPLAY);
FPGA_TX_BYTE(0x00); /* latch reset */ FPGA_TX_BYTE(0x00); /* latch reset */
FPGA_DESELECT(); FPGA_DESELECT();
} }
void dac_pause() { void dac_pause() {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe1); FPGA_TX_BYTE(FPGA_CMD_DACPAUSE);
FPGA_TX_BYTE(0x00); /* latch reset */ FPGA_TX_BYTE(0x00); /* latch reset */
FPGA_DESELECT(); FPGA_DESELECT();
} }
void dac_reset() { void dac_reset() {
FPGA_SELECT(); 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_TX_BYTE(0x00); /* latch reset */ FPGA_TX_BYTE(0x00); /* latch reset */
FPGA_DESELECT(); FPGA_DESELECT();
@ -280,7 +264,7 @@ void dac_reset() {
void msu_reset(uint16_t address) { void msu_reset(uint16_t address) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe4); FPGA_TX_BYTE(FPGA_CMD_MSUSETPTR);
FPGA_TX_BYTE((address>>8) & 0xff); /* address hi */ FPGA_TX_BYTE((address>>8) & 0xff); /* address hi */
FPGA_TX_BYTE(address & 0xff); /* address lo */ FPGA_TX_BYTE(address & 0xff); /* address lo */
FPGA_TX_BYTE(0x00); /* latch reset */ 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) { void set_msu_status(uint8_t set, uint8_t reset) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe0); FPGA_TX_BYTE(FPGA_CMD_MSUSETBITS);
FPGA_TX_BYTE(set); FPGA_TX_BYTE(set);
FPGA_TX_BYTE(reset); FPGA_TX_BYTE(reset);
FPGA_TX_BYTE(0x00); /* latch reset */ FPGA_TX_BYTE(0x00); /* latch reset */
FPGA_DESELECT(); 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() { uint16_t get_msu_track() {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xF3); /* MSU_TRACK */ FPGA_TX_BYTE(FPGA_CMD_MSUGETTRACK);
uint16_t result = (FPGA_RX_BYTE()) << 8; uint16_t result = (FPGA_RX_BYTE()) << 8;
result |= FPGA_RX_BYTE(); result |= FPGA_RX_BYTE();
FPGA_DESELECT(); FPGA_DESELECT();
@ -316,7 +292,7 @@ uint16_t get_msu_track() {
uint32_t get_msu_offset() { uint32_t get_msu_offset() {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xF2); /* MSU_OFFSET */ FPGA_TX_BYTE(FPGA_CMD_MSUGETADDR);
uint32_t result = (FPGA_RX_BYTE()) << 24; uint32_t result = (FPGA_RX_BYTE()) << 24;
result |= (FPGA_RX_BYTE()) << 16; result |= (FPGA_RX_BYTE()) << 16;
result |= (FPGA_RX_BYTE()) << 8; result |= (FPGA_RX_BYTE()) << 8;
@ -327,7 +303,7 @@ uint32_t get_msu_offset() {
uint32_t get_snes_sysclk() { uint32_t get_snes_sysclk() {
FPGA_SELECT(); 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) */ FPGA_TX_BYTE(0x00); /* dummy (copy current sysclk count to register) */
uint32_t result = (FPGA_RX_BYTE()) << 24; uint32_t result = (FPGA_RX_BYTE()) << 24;
result |= (FPGA_RX_BYTE()) << 16; result |= (FPGA_RX_BYTE()) << 16;
@ -339,7 +315,7 @@ uint32_t get_snes_sysclk() {
void set_bsx_regs(uint8_t set, uint8_t reset) { void set_bsx_regs(uint8_t set, uint8_t reset) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe6); FPGA_TX_BYTE(FPGA_CMD_BSXSETBITS);
FPGA_TX_BYTE(set); FPGA_TX_BYTE(set);
FPGA_TX_BYTE(reset); FPGA_TX_BYTE(reset);
FPGA_TX_BYTE(0x00); /* latch 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) { void set_fpga_time(uint64_t time) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe5); FPGA_TX_BYTE(FPGA_CMD_RTCSET);
FPGA_TX_BYTE((time >> 48) & 0xff); FPGA_TX_BYTE((time >> 48) & 0xff);
FPGA_TX_BYTE((time >> 40) & 0xff); FPGA_TX_BYTE((time >> 40) & 0xff);
FPGA_TX_BYTE((time >> 32) & 0xff); FPGA_TX_BYTE((time >> 32) & 0xff);
@ -362,7 +338,7 @@ void set_fpga_time(uint64_t time) {
void fpga_reset_srtc_state() { void fpga_reset_srtc_state() {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe7); FPGA_TX_BYTE(FPGA_CMD_SRTCRESET);
FPGA_TX_BYTE(0x00); FPGA_TX_BYTE(0x00);
FPGA_TX_BYTE(0x00); FPGA_TX_BYTE(0x00);
FPGA_DESELECT(); FPGA_DESELECT();
@ -370,7 +346,7 @@ void fpga_reset_srtc_state() {
void fpga_reset_dspx_addr() { void fpga_reset_dspx_addr() {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe8); FPGA_TX_BYTE(FPGA_CMD_DSPRESETPTR);
FPGA_TX_BYTE(0x00); FPGA_TX_BYTE(0x00);
FPGA_TX_BYTE(0x00); FPGA_TX_BYTE(0x00);
FPGA_DESELECT(); FPGA_DESELECT();
@ -378,7 +354,7 @@ void fpga_reset_dspx_addr() {
void fpga_write_dspx_pgm(uint32_t data) { void fpga_write_dspx_pgm(uint32_t data) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xe9); FPGA_TX_BYTE(FPGA_CMD_DSPWRITEPGM);
FPGA_TX_BYTE((data>>16)&0xff); FPGA_TX_BYTE((data>>16)&0xff);
FPGA_TX_BYTE((data>>8)&0xff); FPGA_TX_BYTE((data>>8)&0xff);
FPGA_TX_BYTE((data)&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) { void fpga_write_dspx_dat(uint16_t data) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xea); FPGA_TX_BYTE(FPGA_CMD_DSPWRITEDAT);
FPGA_TX_BYTE((data>>8)&0xff); FPGA_TX_BYTE((data>>8)&0xff);
FPGA_TX_BYTE((data)&0xff); FPGA_TX_BYTE((data)&0xff);
FPGA_TX_BYTE(0x00); FPGA_TX_BYTE(0x00);
@ -399,7 +375,7 @@ void fpga_write_dspx_dat(uint16_t data) {
void fpga_dspx_reset(uint8_t reset) { void fpga_dspx_reset(uint8_t reset) {
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(reset ? 0xeb : 0xec); FPGA_TX_BYTE(reset ? FPGA_CMD_DSPRESET : FPGA_CMD_DSPUNRESET);
FPGA_TX_BYTE(0x00); FPGA_TX_BYTE(0x00);
FPGA_DESELECT(); FPGA_DESELECT();
} }
@ -407,7 +383,7 @@ void fpga_dspx_reset(uint8_t reset) {
void fpga_set_features(uint8_t feat) { void fpga_set_features(uint8_t feat) {
printf("set features: %02x\n", feat); printf("set features: %02x\n", feat);
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xed); FPGA_TX_BYTE(FPGA_CMD_SETFEATURE);
FPGA_TX_BYTE(feat); FPGA_TX_BYTE(feat);
FPGA_DESELECT(); FPGA_DESELECT();
} }
@ -415,7 +391,7 @@ void fpga_set_features(uint8_t feat) {
void fpga_set_213f(uint8_t data) { void fpga_set_213f(uint8_t data) {
printf("set 213f: %d\n", data); printf("set 213f: %d\n", data);
FPGA_SELECT(); FPGA_SELECT();
FPGA_TX_BYTE(0xee); FPGA_TX_BYTE(FPGA_CMD_SET213F);
FPGA_TX_BYTE(data); FPGA_TX_BYTE(data);
FPGA_DESELECT(); FPGA_DESELECT();
} }

View File

@ -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) #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); void fpga_spi_init(void);
uint8_t fpga_test(void); uint8_t fpga_test(void);
uint16_t fpga_status(void); uint16_t fpga_status(void);
@ -65,7 +103,6 @@ void spi_sd(void);
void spi_none(void); void spi_none(void);
void set_mcu_addr(uint32_t); void set_mcu_addr(uint32_t);
void set_dac_addr(uint16_t); void set_dac_addr(uint16_t);
void set_dac_vol(uint8_t);
void dac_play(void); void dac_play(void);
void dac_pause(void); void dac_pause(void);
void dac_reset(void); void dac_reset(void);
@ -77,7 +114,6 @@ void set_rom_mask(uint32_t);
void set_mapper(uint8_t val); void set_mapper(uint8_t val);
void fpga_sddma(uint8_t tgt, uint8_t partial); void fpga_sddma(uint8_t tgt, uint8_t partial);
void fpga_set_sddma_range(uint16_t start, uint16_t end); void fpga_set_sddma_range(uint16_t start, uint16_t end);
uint8_t get_msu_volume(void);
uint16_t get_msu_track(void); uint16_t get_msu_track(void);
uint32_t get_msu_offset(void); uint32_t get_msu_offset(void);
uint32_t get_snes_sysclk(void); uint32_t get_snes_sysclk(void);

View File

@ -161,7 +161,6 @@ int msu1_check(uint8_t* filename) {
int msu1_loop() { int msu1_loop() {
/* it is assumed that the MSU file is already opened by calling msu1_check(). */ /* it is assumed that the MSU file is already opened by calling msu1_check(). */
set_dac_vol(0x00);
while(fpga_status() & 0x4000); while(fpga_status() & 0x4000);
uint16_t dac_addr = 0; uint16_t dac_addr = 0;
uint16_t msu_addr = 0; uint16_t msu_addr = 0;