fpga_spn: use separate reset for DMA
This commit is contained in:
		
										
											Binary file not shown.
										
									
								
							| @@ -13,6 +13,7 @@ typedef void (*function_ptr_t) (void); | ||||
| plic_instance_t g_plic; | ||||
| std::array<function_ptr_t,PLIC_NUM_INTERRUPTS>  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 | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user
	 Johannes Wirth
					Johannes Wirth