So, I managed to get this to work 
Based on the example in the Users Manual I got the following code cooked together.
Important is to disable the interrupts as code it running form internal Flash (at 0x70000000) and we are programming the same memory using the FlexSPI NOR API.
However, the HyperRAM can NOT be used, it seems the FlexSPI where I have HyperRAM on is somehow affected when doing this FlexSPI NOR API stuff
The solution seems to be to keep all data for the module below in internal SRAM, and then do a (new) initialization of the HyperRAM/FLEXSPI interface one the code below finishes. Then the HyperRAM seems to work again.
(HyperRAM on FlexSPI and the internal NOR is on FlexSPI2)
Hope someone else can use this.
My code:
#include "fsl_flexspi.h"
#include "fsl_rtwdog.h"
#include "fsl_wdog.h"
#include "evkmimxrt1064_flexspi_nor_config.h"
typedef struct {
void (*RTWDOG_GetDefaultConfig)(rtwdog_config_t *config);
void (*RTWDOG_Init)(RTWDOG_Type *base, const rtwdog_config_t *config);
void (*RTWDOG_Deinit)(RTWDOG_Type *base);
void (*RTWDOG_Enable)(RTWDOG_Type *base);
void (*RTWDOG_Disable)(RTWDOG_Type *base);
void (*RTWDOG_EnableInterrupts)(RTWDOG_Type *base, uint32_t mask);
void (*RTWDOG_DisableInterrupts)(RTWDOG_Type *base, uint32_t mask);
uint32_t (*RTWDOG_GetStatusFlags)(RTWDOG_Type *base);
void (*RTWDOG_ClearStatusFlags)(RTWDOG_Type *base, uint32_t mask);
void (*RTWDOG_SetTimeoutValue)(RTWDOG_Type *base, uint16_t timeoutCount);
void (*RTWDOG_SetWindowValue)(RTWDOG_Type *base, uint16_t windowValue);
void (*RTWDOG_Unlock)(RTWDOG_Type *base);
void (*RTWDOG_Refresh)(RTWDOG_Type *base);
uint16_t (*RTWDOG_GetCounterValue)(RTWDOG_Type *base);
} rtwdog_driver_interface_t;
typedef struct {
void (*WDOG_GetDefaultConfig)(wdog_config_t *config);
void (*WDOG_Init)(WDOG_Type *base, const wdog_config_t *config);
void (*WDOG_Deinit)(WDOG_Type *base);
void (*WDOG_Enable)(WDOG_Type *base);
void (*WDOG_Disable)(WDOG_Type *base);
void (*WDOG_EnableInterrupts)(WDOG_Type *base, uint16_t mask);
uint16_t (*WDOG_GetStatusFlags)(WDOG_Type *base);
void (*WDOG_ClearInterruptStatus)(WDOG_Type *base, uint16_t mask);
void (*WDOG_SetTimeoutValue)(WDOG_Type *base, uint16_t timeoutCount);
void (*WDOG_SetInterrputTimeoutValue)(WDOG_Type *base, uint16_t timeoutCount);
void (*WDOG_DisablePowerDownEnable)(WDOG_Type *base);
void (*WDOG_Refresh)(WDOG_Type *base);
} wdog_driver_interface_t;
typedef struct _serial_nor_config_option {
union {
struct {
uint32_t max_freq : 4;
uint32_t misc_mode : 4;
uint32_t quad_mode_setting : 4;
uint32_t cmd_pads : 4;
uint32_t query_pads : 4;
uint32_t device_type : 4;
uint32_t option_size : 4;
uint32_t tag : 4;
} B;
uint32_t U;
} option0;
union {
struct {
uint32_t dummy_cycles : 8;
uint32_t reserved0 : 8;
uint32_t pinmux_group : 4;
uint32_t reserved1 : 8;
uint32_t flash_connection : 4;
} B;
uint32_t U;
} option1;
} serial_nor_config_option_t;
typedef enum _FlexSPIOperationType {
kFlexSpiOperation_Command,
kFlexSpiOperation_Config,
kFlexSpiOperation_Write,
kFlexSpiOperation_Read,
kFlexSpiOperation_End = kFlexSpiOperation_Read,
} flexspi_operation_t;
typedef struct _FlexSpiXfer {
flexspi_operation_t operation;
uint32_t baseAddress;
uint32_t seqId;
uint32_t seqNum;
bool isParallelModeEnable;
uint32_t *txBuffer;
uint32_t txSize;
uint32_t *rxBuffer;
uint32_t rxSize;
} flexspi_xfer_t;
typedef struct {
uint32_t version;
status_t (*init)(uint32_t instance, flexspi_nor_config_t *config);
status_t (*program)(uint32_t instance, flexspi_nor_config_t *config, uint32_t dst_addr, const uint32_t *src);
status_t (*erase_all)(uint32_t instance, flexspi_nor_config_t *config);
status_t (*erase)(uint32_t instance, flexspi_nor_config_t *config, uint32_t start, uint32_t lengthInBytes);
status_t (*read)(uint32_t instance, flexspi_nor_config_t *config, uint32_t *dst, uint32_t addr, uint32_t lengthInBytes);
void (*clear_cache)(uint32_t instance);
status_t (*xfer)(uint32_t instance, flexspi_xfer_t *xfer);
status_t (*update_lut)(uint32_t instance, uint32_t seqIndex, const uint32_t *lutBase, uint32_t seqNumber);
status_t (*get_config)(uint32_t instance, flexspi_nor_config_t *config, serial_nor_config_option_t *option);
} flexspi_nor_driver_interface_t;
typedef struct {
const uint32_t version;
const char *copyright;
void (*runBootloader)(void *arg);
const uint32_t *reserved0;
const flexspi_nor_driver_interface_t *flexSpiNorDriver;
const uint32_t *reserved1[2];
const rtwdog_driver_interface_t *rtwdogDriver;
const wdog_driver_interface_t *wdogDriver;
const uint32_t *reserved2;
} bootloader_api_entry_t;
#define g_bootloaderTree (*(bootloader_api_entry_t**)(0x0020001c))
status_t flexspi_nor_flash_init(uint32_t instance, flexspi_nor_config_t *config) {
return g_bootloaderTree->flexSpiNorDriver->init(instance, config);
}
status_t flexspi_nor_flash_page_program(uint32_t instance, flexspi_nor_config_t*config, uint32_t dstAddr, const uint32_t *src) {
return g_bootloaderTree->flexSpiNorDriver->program(instance, config, dstAddr, src);
}
status_t flexspi_nor_flash_erase_all(uint32_t instance, flexspi_nor_config_t *config) {
return g_bootloaderTree->flexSpiNorDriver->erase_all(instance, config);
}
status_t flexspi_nor_get_config(uint32_t instance, flexspi_nor_config_t *config, serial_nor_config_option_t *option) {
return g_bootloaderTree->flexSpiNorDriver->get_config(instance, config, option);
}
status_t flexspi_nor_flash_erase(uint32_t instance, flexspi_nor_config_t *config, uint32_t start, uint32_t length) {
return g_bootloaderTree->flexSpiNorDriver->erase(instance, config, start, length);
}
status_t flexspi_nor_flash_read(uint32_t instance, flexspi_nor_config_t *config, uint32_t *dst, uint32_t start, uint32_t bytes) {
return g_bootloaderTree->flexSpiNorDriver->read(instance, config, dst, start, bytes);
}
static flexspi_nor_config_t config;
static serial_nor_config_option_t option;
static status_t status;
static uint32_t address = 0x40000;
static uint32_t sector_size = 0x1000;
static uint32_t page_buffer[256/ sizeof(uint32_t)];
static uint32_t instance = 1;
int testIAP(void) {
option.option0.U = 0xC0000008;
__disable_irq();
status = flexspi_nor_get_config(instance, &config, &option);
if (status != kStatus_Success) {
__enable_irq();
return status;
}
status = flexspi_nor_flash_init(instance, &config);
if (status != kStatus_Success) {
__enable_irq();
return status;
}
status = flexspi_nor_flash_erase(instance, &config, address , sector_size);
if (status != kStatus_Success) {
__enable_irq();
return status;
}
for (uint32_t i=0; i<sizeof(page_buffer)/sizeof(page_buffer[0]); i++) {
page_buffer[i] = (i << 24) | (i << 16) | (i << 8) | i;
}
status = flexspi_nor_flash_page_program(instance, &config, address, page_buffer);
if (status != kStatus_Success) {
__enable_irq();
return status;
}
SCB_CleanDCache();
uint32_t mem_address = 0x70000000 + address;
if (0 == memcmp((void*)mem_address, page_buffer, sizeof(page_buffer))) {
__enable_irq();
return kStatus_Success;
} else {
__enable_irq();
return kStatus_Fail;
}
}