From 91f28e9f2be8dcd648f0c093a2f18bb2a8eb0e3f Mon Sep 17 00:00:00 2001 From: Johannes Wirth Date: Thu, 20 Jan 2022 18:22:21 +0100 Subject: [PATCH] Add allocate+free functionality for fpga --- fpga_spn/raven_spn | Bin 270888 -> 271712 bytes fpga_spn/src/dma_regs.h | 14 ++++++++++---- fpga_spn/src/raven_spn.cpp | 28 +++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/fpga_spn/raven_spn b/fpga_spn/raven_spn index 5ccb240f3cc99eb53f7346ea2428701aa1c253ea..25dcaf1272b8d5e6282def7cc7906afd1dc4bc01 100755 GIT binary patch delta 48524 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 diff --git a/fpga_spn/src/dma_regs.h b/fpga_spn/src/dma_regs.h index 302a839..6886f5e 100644 --- a/fpga_spn/src/dma_regs.h +++ b/fpga_spn/src/dma_regs.h @@ -9,8 +9,9 @@ #define DMA_REG_CLEAR_INTERRUPT 0x0C #define DMA_REG_FPGA_ADDRESS 0x10 #define DMA_REG_SC_ADDRESS 0x20 -#define DMA_REG_WRITE 0x30 +#define DMA_REG_OPERATION 0x30 // 0 = READ, 1 = WRITE, 2 = ALLOC, 3 = FREE #define DMA_REG_BYTES 0x40 +#define DMA_REG_ALLOC_ADDRESS 0x50 template class dma_regs { @@ -23,7 +24,7 @@ public: uint32_t r_address; - uint32_t r_write; + uint32_t r_operation; uint32_t r_bytes; @@ -43,14 +44,19 @@ public: return *reinterpret_cast(BASE_ADDR+DMA_REG_SC_ADDRESS); } - static inline uint32_t & write_reg(){ - return *reinterpret_cast(BASE_ADDR+DMA_REG_WRITE); + static inline uint32_t & operation_reg(){ + return *reinterpret_cast(BASE_ADDR+DMA_REG_OPERATION); } static inline uint32_t & bytes_reg(){ return *reinterpret_cast(BASE_ADDR+DMA_REG_BYTES); } + static inline uint32_t & alloc_address_reg(){ + return *reinterpret_cast(BASE_ADDR+DMA_REG_ALLOC_ADDRESS); + } + + }; #endif // _SPN_REGS_H_ diff --git a/fpga_spn/src/raven_spn.cpp b/fpga_spn/src/raven_spn.cpp index 1658e15..2fc58a7 100644 --- a/fpga_spn/src/raven_spn.cpp +++ b/fpga_spn/src/raven_spn.cpp @@ -20,7 +20,7 @@ void run_xspn(int in_addr, int out_addr, int num_samples, int in_beats, int out_ } void fpga_dma(int direction, int fpga_address, int sc_address, int num_bytes) { - dma::write_reg() = direction; + dma::operation_reg() = direction; dma::fpga_address_reg() = fpga_address; dma::sc_address_reg() = sc_address; dma::bytes_reg() = num_bytes; @@ -29,6 +29,23 @@ void fpga_dma(int direction, int fpga_address, int sc_address, int num_bytes) { dma::clear_interrupt_reg() = 1; } +int fpga_alloc(int num_bytes) { + dma::operation_reg() = 2; + dma::bytes_reg() = num_bytes; + dma::start_reg() = 1; + wait_for_dma_interrupt(); + dma::clear_interrupt_reg() = 1; + return dma::alloc_address_reg(); +} + +void fpga_free(int address) { + dma::operation_reg() = 3; + dma::fpga_address_reg() = address; + dma::start_reg() = 1; + wait_for_dma_interrupt(); + dma::clear_interrupt_reg() = 1; +} + static void spn_interrupt_handler(){ printf("spn_interrupt_handler\n"); hw_interrupt = false; @@ -49,6 +66,8 @@ int main() { configure_irq(2, spn_interrupt_handler); configure_irq(22, dma_interrupt_handler); + + spn::mode_reg() = 1; spn::start_reg() = 1; wait_for_spn_interrupt(); @@ -83,8 +102,8 @@ int main() { int in_addr = 0x20010000; // place input samples in the SPI memory int out_addr = 0x20210000; - int fpga_address_in = 0x10000000; - int fpga_address_out = 0x20000000; + int fpga_address_in = fpga_alloc(step * sample_bytes + 64); + int fpga_address_out = fpga_alloc(step * result_bytes + 64); // inject SPN input data spn_checker::input_addr_reg() = in_addr; @@ -107,5 +126,8 @@ int main() { in_addr += step * sample_bytes; // 5 bytes in each sample } + fpga_free(fpga_address_in); + fpga_free(fpga_address_out); + return 0; }