forked from Firmware/Firmwares
		
	Add allocate+free functionality for fpga
This commit is contained in:
		
										
											Binary file not shown.
										
									
								
							@@ -9,8 +9,9 @@
 | 
				
			|||||||
#define DMA_REG_CLEAR_INTERRUPT     0x0C
 | 
					#define DMA_REG_CLEAR_INTERRUPT     0x0C
 | 
				
			||||||
#define DMA_REG_FPGA_ADDRESS        0x10
 | 
					#define DMA_REG_FPGA_ADDRESS        0x10
 | 
				
			||||||
#define DMA_REG_SC_ADDRESS          0x20
 | 
					#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_BYTES               0x40
 | 
				
			||||||
 | 
					#define DMA_REG_ALLOC_ADDRESS       0x50
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<uint32_t BASE_ADDR>
 | 
					template<uint32_t BASE_ADDR>
 | 
				
			||||||
class dma_regs {
 | 
					class dma_regs {
 | 
				
			||||||
@@ -23,7 +24,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    uint32_t r_address;
 | 
					    uint32_t r_address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint32_t r_write;
 | 
					    uint32_t r_operation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint32_t r_bytes;
 | 
					    uint32_t r_bytes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -43,14 +44,19 @@ public:
 | 
				
			|||||||
        return *reinterpret_cast<uint32_t*>(BASE_ADDR+DMA_REG_SC_ADDRESS);
 | 
					        return *reinterpret_cast<uint32_t*>(BASE_ADDR+DMA_REG_SC_ADDRESS);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static inline uint32_t & write_reg(){
 | 
					    static inline uint32_t & operation_reg(){
 | 
				
			||||||
        return *reinterpret_cast<uint32_t*>(BASE_ADDR+DMA_REG_WRITE);
 | 
					        return *reinterpret_cast<uint32_t*>(BASE_ADDR+DMA_REG_OPERATION);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static inline uint32_t & bytes_reg(){
 | 
					    static inline uint32_t & bytes_reg(){
 | 
				
			||||||
        return *reinterpret_cast<uint32_t*>(BASE_ADDR+DMA_REG_BYTES);
 | 
					        return *reinterpret_cast<uint32_t*>(BASE_ADDR+DMA_REG_BYTES);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static inline uint32_t & alloc_address_reg(){
 | 
				
			||||||
 | 
					        return *reinterpret_cast<uint32_t*>(BASE_ADDR+DMA_REG_ALLOC_ADDRESS);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // _SPN_REGS_H_
 | 
					#endif // _SPN_REGS_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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) {
 | 
					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::fpga_address_reg() = fpga_address;
 | 
				
			||||||
    dma::sc_address_reg() = sc_address;
 | 
					    dma::sc_address_reg() = sc_address;
 | 
				
			||||||
    dma::bytes_reg() = num_bytes;
 | 
					    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;
 | 
					    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(){
 | 
					static void spn_interrupt_handler(){
 | 
				
			||||||
    printf("spn_interrupt_handler\n");
 | 
					    printf("spn_interrupt_handler\n");
 | 
				
			||||||
    hw_interrupt = false;
 | 
					    hw_interrupt = false;
 | 
				
			||||||
@@ -49,6 +66,8 @@ int main() {
 | 
				
			|||||||
    configure_irq(2, spn_interrupt_handler);
 | 
					    configure_irq(2, spn_interrupt_handler);
 | 
				
			||||||
    configure_irq(22, dma_interrupt_handler);
 | 
					    configure_irq(22, dma_interrupt_handler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    spn::mode_reg() = 1;
 | 
					    spn::mode_reg() = 1;
 | 
				
			||||||
    spn::start_reg() = 1;
 | 
					    spn::start_reg() = 1;
 | 
				
			||||||
    wait_for_spn_interrupt();
 | 
					    wait_for_spn_interrupt();
 | 
				
			||||||
@@ -83,8 +102,8 @@ int main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	int in_addr  = 0x20010000; // place input samples in the SPI memory
 | 
						int in_addr  = 0x20010000; // place input samples in the SPI memory
 | 
				
			||||||
    int out_addr = 0x20210000;
 | 
					    int out_addr = 0x20210000;
 | 
				
			||||||
    int fpga_address_in = 0x10000000;
 | 
					    int fpga_address_in = fpga_alloc(step * sample_bytes + 64);
 | 
				
			||||||
    int fpga_address_out = 0x20000000;
 | 
					    int fpga_address_out = fpga_alloc(step * result_bytes + 64);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // inject SPN input data
 | 
					    // inject SPN input data
 | 
				
			||||||
    spn_checker::input_addr_reg() = in_addr;
 | 
					    spn_checker::input_addr_reg() = in_addr;
 | 
				
			||||||
@@ -107,5 +126,8 @@ int main() {
 | 
				
			|||||||
		in_addr += step * sample_bytes; // 5 bytes in each sample
 | 
							in_addr += step * sample_bytes; // 5 bytes in each sample
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fpga_free(fpga_address_in);
 | 
				
			||||||
 | 
					    fpga_free(fpga_address_out);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user