//------------------------------------------------------------------------------ // main.c //------------------------------------------------------------------------------ /* This requires a special bitstream with a special test register. See core/platform/alpha/rtl/alpha_fmc_test.v: //---------------------------------------------------------------- // Dummy Register // // General-purpose register to test FMC interface using STM32 // demo program instead of core selector logic. // // This register is a bit tricky, but it allows testing of both // data and address buses. Reading from FPGA will always return // value, which is currently stored in the test register, // regardless of read transaction address. Writing to FPGA has // two variants: a) writing to address 0 will store output data // data value in the test register, b) writing to any non-zero // address will store _address_ of write transaction in the test // register. // // To test data bus, write some different patterns to address 0, // then readback from any address and compare. // // To test address bus, write anything to some different non-zero // addresses, then readback from any address and compare returned // value with previously written address. // //---------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "stm-init.h" #include "stm-led.h" #include "stm-fmc.h" #include "stm-uart.h" #include "stm-fpgacfg.h" //------------------------------------------------------------------------------ // Defines //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Macros //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Variables //------------------------------------------------------------------------------ RNG_HandleTypeDef rng_inst; // FT: "I changed some interesting-to-look-at-in-the-debugger values to be // volatile, so that my compiler wouldn't optimize/obscure them." volatile uint32_t data_diff = 0; volatile uint32_t addr_diff = 0; //------------------------------------------------------------------------------ // Prototypes //------------------------------------------------------------------------------ /* XXX move this to stm-rng.[ch] */ static void MX_RNG_Init(void); int test_fpga_data_bus(void); int test_fpga_address_bus(void); //------------------------------------------------------------------------------ // Defines //------------------------------------------------------------------------------ #define TEST_NUM_ROUNDS 100000 #define VERBOSE 0 //------------------------------------------------------------------------------ int main(void) //------------------------------------------------------------------------------ { int i; stm_init(); uart_send_string("Keep calm for FPGA bitstream loading...\r\n"); // Blink blue LED until the FPGA reports it has loaded its bitstream led_on(LED_BLUE); while (! fpgacfg_check_done()) { for (i = 0; i < 4; i++) { HAL_Delay(500); led_toggle(LED_BLUE); } } // initialize rng MX_RNG_Init(); // turn on green led, turn off other leds led_on(LED_GREEN); led_off(LED_YELLOW); led_off(LED_RED); led_off(LED_BLUE); // vars volatile int data_test_ok = 0, addr_test_ok = 0, successful_runs = 0, failed_runs = 0, sleep = 0; // main loop (test, until an error is detected) while (1) { // test data bus data_test_ok = test_fpga_data_bus(); // test address bus addr_test_ok = test_fpga_address_bus(); if (VERBOSE || (data_test_ok != TEST_NUM_ROUNDS || addr_test_ok != TEST_NUM_ROUNDS)) { uart_send_string("Data: "); uart_send_integer(data_test_ok, 6); uart_send_string(", addr: "); uart_send_integer(addr_test_ok, 6); uart_send_string("\r\n"); } if (data_test_ok == TEST_NUM_ROUNDS && addr_test_ok == TEST_NUM_ROUNDS) { // toggle yellow led to indicate, that we are alive led_toggle(LED_YELLOW); successful_runs++; sleep = 0; } else { led_on(LED_RED); failed_runs++; sleep = 2000; } uart_send_string("Success "); uart_send_integer(successful_runs, 1); uart_send_string(", fail "); uart_send_integer(failed_runs, 1); uart_send_string("\r\n"); if (VERBOSE) uart_send_string("\r\n"); HAL_Delay(sleep); } // should never reach this line } //------------------------------------------------------------------------------ int test_fpga_data_bus(void) //------------------------------------------------------------------------------ { int c; uint32_t rnd, buf; HAL_StatusTypeDef hal_result; // run some rounds of data bus test for (c=0; c