aboutsummaryrefslogblamecommitdiff
path: root/tests/test-mkmif.c
blob: 364557719c9792cc654970f6ee19c6056f871028 (plain) (tree)




















                             
                                                                      




















                                                                                       
                                              












                                                                 
                                               




                           
 



                                                             
                                                                    










                                                                                      
                                              




                          
 















                                                                                           
                                                    












                                                                             
 





                                                                             
                                                                                         

                                       
 




                  
                                                       














                                                         
/*
 * 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(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(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(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(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(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 %08x, expected %08x\n", (unsigned int)readback, (unsigned int)data);
        return HAL_ERROR_IO_UNEXPECTED;
    }

    return HAL_OK;
}

int main(void)
{
    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);
}
"p">; /** * @brief HAL Lock structures definition */ typedef enum { HAL_UNLOCKED = 0x00, HAL_LOCKED = 0x01 } HAL_LockTypeDef; /* Exported macro ------------------------------------------------------------*/ #define HAL_MAX_DELAY 0xFFFFFFFF #define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) != RESET) #define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == RESET) #define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ do{ \ (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ (__DMA_HANDLE__).Parent = (__HANDLE__); \ } while(0) #define UNUSED(x) ((void)(x)) /** @brief Reset the Handle's State field. * @param __HANDLE__: specifies the Peripheral Handle. * @note This macro can be used for the following purpose: * - When the Handle is declared as local variable; before passing it as parameter * to HAL_PPP_Init() for the first time, it is mandatory to use this macro * to set to 0 the Handle's "State" field. * Otherwise, "State" field may have any random value and the first time the function * HAL_PPP_Init() is called, the low level hardware initialization will be missed * (i.e. HAL_PPP_MspInit() will not be executed). * - When there is a need to reconfigure the low level hardware: instead of calling * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). * In this later function, when the Handle's "State" field is set to 0, it will execute the function * HAL_PPP_MspInit() which will reconfigure the low level hardware. * @retval None */ #define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0) #if (USE_RTOS == 1) /* Reserved for future use */ #error �USE_RTOS should be 0 in the current HAL release� #else #define __HAL_LOCK(__HANDLE__) \ do{ \ if((__HANDLE__)->Lock == HAL_LOCKED) \ { \ return HAL_BUSY; \ } \ else \ { \ (__HANDLE__)->Lock = HAL_LOCKED; \ } \ }while (0) #define __HAL_UNLOCK(__HANDLE__) \ do{ \ (__HANDLE__)->Lock = HAL_UNLOCKED; \ }while (0) #endif /* USE_RTOS */ #if defined ( __GNUC__ ) #ifndef __weak #define __weak __attribute__((weak)) #endif /* __weak */ #ifndef __packed #define __packed __attribute__((__packed__)) #endif /* __packed */ #endif /* __GNUC__ */ /* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */ #if defined (__GNUC__) /* GNU Compiler */ #ifndef __ALIGN_END #define __ALIGN_END __attribute__ ((aligned (4))) #endif /* __ALIGN_END */ #ifndef __ALIGN_BEGIN #define __ALIGN_BEGIN #endif /* __ALIGN_BEGIN */ #else #ifndef __ALIGN_END #define __ALIGN_END #endif /* __ALIGN_END */ #ifndef __ALIGN_BEGIN #if defined (__CC_ARM) /* ARM Compiler */ #define __ALIGN_BEGIN __align(4) #elif defined (__ICCARM__) /* IAR Compiler */ #define __ALIGN_BEGIN #endif /* __CC_ARM */ #endif /* __ALIGN_BEGIN */ #endif /* __GNUC__ */ /** * @brief __RAM_FUNC definition */ #if defined ( __CC_ARM ) /* ARM Compiler ------------ RAM functions are defined using the toolchain options. Functions that are executed in RAM should reside in a separate source module. Using the 'Options for File' dialog you can simply change the 'Code / Const' area of a module to a memory space in physical RAM. Available memory areas are declared in the 'Target' tab of the 'Options for Target' dialog. */ #define __RAM_FUNC HAL_StatusTypeDef #elif defined ( __ICCARM__ ) /* ICCARM Compiler --------------- RAM functions are defined using a specific toolchain keyword "__ramfunc". */ #define __RAM_FUNC __ramfunc HAL_StatusTypeDef #elif defined ( __GNUC__ ) /* GNU Compiler ------------ RAM functions are defined using a specific toolchain attribute "__attribute__((section(".RamFunc")))". */ #define __RAM_FUNC HAL_StatusTypeDef __attribute__((section(".RamFunc"))) #endif /** * @brief __NOINLINE definition */ #if defined ( __CC_ARM ) || defined ( __GNUC__ ) /* ARM & GNUCompiler ---------------- */ #define __NOINLINE __attribute__ ( (noinline) ) #elif defined ( __ICCARM__ ) /* ICCARM Compiler --------------- */ #define __NOINLINE _Pragma("optimize = no_inline") #endif #ifdef __cplusplus } #endif #endif /* ___STM32F4xx_HAL_DEF */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/