From d8b23614d7d171840ecfff86e685f2e2ffff30e5 Mon Sep 17 00:00:00 2001 From: optixx Date: Mon, 24 Aug 2009 22:13:59 +0200 Subject: [PATCH] refactor sram buffer copy functions --- avr/usbload/crc.c | 2 +- avr/usbload/main.c | 8 +++++++- avr/usbload/shared_memory.c | 31 ++++++++++++++++++------------- avr/usbload/sram.c | 8 ++++---- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/avr/usbload/crc.c b/avr/usbload/crc.c index 19b37a7..bbd1b6f 100644 --- a/avr/usbload/crc.c +++ b/avr/usbload/crc.c @@ -97,7 +97,7 @@ uint16_t crc_check_memory_range(uint32_t start_addr, uint32_t size,uint8_t *buff uint16_t crc = 0; uint32_t addr; for (addr = start_addr; addr < start_addr + size; addr += TRANSFER_BUFFER_SIZE) { - sram_bulk_read_buffer(addr, buffer, TRANSFER_BUFFER_SIZE); + sram_bulk_copy_into_buffer(addr, buffer, TRANSFER_BUFFER_SIZE); crc = do_crc_update(crc, buffer, TRANSFER_BUFFER_SIZE); } return crc; diff --git a/avr/usbload/main.c b/avr/usbload/main.c index e319c22..ef1f9bc 100644 --- a/avr/usbload/main.c +++ b/avr/usbload/main.c @@ -51,7 +51,7 @@ extern const char _rom[] PROGMEM; extern FILE uart_stdout; -uint8_t debug_level = (DEBUG | DEBUG_USB | DEBUG_CRC); +uint8_t debug_level = (DEBUG | DEBUG_USB | DEBUG_CRC | DEBUG_SHM); uint8_t read_buffer[TRANSFER_BUFFER_SIZE]; uint32_t req_addr = 0; @@ -353,7 +353,13 @@ int main(void) while (req_state != REQ_STATUS_SNES) { usbPoll(); } + + shared_memory_write(SHARED_MEM_TX_CMD_TERMINATE, 0); + + shared_memory_scratchpad_region_tx_restore(); + shared_memory_scratchpad_region_rx_restore(); + info("USB poll done\n"); set_rom_mode(); snes_wr_disable(); diff --git a/avr/usbload/shared_memory.c b/avr/usbload/shared_memory.c index 7a90ec2..b6c67f6 100644 --- a/avr/usbload/shared_memory.c +++ b/avr/usbload/shared_memory.c @@ -47,11 +47,11 @@ uint8_t scratchpad_locked_tx = 1; uint8_t shared_memory_scratchpad_region_save_helper(uint32_t addr){ - if(addr > (SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE )){ + if(addr > (SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE ) && scratchpad_locked_tx){ shared_memory_scratchpad_region_tx_save(); return 0; } - if(addr > (SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE )){ + if(addr > (SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE ) && scratchpad_locked_rx){ shared_memory_scratchpad_region_rx_save(); return 0; } @@ -62,28 +62,33 @@ uint8_t shared_memory_scratchpad_region_save_helper(uint32_t addr){ void shared_memory_scratchpad_region_tx_save() { debug(DEBUG_SHM,"shared_memory_scratchpad_region_tx_save: unlock\n"); - sram_bulk_read_buffer(SHARED_MEM_TX_LOC_STATE,scratchpad_region_tx,SHARED_MEM_TX_LOC_SIZE); + sram_bulk_copy_into_buffer(SHARED_MEM_TX_LOC_STATE,scratchpad_region_tx,SHARED_MEM_TX_LOC_SIZE); scratchpad_locked_tx = 0; } -void shared_memory_scratchpad_region_tx_restore() -{ - debug(DEBUG_SHM,"shared_memory_scratchpad_region_tx_restore: lock\n"); - sram_bulk_copy(SHARED_MEM_TX_LOC_STATE,scratchpad_region_tx,SHARED_MEM_TX_LOC_SIZE); - scratchpad_locked_tx = 1; -} - void shared_memory_scratchpad_region_rx_save() { debug(DEBUG_SHM,"shared_memory_scratchpad_region_rx_save: unlock\n"); - sram_bulk_read_buffer(SHARED_MEM_RX_LOC_STATE,scratchpad_region_rx,SHARED_MEM_RX_LOC_SIZE); + sram_bulk_copy_into_buffer(SHARED_MEM_RX_LOC_STATE,scratchpad_region_rx,SHARED_MEM_RX_LOC_SIZE); scratchpad_locked_rx = 0; } +void shared_memory_scratchpad_region_tx_restore() +{ + if (scratchpad_locked_tx) + return; + debug(DEBUG_SHM,"shared_memory_scratchpad_region_tx_restore: lock\n"); + sram_bulk_copy_from_buffer(SHARED_MEM_TX_LOC_STATE,scratchpad_region_tx,SHARED_MEM_TX_LOC_SIZE); + scratchpad_locked_tx = 1; +} + + void shared_memory_scratchpad_region_rx_restore() { + if (scratchpad_locked_rx) + return; debug(DEBUG_SHM,"shared_memory_scratchpad_region_tx_save: lock\n"); - sram_bulk_copy(SHARED_MEM_RX_LOC_STATE,scratchpad_region_rx,SHARED_MEM_RX_LOC_SIZE); + sram_bulk_copy_from_buffer(SHARED_MEM_RX_LOC_STATE,scratchpad_region_rx,SHARED_MEM_RX_LOC_SIZE); scratchpad_locked_rx = 1; } @@ -193,7 +198,7 @@ int shared_memory_read(uint8_t *cmd, uint8_t *len,uint8_t *buffer) debug(DEBUG_SHM,"shared_memory_read: 0x%04x=0x%02x 0x%04x=0x%02x \n", SHARED_MEM_RX_LOC_CMD, *cmd, SHARED_MEM_RX_LOC_LEN, *len); - sram_bulk_read_buffer(SHARED_MEM_RX_LOC_PAYLOAD,buffer, *len); + sram_bulk_copy_into_buffer(SHARED_MEM_RX_LOC_PAYLOAD,buffer, *len); sram_write(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_RX_AVR_RTS); snes_hirom(); diff --git a/avr/usbload/sram.c b/avr/usbload/sram.c index 14ae271..234296e 100644 --- a/avr/usbload/sram.c +++ b/avr/usbload/sram.c @@ -284,12 +284,12 @@ void sram_write(uint32_t addr, uint8_t data) } -void sram_bulk_copy(uint32_t addr, uint8_t * src, uint32_t len) +void sram_bulk_copy_from_buffer(uint32_t addr, uint8_t * src, uint32_t len) { uint32_t i; uint8_t *ptr = src; - debug(DEBUG_SRAM,"sram_copy: addr=0x%08lx src=0x%p len=%li\n\r", addr,src,len); + debug(DEBUG_SRAM,"sram_bulk_copy_from_buffer: addr=0x%08lx src=0x%p len=%li\n\r", addr,src,len); sram_bulk_write_start(addr); for (i = addr; i < (addr + len); i++){ sram_bulk_write(*ptr++); @@ -298,12 +298,12 @@ void sram_bulk_copy(uint32_t addr, uint8_t * src, uint32_t len) sram_bulk_write_end(); } -void sram_bulk_read_buffer(uint32_t addr, uint8_t * dst, uint32_t len) +void sram_bulk_copy_into_buffer(uint32_t addr, uint8_t * dst, uint32_t len) { uint32_t i; uint8_t *ptr = dst; - debug(DEBUG_SRAM,"sram_bulk_read_buffer: addr=0x%08lx dst=0x%p len=%li\n\r", addr,dst,len); + debug(DEBUG_SRAM,"sram_bulk_copy_into_buffer: addr=0x%08lx dst=0x%p len=%li\n\r", addr,dst,len); sram_bulk_read_start(addr); for (i = addr; i < (addr + len); i++) { *ptr = sram_bulk_read();