diff --git a/avr/usbload/Makefile b/avr/usbload/Makefile index 09ac036..e882406 100644 --- a/avr/usbload/Makefile +++ b/avr/usbload/Makefile @@ -28,15 +28,15 @@ SIZE = avr-size ifeq ($(DEBUG),1) - LDFLAGS = -Wl,-u,vfprintf -lprintf_flt - CFLAGS = -Iusbdrv -I. -DDEBUG_LEVEL=0 + LDFLAGS =-Wl,-u,vfprintf -lprintf_flt + CFLAGS =-Iusbdrv -I. -DDEBUG_LEVEL=0 OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o \ main.o usb_bulk.o uart.o fifo.o sram.o crc.o debug.o \ dump.o timer.o watchdog.o rle.c loader.o info.o shared_memory.o \ irq.o command.o testing.o else - LDFLAGS = -Wl,-u - CFLAGS = -Iusbdrv -I. -DDEBUG_LEVEL=0 -DNO_DEBUG -DNO_INFO + LDFLAGS =-Wl,-u + CFLAGS =-Iusbdrv -I. -DDEBUG_LEVEL=0 -DNO_DEBUG -DNO_INFO OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o usb_bulk.o \ uart.o fifo.o sram.o crc.o debug.o dump.o timer.o watchdog.o rle.c loader.o \ info.o shared_memory.o command.o irq.o diff --git a/avr/usbload/config.h b/avr/usbload/config.h index 2c9f7be..2a92a73 100644 --- a/avr/usbload/config.h +++ b/avr/usbload/config.h @@ -47,6 +47,9 @@ #define HW_VERSION "2.6" #define SW_VERSION "1.0" +#define DO_CRC_CHECK_LOADER 0 #define DO_CRC_CHECK 1 +#define DO_SHM_SCRATCHPAD 1 +#define DO_SHM 1 #endif diff --git a/avr/usbload/crc.c b/avr/usbload/crc.c index 87cc25e..bfdc7cc 100644 --- a/avr/usbload/crc.c +++ b/avr/usbload/crc.c @@ -75,7 +75,7 @@ uint16_t crc_check_bulk_memory(uint32_t bottom_addr, uint32_t top_addr, uint32_t bottom_addr,top_addr); for (addr = bottom_addr; addr < top_addr; addr++) { - if (addr && addr % bank_size == 0) { + if (addr && ((addr % bank_size) == 0)) { debug_P(DEBUG_CRC, PSTR("crc_check_bulk_memory: bank=0x%02x addr=0x%08lx crc=0x%04x\n"), req_bank,addr,crc); req_bank++; diff --git a/avr/usbload/main.c b/avr/usbload/main.c index f00fa9b..b75e096 100644 --- a/avr/usbload/main.c +++ b/avr/usbload/main.c @@ -113,6 +113,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) req_addr = req_addr | rq->wIndex.word; rx_remaining = rq->wLength.word; + if (req_addr && req_addr % req_bank_size == 0) { #ifdef FLT_DEBUG @@ -149,7 +150,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) req_percent_last = req_percent; shared_memory_scratchpad_region_save_helper(req_addr); - + if (req_addr && (req_addr % req_bank_size) == 0) { #ifdef FLT_DEBUG debug_P(DEBUG_USB, @@ -278,7 +279,7 @@ void boot_startup_rom(uint16_t init_delay) rle_decode(&_rom, ROM_BUFFER_SIZE, 0x000000); info_P(PSTR("\n")); -#if DO_CRC_CHECK +#if DO_CRC_CHECK_LOADER dump_memory(0x010000 - 0x100, 0x010000); uint16_t crc; crc = crc_check_bulk_memory((uint32_t)0x000000,0x010000, 0x010000); @@ -351,7 +352,8 @@ int main(void) shared_memory_write(SHARED_MEM_TX_CMD_TERMINATE, 0); -#if 0 + +#if DO_SHM_SCRATCHPAD shared_memory_scratchpad_region_tx_restore(); shared_memory_scratchpad_region_rx_restore(); #endif diff --git a/avr/usbload/shared_memory.c b/avr/usbload/shared_memory.c index 9a97057..68b3796 100644 --- a/avr/usbload/shared_memory.c +++ b/avr/usbload/shared_memory.c @@ -56,66 +56,81 @@ void shared_memory_init(void){ uint8_t shared_memory_scratchpad_region_save_helper(uint32_t addr){ - - if(addr > (SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE) && scratchpad_locked_tx){ + + + +#if DO_SHM_SCRATCHPAD + if(addr > (SHARED_MEM_TX_LOC_STATE + (SHARED_MEM_TX_LOC_SIZE )) && scratchpad_locked_tx){ debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_save_helper: open tx addr=0x%06lx\n"),addr); shared_memory_scratchpad_region_tx_save(); return 0; } - if(addr > (SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE) && scratchpad_locked_rx){ + if(addr > (SHARED_MEM_RX_LOC_STATE + ( SHARED_MEM_RX_LOC_SIZE )) && scratchpad_locked_rx){ debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_save_helper: open rx addr=0x%06lx\n"),addr); shared_memory_scratchpad_region_rx_save(); return 0; } +#endif return 1; } void shared_memory_scratchpad_region_tx_save() { + sram_bulk_addr_save(); -#if SHARED_SCRATCHPAD_DUMP +#if SHARED_SCRATCHPAD_CRC uint16_t crc; crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_TX_LOC_STATE, (uint32_t)(SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE), 0x8000); debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_save: crc=%x\n"),crc); + #endif - sram_bulk_addr_save(); debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_save: unlock\n")); sram_bulk_copy_into_buffer((uint32_t)SHARED_MEM_TX_LOC_STATE,scratchpad_region_tx, (uint32_t)SHARED_MEM_TX_LOC_SIZE); - sram_bulk_addr_restore(); scratchpad_locked_tx = 0; +#if SHARED_SCRATCHPAD_CRC + do_crc_update(0, scratchpad_region_tx,SHARED_MEM_TX_LOC_SIZE); + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_save: crc=%x\n"),crc); +#endif + #if SHARED_SCRATCHPAD_DUMP dump_packet(SHARED_MEM_TX_LOC_STATE, SHARED_MEM_TX_LOC_SIZE, scratchpad_region_tx); dump_memory(SHARED_MEM_TX_LOC_STATE, SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE); #endif + sram_bulk_addr_restore(); } void shared_memory_scratchpad_region_rx_save() { -#if SHARED_SCRATCHPAD_DUMP + sram_bulk_addr_save(); +#if SHARED_SCRATCHPAD_CRC uint16_t crc; crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_RX_LOC_STATE, (uint32_t)(SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE), 0x8000); - debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_save: crc=%x\n"),crc); + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_rx_save: crc=%x\n"),crc); #endif - sram_bulk_addr_save(); debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_rx_save: unlock\n")); sram_bulk_copy_into_buffer((uint32_t)SHARED_MEM_RX_LOC_STATE,scratchpad_region_rx, (uint32_t)SHARED_MEM_RX_LOC_SIZE); - sram_bulk_addr_restore(); scratchpad_locked_rx = 0; +#if SHARED_SCRATCHPAD_CRC + do_crc_update(0, scratchpad_region_rx,SHARED_MEM_RX_LOC_SIZE); + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_rx_save: crc=%x\n"),crc); +#endif + #if SHARED_SCRATCHPAD_DUMP - dump_packet(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_RX_LOC_SIZE, scratchpad_region_tx); + dump_packet(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_RX_LOC_SIZE, scratchpad_region_rx); dump_memory(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE); #endif + sram_bulk_addr_restore(); } @@ -123,18 +138,25 @@ void shared_memory_scratchpad_region_tx_restore() { if (scratchpad_locked_tx) return; - debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_restore: lock\n")); + +#if SHARED_SCRATCHPAD_DUMP + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_restore: memory\n")); + dump_memory(SHARED_MEM_TX_LOC_STATE, SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE); +#endif + sram_bulk_copy_from_buffer((uint32_t)SHARED_MEM_TX_LOC_STATE,scratchpad_region_tx, (uint32_t)SHARED_MEM_TX_LOC_SIZE); scratchpad_locked_tx = 1; #if SHARED_SCRATCHPAD_DUMP + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_restore: buffer\n")); dump_packet(SHARED_MEM_TX_LOC_STATE, SHARED_MEM_TX_LOC_SIZE, scratchpad_region_tx); + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_restore: memory\n")); dump_memory(SHARED_MEM_TX_LOC_STATE, SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE); #endif -#if SHARED_SCRATCHPAD_DUMP +#if SHARED_SCRATCHPAD_CRC uint16_t crc; crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_TX_LOC_STATE, (uint32_t)(SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE), 0x8000); @@ -147,17 +169,26 @@ void shared_memory_scratchpad_region_rx_restore() { if (scratchpad_locked_rx) return; - debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_tx_save: lock\n")); + + + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_rx_restore: lock\n")); +#if SHARED_SCRATCHPAD_DUMP + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_rx_restore: memory\n")); + dump_memory(SHARED_MEM_RX_LOC_STATE - 0x10, SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE); +#endif + sram_bulk_copy_from_buffer((uint32_t)SHARED_MEM_RX_LOC_STATE,scratchpad_region_rx, (uint32_t)SHARED_MEM_RX_LOC_SIZE); scratchpad_locked_rx = 1; #if SHARED_SCRATCHPAD_DUMP - dump_packet(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_TX_LOC_SIZE, scratchpad_region_rx); - dump_memory(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_TX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE); + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_rx_restore: buffer\n")); + dump_packet(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_RX_LOC_SIZE, scratchpad_region_rx); + debug_P(DEBUG_SHM, PSTR("shared_memory_scratchpad_region_rx_restore: memory\n")); + dump_memory(SHARED_MEM_RX_LOC_STATE - 0x10, SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE); #endif -#if SHARED_SCRATCHPAD_DUMP +#if SHARED_SCRATCHPAD_CRC uint16_t crc; crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_RX_LOC_STATE, (uint32_t)(SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE), 0x8000); @@ -197,10 +228,13 @@ void shared_memory_irq_restore() void shared_memory_write(uint8_t cmd, uint8_t value) { +#if DO_SHM +#if DO_SHM_SCRATCHPAD if (scratchpad_locked_tx){ debug_P(DEBUG_SHM, PSTR("shared_memory_write: locked_tx\n")); //return 1; } +#endif debug_P(DEBUG_SHM, PSTR("shared_memory_write: 0x%04x=0x%02x 0x%04x=0x%02x \n"), SHARED_MEM_TX_LOC_CMD, cmd, SHARED_MEM_TX_LOC_PAYLOAD, value); @@ -235,7 +269,7 @@ void shared_memory_write(uint8_t cmd, uint8_t value) shared_memory_scratchpad_tx_restore(); shared_memory_irq_restore(); sram_bulk_addr_restore(); - +#endif } void shared_memory_yield() @@ -255,11 +289,13 @@ void shared_memory_yield() int shared_memory_read(uint8_t *cmd, uint8_t *len,uint8_t *buffer) { uint8_t state; - +#if DO_SHM +#if DO_SHM_SCRATCHPAD if (scratchpad_locked_rx){ debug_P(DEBUG_SHM, PSTR("shared_memory_write: locked_tx\n")); return 1; } +#endif sram_bulk_addr_save(); state = sram_read(SHARED_MEM_RX_LOC_STATE); @@ -294,5 +330,6 @@ int shared_memory_read(uint8_t *cmd, uint8_t *len,uint8_t *buffer) snes_lorom(); snes_wr_disable(); sram_bulk_addr_restore(); +#endif return 0; } diff --git a/avr/usbload/shared_memory.h b/avr/usbload/shared_memory.h index 0e1ba38..11dd9da 100644 --- a/avr/usbload/shared_memory.h +++ b/avr/usbload/shared_memory.h @@ -22,7 +22,7 @@ #define __SHARED_MEMORY_H__ -#define SHARED_MEM_SWITCH_IRQ 0 +#define SHARED_MEM_SWITCH_IRQ 1 #define SHARED_MEM_SWITCH_DELAY 20 #define SHARED_MEM_TX_SNES_ACK 0xa5 @@ -37,7 +37,7 @@ #define SHARED_MEM_TX_CMD_TERMINATE 0x06 #define SHARED_MEM_TX_LOC_STATE 0x000000 -#define SHARED_MEM_TX_LOC_SIZE 0x000100 +#define SHARED_MEM_TX_LOC_SIZE 0x000020 #define SHARED_MEM_TX_LOC_CMD 0x000001 #define SHARED_MEM_TX_LOC_PAYLOAD 0x000002 @@ -48,7 +48,7 @@ #define SHARED_MEM_RX_CMD_FILESEL 0x01 #define SHARED_MEM_RX_LOC_STATE 0x001000 -#define SHARED_MEM_RX_LOC_SIZE 0x000100 +#define SHARED_MEM_RX_LOC_SIZE 0x000020 #define SHARED_MEM_RX_LOC_CMD 0x001001 #define SHARED_MEM_RX_LOC_LEN 0x001002 #define SHARED_MEM_RX_LOC_PAYLOAD 0x001003 @@ -61,7 +61,8 @@ #define SHARED_IRQ_HANDLER_HI 0x0ffe5 #define SHARED_SCRATCHPAD_DUMP 0 - +#define SHARED_SCRATCHPAD_CRC 0 + void shared_memory_init(void); uint8_t shared_memory_scratchpad_region_save_helper(uint32_t addr); diff --git a/avr/usbload/sram.c b/avr/usbload/sram.c index afea2a7..5bd48ad 100644 --- a/avr/usbload/sram.c +++ b/avr/usbload/sram.c @@ -114,7 +114,7 @@ void sreg_set(uint32_t addr) } -inline void sram_bulk_addr_save() + void sram_bulk_addr_save() { addr_stash = addr_current; debug_P(DEBUG_SRAM, PSTR("sram_bulk_addr_save: addr=0x%08lx\n\r"), addr_stash); @@ -243,7 +243,7 @@ inline void sram_bulk_write_next(void) inline void sram_bulk_write( uint8_t data) { AVR_DATA_PORT = data; - } +} void sram_bulk_write_end(void) { @@ -294,8 +294,11 @@ void sram_bulk_copy_from_buffer(uint32_t addr, uint8_t * src, uint32_t len) addr, src, len); sram_bulk_write_start(addr); for (i = addr; i < (addr + len); i++){ - sram_bulk_write(*ptr++); - sram_bulk_write_next(); + sram_bulk_write(*ptr); +//hack + if ((i+1) < (addr + len)) + sram_bulk_write_next(); + ptr++; } sram_bulk_write_end(); } @@ -309,7 +312,7 @@ void sram_bulk_copy_into_buffer(uint32_t addr, uint8_t * dst, uint32_t len) addr, dst, len); sram_bulk_read_start(addr); for (i = addr; i < (addr + len); i++) { - *ptr = sram_bulk_read(); + dst[i] = sram_bulk_read(); sram_bulk_read_next(); ptr++; }