123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- /*
- * =====================================================================================
- *
- * ________ .__ __ ________ ____ ________
- * \_____ \ __ __|__| ____ | | __\______ \ _______ _/_ |/ _____/
- * / / \ \| | \ |/ ___\| |/ / | | \_/ __ \ \/ /| / __ \
- * / \_/. \ | / \ \___| < | ` \ ___/\ / | \ |__\ \
- * \_____\ \_/____/|__|\___ >__|_ \/_______ /\___ >\_/ |___|\_____ /
- * \__> \/ \/ \/ \/ \/
- *
- * www.optixx.org
- *
- *
- * Version: 1.0
- * Created: 07/21/2009 03:32:16 PM
- * Author: david@optixx.org
- *
- * =====================================================================================
- */
- #include <stdlib.h>
- #include <stdint.h>
- #include <util/delay.h>
- #include "shared_memory.h"
- #include "config.h"
- #include "sram.h"
- #include "debug.h"
- #include "dump.h"
- #include "info.h"
- #include "crc.h"
- uint8_t irq_addr_lo;
- uint8_t irq_addr_hi;
- uint8_t scratchpad_state;
- uint8_t scratchpad_cmd;
- uint8_t scratchpad_payload;
- uint8_t scratchpad_region_rx[SHARED_MEM_RX_LOC_SIZE];
- uint8_t scratchpad_region_tx[SHARED_MEM_TX_LOC_SIZE];
- uint8_t scratchpad_locked_rx = 1;
- uint8_t scratchpad_locked_tx = 1;
- void shared_memory_init(void)
- {
- scratchpad_locked_rx = 1;
- scratchpad_locked_tx = 1;
- }
- uint8_t shared_memory_scratchpad_region_save_helper(uint32_t addr)
- {
- #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) {
- 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_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
- 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);
- 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()
- {
- 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_rx_save: crc=%x\n"), crc);
- #endif
- 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);
- 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_rx);
- dump_memory(SHARED_MEM_RX_LOC_STATE,
- SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE);
- #endif
- sram_bulk_addr_restore();
- }
- 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_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_restore: crc=%x\n"), crc);
- #endif
- }
- void shared_memory_scratchpad_region_rx_restore()
- {
- if (scratchpad_locked_rx)
- return;
- 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
- 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_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_rx_restore: crc=%x\n"), crc);
- #endif
- }
- void shared_memory_scratchpad_tx_save()
- {
- scratchpad_state = sram_read(SHARED_MEM_TX_LOC_STATE);
- scratchpad_cmd = sram_read(SHARED_MEM_TX_LOC_CMD);
- scratchpad_payload = sram_read(SHARED_MEM_TX_LOC_PAYLOAD);
- }
- void shared_memory_scratchpad_tx_restore()
- {
- sram_write(SHARED_MEM_TX_LOC_STATE, scratchpad_state);
- sram_write(SHARED_MEM_TX_LOC_CMD, scratchpad_cmd);
- sram_write(SHARED_MEM_TX_LOC_PAYLOAD, scratchpad_payload);
- }
- void shared_memory_irq_hook()
- {
- irq_addr_lo = sram_read(SHARED_IRQ_LOC_LO);
- irq_addr_hi = sram_read(SHARED_IRQ_LOC_HI);
- sram_write(SHARED_IRQ_HANDLER_LO, 0);
- sram_write(SHARED_IRQ_HANDLER_HI, 0);
- }
- void shared_memory_irq_restore()
- {
- sram_write(SHARED_IRQ_LOC_LO, irq_addr_lo);
- sram_write(SHARED_IRQ_LOC_HI, irq_addr_hi);
- }
- 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;
- }
- #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);
- sram_bulk_addr_save();
- #if (DO_SHM_SCRATCHPAD==0)
- shared_memory_scratchpad_tx_save();
- #endif
- #if SHARED_MEM_SWITCH_IRQ
- shared_memory_irq_hook();
- #endif
- sram_write(SHARED_MEM_TX_LOC_STATE, SHARED_MEM_TX_SNES_ACK);
- sram_write(SHARED_MEM_TX_LOC_CMD, cmd);
- sram_write(SHARED_MEM_TX_LOC_PAYLOAD, value);
- snes_hirom();
- snes_wr_disable();
- snes_bus_active();
- #if SHARED_MEM_SWITCH_IRQ
- snes_irq_on();
- snes_irq_lo();
- _delay_us(20);
- snes_irq_hi();
- snes_irq_off();
- #else
- _delay_ms(SHARED_MEM_SWITCH_DELAY);
- #endif
- avr_bus_active();
- snes_irq_lo();
- snes_irq_off();
- snes_lorom();
- snes_wr_disable();
- #if (DO_SHM_SCRATCHPAD==0)
- shared_memory_scratchpad_tx_restore();
- #endif
- #if SHARED_MEM_SWITCH_IRQ
- shared_memory_irq_restore();
- #endif
- sram_bulk_addr_restore();
- #endif
- }
- void shared_memory_yield()
- {
- snes_hirom();
- snes_wr_disable();
- snes_bus_active();
- _delay_ms(SHARED_MEM_SWITCH_DELAY);
- avr_bus_active();
- snes_lorom();
- snes_wr_disable();
- }
- 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);
- if (state != SHARED_MEM_RX_AVR_ACK) {
- sram_bulk_addr_restore();
- return 1;
- }
- *cmd = sram_read(SHARED_MEM_RX_LOC_CMD);
- *len = sram_read(SHARED_MEM_RX_LOC_LEN);
- debug_P(DEBUG_SHM,
- PSTR("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_copy_into_buffer(SHARED_MEM_RX_LOC_PAYLOAD, buffer, *len);
- sram_write(SHARED_MEM_RX_LOC_STATE, SHARED_MEM_RX_AVR_RTS);
- snes_hirom();
- snes_wr_disable();
- snes_bus_active();
- #if SHARED_MEM_SWITCH_IRQ
- snes_irq_on();
- snes_irq_lo();
- _delay_us(20);
- snes_irq_hi();
- snes_irq_off();
- #else
- _delay_ms(SHARED_MEM_SWITCH_DELAY);
- #endif
- avr_bus_active();
- snes_lorom();
- snes_wr_disable();
- sram_bulk_addr_restore();
- #endif
- return 0;
- }
|