mirror of https://github.com/wolfSSL/wolfBoot.git
Added flash test case for iMX RT. Fixed CRLF. Fixed test app LED IO configuration.
parent
5c63d75890
commit
7b454ab898
211
hal/imx_rt.c
211
hal/imx_rt.c
|
@ -25,6 +25,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <target.h>
|
#include <target.h>
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
|
#include "printf.h"
|
||||||
#include "fsl_common.h"
|
#include "fsl_common.h"
|
||||||
#include "fsl_iomuxc.h"
|
#include "fsl_iomuxc.h"
|
||||||
#include "fsl_nor_flash.h"
|
#include "fsl_nor_flash.h"
|
||||||
|
@ -47,6 +48,14 @@
|
||||||
|
|
||||||
#include "xip/fsl_flexspi_nor_boot.h"
|
#include "xip/fsl_flexspi_nor_boot.h"
|
||||||
|
|
||||||
|
/* #define DEBUG_EXT_FLASH */
|
||||||
|
/* #define TEST_FLASH */
|
||||||
|
|
||||||
|
#ifdef TEST_FLASH
|
||||||
|
static int test_flash(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef __WOLFBOOT
|
#ifdef __WOLFBOOT
|
||||||
|
|
||||||
/** Built-in ROM API for bootloaders **/
|
/** Built-in ROM API for bootloaders **/
|
||||||
|
@ -55,8 +64,7 @@ typedef void rtwdog_config_t;
|
||||||
typedef void wdog_config_t;
|
typedef void wdog_config_t;
|
||||||
|
|
||||||
/* Watchdog structures */
|
/* Watchdog structures */
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
void (*RTWDOG_GetDefaultConfig)(rtwdog_config_t *config);
|
void (*RTWDOG_GetDefaultConfig)(rtwdog_config_t *config);
|
||||||
void (*RTWDOG_Init)(RTWDOG_Type *base, const rtwdog_config_t *config);
|
void (*RTWDOG_Init)(RTWDOG_Type *base, const rtwdog_config_t *config);
|
||||||
void (*RTWDOG_Deinit)(RTWDOG_Type *base);
|
void (*RTWDOG_Deinit)(RTWDOG_Type *base);
|
||||||
|
@ -73,8 +81,7 @@ typedef struct
|
||||||
uint16_t (*RTWDOG_GetCounterValue)(RTWDOG_Type *base);
|
uint16_t (*RTWDOG_GetCounterValue)(RTWDOG_Type *base);
|
||||||
} rtwdog_driver_interface_t;
|
} rtwdog_driver_interface_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
void (*WDOG_GetDefaultConfig)(wdog_config_t *config);
|
void (*WDOG_GetDefaultConfig)(wdog_config_t *config);
|
||||||
void (*WDOG_Init)(WDOG_Type *base, const wdog_config_t *config);
|
void (*WDOG_Init)(WDOG_Type *base, const wdog_config_t *config);
|
||||||
void (*WDOG_Deinit)(WDOG_Type *base);
|
void (*WDOG_Deinit)(WDOG_Type *base);
|
||||||
|
@ -90,8 +97,7 @@ typedef struct
|
||||||
} wdog_driver_interface_t;
|
} wdog_driver_interface_t;
|
||||||
|
|
||||||
/* Flex SPI op */
|
/* Flex SPI op */
|
||||||
typedef enum _FlexSPIOperationType
|
typedef enum _FlexSPIOperationType {
|
||||||
{
|
|
||||||
kFlexSpiOperation_Command,
|
kFlexSpiOperation_Command,
|
||||||
kFlexSpiOperation_Config,
|
kFlexSpiOperation_Config,
|
||||||
kFlexSpiOperation_Write,
|
kFlexSpiOperation_Write,
|
||||||
|
@ -100,8 +106,7 @@ typedef enum _FlexSPIOperationType
|
||||||
} flexspi_operation_t;
|
} flexspi_operation_t;
|
||||||
|
|
||||||
/* FLEX SPI Xfer */
|
/* FLEX SPI Xfer */
|
||||||
typedef struct _FlexSpiXfer
|
typedef struct _FlexSpiXfer {
|
||||||
{
|
|
||||||
flexspi_operation_t operation;
|
flexspi_operation_t operation;
|
||||||
uint32_t baseAddress;
|
uint32_t baseAddress;
|
||||||
uint32_t seqId;
|
uint32_t seqId;
|
||||||
|
@ -114,12 +119,9 @@ typedef struct _FlexSpiXfer
|
||||||
} flexspi_xfer_t;
|
} flexspi_xfer_t;
|
||||||
|
|
||||||
/* Serial NOR config option */
|
/* Serial NOR config option */
|
||||||
typedef struct _serial_nor_config_option
|
typedef struct _serial_nor_config_option {
|
||||||
{
|
union {
|
||||||
union
|
struct {
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
uint32_t max_freq : 4; /* Maximum supported Frequency */
|
uint32_t max_freq : 4; /* Maximum supported Frequency */
|
||||||
uint32_t misc_mode : 4; /* miscellaneous mode */
|
uint32_t misc_mode : 4; /* miscellaneous mode */
|
||||||
uint32_t quad_mode_setting : 4; /* Quad mode setting */
|
uint32_t quad_mode_setting : 4; /* Quad mode setting */
|
||||||
|
@ -131,10 +133,8 @@ typedef struct _serial_nor_config_option
|
||||||
} B;
|
} B;
|
||||||
uint32_t U;
|
uint32_t U;
|
||||||
} option0;
|
} option0;
|
||||||
union
|
union {
|
||||||
{
|
struct {
|
||||||
struct
|
|
||||||
{
|
|
||||||
uint32_t dummy_cycles : 8; /* Dummy cycles before read */
|
uint32_t dummy_cycles : 8; /* Dummy cycles before read */
|
||||||
uint32_t reserved0 : 8; /* Reserved for future use */
|
uint32_t reserved0 : 8; /* Reserved for future use */
|
||||||
uint32_t pinmux_group : 4; /* The pinmux group selection */
|
uint32_t pinmux_group : 4; /* The pinmux group selection */
|
||||||
|
@ -146,8 +146,7 @@ typedef struct _serial_nor_config_option
|
||||||
} serial_nor_config_option_t;
|
} serial_nor_config_option_t;
|
||||||
|
|
||||||
/* NOR flash API */
|
/* NOR flash API */
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
uint32_t version;
|
uint32_t version;
|
||||||
status_t (*init)(uint32_t instance, flexspi_nor_config_t *config);
|
status_t (*init)(uint32_t instance, flexspi_nor_config_t *config);
|
||||||
status_t (*program)(uint32_t instance, flexspi_nor_config_t *config, uint32_t
|
status_t (*program)(uint32_t instance, flexspi_nor_config_t *config, uint32_t
|
||||||
|
@ -168,8 +167,7 @@ typedef struct
|
||||||
|
|
||||||
|
|
||||||
/* Root pointer */
|
/* Root pointer */
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
const uint32_t version; /* Bootloader version number */
|
const uint32_t version; /* Bootloader version number */
|
||||||
const char *copyright; /* Bootloader Copyright */
|
const char *copyright; /* Bootloader Copyright */
|
||||||
void (*runBootloader)(void *arg); /* Function to start the bootloader executing */
|
void (*runBootloader)(void *arg); /* Function to start the bootloader executing */
|
||||||
|
@ -277,6 +275,7 @@ const flexspi_nor_config_t __attribute__((section(".flash_config"))) qspiflash_c
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/** Flash configuration in the .flash_config section of flash **/
|
/** Flash configuration in the .flash_config section of flash **/
|
||||||
#ifdef CPU_MIMXRT1052DVJ6B
|
#ifdef CPU_MIMXRT1052DVJ6B
|
||||||
|
|
||||||
|
@ -546,8 +545,8 @@ const flexspi_nor_config_t __attribute__((section(".flash_config"))) qspiflash_c
|
||||||
#endif
|
#endif
|
||||||
#endif /* CPU_MIMXRT1052DVJ6B */
|
#endif /* CPU_MIMXRT1052DVJ6B */
|
||||||
|
|
||||||
#ifndef __FLASH_BASE
|
|
||||||
|
|
||||||
|
#ifndef __FLASH_BASE
|
||||||
#if defined(CPU_MIMXRT1052DVJ6B) || defined(CPU_MIMXRT1062DVL6A)
|
#if defined(CPU_MIMXRT1052DVJ6B) || defined(CPU_MIMXRT1062DVL6A)
|
||||||
#define __FLASH_BASE 0x60000000
|
#define __FLASH_BASE 0x60000000
|
||||||
#elif defined(CPU_MIMXRT1064DVL6A)
|
#elif defined(CPU_MIMXRT1064DVL6A)
|
||||||
|
@ -555,19 +554,13 @@ const flexspi_nor_config_t __attribute__((section(".flash_config"))) qspiflash_c
|
||||||
#else
|
#else
|
||||||
#error "Please define MCUXPRESSO SDK CPU variant macro (e.g. CPU_MIMXRT1062DVL6A)"
|
#error "Please define MCUXPRESSO SDK CPU variant macro (e.g. CPU_MIMXRT1062DVL6A)"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef FLASH_BASE
|
#ifndef FLASH_BASE
|
||||||
#define FLASH_BASE __FLASH_BASE
|
#define FLASH_BASE __FLASH_BASE
|
||||||
#define PLUGIN_FLAG 0x0UL
|
#define PLUGIN_FLAG 0x0UL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const uint8_t dcd_data[1] = {0};
|
|
||||||
extern void isr_reset(void);
|
|
||||||
|
|
||||||
|
|
||||||
const BOOT_DATA_T __attribute__((section(".boot_data"))) boot_data = {
|
const BOOT_DATA_T __attribute__((section(".boot_data"))) boot_data = {
|
||||||
FLASH_BASE, /* boot start location */
|
FLASH_BASE, /* boot start location */
|
||||||
CONFIG_FLASH_SIZE, /* size */
|
CONFIG_FLASH_SIZE, /* size */
|
||||||
|
@ -575,6 +568,9 @@ const BOOT_DATA_T __attribute__((section(".boot_data"))) boot_data = {
|
||||||
0xFFFFFFFF /* empty - extra data word */
|
0xFFFFFFFF /* empty - extra data word */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const uint8_t dcd_data[1] = {0};
|
||||||
|
extern void isr_reset(void);
|
||||||
|
|
||||||
const ivt __attribute__((section(".image_vt"))) image_vector_table = {
|
const ivt __attribute__((section(".image_vt"))) image_vector_table = {
|
||||||
IVT_HEADER, /* IVT Header */
|
IVT_HEADER, /* IVT Header */
|
||||||
(uint32_t)isr_reset, /* Image Entry Function */
|
(uint32_t)isr_reset, /* Image Entry Function */
|
||||||
|
@ -589,86 +585,100 @@ const ivt __attribute__((section(".image_vt"))) image_vector_table = {
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Variables for BOARD_BootClockRUN configuration
|
* Variables for BOARD_BootClockRUN configuration
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =
|
const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN = {
|
||||||
{
|
|
||||||
.loopDivider = 100, /* PLL loop divider, Fout = Fin * 50 */
|
.loopDivider = 100, /* PLL loop divider, Fout = Fin * 50 */
|
||||||
.src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
|
.src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
|
||||||
};
|
};
|
||||||
const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =
|
const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN = {
|
||||||
{
|
|
||||||
.loopDivider = 1, /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */
|
.loopDivider = 1, /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */
|
||||||
.numerator = 0, /* 30 bit numerator of fractional loop divider */
|
.numerator = 0, /* 30 bit numerator of fractional loop divider */
|
||||||
.denominator = 1, /* 30 bit denominator of fractional loop divider */
|
.denominator = 1, /* 30 bit denominator of fractional loop divider */
|
||||||
.src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
|
.src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
|
||||||
};
|
};
|
||||||
const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =
|
const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN = {
|
||||||
{
|
|
||||||
.loopDivider = 0, /* PLL loop divider, Fout = Fin * 20 */
|
.loopDivider = 0, /* PLL loop divider, Fout = Fin * 20 */
|
||||||
.src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
|
.src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
|
||||||
};
|
};
|
||||||
const clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN =
|
const clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN = {
|
||||||
{
|
|
||||||
.loopDivider = 31, /* PLL loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */
|
.loopDivider = 31, /* PLL loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */
|
||||||
.postDivider = 8, /* Divider after PLL */
|
.postDivider = 8, /* Divider after PLL */
|
||||||
.numerator = 0, /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */
|
.numerator = 0, /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */
|
||||||
.denominator = 1, /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */
|
.denominator = 1, /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */
|
||||||
.src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
|
.src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void clock_init(void)
|
static void clock_init(void)
|
||||||
{
|
{
|
||||||
if (CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_BYPASS_MASK)
|
if (CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_BYPASS_MASK) {
|
||||||
{
|
|
||||||
/* Configure ARM_PLL */
|
/* Configure ARM_PLL */
|
||||||
CCM_ANALOG->PLL_ARM =
|
CCM_ANALOG->PLL_ARM =
|
||||||
CCM_ANALOG_PLL_ARM_BYPASS(1) | CCM_ANALOG_PLL_ARM_ENABLE(1) | CCM_ANALOG_PLL_ARM_DIV_SELECT(24);
|
CCM_ANALOG_PLL_ARM_BYPASS(1) |
|
||||||
|
CCM_ANALOG_PLL_ARM_ENABLE(1) |
|
||||||
|
CCM_ANALOG_PLL_ARM_DIV_SELECT(24);
|
||||||
/* Wait Until clock is locked */
|
/* Wait Until clock is locked */
|
||||||
while ((CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_LOCK_MASK) == 0)
|
while ((CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_LOCK_MASK) == 0);
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure PLL_SYS */
|
/* Configure PLL_SYS */
|
||||||
CCM_ANALOG->PLL_SYS &= ~CCM_ANALOG_PLL_SYS_POWERDOWN_MASK;
|
CCM_ANALOG->PLL_SYS &= ~CCM_ANALOG_PLL_SYS_POWERDOWN_MASK;
|
||||||
/* Wait Until clock is locked */
|
/* Wait Until clock is locked */
|
||||||
while ((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_LOCK_MASK) == 0)
|
while ((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_LOCK_MASK) == 0);
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure PFD_528 */
|
/* Configure PFD_528 */
|
||||||
CCM_ANALOG->PFD_528 = CCM_ANALOG_PFD_528_PFD0_FRAC(24) | CCM_ANALOG_PFD_528_PFD1_FRAC(24) |
|
CCM_ANALOG->PFD_528 =
|
||||||
CCM_ANALOG_PFD_528_PFD2_FRAC(19) | CCM_ANALOG_PFD_528_PFD3_FRAC(24);
|
CCM_ANALOG_PFD_528_PFD0_FRAC(24) |
|
||||||
|
CCM_ANALOG_PFD_528_PFD1_FRAC(24) |
|
||||||
|
CCM_ANALOG_PFD_528_PFD2_FRAC(19) |
|
||||||
|
CCM_ANALOG_PFD_528_PFD3_FRAC(24);
|
||||||
|
|
||||||
/* Configure USB1_PLL */
|
/* Configure USB1_PLL */
|
||||||
CCM_ANALOG->PLL_USB1 =
|
CCM_ANALOG->PLL_USB1 =
|
||||||
CCM_ANALOG_PLL_USB1_DIV_SELECT(0) | CCM_ANALOG_PLL_USB1_POWER(1) | CCM_ANALOG_PLL_USB1_ENABLE(1);
|
CCM_ANALOG_PLL_USB1_DIV_SELECT(0) |
|
||||||
while ((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_LOCK_MASK) == 0)
|
CCM_ANALOG_PLL_USB1_POWER(1) |
|
||||||
{
|
CCM_ANALOG_PLL_USB1_ENABLE(1);
|
||||||
}
|
while ((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_LOCK_MASK) == 0);
|
||||||
CCM_ANALOG->PLL_USB1 &= ~CCM_ANALOG_PLL_USB1_BYPASS_MASK;
|
CCM_ANALOG->PLL_USB1 &= ~CCM_ANALOG_PLL_USB1_BYPASS_MASK;
|
||||||
|
|
||||||
/* Configure PFD_480 */
|
/* Configure PFD_480 */
|
||||||
CCM_ANALOG->PFD_480 = CCM_ANALOG_PFD_480_PFD0_FRAC(35) | CCM_ANALOG_PFD_480_PFD1_FRAC(35) |
|
CCM_ANALOG->PFD_480 =
|
||||||
CCM_ANALOG_PFD_480_PFD2_FRAC(26) | CCM_ANALOG_PFD_480_PFD3_FRAC(15);
|
CCM_ANALOG_PFD_480_PFD0_FRAC(35) |
|
||||||
|
CCM_ANALOG_PFD_480_PFD1_FRAC(35) |
|
||||||
|
CCM_ANALOG_PFD_480_PFD2_FRAC(26) |
|
||||||
|
CCM_ANALOG_PFD_480_PFD3_FRAC(15);
|
||||||
|
|
||||||
/* Configure Clock PODF */
|
/* Configure Clock PODF */
|
||||||
CCM->CACRR = CCM_CACRR_ARM_PODF(1);
|
CCM->CACRR = CCM_CACRR_ARM_PODF(1);
|
||||||
|
|
||||||
CCM->CBCDR = (CCM->CBCDR & (~(CCM_CBCDR_SEMC_PODF_MASK | CCM_CBCDR_AHB_PODF_MASK | CCM_CBCDR_IPG_PODF_MASK))) |
|
CCM->CBCDR =
|
||||||
CCM_CBCDR_SEMC_PODF(2) | CCM_CBCDR_AHB_PODF(2) | CCM_CBCDR_IPG_PODF(2);
|
(CCM->CBCDR &
|
||||||
|
(~(CCM_CBCDR_SEMC_PODF_MASK |
|
||||||
|
CCM_CBCDR_AHB_PODF_MASK |
|
||||||
|
CCM_CBCDR_IPG_PODF_MASK))) |
|
||||||
|
CCM_CBCDR_SEMC_PODF(2) |
|
||||||
|
CCM_CBCDR_AHB_PODF(2) |
|
||||||
|
CCM_CBCDR_IPG_PODF(2);
|
||||||
|
|
||||||
#if defined(CPU_MIMXRT1062DVL6A) || defined(CPU_MIMXRT1064DVL6A)
|
#if defined(CPU_MIMXRT1062DVL6A) || defined(CPU_MIMXRT1064DVL6A)
|
||||||
/* Configure FLEXSPI2 CLOCKS */
|
/* Configure FLEXSPI2 CLOCKS */
|
||||||
CCM->CBCMR =
|
CCM->CBCMR =
|
||||||
(CCM->CBCMR &
|
(CCM->CBCMR &
|
||||||
(~(CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK | CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK | CCM_CBCMR_FLEXSPI2_PODF_MASK))) |
|
(~(CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK |
|
||||||
CCM_CBCMR_PRE_PERIPH_CLK_SEL(3) | CCM_CBCMR_FLEXSPI2_CLK_SEL(1) | CCM_CBCMR_FLEXSPI2_PODF(7);
|
CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK |
|
||||||
|
CCM_CBCMR_FLEXSPI2_PODF_MASK))) |
|
||||||
|
CCM_CBCMR_PRE_PERIPH_CLK_SEL(3) |
|
||||||
|
CCM_CBCMR_FLEXSPI2_CLK_SEL(1) |
|
||||||
|
CCM_CBCMR_FLEXSPI2_PODF(7);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Configure FLEXSPI CLOCKS */
|
/* Configure FLEXSPI CLOCKS */
|
||||||
CCM->CSCMR1 = ((CCM->CSCMR1 &
|
CCM->CSCMR1 =
|
||||||
~(CCM_CSCMR1_FLEXSPI_CLK_SEL_MASK | CCM_CSCMR1_FLEXSPI_PODF_MASK | CCM_CSCMR1_PERCLK_PODF_MASK |
|
((CCM->CSCMR1 &
|
||||||
|
~(CCM_CSCMR1_FLEXSPI_CLK_SEL_MASK |
|
||||||
|
CCM_CSCMR1_FLEXSPI_PODF_MASK |
|
||||||
|
CCM_CSCMR1_PERCLK_PODF_MASK |
|
||||||
CCM_CSCMR1_PERCLK_CLK_SEL_MASK)) |
|
CCM_CSCMR1_PERCLK_CLK_SEL_MASK)) |
|
||||||
CCM_CSCMR1_FLEXSPI_CLK_SEL(3) | CCM_CSCMR1_FLEXSPI_PODF(7) | CCM_CSCMR1_PERCLK_PODF(1));
|
CCM_CSCMR1_FLEXSPI_CLK_SEL(3) |
|
||||||
|
CCM_CSCMR1_FLEXSPI_PODF(7) |
|
||||||
|
CCM_CSCMR1_PERCLK_PODF(1));
|
||||||
|
|
||||||
/* Finally, Enable PLL_ARM, PLL_SYS and PLL_USB1 */
|
/* Finally, Enable PLL_ARM, PLL_SYS and PLL_USB1 */
|
||||||
CCM_ANALOG->PLL_ARM &= ~CCM_ANALOG_PLL_ARM_BYPASS_MASK;
|
CCM_ANALOG->PLL_ARM &= ~CCM_ANALOG_PLL_ARM_BYPASS_MASK;
|
||||||
|
@ -680,8 +690,13 @@ static void clock_init(void)
|
||||||
|
|
||||||
#ifdef DEBUG_UART
|
#ifdef DEBUG_UART
|
||||||
|
|
||||||
|
/* The UART interface (LPUART1 - LPUART8) */
|
||||||
|
#ifndef UART_BASEADDR
|
||||||
#define UART_BASEADDR LPUART1
|
#define UART_BASEADDR LPUART1
|
||||||
|
#endif
|
||||||
|
#ifndef UART_BAUDRATE
|
||||||
#define UART_BAUDRATE (115200U)
|
#define UART_BAUDRATE (115200U)
|
||||||
|
#endif
|
||||||
|
|
||||||
void uart_init(void)
|
void uart_init(void)
|
||||||
{
|
{
|
||||||
|
@ -696,9 +711,18 @@ void uart_init(void)
|
||||||
LPUART_Init(UART_BASEADDR, &config, uartClkSrcFreq);
|
LPUART_Init(UART_BASEADDR, &config, uartClkSrcFreq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uart_write(const char* buf, uint32_t sz)
|
void uart_write(const char* buf, unsigned int sz)
|
||||||
{
|
{
|
||||||
|
int doCrlf = 0;
|
||||||
|
if (buf[sz-1] == '\n') { /* handle CRLF */
|
||||||
|
doCrlf = 1;
|
||||||
|
sz--;
|
||||||
|
}
|
||||||
LPUART_WriteBlocking(UART_BASEADDR, (const uint8_t*)buf, sz);
|
LPUART_WriteBlocking(UART_BASEADDR, (const uint8_t*)buf, sz);
|
||||||
|
if (doCrlf) {
|
||||||
|
const char* kCrlf = "\r\n";
|
||||||
|
LPUART_WriteBlocking(UART_BASEADDR, (const uint8_t*)kCrlf, 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* DEBUG_UART */
|
#endif /* DEBUG_UART */
|
||||||
|
@ -717,9 +741,14 @@ void hal_init(void)
|
||||||
clock_init();
|
clock_init();
|
||||||
#ifdef DEBUG_UART
|
#ifdef DEBUG_UART
|
||||||
uart_init();
|
uart_init();
|
||||||
uart_write("wolfBoot HAL Init\n", 19);
|
uart_write("wolfBoot HAL Init\n", 18);
|
||||||
#endif
|
#endif
|
||||||
hal_flash_init();
|
hal_flash_init();
|
||||||
|
#ifdef TEST_FLASH
|
||||||
|
if (test_flash() != 0) {
|
||||||
|
wolfBoot_printf("Flash Test Failed!\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void hal_prepare_boot(void)
|
void hal_prepare_boot(void)
|
||||||
|
@ -754,6 +783,10 @@ int RAMFUNCTION hal_flash_write(uint32_t address, const uint8_t *data, int len)
|
||||||
uint32_t wbuf[CONFIG_FLASH_PAGE_SIZE / sizeof(uint32_t)];
|
uint32_t wbuf[CONFIG_FLASH_PAGE_SIZE / sizeof(uint32_t)];
|
||||||
int i;
|
int i;
|
||||||
hal_flash_init(); /* make sure g_bootloaderTree is set */
|
hal_flash_init(); /* make sure g_bootloaderTree is set */
|
||||||
|
#ifdef DEBUG_EXT_FLASH
|
||||||
|
wolfBoot_printf("flash write: addr 0x%x, len %d\n",
|
||||||
|
address - FLASH_BASE, len);
|
||||||
|
#endif
|
||||||
for (i = 0; i < len; i+= CONFIG_FLASH_PAGE_SIZE) {
|
for (i = 0; i < len; i+= CONFIG_FLASH_PAGE_SIZE) {
|
||||||
memcpy(wbuf, data + i, CONFIG_FLASH_PAGE_SIZE);
|
memcpy(wbuf, data + i, CONFIG_FLASH_PAGE_SIZE);
|
||||||
status = g_bootloaderTree->flexSpiNorDriver->program(0, FLEXSPI_CONFIG,
|
status = g_bootloaderTree->flexSpiNorDriver->program(0, FLEXSPI_CONFIG,
|
||||||
|
@ -776,9 +809,53 @@ int RAMFUNCTION hal_flash_erase(uint32_t address, int len)
|
||||||
{
|
{
|
||||||
status_t status;
|
status_t status;
|
||||||
hal_flash_init(); /* make sure g_bootloaderTree is set */
|
hal_flash_init(); /* make sure g_bootloaderTree is set */
|
||||||
|
#ifdef DEBUG_EXT_FLASH
|
||||||
|
wolfBoot_printf("flash erase: addr 0x%x, len %d\n",
|
||||||
|
address - FLASH_BASE, len);
|
||||||
|
#endif
|
||||||
status = g_bootloaderTree->flexSpiNorDriver->erase(0, FLEXSPI_CONFIG,
|
status = g_bootloaderTree->flexSpiNorDriver->erase(0, FLEXSPI_CONFIG,
|
||||||
address - FLASH_BASE, len);
|
address - FLASH_BASE, len);
|
||||||
if (status != kStatus_Success)
|
if (status != kStatus_Success)
|
||||||
return -1;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TEST_FLASH
|
||||||
|
|
||||||
|
#ifndef TEST_ADDRESS
|
||||||
|
#define TEST_ADDRESS (FLASH_BASE + 0x700000) /* 7MB */
|
||||||
|
#endif
|
||||||
|
/* #define TEST_FLASH_READONLY */
|
||||||
|
|
||||||
|
static uint32_t pageData[WOLFBOOT_SECTOR_SIZE/4]; /* force 32-bit alignment */
|
||||||
|
|
||||||
|
static int test_flash(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
#ifndef TEST_FLASH_READONLY
|
||||||
|
/* Erase sector */
|
||||||
|
ret = hal_flash_erase(TEST_ADDRESS, WOLFBOOT_SECTOR_SIZE);
|
||||||
|
wolfBoot_printf("Erase Sector: Ret %d\n", ret);
|
||||||
|
|
||||||
|
/* Fill data into the page_buffer */
|
||||||
|
for (i=0; i<sizeof(pageData)/sizeof(pageData[0]); i++) {
|
||||||
|
pageData[i] = (i << 24) | (i << 16) | (i << 8) | i;
|
||||||
|
}
|
||||||
|
/* Write Page */
|
||||||
|
ret = hal_flash_write(TEST_ADDRESS, (uint8_t*)pageData, sizeof(pageData));
|
||||||
|
wolfBoot_printf("Write Page: Ret %d\n", ret);
|
||||||
|
#endif /* !TEST_FLASH_READONLY */
|
||||||
|
|
||||||
|
/* Compare Page */
|
||||||
|
ret = memcmp((void*)TEST_ADDRESS, pageData, sizeof(pageData));
|
||||||
|
if (ret != 0) {
|
||||||
|
wolfBoot_printf("Check Data @ %d failed\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
wolfBoot_printf("Flash Test Passed\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* TEST_FLASH */
|
||||||
|
|
|
@ -1540,7 +1540,7 @@ void hal_init(void)
|
||||||
#ifdef DEBUG_UART
|
#ifdef DEBUG_UART
|
||||||
uart_init();
|
uart_init();
|
||||||
#if !defined(BUILD_LOADER_STAGE1)
|
#if !defined(BUILD_LOADER_STAGE1)
|
||||||
uart_write("wolfBoot HAL Init\n", 19);
|
uart_write("wolfBoot HAL Init\n", 18);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_PCIE
|
#ifdef ENABLE_PCIE
|
||||||
|
@ -1909,7 +1909,7 @@ static int test_flash(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint32_t pageData[FLASH_PAGE_SIZE/4]; /* force 32-bit alignment */
|
uint32_t pageData[WOLFBOOT_SECTOR_SIZE/4]; /* force 32-bit alignment */
|
||||||
|
|
||||||
#ifndef TEST_FLASH_READONLY
|
#ifndef TEST_FLASH_READONLY
|
||||||
/* Erase sector */
|
/* Erase sector */
|
||||||
|
|
|
@ -55,7 +55,7 @@ static uint32_t debug_console_get_freq(void)
|
||||||
}
|
}
|
||||||
/* Initialize debug console. */
|
/* Initialize debug console. */
|
||||||
#define UART_TYPE kSerialPort_Uart
|
#define UART_TYPE kSerialPort_Uart
|
||||||
#define UART_BASEADDR (uint32_t)LPUART1
|
#define UART_BASEADDR LPUART1_BASE
|
||||||
#define UART_INSTANCE 1U
|
#define UART_INSTANCE 1U
|
||||||
#define UART_BAUDRATE (115200U)
|
#define UART_BAUDRATE (115200U)
|
||||||
void init_debug_console(void)
|
void init_debug_console(void)
|
||||||
|
@ -78,12 +78,14 @@ void rt1060_init_pins(void)
|
||||||
|
|
||||||
GPIO_PinInit(USER_LED_GPIO, USER_LED_PIN, &USER_LED_config);
|
GPIO_PinInit(USER_LED_GPIO, USER_LED_PIN, &USER_LED_config);
|
||||||
|
|
||||||
|
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0U);
|
||||||
IOMUXC_SetPinMux( /* GPIO_AD_B0_10 is configured as ARM_TRACE_SWO */
|
IOMUXC_SetPinMux( /* GPIO_AD_B0_10 is configured as ARM_TRACE_SWO */
|
||||||
IOMUXC_GPIO_AD_B0_10_ARM_TRACE_SWO, 0U);
|
IOMUXC_GPIO_AD_B0_10_ARM_TRACE_SWO, 0U);
|
||||||
IOMUXC_SetPinMux( /* GPIO_AD_B0_12 is configured as LPUART1_TX */
|
IOMUXC_SetPinMux( /* GPIO_AD_B0_12 is configured as LPUART1_TX */
|
||||||
IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U);
|
IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U);
|
||||||
IOMUXC_SetPinMux( /* GPIO_AD_B0_13 is configured as LPUART1_RX */
|
IOMUXC_SetPinMux( /* GPIO_AD_B0_13 is configured as LPUART1_RX */
|
||||||
IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U);
|
IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U);
|
||||||
|
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0x10B0U);
|
||||||
IOMUXC_SetPinConfig( /* GPIO_AD_B0_10 PAD functional properties : */
|
IOMUXC_SetPinConfig( /* GPIO_AD_B0_10 PAD functional properties : */
|
||||||
IOMUXC_GPIO_AD_B0_10_ARM_TRACE_SWO, 0x90B1U);
|
IOMUXC_GPIO_AD_B0_10_ARM_TRACE_SWO, 0x90B1U);
|
||||||
IOMUXC_SetPinConfig( /* GPIO_AD_B0_12 PAD functional properties : */
|
IOMUXC_SetPinConfig( /* GPIO_AD_B0_12 PAD functional properties : */
|
||||||
|
@ -91,7 +93,6 @@ void rt1060_init_pins(void)
|
||||||
IOMUXC_SetPinConfig( /* GPIO_AD_B0_13 PAD functional properties : */
|
IOMUXC_SetPinConfig( /* GPIO_AD_B0_13 PAD functional properties : */
|
||||||
IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0x10B0U);
|
IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0x10B0U);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CPU_MIMXRT1052DVJ6B
|
#ifdef CPU_MIMXRT1052DVJ6B
|
||||||
|
@ -107,10 +108,12 @@ void rt1050_init_pins(void)
|
||||||
|
|
||||||
GPIO_PinInit(USER_LED_GPIO, USER_LED_PIN, &USER_LED_config);
|
GPIO_PinInit(USER_LED_GPIO, USER_LED_PIN, &USER_LED_config);
|
||||||
|
|
||||||
|
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0U);
|
||||||
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TXD, 0U);
|
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TXD, 0U);
|
||||||
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RXD, 0U);
|
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RXD, 0U);
|
||||||
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_CCM_CLKO1, 0U);
|
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_CCM_CLKO1, 0U);
|
||||||
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_CCM_CLKO2, 0U);
|
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_CCM_CLKO2, 0U);
|
||||||
|
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0x10B0U);
|
||||||
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TXD, 0x10B0U);
|
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TXD, 0x10B0U);
|
||||||
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RXD, 0x10B0U);
|
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RXD, 0x10B0U);
|
||||||
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_04_CCM_CLKO1, 0x10B0U);
|
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_04_CCM_CLKO1, 0x10B0U);
|
||||||
|
|
Loading…
Reference in New Issue