diff --git a/fpga_spn/raven_spn b/fpga_spn/raven_spn index 4cd2606..5ccb240 100755 Binary files a/fpga_spn/raven_spn and b/fpga_spn/raven_spn differ diff --git a/fpga_spn/src/init.h b/fpga_spn/src/init.h index 6eeba18..8515496 100644 --- a/fpga_spn/src/init.h +++ b/fpga_spn/src/init.h @@ -13,6 +13,7 @@ typedef void (*function_ptr_t) (void); plic_instance_t g_plic; std::array g_ext_interrupt_handlers; bool hw_interrupt{true}; +bool dma_interrupt{true}; /*! \brief external interrupt handler @@ -43,11 +44,7 @@ void configure_irq(size_t irq_num, function_ptr_t handler, unsigned char prio=1) PLIC_enable_interrupt(&g_plic, irq_num); } -static void msi_interrupt_handler(){ - hw_interrupt = false; -} - -void wait_for_interrupt() { +void wait_for_spn_interrupt() { // wait until HW is done if(hw_interrupt) { do{ @@ -58,6 +55,17 @@ void wait_for_interrupt() { hw_interrupt=true; } +void wait_for_dma_interrupt() { + // wait until HW is done + if(dma_interrupt) { + do{ + asm("wfi"); + asm("nop"); + }while(dma_interrupt); + } + dma_interrupt=true; +} + /*!\brief initializes platform * */ @@ -77,7 +85,6 @@ void platform_init(){ clear_csr(mie, MIP_MEIP); clear_csr(mie, MIP_MTIP); for (auto& h:g_ext_interrupt_handlers) h=no_interrupt_handler; - configure_irq(2, msi_interrupt_handler); // Enable interrupts in general. set_csr(mstatus, MSTATUS_MIE); // Enable the Machine-External bit in MIE diff --git a/fpga_spn/src/raven_spn.cpp b/fpga_spn/src/raven_spn.cpp index d0c9f9d..1658e15 100644 --- a/fpga_spn/src/raven_spn.cpp +++ b/fpga_spn/src/raven_spn.cpp @@ -25,10 +25,20 @@ void fpga_dma(int direction, int fpga_address, int sc_address, int num_bytes) { dma::sc_address_reg() = sc_address; dma::bytes_reg() = num_bytes; dma::start_reg() = 1; - wait_for_interrupt(); + wait_for_dma_interrupt(); dma::clear_interrupt_reg() = 1; } +static void spn_interrupt_handler(){ + printf("spn_interrupt_handler\n"); + hw_interrupt = false; +} + +static void dma_interrupt_handler(){ + printf("dma_interrupt_handler\n"); + dma_interrupt = false; +} + /*! \brief main function * */ @@ -36,10 +46,12 @@ int main() { platform_init(); + configure_irq(2, spn_interrupt_handler); + configure_irq(22, dma_interrupt_handler); spn::mode_reg() = 1; spn::start_reg() = 1; - wait_for_interrupt(); + wait_for_spn_interrupt(); spn::interrupt_reg() = 1; uint32_t readout = spn::readout_reg(); printf("READOUT HW:0x%x\n", readout); @@ -60,8 +72,8 @@ int main() { printf("Result Bytes: %d\n", result_bytes); - uint32_t step = 10000; - uint32_t iterations = 5; + uint32_t step = 50000; + uint32_t iterations = 2; uint32_t in_beats = (step * sample_bytes) / axi_bytes; @@ -84,7 +96,7 @@ int main() { for (int k = 0; k < iterations*step; k+=step) { fpga_dma(1, fpga_address_in, in_addr, step * sample_bytes); run_xspn(fpga_address_in, fpga_address_out, step, in_beats, out_beats); - wait_for_interrupt(); + wait_for_spn_interrupt(); spn::interrupt_reg() = 1; printf("XSPN finished\n"); fpga_dma(0, fpga_address_out, out_addr, step * result_bytes); diff --git a/raven_spn/raven_spn b/raven_spn/raven_spn index f05de60..aac31fe 100755 Binary files a/raven_spn/raven_spn and b/raven_spn/raven_spn differ