diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test-mkmif.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/tests/test-mkmif.c b/tests/test-mkmif.c new file mode 100644 index 0000000..0729628 --- /dev/null +++ b/tests/test-mkmif.c @@ -0,0 +1,149 @@ +/* + * Test Joachim's MKMIF core. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> +#include <assert.h> + +#include <sys/time.h> + +#include <hal.h> + +#define SCLK_DIV 0x00000020 + +typedef union { + uint8_t byte[4]; + uint32_t word; +} byteword_t; + +static hal_error_t sclk_test(const hal_core_t *core, const uint32_t divisor) +{ + uint32_t readback; + hal_error_t err; + + printf("Trying to adjust the clockspeed.\n"); + + if ((err = hal_mkmif_set_clockspeed(core, divisor)) != HAL_OK) { + printf("hal_mkmif_set_clockspeed: %s\n", hal_error_string(err)); + return err; + } + if ((err = hal_mkmif_get_clockspeed(core, &readback)) != HAL_OK) { + printf("hal_mkmif_get_clockspeed: %s\n", hal_error_string(err)); + return err; + } + if (readback != divisor) { + printf("expected %x, got %x\n", (unsigned int)divisor, (unsigned int)readback); + return HAL_ERROR_IO_UNEXPECTED; + } + return HAL_OK; +} + +static hal_error_t init_test(const hal_core_t *core) +{ + hal_error_t err; + + printf("Trying to init to the memory in continuous mode.\n"); + + if ((err = hal_mkmif_init(core)) != HAL_OK) { + printf("hal_mkmif_init: %s\n", hal_error_string(err)); + return err; + } + + return HAL_OK; +} + +static hal_error_t write_test(const hal_core_t *core) +{ + uint32_t write_data; + uint32_t write_address; + int i; + hal_error_t err; + + for (write_data = 0x01020304, write_address = 0, i = 0; + i < 0x10; + write_data += 0x01010101, write_address += 4, ++i) { + + printf("Trying to write 0x%08x to memory address 0x%08x.\n", + (unsigned int)write_data, (unsigned int)write_address); + + if ((err = hal_mkmif_write_word(core, write_address, write_data)) != HAL_OK) { + printf("hal_mkmif_write: %s\n", hal_error_string(err)); + return err; + } + } + + return HAL_OK; +} + +static hal_error_t read_test(const hal_core_t *core) +{ + uint32_t read_data; + uint32_t read_address; + int i; + hal_error_t err; + + for (read_address = 0, i = 0; + i < 0x10; + read_address += 4, ++i) { + + printf("Trying to read from memory address 0x%08x.\n", (unsigned int)read_address); + + if ((err = hal_mkmif_read_word(core, read_address, &read_data)) != HAL_OK) { + printf("hal_mkmif_read: %s\n", hal_error_string(err)); + return err; + } + printf("Data read: 0x%08x\n", (unsigned int)read_data); + } + + return HAL_OK; +} + +static hal_error_t write_read_test(const hal_core_t *core) +{ + uint32_t data; + uint32_t readback; + hal_error_t err; + + printf("Trying to write 0xdeadbeef to the memory and then read back.\n"); + + data = 0xdeadbeef; + + if ((err = hal_mkmif_write_word(core, 0x00000000, data)) != HAL_OK) { + printf("write error: %s\n", hal_error_string(err)); + return err; + } + + if ((err = hal_mkmif_read_word(core, 0x00000000, &readback)) != HAL_OK) { + printf("read error: %s\n", hal_error_string(err)); + return err; + } + + if (readback != data) { + printf("read %04x, expected %04x\n", (unsigned int)readback, (unsigned int)data); + return HAL_ERROR_IO_UNEXPECTED; + } + + return HAL_OK; +} + +int main(void) +{ + const hal_core_t *core = hal_core_find(MKMIF_NAME, NULL); + + if (core == NULL) { + printf("MKMIF core not present, not testing.\n"); + return HAL_ERROR_CORE_NOT_FOUND; + } + + hal_io_set_debug(1); + + return + sclk_test(core, SCLK_DIV) || + init_test(core) || + write_read_test(core) || + write_test(core) || + read_test(core); +} |