From 01cda583a24155ccb7ba9daba5e1acb138119ced Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Tue, 30 Apr 2024 17:47:28 -0600 Subject: [PATCH 01/41] Remove inclusion of lpgcr regs --- Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h index 2bb366ac654..9586fb68d02 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h @@ -26,7 +26,6 @@ #include "mxc_device.h" #include "gcr_regs.h" -#include "lpgcr_regs.h" #ifdef __cplusplus extern "C" { From b085ffc2e7085f473df7f77896e550289ef9d02b Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Tue, 30 Apr 2024 18:24:46 -0600 Subject: [PATCH 02/41] Add core_cm33.h to top-level device header --- Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 396c9128ffb..28245b51a61 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -149,6 +149,8 @@ typedef enum { #define __NVIC_PRIO_BITS 4U /**< NVIC interrupt priority bits */ #define __Vendor_SysTickConfig 0U /**< Is 1 if different SysTick counter is used */ +#include + /* ================================================================================ */ /* ================== Device Specific Memory Section ================== */ /* ================================================================================ */ From aa7e9ea1ff7337ac5f9850963a33c415f990bb86 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Tue, 30 Apr 2024 18:25:58 -0600 Subject: [PATCH 03/41] Add MXC_GPIO macros to top-level device header --- .../CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 28245b51a61..da1a488d282 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -383,6 +383,19 @@ typedef enum { #define MXC_CFG_GPIO_INSTANCES (1) #define MXC_CFG_GPIO_PINS_PORT (32) +/* Utility macros + +Note(JC): There is only 1 GPIO instance, but for driver compatibility these must be +implemented. + +For GET_IDX and GET_GPIO we return -1 so that other MXC_ASSERTs might error out. +For GET_IRQ we follow precedent and return the base 0 IRQn, which is the ICE unlock. +We may want to handle GET_IRQ better... +*/ +#define MXC_GPIO_GET_IDX(p) ((p) == MXC_GPIO0 ? 0 : -1) +#define MXC_GPIO_GET_GPIO(i) ((i) == 0 ? MXC_GPIO0 : -1) +#define MXC_GPIO_GET_IRQ(i) ((i) == 0 ? GPIO0_IRQn : (IRQn_Type)0) + /* Non-secure Mapping */ #define MXC_BASE_GPIO0_NS ((uint32_t)0x40008000UL) #define MXC_GPIO0_NS ((mxc_gpio_regs_t *)MXC_BASE_GPIO0_NS) From c76e74ce21a3a602594192a33094fab79124dc0d Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Tue, 30 Apr 2024 18:50:12 -0600 Subject: [PATCH 04/41] Update mxc_sys.h with reset/pclkdis/clksel definitions --- .../PeriphDrivers/Include/MAX32657/mxc_sys.h | 126 ++++++------------ 1 file changed, 39 insertions(+), 87 deletions(-) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h index 9586fb68d02..def4ee9b925 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h @@ -40,117 +40,68 @@ extern "C" { /** @brief System reset0 and reset1 enumeration. Used in MXC_SYS_PeriphReset0 function */ typedef enum { - MXC_SYS_RESET0_DMA = MXC_F_GCR_RST0_DMA_POS, /**< Reset DMA */ - MXC_SYS_RESET0_WDT0 = MXC_F_GCR_RST0_WDT0_POS, /**< Reset WDT */ + MXC_SYS_RESET0_DMA0 = MXC_F_GCR_RST0_DMA0_POS, /**< Reset DMA0 */ + MXC_SYS_RESET0_WDT = MXC_F_GCR_RST0_WDT_POS, /**< Reset WDT */ MXC_SYS_RESET0_GPIO0 = MXC_F_GCR_RST0_GPIO0_POS, /**< Reset GPIO0 */ - MXC_SYS_RESET0_GPIO1 = MXC_F_GCR_RST0_GPIO1_POS, /**< Reset GPIO1 */ MXC_SYS_RESET0_TMR0 = MXC_F_GCR_RST0_TMR0_POS, /**< Reset TMR0 */ MXC_SYS_RESET0_TMR1 = MXC_F_GCR_RST0_TMR1_POS, /**< Reset TMR1 */ MXC_SYS_RESET0_TMR2 = MXC_F_GCR_RST0_TMR2_POS, /**< Reset TMR2 */ MXC_SYS_RESET0_TMR3 = MXC_F_GCR_RST0_TMR3_POS, /**< Reset TMR3 */ - MXC_SYS_RESET0_UART0 = MXC_F_GCR_RST0_UART0_POS, /**< Reset UART0 */ - MXC_SYS_RESET0_UART1 = MXC_F_GCR_RST0_UART1_POS, /**< Reset UART1 */ - MXC_SYS_RESET0_SPI1 = MXC_F_GCR_RST0_SPI1_POS, /**< Reset SPI1 */ - MXC_SYS_RESET0_I2C0 = MXC_F_GCR_RST0_I2C0_POS, /**< Reset I2C0 */ + MXC_SYS_RESET0_TMR4 = MXC_F_GCR_RST0_TMR4_POS, /**< Reset TMR4 */ + MXC_SYS_RESET0_TMR5 = MXC_F_GCR_RST0_TMR5_POS, /**< Reset TMR5 */ + MXC_SYS_RESET0_UART = MXC_F_GCR_RST0_UART_POS, /**< Reset UART0 */ + MXC_SYS_RESET0_SPI = MXC_F_GCR_RST0_SPI_POS, /**< Reset SPI */ + MXC_SYS_RESET0_I3C = MXC_F_GCR_RST0_I3C, /**< Reset I2C/I3C */ MXC_SYS_RESET0_RTC = MXC_F_GCR_RST0_RTC_POS, /**< Reset RTC */ - MXC_SYS_RESET0_SMPHR = MXC_F_GCR_RST0_SMPHR_POS, /**< Reset SMPHR */ + // MXC_SYS_RESET0_SMPHR = MXC_F_GCR_RST0_SMPHR_POS, /**< Reset SMPHR */ MXC_SYS_RESET0_TRNG = MXC_F_GCR_RST0_TRNG_POS, /**< Reset TRNG */ - MXC_SYS_RESET0_CNN = MXC_F_GCR_RST0_CNN_POS, /**< Reset CNN */ - MXC_SYS_RESET0_ADC = MXC_F_GCR_RST0_ADC_POS, /**< Reset ADC */ - MXC_SYS_RESET0_UART2 = MXC_F_GCR_RST0_UART2_POS, /**< Reset UART2 */ + MXC_SYS_RESET0_DMA1 = MXC_F_GCR_RST0_DMA1_POS, /**< Reset DMA0 */ MXC_SYS_RESET0_SOFT = MXC_F_GCR_RST0_SOFT_POS, /**< Soft reset */ MXC_SYS_RESET0_PERIPH = MXC_F_GCR_RST0_PERIPH_POS, /**< Peripheral reset */ MXC_SYS_RESET0_SYS = MXC_F_GCR_RST0_SYS_POS, /**< System reset */ /* RESET1 Below this line we add 32 to separate RESET0 and RESET1 */ - MXC_SYS_RESET1_I2C1 = (MXC_F_GCR_RST1_I2C1_POS + 32), /**< Reset I2C1 */ - MXC_SYS_RESET1_PT = (MXC_F_GCR_RST1_PT_POS + 32), /**< Reset PT */ - MXC_SYS_RESET1_OWM = (MXC_F_GCR_RST1_OWM_POS + 32), /**< Reset OWM */ MXC_SYS_RESET1_CRC = (MXC_F_GCR_RST1_CRC_POS + 32), /**< Reset CRC */ MXC_SYS_RESET1_AES = (MXC_F_GCR_RST1_AES_POS + 32), /**< Reset AES */ - MXC_SYS_RESET1_SMPHR = (MXC_F_GCR_RST1_SMPHR_POS + 32), /**< Reset SMPHR */ - MXC_SYS_RESET1_I2C2 = (MXC_F_GCR_RST1_I2C2_POS + 32), /**< Reset I2C2 */ - MXC_SYS_RESET1_I2S = (MXC_F_GCR_RST1_I2S_POS + 32), /**< Reset I2S*/ - // MXC_SYS_RESET1_BTLE = (MXC_F_GCR_RST1_BTLE_POS + 32), /**< Reset BTLE*/ - MXC_SYS_RESET1_DVS = (MXC_F_GCR_RST1_DVS_POS + 32), /**< Reset DVS */ - MXC_SYS_RESET1_SIMO = (MXC_F_GCR_RST1_SIMO_POS + 32), /**< Reset SIMO */ - MXC_SYS_RESET1_SPI0 = (MXC_F_GCR_RST1_SPI0_POS + 32), /**< Reset SPI0 */ - MXC_SYS_RESET1_CPU1 = (MXC_F_GCR_RST1_CPU1_POS + 32), /**< Reset CPU1 */ - /* LPGCR RESET Below this line we add 64 to separate LPGCR and GCR */ - MXC_SYS_RESET_GPIO2 = (MXC_F_LPGCR_RST_GPIO2_POS + 64), /**< Reset GPIO2 */ - MXC_SYS_RESET_WDT1 = (MXC_F_LPGCR_RST_WDT1_POS + 64), /**< Reset WDT1 */ - MXC_SYS_RESET_TMR4 = (MXC_F_LPGCR_RST_TMR4_POS + 64), /**< Reset TMR4 */ - MXC_SYS_RESET_TMR5 = (MXC_F_LPGCR_RST_TMR5_POS + 64), /**< Reset TMR5 */ - MXC_SYS_RESET_UART3 = (MXC_F_LPGCR_RST_UART3_POS + 64), /**< Reset UART3 */ - MXC_SYS_RESET_LPCOMP = (MXC_F_LPGCR_RST_LPCOMP_POS + 64), /**< Reset LPCOMP */ } mxc_sys_reset_t; /** @brief System clock disable enumeration. Used in MXC_SYS_ClockDisable and MXC_SYS_ClockEnable functions */ typedef enum { MXC_SYS_PERIPH_CLOCK_GPIO0 = - MXC_F_GCR_PCLKDIS0_GPIO0_POS, /**< Disable MXC_F_GCR_PCLKDIS0_GPIO0 clock */ - MXC_SYS_PERIPH_CLOCK_GPIO1 = - MXC_F_GCR_PCLKDIS0_GPIO1_POS, /**< Disable MXC_F_GCR_PCLKDIS0_GPIO1 clock */ - MXC_SYS_PERIPH_CLOCK_DMA = - MXC_F_GCR_PCLKDIS0_DMA_POS, /**< Disable MXC_F_GCR_PCLKDIS0_DMA clock */ - MXC_SYS_PERIPH_CLOCK_SPI1 = - MXC_F_GCR_PCLKDIS0_SPI1_POS, /**< Disable MXC_F_GCR_PCLKDIS0_SPI1 clock */ - MXC_SYS_PERIPH_CLOCK_UART0 = - MXC_F_GCR_PCLKDIS0_UART0_POS, /**< Disable MXC_F_GCR_PCLKDIS0_UART0 clock */ - MXC_SYS_PERIPH_CLOCK_UART1 = - MXC_F_GCR_PCLKDIS0_UART1_POS, /**< Disable MXC_F_GCR_PCLKDIS0_UART1 clock */ - MXC_SYS_PERIPH_CLOCK_I2C0 = - MXC_F_GCR_PCLKDIS0_I2C0_POS, /**< Disable MXC_F_GCR_PCLKDIS0_I2C0 clock */ + MXC_F_GCR_PCLKDIS0_GPIO0_POS, /**< Disable GPIO0 clock */ + MXC_SYS_PERIPH_CLOCK_DMA0 = + MXC_F_GCR_PCLKDIS0_DMA0_POS, /**< Disable DMA0 clock */ + MXC_SYS_PERIPH_CLOCK_SPI = + MXC_F_GCR_PCLKDIS0_SPI_POS, /**< Disable SPI clock */ + MXC_SYS_PERIPH_CLOCK_UART = + MXC_F_GCR_PCLKDIS0_UART_POS, /**< Disable UART0 clock */ + MXC_SYS_PERIPH_CLOCK_I3C = + MXC_F_GCR_PCLKDIS0_I3C_POS, /**< Disable I2C/I3C clock */ MXC_SYS_PERIPH_CLOCK_TMR0 = - MXC_F_GCR_PCLKDIS0_TMR0_POS, /**< Disable MXC_F_GCR_PCLKDIS0_TMR0 clock */ + MXC_F_GCR_PCLKDIS0_TMR0_POS, /**< Disable TMR0 clock */ MXC_SYS_PERIPH_CLOCK_TMR1 = - MXC_F_GCR_PCLKDIS0_TMR1_POS, /**< Disable MXC_F_GCR_PCLKDIS0_TMR1 clock */ + MXC_F_GCR_PCLKDIS0_TMR1_POS, /**< Disable TMR1 clock */ MXC_SYS_PERIPH_CLOCK_TMR2 = - MXC_F_GCR_PCLKDIS0_TMR2_POS, /**< Disable MXC_F_GCR_PCLKDIS0_TMR2 clock */ + MXC_F_GCR_PCLKDIS0_TMR2_POS, /**< Disable TMR2 clock */ MXC_SYS_PERIPH_CLOCK_TMR3 = - MXC_F_GCR_PCLKDIS0_TMR3_POS, /**< Disable MXC_F_GCR_PCLKDIS0_T3 clock */ - MXC_SYS_PERIPH_CLOCK_ADC = - MXC_F_GCR_PCLKDIS0_ADC_POS, /**< Disable MXC_F_GCR_PCLKDIS0_ADC clock */ - MXC_SYS_PERIPH_CLOCK_CNN = - MXC_F_GCR_PCLKDIS0_CNN_POS, /**< Disable MXC_F_GCR_PCLKDIS0_CNN clock */ - MXC_SYS_PERIPH_CLOCK_I2C1 = - MXC_F_GCR_PCLKDIS0_I2C1_POS, /**< Disable MXC_F_GCR_PCLKDIS0_I2C1 clock */ - MXC_SYS_PERIPH_CLOCK_PT = MXC_F_GCR_PCLKDIS0_PT_POS, /**< Disable MXC_F_GCR_PCLKDIS0_PT clock */ + MXC_F_GCR_PCLKDIS0_TMR3_POS, /**< Disable TMR3 clock */ + MXC_SYS_PERIPH_CLOCK_TMR4 = + MXC_F_GCR_PCLKDIS0_TMR4_POS, /**< Disable TMR4 clock */ + MXC_SYS_PERIPH_CLOCK_TMR5 = + MXC_F_GCR_PCLKDIS0_TMR5_POS, /**< Disable TMR4 clock */ /* PCLKDIS1 Below this line we add 32 to separate PCLKDIS0 and PCLKDIS1 */ - MXC_SYS_PERIPH_CLOCK_UART2 = - (MXC_F_GCR_PCLKDIS1_UART2_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_UART2 clock */ MXC_SYS_PERIPH_CLOCK_TRNG = - (MXC_F_GCR_PCLKDIS1_TRNG_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_TRNG clock */ - MXC_SYS_PERIPH_CLOCK_SMPHR = - (MXC_F_GCR_PCLKDIS1_SMPHR_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_SMPHR clock */ - MXC_SYS_PERIPH_CLOCK_OWIRE = - (MXC_F_GCR_PCLKDIS1_OWM_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_OWM clock */ + (MXC_F_GCR_PCLKDIS1_TRNG_POS + 32), /**< Disable TRNG clock */ + // MXC_SYS_PERIPH_CLOCK_SMPHR = + // (MXC_F_GCR_PCLKDIS1_SMPHR_POS + 32), /**< Disable SMPHR clock */ MXC_SYS_PERIPH_CLOCK_CRC = - (MXC_F_GCR_PCLKDIS1_CRC_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_CRC clock */ + (MXC_F_GCR_PCLKDIS1_CRC_POS + 32), /**< Disable CRC clock */ MXC_SYS_PERIPH_CLOCK_AES = - (MXC_F_GCR_PCLKDIS1_AES_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_AES clock */ - MXC_SYS_PERIPH_CLOCK_I2S = - (MXC_F_GCR_PCLKDIS1_I2S_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_I2S clock */ - MXC_SYS_PERIPH_CLOCK_SPI0 = - (MXC_F_GCR_PCLKDIS1_SPI0_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_SPI0 clock */ - MXC_SYS_PERIPH_CLOCK_I2C2 = - (MXC_F_GCR_PCLKDIS1_I2C2_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_I2C2 clock */ - MXC_SYS_PERIPH_CLOCK_WDT0 = - (MXC_F_GCR_PCLKDIS1_WDT0_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_WDT0 clock */ - MXC_SYS_PERIPH_CLOCK_CPU1 = - (MXC_F_GCR_PCLKDIS1_CPU1_POS + 32), /**< Disable MXC_F_GCR_PCLKDIS1_CPU1 clock */ - /* LPGCR PCLKDIS Below this line we add 64 to seperate GCR and LPGCR registers */ - MXC_SYS_PERIPH_CLOCK_GPIO2 = - (MXC_F_LPGCR_PCLKDIS_GPIO2_POS + 64), /**< Disable MXC_F_LPGCR_PCLKDIS_GPIO2 clock */ - MXC_SYS_PERIPH_CLOCK_WDT1 = - (MXC_F_LPGCR_PCLKDIS_WDT1_POS + 64), /**< Disable MXC_F_LPGCR_PCLKDIS_WDT1 clock */ - MXC_SYS_PERIPH_CLOCK_TMR4 = - (MXC_F_LPGCR_PCLKDIS_TMR4_POS + 64), /**< Disable MXC_F_LPGCR_PCLKDIS_TMR4 clock */ - MXC_SYS_PERIPH_CLOCK_TMR5 = - (MXC_F_LPGCR_PCLKDIS_TMR5_POS + 64), /**< Disable MXC_F_LPGCR_PCLKDIS_TMR5 clock */ - MXC_SYS_PERIPH_CLOCK_UART3 = - (MXC_F_LPGCR_PCLKDIS_UART3_POS + 64), /**< Disable MXC_F_LPGCR_PCLKDIS_UART3 clock */ - MXC_SYS_PERIPH_CLOCK_LPCOMP = - (MXC_F_LPGCR_PCLKDIS_LPCOMP_POS + 64), /**< Disable MXC_F_LPGCR_PCLKDIS_LPCOMP clock */ + (MXC_F_GCR_PCLKDIS1_AES_POS + 32), /**< Disable AES clock */ + // MXC_SYS_PERIPH_CLOCK_SPI = + // (MXC_F_GCR_PCLKDIS1_SPI_POS + 32), /**< Disable SPI clock */ + // TODO(JC): The SPI clock disable is defined in both PCLKDIS0 and PCLKDIS1 + MXC_SYS_PERIPH_CLOCK_WDT = + (MXC_F_GCR_PCLKDIS1_WDT_POS), /**< Disable WDT clock */ } mxc_sys_periph_clock_t; /** @brief Enumeration to select System Clock source */ @@ -167,8 +118,9 @@ typedef enum { MXC_V_GCR_CLKCTRL_SYSCLK_SEL_INRO, /**< Select the Internal Nanoring Oscillator (INRO) */ MXC_SYS_CLOCK_ERTCO = MXC_V_GCR_CLKCTRL_SYSCLK_SEL_ERTCO, /**< Select the External RTC Crystal Oscillator */ - MXC_SYS_CLOCK_EXTCLK = - MXC_V_GCR_CLKCTRL_SYSCLK_SEL_EXTCLK /**< Use the external system clock input */ + // MXC_SYS_CLOCK_EXTCLK = + // MXC_V_GCR_CLKCTRL_SYSCLK_SEL_EXTCLK /**< Use the external system clock input */ + // TODO(JC): ^^^ EXTCLK select is missing from gcr_regs.h (should be 0x7) } mxc_sys_system_clock_t; /** @brief Enumeration to set the System Clock divider */ From bd8b0fdcab48776b639e10275596fd9a495df0f7 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Tue, 30 Apr 2024 19:22:31 -0600 Subject: [PATCH 05/41] Add basic system implementation --- .../Device/Maxim/MAX32657/Include/max32657.h | 9 ++ .../Maxim/MAX32657/Source/system_max32657.c | 132 ++++++++++++++++++ 2 files changed, 141 insertions(+) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index da1a488d282..35efa6c2eb9 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -31,6 +31,7 @@ #define MXC_NUMCORES 1 #include +#include "system_max32657.h" #ifndef FALSE #define FALSE (0) @@ -768,4 +769,12 @@ We may want to handle GET_IRQ better... #define MXC_SETFIELD(reg, mask, setting) ((reg) = ((reg) & ~(mask)) | ((setting) & (mask))) +/******************************************************************************/ +/* CPACR Definitions */ +/* Note: Added by Maxim Integrated, as these are missing from CMSIS/Core/Include/core_cm33.h */ +#define SCB_CPACR_CP10_Pos 20 /*!< SCB CPACR: Coprocessor 10 Position */ +#define SCB_CPACR_CP10_Msk (0x3UL << SCB_CPACR_CP10_Pos) /*!< SCB CPACR: Coprocessor 10 Mask */ +#define SCB_CPACR_CP11_Pos 22 /*!< SCB CPACR: Coprocessor 11 Position */ +#define SCB_CPACR_CP11_Msk (0x3UL << SCB_CPACR_CP11_Pos) /*!< SCB CPACR: Coprocessor 11 Mask */ + #endif // LIBRARIES_CMSIS_DEVICE_MAXIM_MAX326657_INCLUDE_MAX32657_H_ diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c index 5b3c0874344..51078ce7a50 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c @@ -17,3 +17,135 @@ ******************************************************************************/ // TODO(ME30): System implementation + +#include "system_max32657.h" +#include "max32657.h" +#include "mxc_sys.h" +#include "icc.h" + +extern void (*const __isr_vector[])(void); +uint32_t SystemCoreClock = IPO_FREQ; // Part defaults to IPO on startup + +/* +The libc implementation from GCC 11+ depends on _getpid and _kill in some places. +There is no concept of processes/PIDs in the baremetal PeriphDrivers, therefore +we implement stub functions that return an error code to resolve linker warnings. +*/ +int _getpid(void) +{ + return E_NOT_SUPPORTED; +} + +int _kill(void) +{ + return E_NOT_SUPPORTED; +} + +__weak void SystemCoreClockUpdate(void) +{ + uint32_t base_freq, div, clk_src; + + // Get the clock source and frequency + clk_src = (MXC_GCR->clkctrl & MXC_F_GCR_CLKCTRL_SYSCLK_SEL); + switch (clk_src) { + case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_IPO: + base_freq = IPO_FREQ; + break; + case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_ERFO: + base_freq = ERFO_FREQ; + break; + case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_INRO: + base_freq = INRO_FREQ; + break; + case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_IBRO: + base_freq = IBRO_FREQ; + break; + case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_ERTCO: + base_freq = ERTCO_FREQ; + break; + // case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_EXTCLK: + // base_freq = EXTCLK_FREQ; + // break; + // TODO(JC): ^^^ Uncomment when EXTCLK register definition is added + default: + // Codes 001 and 111 are reserved. + // This code should never execute, however, initialize to safe value. + base_freq = HIRC_FREQ; + break; + } + + // Get the clock divider + div = (MXC_GCR->clkctrl & MXC_F_GCR_CLKCTRL_SYSCLK_DIV) >> MXC_F_GCR_CLKCTRL_SYSCLK_DIV_POS; + + SystemCoreClock = base_freq >> div; +} + +/* This function is called before C runtime initialization and can be + * implemented by the application for early initializations. If a value other + * than '0' is returned, the C runtime initialization will be skipped. + * + * You may over-ride this function in your program by defining a custom + * PreInit(), but care should be taken to reproduce the initialization steps + * or a non-functional system may result. + */ +__weak int PreInit(void) +{ + // TODO(JC): No SIMO on this device, confirm nothing needs to be done here. + + return 0; +} + +/* This function is called before the Board_Init function. This weak + * implementation does nothing, but you may over-ride this function in your + * program if you want to configure the state of all pins prior to the + * application running. This is useful when using external tools (like a + * Pin Mux configuration tool) that generate code to initialize the pins. + */ +__weak void PinInit(void) +{ + /* Do nothing */ +} + +/* This function can be implemented by the application to initialize the board */ +__weak int Board_Init(void) +{ + /* Do nothing */ + return 0; +} + +/* This function is called just before control is transferred to main(). + * + * You may over-ride this function in your program by defining a custom + * SystemInit(), but care should be taken to reproduce the initialization + * steps or a non-functional system may result. + */ +__weak void SystemInit(void) +{ + /* Configure the interrupt controller to use the application vector table in */ + /* the application space */ +#if defined(__CC_ARM) || defined(__GNUC__) + /* IAR sets the VTOR pointer incorrectly and causes stack corruption */ + SCB->VTOR = (uint32_t)__isr_vector; +#endif /* __CC_ARM || __GNUC__ */ + + /* Make sure interrupts are enabled. */ + __enable_irq(); + + /* Enable instruction cache */ + MXC_ICC_Enable(MXC_ICC); + + /* Enable FPU on Cortex-M4, which occupies coprocessor slots 10 & 11 */ + /* Grant full access, per "Table B3-24 CPACR bit assignments". */ + /* DDI0403D "ARMv7-M Architecture Reference Manual" */ + SCB->CPACR |= SCB_CPACR_CP10_Msk | SCB_CPACR_CP11_Msk; + __DSB(); + __ISB(); + + /* Change system clock source to the main high-speed clock */ + MXC_SYS_Clock_Select(MXC_SYS_CLOCK_IPO); + MXC_SYS_SetClockDiv(MXC_SYS_CLOCK_DIV_1); + SystemCoreClockUpdate(); + + PinInit(); + Board_Init(); +} \ No newline at end of file From e84319a67fad7e72792b8bdea4e90cb471d723e7 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Tue, 30 Apr 2024 19:28:04 -0600 Subject: [PATCH 06/41] Add MAX32657 Hello World --- Examples/MAX32657/Hello_World/.cproject | 81 ++++ Examples/MAX32657/Hello_World/.project | 26 ++ .../.settings/language.settings.xml | 15 + .../org.eclipse.cdt.codan.core.prefs | 93 +++++ .../.settings/org.eclipse.cdt.core.prefs | 15 + .../MAX32657/Hello_World/.vscode/README.md | 47 +++ .../Hello_World/.vscode/c_cpp_properties.json | 53 +++ .../MAX32657/Hello_World/.vscode/flash.gdb | 17 + .../MAX32657/Hello_World/.vscode/launch.json | 133 ++++++ .../Hello_World/.vscode/settings.json | 80 ++++ .../MAX32657/Hello_World/.vscode/tasks.json | 115 ++++++ .../MAX32657/Hello_World/Hello_World.launch | 62 +++ Examples/MAX32657/Hello_World/Makefile | 382 ++++++++++++++++++ Examples/MAX32657/Hello_World/README.md | 42 ++ Examples/MAX32657/Hello_World/main.c | 56 +++ Examples/MAX32657/Hello_World/project.mk | 10 + 16 files changed, 1227 insertions(+) create mode 100644 Examples/MAX32657/Hello_World/.cproject create mode 100644 Examples/MAX32657/Hello_World/.project create mode 100644 Examples/MAX32657/Hello_World/.settings/language.settings.xml create mode 100644 Examples/MAX32657/Hello_World/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 Examples/MAX32657/Hello_World/.settings/org.eclipse.cdt.core.prefs create mode 100755 Examples/MAX32657/Hello_World/.vscode/README.md create mode 100755 Examples/MAX32657/Hello_World/.vscode/c_cpp_properties.json create mode 100755 Examples/MAX32657/Hello_World/.vscode/flash.gdb create mode 100755 Examples/MAX32657/Hello_World/.vscode/launch.json create mode 100755 Examples/MAX32657/Hello_World/.vscode/settings.json create mode 100755 Examples/MAX32657/Hello_World/.vscode/tasks.json create mode 100644 Examples/MAX32657/Hello_World/Hello_World.launch create mode 100644 Examples/MAX32657/Hello_World/Makefile create mode 100644 Examples/MAX32657/Hello_World/README.md create mode 100644 Examples/MAX32657/Hello_World/main.c create mode 100644 Examples/MAX32657/Hello_World/project.mk diff --git a/Examples/MAX32657/Hello_World/.cproject b/Examples/MAX32657/Hello_World/.cproject new file mode 100644 index 00000000000..3a8a4199e81 --- /dev/null +++ b/Examples/MAX32657/Hello_World/.cproject @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/MAX32657/Hello_World/.project b/Examples/MAX32657/Hello_World/.project new file mode 100644 index 00000000000..d21c0a970b7 --- /dev/null +++ b/Examples/MAX32657/Hello_World/.project @@ -0,0 +1,26 @@ + + + Hello_World + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/Examples/MAX32657/Hello_World/.settings/language.settings.xml b/Examples/MAX32657/Hello_World/.settings/language.settings.xml new file mode 100644 index 00000000000..d32717b6f37 --- /dev/null +++ b/Examples/MAX32657/Hello_World/.settings/language.settings.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Examples/MAX32657/Hello_World/.settings/org.eclipse.cdt.codan.core.prefs b/Examples/MAX32657/Hello_World/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000000..59c0b37ba75 --- /dev/null +++ b/Examples/MAX32657/Hello_World/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,93 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.codan.checkers.errnoreturn=Warning +org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return\\")",implicit\=>false} +org.eclipse.cdt.codan.checkers.errreturnvalue=Error +org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused return value\\")"} +org.eclipse.cdt.codan.checkers.nocommentinside=-Error +org.eclipse.cdt.codan.checkers.nocommentinside.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Nesting comments\\")"} +org.eclipse.cdt.codan.checkers.nolinecomment=-Error +org.eclipse.cdt.codan.checkers.nolinecomment.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Line comments\\")"} +org.eclipse.cdt.codan.checkers.noreturn=Error +org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return value\\")",implicit\=>false} +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Abstract class cannot be instantiated\\")"} +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Ambiguous problem\\")"} +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment in condition\\")"} +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment to itself\\")"} +org.eclipse.cdt.codan.internal.checkers.CStyleCastProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.CStyleCastProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"C-Style cast instead of C++ cast\\")"} +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No break at end of case\\")",no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false,enable_fallthrough_quickfix_param\=>false} +org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning +org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Catching by reference is recommended\\")",unknown\=>false,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Circular inheritance\\")"} +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class members should be properly initialized\\")",skip\=>true} +org.eclipse.cdt.codan.internal.checkers.CopyrightProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.CopyrightProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Lack of copyright information\\")",regex\=>".*Copyright.*"} +org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem=Error +org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid 'decltype(auto)' specifier\\")"} +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Field cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Function cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.GotoStatementProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.GotoStatementProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Goto statement used\\")"} +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid arguments\\")"} +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid template argument\\")"} +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Label statement not found\\")"} +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Member declaration not found\\")"} +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Method cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.MissCaseProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissCaseProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing cases in switch\\")"} +org.eclipse.cdt.codan.internal.checkers.MissDefaultProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissDefaultProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing default in switch\\")",defaultWithAllEnums\=>false} +org.eclipse.cdt.codan.internal.checkers.MissReferenceProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing reference return value in assignment operator\\")"} +org.eclipse.cdt.codan.internal.checkers.MissSelfCheckProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissSelfCheckProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing self check in assignment operator\\")"} +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Name convention for function\\")",pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class has a virtual method and non-virtual destructor\\")"} +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid overload\\")"} +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redeclaration\\")"} +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redefinition\\")"} +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Return with parenthesis\\")"} +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Format String Vulnerability\\")"} +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Statement has no effect\\")",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suggested parenthesis around expression\\")",paramNot\=>false} +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suspicious semicolon\\")",else\=>false,afterelse\=>false} +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Type cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused function declaration\\")",macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused static function\\")",macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused variable declaration in file scope\\")",macro\=>true,exceptions\=>("@(\#)","$Id")} +org.eclipse.cdt.codan.internal.checkers.UsingInHeaderProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.UsingInHeaderProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Using directive in header\\")"} +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Symbol is not resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.VirtualMethodCallProblem=-Error +org.eclipse.cdt.codan.internal.checkers.VirtualMethodCallProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Virtual method call in constructor/destructor\\")"} +org.eclipse.cdt.qt.core.qtproblem=Warning +org.eclipse.cdt.qt.core.qtproblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>true,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>null} diff --git a/Examples/MAX32657/Hello_World/.settings/org.eclipse.cdt.core.prefs b/Examples/MAX32657/Hello_World/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000000..7634acd5b10 --- /dev/null +++ b/Examples/MAX32657/Hello_World/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,15 @@ +eclipse.preferences.version=1 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/value=EvKit_V1 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/operation=replace +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/value=arm-none-eabi- +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/value=Hello_World +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/value=MAX32657 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/append=true +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/appendContributed=true diff --git a/Examples/MAX32657/Hello_World/.vscode/README.md b/Examples/MAX32657/Hello_World/.vscode/README.md new file mode 100755 index 00000000000..5b355bd51c9 --- /dev/null +++ b/Examples/MAX32657/Hello_World/.vscode/README.md @@ -0,0 +1,47 @@ +# VSCode-Maxim + +_(If you're viewing this document from within Visual Studio Code you can press `CTRL+SHIFT+V` to open a Markdown preview window.)_ + +## Quick Links + +* [MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/) +* [VSCode-Maxim Github](https://github.com/analogdevicesinc/VSCode-Maxim) + +## Introduction + +VSCode-Maxim is a set of [Visual Studio Code](https://code.visualstudio.com/) project configurations and utilities for enabling embedded development for [Analog Device's MSDK](https://github.com/analogdevicesinc/msdk) and the [MAX32xxx/MAX78xxx microcontrollers](https://www.analog.com/en/product-category/microcontrollers.html). + +The following features are supported: + +* Code editing with intellisense down to the register level +* Code compilation with the ability to easily re-target a project for different microcontrollers and boards +* Flashing programs +* GUI and command-line debugging + +## Dependencies + +* [Visual Studio Code](https://code.visualstudio.com/) + * [C/C++ VSCode Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) + * [Cortex-Debug Extension](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug) +* [Analog Devices MSDK](https://analogdevicesinc.github.io/msdk/) + +## Installation + +Install the MSDK, then set `"MAXIM_PATH"` in your _user_ VS Code settings. + +See [Getting Started with Visual Studio Code](https://analogdevicesinc.github.io/msdk/USERGUIDE/#getting-started-with-visual-studio-code) in the MSDK User Guide for detailed instructions. + +## Usage + +See the [MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/#visual-studio-code) for detailed usage info. + +## Issue Tracker + +Bug reports, feature requests, and contributions are welcome via the [issues](https://github.com/analogdevicesinc/VSCode-Maxim/issues) tracker on Github. + +New issues should contain _at minimum_ the following information: + +* Visual Studio Code version #s (see `Help -> About`) +* C/C++ Extension version # +* Target microcontroller and evaluation platform +* The projects `.vscode` folder and `Makefile` (where applicable). Standard compression formats such as `.zip`, `.rar`, `.tar.gz`, etc. are all acceptable. diff --git a/Examples/MAX32657/Hello_World/.vscode/c_cpp_properties.json b/Examples/MAX32657/Hello_World/.vscode/c_cpp_properties.json new file mode 100755 index 00000000000..dfbed47b581 --- /dev/null +++ b/Examples/MAX32657/Hello_World/.vscode/c_cpp_properties.json @@ -0,0 +1,53 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc.exe", + "browse": { + "path": [ + "${default}" + ] + } + }, + { + "name": "Linux", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc", + "browse": { + "path": [ + "${default}" + ] + } + }, + { + "name": "Mac", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc", + "browse": { + "path": [ + "${default}" + ] + } + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Examples/MAX32657/Hello_World/.vscode/flash.gdb b/Examples/MAX32657/Hello_World/.vscode/flash.gdb new file mode 100755 index 00000000000..8f22801a47d --- /dev/null +++ b/Examples/MAX32657/Hello_World/.vscode/flash.gdb @@ -0,0 +1,17 @@ +define flash_m4 + set architecture armv7e-m + set remotetimeout 10 + target remote | openocd -c "gdb_port pipe;log_output flash.log" -s $arg0/scripts -f interface/$arg1 -f target/$arg2 -c "init; reset halt" + load + compare-sections + monitor reset halt +end + +define flash_m4_run + set architecture armv7e-m + set remotetimeout 10 + target remote | openocd -c "gdb_port pipe;log_output flash.log" -s $arg0/scripts -f interface/$arg1 -f target/$arg2 -c "init; reset halt" + load + compare-sections + monitor resume +end diff --git a/Examples/MAX32657/Hello_World/.vscode/launch.json b/Examples/MAX32657/Hello_World/.vscode/launch.json new file mode 100755 index 00000000000..01fe5199048 --- /dev/null +++ b/Examples/MAX32657/Hello_World/.vscode/launch.json @@ -0,0 +1,133 @@ +{ + "configurations": [ + { + "name": "Debug Arm (Cortex-debug)", + "cwd":"${workspaceRoot}", + "executable": "${workspaceFolder}/build/${config:program_file}", + "loadFiles": ["${workspaceFolder}/build/${config:program_file}"], + "symbolFiles": [{ + "file": "${workspaceFolder}/build/${config:symbol_file}" + }], + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "linux": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "serverpath": "${config:OCD_path}/openocd", + }, + "windows": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb.exe", + "serverpath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "serverpath": "${config:OCD_path}/openocd", + }, + "searchDir": ["${config:OCD_path}/scripts"], + "configFiles": ["interface/${config:M4_OCD_interface_file}", "target/${config:M4_OCD_target_file}"], + "interface": "swd", + "runToEntryPoint": "main", + "svdFile": "${config:MAXIM_PATH}/Libraries/CMSIS/Device/Maxim/${config:target}/Include/${config:target}.svd" + }, + { + "name": "GDB (Arm M4)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/${config:program_file}", + "args": [], + "stopAtEntry": true, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "linux": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "debugServerPath": "${config:OCD_path}/openocd", + }, + "windows": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb.exe", + "debugServerPath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "debugServerPath": "${config:OCD_path}/bin/openocd", + }, + "logging": { + "exceptions": true, + "trace": false, + "traceResponse": false, + "engineLogging": false + }, + "miDebuggerServerAddress": "localhost:3333", + "debugServerArgs": "-s ${config:OCD_path}/scripts -f interface/${config:M4_OCD_interface_file} -f target/${config:M4_OCD_target_file} -c \"init; reset halt\"", + "serverStarted": "Info : Listening on port 3333 for gdb connections", + "filterStderr": true, + "targetArchitecture": "arm", + "customLaunchSetupCommands": [ + {"text":"-list-features"} + ], + "setupCommands": [ + { "text":"set logging overwrite on"}, + { "text":"set logging file debug-arm.log"}, + { "text":"set logging on"}, + { "text":"cd ${workspaceFolder}" }, + { "text":"exec-file build/${config:program_file}" }, + { "text":"symbol-file build/${config:symbol_file}" }, + { "text":"target remote localhost:3333" }, + { "text":"monitor reset halt" }, + { "text":"set $pc=Reset_Handler"}, + { "text":"b main" } + ] + }, + { + "name": "GDB (RISC-V)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/buildrv/${config:program_file}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "linux": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb", + "debugServerPath": "${config:OCD_path}/openocd", + }, + "windows": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb.exe", + "debugServerPath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb", + "debugServerPath": "${config:OCD_path}/bin/openocd", + }, + "logging": { + "exceptions": true, + "trace": false, + "traceResponse": false, + "engineLogging": false + }, + "miDebuggerServerAddress": "localhost:3334", + "debugServerArgs": "-c \"gdb_port 3334\" -s ${config:OCD_path}/scripts -f interface/${config:RV_OCD_interface_file} -f target/${config:RV_OCD_target_file}", + "serverStarted": "Info : Listening on port 3334 for gdb connections", + "filterStderr": true, + "customLaunchSetupCommands": [ + {"text":"-list-features"} + ], + "targetArchitecture": "arm", + "setupCommands": [ + { "text":"set logging overwrite on"}, + { "text":"set logging file debug-riscv.log"}, + { "text":"set logging on"}, + { "text":"cd ${workspaceFolder}" }, + { "text": "set architecture riscv:rv32", "ignoreFailures": false }, + { "text":"exec-file build/${config:program_file}", "ignoreFailures": false }, + { "text":"symbol-file buildrv/${config:symbol_file}", "ignoreFailures": false }, + { "text":"target remote localhost:3334" }, + { "text":"b main" }, + { "text": "set $pc=Reset_Handler","ignoreFailures": false } + ] + } + ] +} diff --git a/Examples/MAX32657/Hello_World/.vscode/settings.json b/Examples/MAX32657/Hello_World/.vscode/settings.json new file mode 100755 index 00000000000..66194c6a77c --- /dev/null +++ b/Examples/MAX32657/Hello_World/.vscode/settings.json @@ -0,0 +1,80 @@ +{ + "terminal.integrated.env.windows": { + "Path":"${config:OCD_path};${config:ARM_GCC_path}/bin;${config:xPack_GCC_path}/bin;${config:MSYS_path}/usr/bin;${config:Make_path};${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + "terminal.integrated.defaultProfile.windows": "Command Prompt", + + "terminal.integrated.env.linux": { + "PATH":"${config:OCD_path}:${config:ARM_GCC_path}/bin:${config:xPack_GCC_path}/bin:${config:Make_path}:${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + "terminal.integrated.env.osx": { + "PATH":"${config:OCD_path}/bin:${config:ARM_GCC_path}/bin:${config:xPack_GCC_path}/bin:${config:Make_path}:${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + + "target":"MAX32657", + "board":"EvKit_V1", + + "project_name":"${workspaceFolderBasename}", + + "program_file":"${config:project_name}.elf", + "symbol_file":"${config:program_file}", + + "M4_OCD_interface_file":"cmsis-dap.cfg", + "M4_OCD_target_file":"max32657.cfg", + "RV_OCD_interface_file":"ftdi/olimex-arm-usb-ocd-h.cfg", + "RV_OCD_target_file":"${config:target}_riscv.cfg", + + "v_Arm_GCC":"10.3", + "v_xPack_GCC":"12.2.0-3.1", + + "OCD_path":"${config:MAXIM_PATH}/Tools/OpenOCD", + "ARM_GCC_path":"${config:MAXIM_PATH}/Tools/GNUTools/${config:v_Arm_GCC}", + "xPack_GCC_path":"${config:MAXIM_PATH}/Tools/xPack/riscv-none-elf-gcc/${config:v_xPack_GCC}", + "Make_path":"${config:MAXIM_PATH}/Tools/GNUTools/Make", + "MSYS_path":"${config:MAXIM_PATH}/Tools/MSYS2", + + "C_Cpp.default.includePath": [ + "${workspaceFolder}", + "${workspaceFolder}/**", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/Include", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/${config:board}/Include", + "${config:MAXIM_PATH}/Libraries/CMSIS/Device/Maxim/${config:target}/Include", + "${config:MAXIM_PATH}/Libraries/CMSIS/5.9.0/Core/Include", + "${config:MAXIM_PATH}/Libraries/CMSIS/Include", + "${config:ARM_GCC_path}/arm-none-eabi/include", + "${config:ARM_GCC_path}/lib/gcc/arm-none-eabi/${config:v_Arm_GCC}/include", + "${config:MAXIM_PATH}/Libraries/PeriphDrivers/Include/${config:target}", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Camera", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display/fonts", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/ExtMemory", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/LED", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PMIC", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PushButton", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Touchscreen" + ], + "C_Cpp.default.browse.path": [ + "${workspaceFolder}", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/Source", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/${config:board}/Source", + "${config:MAXIM_PATH}/Libraries/PeriphDrivers/Source", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Camera", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display/fonts", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/LED", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PMIC", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PushButton", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Touchscreen", + "${config:MAXIM_PATH}/Libraries/MiscDrivers" + ], + "C_Cpp.default.defines": [ + + ], + "C_Cpp.default.forcedInclude": [ + "${workspaceFolder}/build/project_defines.h" + ] +} + diff --git a/Examples/MAX32657/Hello_World/.vscode/tasks.json b/Examples/MAX32657/Hello_World/.vscode/tasks.json new file mode 100755 index 00000000000..e95445e2b3e --- /dev/null +++ b/Examples/MAX32657/Hello_World/.vscode/tasks.json @@ -0,0 +1,115 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "make -r -j 8 --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -r -j 8 --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "clean", + "type": "shell", + "command": "make -j 8 clean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -j 8 clean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "clean-periph", + "type": "shell", + "command": "make -j 8 distclean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -j 8 distclean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "flash", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--cd=\"${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "-x=\"${workspaceFolder}/.vscode/flash.gdb\"", + "--ex=\"flash_m4 ${config:OCD_path} ${config:M4_OCD_interface_file} ${config:M4_OCD_target_file}\"", + "--batch" + ], + "group": "build", + "problemMatcher": [], + "dependsOn":["build"] + }, + { + "label": "flash & run", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--cd=\"${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "-x=\"${workspaceFolder}/.vscode/flash.gdb\"", + "--ex=\"flash_m4_run ${config:OCD_path} ${config:M4_OCD_interface_file} ${config:M4_OCD_target_file}\"", + "--batch" + ], + "group": "build", + "problemMatcher": [], + "dependsOn":["build"] + }, + { + "label": "erase flash", + "type": "shell", + "command": "openocd", + "args": [ + "-s", "${config:OCD_path}/scripts", + "-f", "interface/${config:M4_OCD_interface_file}", + "-f", "target/${config:M4_OCD_target_file}", + "-c", "\"init; reset halt; max32xxx mass_erase 0;\"", + "-c", "exit" + ], + "group":"build", + "problemMatcher": [], + "dependsOn":[] + }, + { + "label": "openocd (m4)", + "type": "shell", + "command": "openocd", + "args": [ + "-s", + "${config:OCD_path}/scripts", + "-f", + "interface/${config:M4_OCD_interface_file}", + "-f", + "target/${config:M4_OCD_target_file}", + "-c", + "\"init; reset halt\"" + ], + "problemMatcher": [], + "dependsOn":[] + }, + { + "label": "gdb (m4)", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--ex=\"cd ${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "--ex=\"target remote localhost:3333\"", + "--ex=\"monitor reset halt\"", + "--ex=\"b main\"", + "--ex=\"c\"" + ], + "problemMatcher": [], + "dependsOn":[] + }, + ] +} \ No newline at end of file diff --git a/Examples/MAX32657/Hello_World/Hello_World.launch b/Examples/MAX32657/Hello_World/Hello_World.launch new file mode 100644 index 00000000000..208feecdd1f --- /dev/null +++ b/Examples/MAX32657/Hello_World/Hello_World.launch @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/MAX32657/Hello_World/Makefile b/Examples/MAX32657/Hello_World/Makefile new file mode 100644 index 00000000000..6c2b40a794a --- /dev/null +++ b/Examples/MAX32657/Hello_World/Makefile @@ -0,0 +1,382 @@ +############################################################################### + # + # Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by + # Analog Devices, Inc.), + # Copyright (C) 2023-2024 Analog Devices, Inc. + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + # + ############################################################################## + +# ** Readme! ** +# Don't edit this file! This is the core Makefile for a MaximSDK +# project. The available configuration options can be overridden +# in "project.mk", on the command-line, or with system environment +# variables. + +# See https://analogdevicesinc.github.io/msdk/USERGUIDE/#build-system +# for more detailed instructions on how to use this system. + +# The detailed instructions mentioned above are easier to read than +# this file, but the comments found in this file also outline the +# available configuration variables. This file is organized into +# sub-sections, some of which expose config variables. + + +# ******************************************************************************* +# Set the target microcontroller and board to compile for. + +# Every TARGET microcontroller has some Board Support Packages (BSPs) that are +# available for it under the MaximSDK/Libraries/Boards/TARGET folder. The BSP +# that gets selected is MaximSDK/Libraries/Boards/TARGET/BOARD. + +# Configuration Variables: +# - TARGET : Override the default target microcontroller. Ex: TARGET=MAX78000 +# - BOARD : Override the default BSP (case sensitive). Ex: BOARD=EvKit_V1, BOARD=FTHR_RevA + + +ifeq "$(TARGET)" "" +# Default target microcontroller +TARGET := MAX32657 +TARGET_UC := MAX32657 +TARGET_LC := max32657 +else +# "TARGET" has been overridden in the environment or on the command-line. +# We need to calculate an upper and lowercase version of the part number, +# because paths on Linux and MacOS are case-sensitive. +TARGET_UC := $(subst m,M,$(subst a,A,$(subst x,X,$(TARGET)))) +TARGET_LC := $(subst M,m,$(subst A,a,$(subst X,x,$(TARGET)))) +endif + +# Default board. +BOARD ?= EvKit_V1 + +# ******************************************************************************* +# Locate the MaximSDK + +# This Makefile needs to know where to find the MaximSDK, and the MAXIM_PATH variable +# should point to the root directory of the MaximSDK installation. Setting this manually +# is usually only required if you're working on the command-line. + +# If MAXIM_PATH is not specified, we assume the project still lives inside of the MaximSDK +# and move up from this project's original location. + +# Configuration Variables: +# - MAXIM_PATH : Tell this Makefile where to find the MaximSDK. Ex: MAXIM_PATH=C:/MaximSDK + + +ifneq "$(MAXIM_PATH)" "" +# Sanitize MAXIM_PATH for backslashes +MAXIM_PATH := $(subst \,/,$(MAXIM_PATH)) +# Locate some other useful paths... +LIBS_DIR := $(abspath $(MAXIM_PATH)/Libraries) +CMSIS_ROOT := $(LIBS_DIR)/CMSIS +endif + +# ******************************************************************************* +# Include project Makefile. We do this after formulating TARGET, BOARD, and MAXIM_PATH +# in case project.mk needs to reference those values. However, we also include +# this as early as possible in the Makefile so that it can append to or override +# the variables below. + + +PROJECTMK ?= $(abspath ./project.mk) +include $(PROJECTMK) +$(info Loaded project.mk) +# PROJECTMK is also used by implicit rules and other libraries to add project.mk as a watch file + +# ******************************************************************************* +# Final path sanitization and re-calculation. No options here. + +ifeq "$(MAXIM_PATH)" "" +# MAXIM_PATH is still not defined... +DEPTH := ../../../ +MAXIM_PATH := $(abspath $(DEPTH)) +$(warning Warning: MAXIM_PATH is not set! Set MAXIM_PATH in your environment or in project.mk to clear this warning.) +$(warning Warning: Attempting to use $(MAXIM_PATH) calculated from relative path) +else +# Sanitize MAXIM_PATH for backslashes +MAXIM_PATH := $(subst \,/,$(MAXIM_PATH)) +endif + +# Final recalculation of LIBS_DIR/CMSIS_ROOT +LIBS_DIR := $(abspath $(MAXIM_PATH)/Libraries) +CMSIS_ROOT := $(LIBS_DIR)/CMSIS + +# One final UC/LC check in case user set TARGET in project.mk +TARGET_UC := $(subst m,M,$(subst a,A,$(subst x,X,$(TARGET)))) +TARGET_LC := $(subst M,m,$(subst A,a,$(subst X,x,$(TARGET)))) + +export TARGET +export TARGET_UC +export TARGET_LC +export CMSIS_ROOT +# TODO: Remove dependency on exports for these variables. + +# ******************************************************************************* +# Set up search paths, and auto-detect all source code on those paths. + +# The following paths are searched by default, where "./" is the project directory. +# ./ +# |- *.h +# |- *.c +# |-include (optional) +# |- *.h +# |-src (optional) +# |- *.c + +# Configuration Variables: +# - VPATH : Tell this Makefile to search additional locations for source (.c) files. +# You should use the "+=" operator with this option. +# Ex: VPATH += your/new/path +# - IPATH : Tell this Makefile to search additional locations for header (.h) files. +# You should use the "+=" operator with this option. +# Ex: VPATH += your/new/path +# - SRCS : Tell this Makefile to explicitly add a source (.c) file to the build. +# This is really only useful if you want to add a source file that isn't +# on any VPATH, in which case you can add the full path to the file here. +# You should use the "+=" operator with this option. +# Ex: SRCS += your/specific/source/file.c +# - AUTOSEARCH : Set whether this Makefile should automatically detect .c files on +# VPATH and add them to the build. This is enabled by default. Set +# to 0 to disable. If autosearch is disabled, source files must be +# manually added to SRCS. +# Ex: AUTOSEARCH = 0 + + +# Where to find source files for this project. +VPATH += . +VPATH += src +VPATH := $(VPATH) + +# Where to find header files for this project +IPATH += . +IPATH += include +IPATH := $(IPATH) + +AUTOSEARCH ?= 1 +ifeq ($(AUTOSEARCH), 1) +# Auto-detect all C/C++ source files on VPATH +SRCS += $(wildcard $(addsuffix /*.c, $(VPATH))) +SRCS += $(wildcard $(addsuffix /*.cpp, $(VPATH))) +endif + +# Collapse SRCS before passing them on to the next stage +SRCS := $(SRCS) + +# ******************************************************************************* +# Set the output filename + +# Configuration Variables: +# - PROJECT : Override the default output filename. Ex: PROJECT=MyProject + + +# The default value creates a file named after the target micro. Ex: MAX78000.elf +PROJECT ?= $(TARGET_LC) + +# ******************************************************************************* +# Compiler options + +# Configuration Variables: +# - DEBUG : Set DEBUG=1 to build explicitly for debugging. This adds some additional +# symbols and sets -Og as the default optimization level. +# - MXC_OPTIMIZE_CFLAGS : Override the default compiler optimization level. +# Ex: MXC_OPTIMIZE_CFLAGS = -O2 +# - PROJ_CFLAGS : Add additional compiler flags to the build. +# You should use the "+=" operator with this option. +# Ex: PROJ_CFLAGS += -Wextra +# - MFLOAT_ABI : Set the floating point acceleration level. +# The only options are "hard", "soft", or "softfp". +# Ex: MFLOAT_ABI = hard +# - LINKERFILE : Override the default linkerfile. +# Ex: LINKERFILE = customlinkerfile.ld +# - LINKERPATH : Override the default search location for $(LINKERFILE) +# The default search location is $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/GCC +# If $(LINKERFILE) cannot be found at this path, then the root project +# directory will be used as a fallback. + +# Select 'GCC' or 'IAR' compiler +ifeq "$(COMPILER)" "" +COMPILER := GCC +endif + +# Set default compiler optimization levels +ifeq "$(MAKECMDGOALS)" "release" +# Default optimization level for "release" builds (make release) +MXC_OPTIMIZE_CFLAGS ?= -O2 +DEBUG = 0 +endif + +ifeq ($(DEBUG),1) +# Optimizes for debugging as recommended +# by GNU for code-edit-debug cycles +# https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options +MXC_OPTIMIZE_CFLAGS := -Og +endif + +# Default level if not building for release or explicitly for debug +MXC_OPTIMIZE_CFLAGS ?= -Og + +# Set compiler flags +PROJ_CFLAGS += -Wall # Enable warnings +PROJ_CFLAGS += -DMXC_ASSERT_ENABLE + +# Set hardware floating point acceleration. +# Options are: +# - hard +# - soft +# - softfp (default if MFLOAT_ABI is not set) +MFLOAT_ABI ?= softfp +# MFLOAT_ABI must be exported to other Makefiles +export MFLOAT_ABI + +# This path contains system-level intialization files for the target micro. Add to the build. +VPATH += $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source + +# ******************************************************************************* +# Secure Boot Tools (SBT) + +# This section integrates the Secure Boot Tools. It's intended for use with +# microcontrollers that have a secure bootloader. + +# Enabling SBT integration will add some special rules, such as "make sla", "make scpa", etc. + +# Configuration variables: +# SBT : Toggle SBT integration. Set to 1 to enable, or 0 +# to disable +# MAXIM_SBT_DIR : Specify the location of the SBT tool binaries. This defaults to +# Tools/SBT in the MaximSDK. The standalone SBT installer will override +# this via an environment variable. +# TARGET_SEC : Specify the part number to be passed into the SBT. This should match +# the secure variant part #. The default value will depend on TARGET. +# For example, TARGET=MAX32650 will result in TARGET_SEC=MAX32651, and +# the default selection happens in Tools/SBT/SBT-config. +# However, if there are multiple secure part #s for the target +# microcontroller this variable may need to be changed. + +SBT ?= 0 +ifeq ($(SBT), 1) +MAXIM_SBT_DIR ?= $(MAXIM_PATH)/Tools/SBT +MAXIM_SBT_DIR := $(subst \,/,$(MAXIM_SBT_DIR)) +# ^ Must sanitize path for \ on Windows, since this may come from an environment +# variable. + +export MAXIM_SBT_DIR # SBTs must have this environment variable defined to work + +# SBT-config.mk and SBT-rules.mk are included further down this Makefile. + +endif # SBT + +# ******************************************************************************* +# Default goal selection. This section allows you to override the default goal +# that will run if no targets are specified on the command-line. +# (ie. just running 'make' instead of 'make all') + +# Configuration variables: +# .DEFAULT_GOAL : Set the default goal if no targets were specified on the +# command-line +# ** "override" must be used with this variable. ** +# Ex: "override .DEFAULT_GOAL = mygoal" + +ifeq "$(.DEFAULT_GOAL)" "" +ifeq ($(SBT),1) +override .DEFAULT_GOAL := sla +else +override .DEFAULT_GOAL := all +endif +endif + +# Developer note: 'override' is used above for legacy Makefile compatibility. +# gcc.mk/gcc_riscv.mk need to hard-set 'all' internally, so this new system +# uses 'override' to come in over the top without breaking old projects. + +# It's also necessary to explicitly set MAKECMDGOALS... +ifeq "$(MAKECMDGOALS)" "" +MAKECMDGOALS:=$(.DEFAULT_GOAL) +endif + +# Enable colors when --sync-output is used. +# See https://www.gnu.org/software/make/manual/make.html#Terminal-Output (section 13.2) +ifneq ($(MAKE_TERMOUT),) +PROJ_CFLAGS += -fdiagnostics-color=always +endif + +ifneq ($(FORCE_COLOR),) +PROJ_CFLAGS += -fdiagnostics-color=always +endif + +# ******************************************************************************* +# Include SBT config. We need to do this here because it needs to know +# the current MAKECMDGOAL. +ifeq ($(SBT),1) +include $(MAXIM_PATH)/Tools/SBT/SBT-config.mk +endif + +# ******************************************************************************* +# Libraries + +# This section offers "toggle switches" to include or exclude the libraries that +# are available in the MaximSDK. Set a configuration variable to 1 to include the +# library in the build, or 0 to exclude. + +# Each library may also have its own library specific configuration variables. See +# Libraries/libs.mk for more details. + +# Configuration variables: +# - LIB_BOARD : Include the Board-Support Package (BSP) library. (Enabled by default) +# - LIB_PERIPHDRIVERS : Include the peripheral driver library. (Enabled by default) +# - LIB_CMSIS_DSP : Include the CMSIS-DSP library. +# - LIB_CORDIO : Include the Cordio BLE library +# - LIB_FCL : Include the Free Cryptographic Library (FCL) +# - LIB_FREERTOS : Include the FreeRTOS and FreeRTOS-Plus-CLI libraries +# - LIB_LC3 : Include the Low Complexity Communication Codec (LC3) library +# - LIB_LITTLEFS : Include the "little file system" (littleFS) library +# - LIB_LWIP : Include the lwIP library +# - LIB_MAXUSB : Include the MAXUSB library +# - LIB_SDHC : Include the SDHC library + +include $(LIBS_DIR)/libs.mk + + +# ******************************************************************************* +# Rules + +# Include the rules for building for this target. All other makefiles should be +# included before this one. +include $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/$(COMPILER)/$(TARGET_LC).mk + +# Include the rules that integrate the SBTs. SBTs are a special case that must be +# include after the core gcc rules to extend them. +ifeq ($(SBT), 1) +include $(MAXIM_PATH)/Tools/SBT/SBT-rules.mk +endif + + +# Get .DEFAULT_GOAL working. +ifeq "$(MAKECMDGOALS)" "" +MAKECMDGOALS:=$(.DEFAULT_GOAL) +endif + + +all: +# Extend the functionality of the "all" recipe here + arm-none-eabi-size --format=berkeley $(BUILD_DIR)/$(PROJECT).elf + +libclean: + $(MAKE) -f ${PERIPH_DRIVER_DIR}/periphdriver.mk clean.periph + +clean: +# Extend the functionality of the "clean" recipe here + +# The rule to clean out all the build products. +distclean: clean libclean diff --git a/Examples/MAX32657/Hello_World/README.md b/Examples/MAX32657/Hello_World/README.md new file mode 100644 index 00000000000..cdff97576e7 --- /dev/null +++ b/Examples/MAX32657/Hello_World/README.md @@ -0,0 +1,42 @@ +## Description + +A basic getting started program. + +This version of Hello_World prints an incrementing count to the console UART and toggles a LED0 every 500 ms. + + +## Software + +### Project Usage + +Universal instructions on building, flashing, and debugging this project can be found in the **[MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/)**. + +### Project-Specific Build Notes + +* This project comes pre-configured for the MAX32655EVKIT. See [Board Support Packages](https://analogdevicesinc.github.io/msdk/USERGUIDE/#board-support-packages) in the MSDK User Guide for instructions on changing the target board. + +## Required Connections +If using the MAX32655EVKIT (EvKit\_V1): +- Connect a USB cable between the PC and the CN1 (USB/PWR) connector. +- Connect pins JP4(RX_SEL) and JP5(TX_SEL) to RX0 and TX0 header. +- Open an terminal application on the PC and connect to the EV kit's console UART at 115200, 8-N-1. +- Close jumper JP2 (LED0 EN). +- Close jumper JP3 (LED1 EN). + +If using the MAX32655FTHR (FTHR\_Apps\_P1): +- Connect a USB cable between the PC and the J4 (USB/PWR) connector. +- Open an terminal application on the PC and connect to the board's console UART at 115200, 8-N-1. + +## Expected Output + +The Console UART of the device will output these messages: + +``` +Hello World! +count : 0 +count : 1 +count : 2 +count : 3 +``` + +You will also observe LED0 blinking at a rate of 2Hz. diff --git a/Examples/MAX32657/Hello_World/main.c b/Examples/MAX32657/Hello_World/main.c new file mode 100644 index 00000000000..5a4ce99ba9d --- /dev/null +++ b/Examples/MAX32657/Hello_World/main.c @@ -0,0 +1,56 @@ +/****************************************************************************** + * + * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by + * Analog Devices, Inc.), + * Copyright (C) 2023-2024 Analog Devices, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +/** + * @file main.c + * @brief Hello World! + * @details This example uses the UART to print to a terminal and flashes an LED. + */ + +/***** Includes *****/ +#include +#include +#include "mxc_device.h" +#include "led.h" +#include "pb.h" +#include "board.h" +#include "mxc_delay.h" + +/***** Definitions *****/ + +/***** Globals *****/ + +/***** Functions *****/ + +// ***************************************************************************** +int main(void) +{ + int count = 0; + + printf("Hello World!\n"); + + while (1) { + LED_On(LED_RED); + MXC_Delay(500000); + LED_Off(LED_RED); + MXC_Delay(500000); + printf("count = %d\n", count++); + } +} diff --git a/Examples/MAX32657/Hello_World/project.mk b/Examples/MAX32657/Hello_World/project.mk new file mode 100644 index 00000000000..c5bb8a2183b --- /dev/null +++ b/Examples/MAX32657/Hello_World/project.mk @@ -0,0 +1,10 @@ +# This file can be used to set build configuration +# variables. These variables are defined in a file called +# "Makefile" that is located next to this one. + +# For instructions on how to use this system, see +# https://analogdevicesinc.github.io/msdk/USERGUIDE/#build-system + +# ********************************************************** + +# Add your config here! From 05b71fc342d2f2686bda52dec63f89d45924c6d4 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Tue, 30 Apr 2024 19:28:23 -0600 Subject: [PATCH 07/41] Fix comment typo --- Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 35efa6c2eb9..67ac023cab0 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -604,7 +604,7 @@ We may want to handle GET_IRQ better... /******************************************************************************/ /* UART / Serial Port Interface */ #define MXC_UART_INSTANCES (1) -#define MXC_UART_FIFO_DEPTH (8) // TOD(ME30): Check this is correct. +#define MXC_UART_FIFO_DEPTH (8) // TODO(ME30): Check this is correct. /* Non-secure Mapping */ #define MXC_BASE_UART_NS ((uint32_t)0x40042000UL) From 1ddd3e7cda1551880bca83556cd95567a1406635 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Wed, 1 May 2024 12:03:40 -0600 Subject: [PATCH 08/41] Update readme --- Examples/MAX32657/Hello_World/README.md | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Examples/MAX32657/Hello_World/README.md b/Examples/MAX32657/Hello_World/README.md index cdff97576e7..c64b76a6473 100644 --- a/Examples/MAX32657/Hello_World/README.md +++ b/Examples/MAX32657/Hello_World/README.md @@ -13,19 +13,9 @@ Universal instructions on building, flashing, and debugging this project can be ### Project-Specific Build Notes -* This project comes pre-configured for the MAX32655EVKIT. See [Board Support Packages](https://analogdevicesinc.github.io/msdk/USERGUIDE/#board-support-packages) in the MSDK User Guide for instructions on changing the target board. +* This project comes pre-configured for the MAX32657EVKIT. See [Board Support Packages](https://analogdevicesinc.github.io/msdk/USERGUIDE/#board-support-packages) in the MSDK User Guide for instructions on changing the target board. ## Required Connections -If using the MAX32655EVKIT (EvKit\_V1): -- Connect a USB cable between the PC and the CN1 (USB/PWR) connector. -- Connect pins JP4(RX_SEL) and JP5(TX_SEL) to RX0 and TX0 header. -- Open an terminal application on the PC and connect to the EV kit's console UART at 115200, 8-N-1. -- Close jumper JP2 (LED0 EN). -- Close jumper JP3 (LED1 EN). - -If using the MAX32655FTHR (FTHR\_Apps\_P1): -- Connect a USB cable between the PC and the J4 (USB/PWR) connector. -- Open an terminal application on the PC and connect to the board's console UART at 115200, 8-N-1. ## Expected Output From 19787250196471f1ef0522253f960190fd08f5a8 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Wed, 1 May 2024 15:39:14 -0600 Subject: [PATCH 09/41] Update ME30 linker script - Target secure memory regions by default (CPU boots into secure mode by default) - Update memory layout and sizes - Remove dual-core/shared/mailbox (single-core device) --- .../Maxim/MAX32657/Source/GCC/max32657.ld | 60 +++++++------------ 1 file changed, 20 insertions(+), 40 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld index 695e2f01d09..72aae01c65d 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld @@ -1,8 +1,6 @@ /****************************************************************************** * - * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by - * Analog Devices, Inc.), - * Copyright (C) 2023-2024 Analog Devices, Inc. + * Copyright (C) 2024 Analog Devices, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,9 +17,12 @@ ******************************************************************************/ MEMORY { - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 0x00010000 /* 64kB ROM */ - FLASH (rx) : ORIGIN = 0x10000000, LENGTH = 0x00080000 /* 512KB Flash */ - SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 /* 128kB SRAM */ + ROM_S (rx) : ORIGIN = 0x00000000, LENGTH = 0x00010000 /* 64kB secure ROM (ROM always secure) */ + FLASH_NS (rx) : ORIGIN = 0x01000000, LENGTH = 0x00100000 /* 1MB non-secure Flash */ + SRAM_NS (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 /* 256KB non-secure SRAM */ + FLASH_S (rx) : ORIGIN = 0x11000000, LENGTH = 0x00100000 /* 1MB secure Flash */ + FLASH_INFO_S (rx) : ORIGIN = 0x12000000, LENGTH = 0x00010000 /* 16KB secure Flash Info */ + SRAM_S (rwx) : ORIGIN = 0x30000000, LENGTH = 0x00040000 /* 256KB secure SRAM */ } SECTIONS { @@ -29,7 +30,7 @@ SECTIONS { { KEEP(*(.rom_vector)) *(.rom_handlers*) - } > ROM + } > ROM_S .text : { @@ -58,12 +59,12 @@ SECTIONS { /* C++ Exception handling */ KEEP(*(.eh_frame*)) _etext = .; - } > FLASH + } > FLASH_S .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) - } > FLASH + } > FLASH_S /* Binary import */ .bin_storage : @@ -73,7 +74,7 @@ SECTIONS { KEEP(*(.bin_storage_img)) _bin_end_ = .; . = ALIGN(4); - } > FLASH + } > FLASH_S .rom_code : { @@ -81,7 +82,7 @@ SECTIONS { _sran_code = .; *(.rom_code_section) _esran_code = .; - } > ROM + } > ROM_S .flash_code : { @@ -89,7 +90,7 @@ SECTIONS { _sran_code = .; *(.flash_code_section) _esran_code = .; - } > FLASH + } > FLASH_S .sram_code : { @@ -97,7 +98,7 @@ SECTIONS { _sran_code = .; *(.sram_code_section) _esran_code = .; - } > SRAM + } > SRAM_S /* it's used for C++ exception handling */ /* we need to keep this to avoid overlapping */ @@ -106,7 +107,7 @@ SECTIONS { __exidx_start = .; *(.ARM.exidx* .gnu.linkonce.armexidx.*) __exidx_end = .; - } > FLASH + } > FLASH_S .data : { @@ -137,7 +138,7 @@ SECTIONS { PROVIDE_HIDDEN (__fini_array_end = .); _edata = ALIGN(., 4); - } > SRAM AT>FLASH + } > SRAM_S AT>FLASH_S __load_data = LOADADDR(.data); .bss : @@ -145,24 +146,12 @@ SECTIONS { . = ALIGN(4); _bss = .; *(.bss*) /*read-write zero initialized data: uninitialzed global variable*/ - *(COMMON) _ebss = ALIGN(., 4); - } > SRAM - - .shared : - { - . = ALIGN(4); - _shared = .; - *(.mailbox*) - . = ALIGN(4); - *(.shared*) /*read-write zero initialized data: uninitialzed global variable*/ - _eshared = ALIGN(., 4); - } > SRAM AT>FLASH - __shared_data = LOADADDR(.shared); + } > SRAM_S /* Set stack top to end of RAM, and stack limit move down by * size of stack_dummy section */ - __StackTop = ORIGIN(SRAM) + LENGTH(SRAM); + __StackTop = ORIGIN(SRAM_S) + LENGTH(SRAM_S); __StackLimit = __StackTop - SIZEOF(.stack_dummy); /* .stack_dummy section doesn't contains any symbols. It is only @@ -171,27 +160,18 @@ SECTIONS { .stack_dummy (COPY): { *(.stack*) - } > SRAM + } > SRAM_S .heap (COPY): { . = ALIGN(4); *(.heap*) __HeapLimit = ABSOLUTE(__StackLimit); - } > SRAM + } > SRAM_S PROVIDE(__stack = __StackTop); /* Check if data + heap + stack exceeds RAM limit */ ASSERT(__StackLimit >= _ebss, "region RAM overflowed with stack") - /* Section used by RISCV loader projects. See RISCV_LOAD documentation in the build system. */ - .riscv_flash : - { - /* Align address to mod 256 with a small offset. This is required to match the flash page size.*/ - . = ALIGN(256); /* ALIGN operatator is used here. Note that (. & 0x1FFFFF00) was used in the past, but a strange bug was seen on Windows where the & did not behave as expected.*/ - . += 0x100; - _riscv_boot = .; - KEEP(*riscv.o (.text*)) - } > FLASH } From 68338cc6e44b0ede6192c4cec56be43e9e9c47e9 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Wed, 1 May 2024 15:40:28 -0600 Subject: [PATCH 10/41] Update .arch value for startup assembly file --- .../Maxim/MAX32657/Source/GCC/startup_max32657.S | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/startup_max32657.S b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/startup_max32657.S index 4bad29772e9..6d472f73a13 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/startup_max32657.S +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/startup_max32657.S @@ -19,15 +19,15 @@ ******************************************************************************/ .syntax unified - .arch armv8-m + .arch armv8-m.main .section .stack .align 3 #ifdef __STACK_SIZE .equ Stack_Size, __STACK_SIZE #else - // TODO: Update max stack size - .equ Stack_Size, 0x00001000 + // Default stack size (192KB) + .equ Stack_Size, 0x00030000 #endif .globl __StackTop .globl __StackLimit @@ -42,8 +42,8 @@ __StackTop: #ifdef __HEAP_SIZE .equ Heap_Size, __HEAP_SIZE #else - // TODO: Update max heap size - .equ Heap_Size, 0x00000C00 + // Default heap size (64KB) + .equ Heap_Size, 0x00010000 #endif .globl __HeapBase .globl __HeapLimit From 6f19ec6656398fc579716ed138ec1a50d50de07a Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Wed, 1 May 2024 15:41:14 -0600 Subject: [PATCH 11/41] Add basic selector for secure/non-secure builds - Add MSECURITY_MODE build configuration variable - Defines MSECURITY_MODE_SECURE/MSECURITY_MODE_NONSECURE at compile time --- Libraries/CMSIS/Device/Maxim/GCC/gcc.mk | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk index d16eae97c2c..13406a0a04f 100644 --- a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk +++ b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk @@ -255,6 +255,26 @@ endif # - cortex-m33 MCPU ?= cortex-m4 +ifeq "$(MCPU)" "cortex-m33" +# Security mode for the target processor. +# Acceptable values are +# - SECURE +# - NONSECURE +# +# When "SECURE" is selected, the build system will link the program binary into the secure +# memory sections and map peripheral instances onto their corresponding secure +# address aliases. "MSECURITY_MODE_SECURE" will be defined at compile time. +# +# When "NONSCURE" is selected, the program binary will be linked into the non-secure memory +# sections and peripherals will be mapped onto the non-secure address aliases. +# It should be noted that the M33 will boot into secure mode by default, which has access to +# both the secure and non-secure addresses and aliases. "MSECURITY_MODE_NONSECURE" will be defined +# at compile time. +MSECURITY_MODE ?= SECURE + +PROJ_CFLAGS += -DMSECURITY_MODE_$(MSECURITY_MODE) +endif + # Float ABI options: # See https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html (-mfloat-abi) # Specifies which floating-point ABI to use. Permissible values are: ‘soft’, ‘softfp’ and ‘hard’. From e36207e1681a7eba39ce8649427160757fb2119d Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Wed, 1 May 2024 16:19:33 -0600 Subject: [PATCH 12/41] Add MAX32657 periph driver files to build --- Libraries/PeriphDrivers/max32657_files.mk | 60 +++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/Libraries/PeriphDrivers/max32657_files.mk b/Libraries/PeriphDrivers/max32657_files.mk index afaccda46e3..9be6538cd3e 100644 --- a/Libraries/PeriphDrivers/max32657_files.mk +++ b/Libraries/PeriphDrivers/max32657_files.mk @@ -51,3 +51,63 @@ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/AES +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/AES/aes_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/AES/aes_revb.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/CRC +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/CRC/crc_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/CRC/crc_reva.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/DMA +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/DMA/dma_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/DMA/dma_reva.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/FLC +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/FLC/flc_common.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/FLC/flc_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/FLC/flc_reva.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/GPIO +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/GPIO/gpio_common.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/GPIO/gpio_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/GPIO/gpio_reva.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/ICC +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/ICC/icc_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/ICC/icc_reva.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/LP +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/LP/lp_me30.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/RTC +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/RTC/rtc_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/RTC/rtc_reva.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/SPI +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SPI/spi_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SPI/spi_reva1.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/TMR +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/TMR/tmr_common.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/TMR/tmr_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/TMR/tmr_revb.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/TRNG +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/TRNG/trng_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/TRNG/trng_revb.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/UART +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/UART/uart_common.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/UART/uart_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/UART/uart_reva.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_reva.c + +PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WUT +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_reva.c + From 9f7bbfe13b9b115105a10fb7c70efe90a763bf26 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Wed, 1 May 2024 16:20:06 -0600 Subject: [PATCH 13/41] Implement top-level UART macros for secure/non-secure --- .../Device/Maxim/MAX32657/Include/max32657.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 67ac023cab0..cfff0a47210 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -59,6 +59,7 @@ /* ================================================================================ */ // clang-format off +// TODO(ME30): Secure vs non-secure interrupt vectors typedef enum { NonMaskableInt_IRQn = -14, HardFault_IRQn = -13, @@ -617,11 +618,22 @@ We may want to handle GET_IRQ better... #define MXC_BASE_UART_S ((uint32_t)0x50042000UL) #define MXC_UART_S ((mxc_uart_regs_t *)MXC_BASE_UART_S) +#define MXC_UART_S_GET_UART(i) ((i) == 0 ? MXC_UART_S : 0) +#define MXC_UART_S_GET_BASE(i) ((i) == 0 ? MXC_BASE_UART0_S : 0) + +#ifdef MSECURITY_MODE_SECURE #define MXC_BASE_UART MXC_BASE_UART_S #define MXC_UART MXC_UART_S -#define MXC_UART_S_GET_UART(i) ((i) == 0 ? MXC_UART_S : 0) -#define MXC_UART_S_GET_BASE(i) ((i) == 0 ? MXC_BASE_UART0_S : 0) +#define MXC_UART_GET_UART(i) MXC_UART_S_GET_UART(i) +#endif + +#ifdef MSECURITY_MODE_NONSECURE +#define MXC_BASE_UART MXC_BASE_UART_NS +#define MXC_UART MXC_UART_NS + +#define MXC_UART_GET_UART(i) MXC_UART_NS_GET_UART(i) +#endif #define MXC_UART_GET_IRQ(i) (IRQn_Type)((i) == 0 ? UART0_IRQn : 0) #define MXC_UART_GET_IDX(p) ((p) == MXC_UART_NS ? 0 : (p) == MXC_UART_S ? 0 : -1) From df0e56640da75070e9561fed270a9d16dbe6ee7f Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Wed, 1 May 2024 16:21:23 -0600 Subject: [PATCH 14/41] Update DMA drivers to handle multiple instances --- .../PeriphDrivers/Include/MAX32657/dma.h | 76 ++++++++++--------- .../PeriphDrivers/Include/MAX32657/mxc_sys.h | 2 - Libraries/PeriphDrivers/Source/DMA/dma_me30.c | 58 ++++++++++---- 3 files changed, 81 insertions(+), 55 deletions(-) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/dma.h b/Libraries/PeriphDrivers/Include/MAX32657/dma.h index 747e5702681..fb9c43273ac 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/dma.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/dma.h @@ -187,6 +187,7 @@ typedef mxc_dma_srcdst_t (*mxc_dma_trans_chain_t)(mxc_dma_srcdst_t dest); /*************************/ /** * @brief Initialize DMA resources + * @param dma Pointer to DMA registers. * @details This initialization is required before using the DMA driver functions. * @note On default this function enables DMA peripheral clock. * if you wish to manage clock and gpio related things in upper level instead of here. @@ -194,15 +195,18 @@ typedef mxc_dma_srcdst_t (*mxc_dma_trans_chain_t)(mxc_dma_srcdst_t dest); * By this flag this function will remove clock and gpio related codes from file. * @return #E_NO_ERROR if successful */ -int MXC_DMA_Init(void); +int MXC_DMA_Init(mxc_dma_regs_t *dma); /** * @brief De-Initialize DMA resources. + * + * @param dma Pointer to DMA registers. */ -void MXC_DMA_DeInit(void); +void MXC_DMA_DeInit(mxc_dma_regs_t *dma); /** * @brief Request DMA channel + * @param dma Pointer to DMA registers. * @details Returns a handle to the first free DMA channel, which can be used via API calls * or direct access to channel registers using the MXC_DMA_GetCHRegs(int ch) function. * @return Non-negative channel handle (inclusive of zero). @@ -210,13 +214,13 @@ void MXC_DMA_DeInit(void); * @return #E_BAD_STATE DMA is not initialized, call MXC_DMA_Init() first. * @return #E_BUSY DMA is currently busy (locked), try again later. */ -int MXC_DMA_AcquireChannel(void); +int MXC_DMA_AcquireChannel(mxc_dma_regs_t *dma); /** * @brief Release DMA channel * @details Stops any DMA operation on the channel and returns it to the pool of free channels. * - * @param ch DMA channel to release + * @param ch channel handle to release * * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ @@ -260,6 +264,7 @@ int MXC_DMA_SetSrcDst(mxc_dma_srcdst_t srcdst); * * @return See \ref MXC_Error_Codes for a list of return values */ + int MXC_DMA_GetSrcDst(mxc_dma_srcdst_t *srcdst); /** @@ -280,11 +285,12 @@ int MXC_DMA_SetSrcReload(mxc_dma_srcdst_t srcdstReload); * * @return See \ref MXC_Error_Codes for a list of return values */ + int MXC_DMA_GetSrcReload(mxc_dma_srcdst_t *srcdstReload); /** * @brief Set channel interrupt callback - * @param ch DMA channel + * @param ch channel handle * @param callback Pointer to a function to call when the channel * interrupt flag is set and interrupts are enabled or * when DMA is shutdown by the driver. @@ -301,8 +307,8 @@ int MXC_DMA_GetSrcReload(mxc_dma_srcdst_t *srcdstReload); * reason is either #E_NO_ERROR for a DMA interrupt or #E_SHUTDOWN * if the DMA is being shutdown. * - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * #E_NO_ERROR otherwise, \ref MXC_Error_Codes + * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR + * otherwise */ int MXC_DMA_SetCallback(int ch, void (*callback)(int, int)); @@ -311,7 +317,7 @@ int MXC_DMA_SetCallback(int ch, void (*callback)(int, int)); * @note Each channel has two interrupts (complete, and count to zero). * To enable complete, pass true for chdis. To enable count to zero, * pass true for ctz. - * @param ch DMA channel + * @param ch Channel Handle * @param chdis Enable channel complete interrupt * @param ctz Enable channel count to zero interrupt. * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise @@ -322,36 +328,32 @@ int MXC_DMA_SetChannelInterruptEn(int ch, bool chdis, bool ctz); * @brief Enable channel interrupt * @note Each channel has two interrupts (complete, and count to zero) which must also be enabled with MXC_DMA_SetChannelInterruptEn() - * @param ch DMA channel to enable interrupts for. + * @param ch channel handle * @param flags The flags to enable - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * #E_NO_ERROR otherwise, \ref MXC_Error_Codes + * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ int MXC_DMA_ChannelEnableInt(int ch, int flags); /** * @brief Disable channel interrupt - * @param ch DMA channel to clear flags for. + * @param ch channel handle * @param flags The flags to disable - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * #E_NO_ERROR otherwise, \ref MXC_Error_Codes + * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ int MXC_DMA_ChannelDisableInt(int ch, int flags); /** * @brief Read channel interrupt flags - * @param ch DMA channel to get interrupt status from. - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * flags otherwise, \ref MXC_Error_Codes + * @param ch channel handle + * @return #E_BAD_PARAM if an unused or invalid channel handle, flags otherwise */ int MXC_DMA_ChannelGetFlags(int ch); /** * @brief Clear channel interrupt flags - * @param ch DMA channel to clear the interrupt flag for. + * @param ch channel handle * @param flags The flags to clear - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * #E_NO_ERROR otherwise, \ref MXC_Error_Codes + * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ int MXC_DMA_ChannelClearFlags(int ch, int flags); @@ -359,40 +361,36 @@ int MXC_DMA_ChannelClearFlags(int ch, int flags); * @brief Enable channel interrupt * @note Each channel has two interrupts (complete, and count to zero) which must also be enabled with MXC_DMA_SetChannelInterruptEn() - * @param ch DMA channel to enable interrupts for. - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * #E_NO_ERROR otherwise, \ref MXC_Error_Codes + * @param ch channel handle + * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ int MXC_DMA_EnableInt(int ch); /** * @brief Disable channel interrupt - * @param ch DMA channel to disable interrupts for. - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * #E_NO_ERROR otherwise, \ref MXC_Error_Codes + * @param ch channel handle + * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ int MXC_DMA_DisableInt(int ch); /** * @brief Start transfer - * @param ch DMA channel - * @details Start the DMA channel transfer, assumes that MXC_DMA_SetSrcDstCnt() has been called beforehand. - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * #E_NO_ERROR otherwise, \ref MXC_Error_Codes + * @param ch channel handle + * @note Start the DMA channel transfer, assumes that MXC_DMA_SetSrcDstCnt() has been called beforehand. + * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ int MXC_DMA_Start(int ch); /** * @brief Stop DMA transfer, irrespective of status (complete or in-progress) - * @param ch DMA channel - * @return #E_BAD_PARAM if an unused or invalid channel handle, - * #E_NO_ERROR otherwise, \ref MXC_Error_Codes + * @param ch channel handle + * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ int MXC_DMA_Stop(int ch); /** * @brief Get a pointer to the DMA channel registers - * @param ch DMA channel + * @param ch channel handle * @note If direct access to DMA channel registers is required, this * function can be used on a channel handle returned by MXC_DMA_AcquireChannel(). * @return NULL if an unused or invalid channel handle, or a valid pointer otherwise @@ -401,10 +399,11 @@ mxc_dma_ch_regs_t *MXC_DMA_GetCHRegs(int ch); /** * @brief Interrupt handler function + * @param dma Pointer to DMA registers. * @details Call this function as the ISR for each DMA channel under driver control. * Interrupt flags for channel ch will be automatically cleared before return. */ -void MXC_DMA_Handler(void); +void MXC_DMA_Handler(mxc_dma_regs_t *dma); /*************************/ /* High Level Functions */ @@ -415,6 +414,7 @@ void MXC_DMA_Handler(void); * @note The user must have the DMA interrupt enabled and call * MXC_DMA_Handler() from the ISR. * + * @param dma Pointer to DMA registers. * @param dest pointer to destination memory * @param src pointer to source memory * @param len number of bytes to copy @@ -422,20 +422,22 @@ void MXC_DMA_Handler(void); * * @return see \ref MXC_Error_Codes */ -int MXC_DMA_MemCpy(void *dest, void *src, int len, mxc_dma_complete_cb_t callback); +int MXC_DMA_MemCpy(mxc_dma_regs_t *dma, void *dest, void *src, int len, + mxc_dma_complete_cb_t callback); /** * @brief Performs a memcpy, using DMA, optionally asynchronous * @note The user must have the DMA interrupt enabled and call * MXC_DMA_Handler() from the ISR. * + * @param dma Pointer to DMA registers. * @param config The channel config struct * @param firstSrcDst The source, destination, and count for the first transfer * @param callback function is called when transfer is complete * * @return see \ref MXC_Error_Codes */ -int MXC_DMA_DoTransfer(mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, +int MXC_DMA_DoTransfer(mxc_dma_regs_t *dma, mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, mxc_dma_trans_chain_t callback); /** * For other functional uses of DMA (UART, SPI, etc) see the appropriate peripheral driver diff --git a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h index def4ee9b925..9a50c8fd720 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h @@ -91,8 +91,6 @@ typedef enum { /* PCLKDIS1 Below this line we add 32 to separate PCLKDIS0 and PCLKDIS1 */ MXC_SYS_PERIPH_CLOCK_TRNG = (MXC_F_GCR_PCLKDIS1_TRNG_POS + 32), /**< Disable TRNG clock */ - // MXC_SYS_PERIPH_CLOCK_SMPHR = - // (MXC_F_GCR_PCLKDIS1_SMPHR_POS + 32), /**< Disable SMPHR clock */ MXC_SYS_PERIPH_CLOCK_CRC = (MXC_F_GCR_PCLKDIS1_CRC_POS + 32), /**< Disable CRC clock */ MXC_SYS_PERIPH_CLOCK_AES = diff --git a/Libraries/PeriphDrivers/Source/DMA/dma_me30.c b/Libraries/PeriphDrivers/Source/DMA/dma_me30.c index a0483bd536d..82a4c3ccc26 100644 --- a/Libraries/PeriphDrivers/Source/DMA/dma_me30.c +++ b/Libraries/PeriphDrivers/Source/DMA/dma_me30.c @@ -32,26 +32,50 @@ /****** Functions ******/ -int MXC_DMA_Init(void) +static mxc_dma_regs_t *getDMAInstance(int ch) +{ + if (ch < (MXC_DMA_CHANNELS / MXC_DMA_INSTANCES)) { + return MXC_DMA0; + } else if (ch >= (MXC_DMA_CHANNELS / MXC_DMA_INSTANCES) && ch < MXC_DMA_CHANNELS) { + return MXC_DMA1; + } + + return NULL; +} + +int MXC_DMA_Init(mxc_dma_regs_t *dma) { #ifndef MSDK_NO_GPIO_CLK_INIT - if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA)) { - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA); - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA); + switch (MXC_DMA_GET_IDX(dma)) { + case 0: + if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA0)) { + MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA0); + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA0); + } + break; + case 1: + // TODO(ME30): PERIPH CLOCK register definitions missing for DMA1 + //if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK)) { + // MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA1); + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA1); + // } + break; + default: + return E_BAD_PARAM; } #endif - return MXC_DMA_RevA_Init((mxc_dma_reva_regs_t *)MXC_DMA); + return MXC_DMA_RevA_Init((mxc_dma_reva_regs_t *)dma); } -void MXC_DMA_DeInit(void) +void MXC_DMA_DeInit(mxc_dma_regs_t *dma) { - return MXC_DMA_RevA_DeInit((mxc_dma_reva_regs_t *)MXC_DMA); + return MXC_DMA_RevA_DeInit((mxc_dma_reva_regs_t *)dma); } int MXC_DMA_AcquireChannel(void) { - return MXC_DMA_RevA_AcquireChannel((mxc_dma_reva_regs_t *)MXC_DMA); + return MXC_DMA_RevA_AcquireChannel((mxc_dma_reva_regs_t *)dma); } int MXC_DMA_ReleaseChannel(int ch) @@ -121,12 +145,14 @@ int MXC_DMA_ChannelClearFlags(int ch, int flags) int MXC_DMA_EnableInt(int ch) { - return MXC_DMA_RevA_EnableInt((mxc_dma_reva_regs_t *)MXC_DMA, ch); + mxc_dma_regs_t *dma = getDMAInstance(ch); + return MXC_DMA_RevA_EnableInt((mxc_dma_reva_regs_t *)dma, ch); } int MXC_DMA_DisableInt(int ch) { - return MXC_DMA_RevA_DisableInt((mxc_dma_reva_regs_t *)MXC_DMA, ch); + mxc_dma_regs_t *dma = getDMAInstance(ch); + return MXC_DMA_RevA_DisableInt((mxc_dma_reva_regs_t *)dma, ch); } int MXC_DMA_Start(int ch) @@ -144,18 +170,18 @@ mxc_dma_ch_regs_t *MXC_DMA_GetCHRegs(int ch) return MXC_DMA_RevA_GetCHRegs(ch); } -void MXC_DMA_Handler(void) +void MXC_DMA_Handler(mxc_dma_regs_t *dma) { - MXC_DMA_RevA_Handler((mxc_dma_reva_regs_t *)MXC_DMA); + MXC_DMA_RevA_Handler((mxc_dma_reva_regs_t *)dma); } -int MXC_DMA_MemCpy(void *dest, void *src, int len, mxc_dma_complete_cb_t callback) +int MXC_DMA_MemCpy(mxc_dma_regs_t *dma, void *dest, void *src, int len, mxc_dma_complete_cb_t callback) { - return MXC_DMA_RevA_MemCpy((mxc_dma_reva_regs_t *)MXC_DMA, dest, src, len, callback); + return MXC_DMA_RevA_MemCpy((mxc_dma_reva_regs_t *)dma, dest, src, len, callback); } -int MXC_DMA_DoTransfer(mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, +int MXC_DMA_DoTransfer(mxc_dma_regs_t *dma, mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, mxc_dma_trans_chain_t callback) { - return MXC_DMA_RevA_DoTransfer((mxc_dma_reva_regs_t *)MXC_DMA, config, firstSrcDst, callback); + return MXC_DMA_RevA_DoTransfer((mxc_dma_reva_regs_t *)dma, config, firstSrcDst, callback); } From e61dab141e4b0538d69c4fd4c4b86b589d70f621 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 15:56:59 -0600 Subject: [PATCH 15/41] Revert "Update DMA drivers to handle multiple instances" This reverts commit df0e56640da75070e9561fed270a9d16dbe6ee7f. --- .../PeriphDrivers/Include/MAX32657/dma.h | 76 +++++++++---------- .../PeriphDrivers/Include/MAX32657/mxc_sys.h | 2 + Libraries/PeriphDrivers/Source/DMA/dma_me30.c | 58 ++++---------- 3 files changed, 55 insertions(+), 81 deletions(-) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/dma.h b/Libraries/PeriphDrivers/Include/MAX32657/dma.h index fb9c43273ac..747e5702681 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/dma.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/dma.h @@ -187,7 +187,6 @@ typedef mxc_dma_srcdst_t (*mxc_dma_trans_chain_t)(mxc_dma_srcdst_t dest); /*************************/ /** * @brief Initialize DMA resources - * @param dma Pointer to DMA registers. * @details This initialization is required before using the DMA driver functions. * @note On default this function enables DMA peripheral clock. * if you wish to manage clock and gpio related things in upper level instead of here. @@ -195,18 +194,15 @@ typedef mxc_dma_srcdst_t (*mxc_dma_trans_chain_t)(mxc_dma_srcdst_t dest); * By this flag this function will remove clock and gpio related codes from file. * @return #E_NO_ERROR if successful */ -int MXC_DMA_Init(mxc_dma_regs_t *dma); +int MXC_DMA_Init(void); /** * @brief De-Initialize DMA resources. - * - * @param dma Pointer to DMA registers. */ -void MXC_DMA_DeInit(mxc_dma_regs_t *dma); +void MXC_DMA_DeInit(void); /** * @brief Request DMA channel - * @param dma Pointer to DMA registers. * @details Returns a handle to the first free DMA channel, which can be used via API calls * or direct access to channel registers using the MXC_DMA_GetCHRegs(int ch) function. * @return Non-negative channel handle (inclusive of zero). @@ -214,13 +210,13 @@ void MXC_DMA_DeInit(mxc_dma_regs_t *dma); * @return #E_BAD_STATE DMA is not initialized, call MXC_DMA_Init() first. * @return #E_BUSY DMA is currently busy (locked), try again later. */ -int MXC_DMA_AcquireChannel(mxc_dma_regs_t *dma); +int MXC_DMA_AcquireChannel(void); /** * @brief Release DMA channel * @details Stops any DMA operation on the channel and returns it to the pool of free channels. * - * @param ch channel handle to release + * @param ch DMA channel to release * * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise */ @@ -264,7 +260,6 @@ int MXC_DMA_SetSrcDst(mxc_dma_srcdst_t srcdst); * * @return See \ref MXC_Error_Codes for a list of return values */ - int MXC_DMA_GetSrcDst(mxc_dma_srcdst_t *srcdst); /** @@ -285,12 +280,11 @@ int MXC_DMA_SetSrcReload(mxc_dma_srcdst_t srcdstReload); * * @return See \ref MXC_Error_Codes for a list of return values */ - int MXC_DMA_GetSrcReload(mxc_dma_srcdst_t *srcdstReload); /** * @brief Set channel interrupt callback - * @param ch channel handle + * @param ch DMA channel * @param callback Pointer to a function to call when the channel * interrupt flag is set and interrupts are enabled or * when DMA is shutdown by the driver. @@ -307,8 +301,8 @@ int MXC_DMA_GetSrcReload(mxc_dma_srcdst_t *srcdstReload); * reason is either #E_NO_ERROR for a DMA interrupt or #E_SHUTDOWN * if the DMA is being shutdown. * - * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR - * otherwise + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ int MXC_DMA_SetCallback(int ch, void (*callback)(int, int)); @@ -317,7 +311,7 @@ int MXC_DMA_SetCallback(int ch, void (*callback)(int, int)); * @note Each channel has two interrupts (complete, and count to zero). * To enable complete, pass true for chdis. To enable count to zero, * pass true for ctz. - * @param ch Channel Handle + * @param ch DMA channel * @param chdis Enable channel complete interrupt * @param ctz Enable channel count to zero interrupt. * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise @@ -328,32 +322,36 @@ int MXC_DMA_SetChannelInterruptEn(int ch, bool chdis, bool ctz); * @brief Enable channel interrupt * @note Each channel has two interrupts (complete, and count to zero) which must also be enabled with MXC_DMA_SetChannelInterruptEn() - * @param ch channel handle + * @param ch DMA channel to enable interrupts for. * @param flags The flags to enable - * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ int MXC_DMA_ChannelEnableInt(int ch, int flags); /** * @brief Disable channel interrupt - * @param ch channel handle + * @param ch DMA channel to clear flags for. * @param flags The flags to disable - * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ int MXC_DMA_ChannelDisableInt(int ch, int flags); /** * @brief Read channel interrupt flags - * @param ch channel handle - * @return #E_BAD_PARAM if an unused or invalid channel handle, flags otherwise + * @param ch DMA channel to get interrupt status from. + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * flags otherwise, \ref MXC_Error_Codes */ int MXC_DMA_ChannelGetFlags(int ch); /** * @brief Clear channel interrupt flags - * @param ch channel handle + * @param ch DMA channel to clear the interrupt flag for. * @param flags The flags to clear - * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ int MXC_DMA_ChannelClearFlags(int ch, int flags); @@ -361,36 +359,40 @@ int MXC_DMA_ChannelClearFlags(int ch, int flags); * @brief Enable channel interrupt * @note Each channel has two interrupts (complete, and count to zero) which must also be enabled with MXC_DMA_SetChannelInterruptEn() - * @param ch channel handle - * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise + * @param ch DMA channel to enable interrupts for. + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ int MXC_DMA_EnableInt(int ch); /** * @brief Disable channel interrupt - * @param ch channel handle - * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise + * @param ch DMA channel to disable interrupts for. + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ int MXC_DMA_DisableInt(int ch); /** * @brief Start transfer - * @param ch channel handle - * @note Start the DMA channel transfer, assumes that MXC_DMA_SetSrcDstCnt() has been called beforehand. - * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise + * @param ch DMA channel + * @details Start the DMA channel transfer, assumes that MXC_DMA_SetSrcDstCnt() has been called beforehand. + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ int MXC_DMA_Start(int ch); /** * @brief Stop DMA transfer, irrespective of status (complete or in-progress) - * @param ch channel handle - * @return #E_BAD_PARAM if an unused or invalid channel handle, #E_NO_ERROR otherwise + * @param ch DMA channel + * @return #E_BAD_PARAM if an unused or invalid channel handle, + * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ int MXC_DMA_Stop(int ch); /** * @brief Get a pointer to the DMA channel registers - * @param ch channel handle + * @param ch DMA channel * @note If direct access to DMA channel registers is required, this * function can be used on a channel handle returned by MXC_DMA_AcquireChannel(). * @return NULL if an unused or invalid channel handle, or a valid pointer otherwise @@ -399,11 +401,10 @@ mxc_dma_ch_regs_t *MXC_DMA_GetCHRegs(int ch); /** * @brief Interrupt handler function - * @param dma Pointer to DMA registers. * @details Call this function as the ISR for each DMA channel under driver control. * Interrupt flags for channel ch will be automatically cleared before return. */ -void MXC_DMA_Handler(mxc_dma_regs_t *dma); +void MXC_DMA_Handler(void); /*************************/ /* High Level Functions */ @@ -414,7 +415,6 @@ void MXC_DMA_Handler(mxc_dma_regs_t *dma); * @note The user must have the DMA interrupt enabled and call * MXC_DMA_Handler() from the ISR. * - * @param dma Pointer to DMA registers. * @param dest pointer to destination memory * @param src pointer to source memory * @param len number of bytes to copy @@ -422,22 +422,20 @@ void MXC_DMA_Handler(mxc_dma_regs_t *dma); * * @return see \ref MXC_Error_Codes */ -int MXC_DMA_MemCpy(mxc_dma_regs_t *dma, void *dest, void *src, int len, - mxc_dma_complete_cb_t callback); +int MXC_DMA_MemCpy(void *dest, void *src, int len, mxc_dma_complete_cb_t callback); /** * @brief Performs a memcpy, using DMA, optionally asynchronous * @note The user must have the DMA interrupt enabled and call * MXC_DMA_Handler() from the ISR. * - * @param dma Pointer to DMA registers. * @param config The channel config struct * @param firstSrcDst The source, destination, and count for the first transfer * @param callback function is called when transfer is complete * * @return see \ref MXC_Error_Codes */ -int MXC_DMA_DoTransfer(mxc_dma_regs_t *dma, mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, +int MXC_DMA_DoTransfer(mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, mxc_dma_trans_chain_t callback); /** * For other functional uses of DMA (UART, SPI, etc) see the appropriate peripheral driver diff --git a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h index 9a50c8fd720..def4ee9b925 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h @@ -91,6 +91,8 @@ typedef enum { /* PCLKDIS1 Below this line we add 32 to separate PCLKDIS0 and PCLKDIS1 */ MXC_SYS_PERIPH_CLOCK_TRNG = (MXC_F_GCR_PCLKDIS1_TRNG_POS + 32), /**< Disable TRNG clock */ + // MXC_SYS_PERIPH_CLOCK_SMPHR = + // (MXC_F_GCR_PCLKDIS1_SMPHR_POS + 32), /**< Disable SMPHR clock */ MXC_SYS_PERIPH_CLOCK_CRC = (MXC_F_GCR_PCLKDIS1_CRC_POS + 32), /**< Disable CRC clock */ MXC_SYS_PERIPH_CLOCK_AES = diff --git a/Libraries/PeriphDrivers/Source/DMA/dma_me30.c b/Libraries/PeriphDrivers/Source/DMA/dma_me30.c index 82a4c3ccc26..a0483bd536d 100644 --- a/Libraries/PeriphDrivers/Source/DMA/dma_me30.c +++ b/Libraries/PeriphDrivers/Source/DMA/dma_me30.c @@ -32,50 +32,26 @@ /****** Functions ******/ -static mxc_dma_regs_t *getDMAInstance(int ch) -{ - if (ch < (MXC_DMA_CHANNELS / MXC_DMA_INSTANCES)) { - return MXC_DMA0; - } else if (ch >= (MXC_DMA_CHANNELS / MXC_DMA_INSTANCES) && ch < MXC_DMA_CHANNELS) { - return MXC_DMA1; - } - - return NULL; -} - -int MXC_DMA_Init(mxc_dma_regs_t *dma) +int MXC_DMA_Init(void) { #ifndef MSDK_NO_GPIO_CLK_INIT - switch (MXC_DMA_GET_IDX(dma)) { - case 0: - if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA0)) { - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA0); - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA0); - } - break; - case 1: - // TODO(ME30): PERIPH CLOCK register definitions missing for DMA1 - //if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK)) { - // MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA1); - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA1); - // } - break; - default: - return E_BAD_PARAM; + if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA)) { + MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA); + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA); } #endif - return MXC_DMA_RevA_Init((mxc_dma_reva_regs_t *)dma); + return MXC_DMA_RevA_Init((mxc_dma_reva_regs_t *)MXC_DMA); } -void MXC_DMA_DeInit(mxc_dma_regs_t *dma) +void MXC_DMA_DeInit(void) { - return MXC_DMA_RevA_DeInit((mxc_dma_reva_regs_t *)dma); + return MXC_DMA_RevA_DeInit((mxc_dma_reva_regs_t *)MXC_DMA); } int MXC_DMA_AcquireChannel(void) { - return MXC_DMA_RevA_AcquireChannel((mxc_dma_reva_regs_t *)dma); + return MXC_DMA_RevA_AcquireChannel((mxc_dma_reva_regs_t *)MXC_DMA); } int MXC_DMA_ReleaseChannel(int ch) @@ -145,14 +121,12 @@ int MXC_DMA_ChannelClearFlags(int ch, int flags) int MXC_DMA_EnableInt(int ch) { - mxc_dma_regs_t *dma = getDMAInstance(ch); - return MXC_DMA_RevA_EnableInt((mxc_dma_reva_regs_t *)dma, ch); + return MXC_DMA_RevA_EnableInt((mxc_dma_reva_regs_t *)MXC_DMA, ch); } int MXC_DMA_DisableInt(int ch) { - mxc_dma_regs_t *dma = getDMAInstance(ch); - return MXC_DMA_RevA_DisableInt((mxc_dma_reva_regs_t *)dma, ch); + return MXC_DMA_RevA_DisableInt((mxc_dma_reva_regs_t *)MXC_DMA, ch); } int MXC_DMA_Start(int ch) @@ -170,18 +144,18 @@ mxc_dma_ch_regs_t *MXC_DMA_GetCHRegs(int ch) return MXC_DMA_RevA_GetCHRegs(ch); } -void MXC_DMA_Handler(mxc_dma_regs_t *dma) +void MXC_DMA_Handler(void) { - MXC_DMA_RevA_Handler((mxc_dma_reva_regs_t *)dma); + MXC_DMA_RevA_Handler((mxc_dma_reva_regs_t *)MXC_DMA); } -int MXC_DMA_MemCpy(mxc_dma_regs_t *dma, void *dest, void *src, int len, mxc_dma_complete_cb_t callback) +int MXC_DMA_MemCpy(void *dest, void *src, int len, mxc_dma_complete_cb_t callback) { - return MXC_DMA_RevA_MemCpy((mxc_dma_reva_regs_t *)dma, dest, src, len, callback); + return MXC_DMA_RevA_MemCpy((mxc_dma_reva_regs_t *)MXC_DMA, dest, src, len, callback); } -int MXC_DMA_DoTransfer(mxc_dma_regs_t *dma, mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, +int MXC_DMA_DoTransfer(mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, mxc_dma_trans_chain_t callback) { - return MXC_DMA_RevA_DoTransfer((mxc_dma_reva_regs_t *)dma, config, firstSrcDst, callback); + return MXC_DMA_RevA_DoTransfer((mxc_dma_reva_regs_t *)MXC_DMA, config, firstSrcDst, callback); } From 9644b4e4908da853107cee38a7ff4a39e7cda4fd Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 16:11:01 -0600 Subject: [PATCH 16/41] Use built-in -mcmse GCC flag for indicating secure builds - Add to max32657.h - Define "IS_SECURE_ENVIRONMENT" that uses GCC-provided definitions instead of our custom build-time one. Usage: #if IS_SECURE_ENVIRONMENT ... #endif --- Libraries/CMSIS/Device/Maxim/GCC/gcc.mk | 7 ++++++- .../CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 10 ++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk index 13406a0a04f..48acf971c44 100644 --- a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk +++ b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk @@ -272,7 +272,12 @@ ifeq "$(MCPU)" "cortex-m33" # at compile time. MSECURITY_MODE ?= SECURE -PROJ_CFLAGS += -DMSECURITY_MODE_$(MSECURITY_MODE) +ifeq "$(MSECURITY_MODE)" "SECURE" +# Tell the compiler we are building a secure project. This is required to satisfy the requirements +# defined in "Armv8-M Security Extension: Requirements on Developments Tools" +# https://developer.arm.com/documentation/ecm0359818/latest +PROJ_CFLAGS += -mcmse +endif endif # Float ABI options: diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index cfff0a47210..ce7f2cfb633 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -152,6 +152,8 @@ typedef enum { #define __Vendor_SysTickConfig 0U /**< Is 1 if different SysTick counter is used */ #include +#include +#define IS_SECURE_ENVIRONMENT (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)) /* ================================================================================ */ /* ================== Device Specific Memory Section ================== */ @@ -621,17 +623,13 @@ We may want to handle GET_IRQ better... #define MXC_UART_S_GET_UART(i) ((i) == 0 ? MXC_UART_S : 0) #define MXC_UART_S_GET_BASE(i) ((i) == 0 ? MXC_BASE_UART0_S : 0) -#ifdef MSECURITY_MODE_SECURE +#if IS_SECURE_ENVIRONMENT #define MXC_BASE_UART MXC_BASE_UART_S #define MXC_UART MXC_UART_S - #define MXC_UART_GET_UART(i) MXC_UART_S_GET_UART(i) -#endif - -#ifdef MSECURITY_MODE_NONSECURE +#else #define MXC_BASE_UART MXC_BASE_UART_NS #define MXC_UART MXC_UART_NS - #define MXC_UART_GET_UART(i) MXC_UART_NS_GET_UART(i) #endif From bc0648dcc3f2dc3319f3a0ea700234cc42cabc61 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 16:28:40 -0600 Subject: [PATCH 17/41] Update ME30 DMA drivers and macros --- .../Device/Maxim/MAX32657/Include/max32657.h | 26 ++++++++++++++----- Libraries/PeriphDrivers/Source/DMA/dma_me30.c | 11 +++++--- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index ce7f2cfb633..c30c5af857d 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -560,25 +560,39 @@ We may want to handle GET_IRQ better... /* Non-secure Mapping */ #define MXC_BASE_DMA0_NS ((uint32_t)0x40028000UL) #define MXC_DMA0_NS ((mxc_dma_regs_t *)MXC_BASE_DMA0_NS) -/* DMA1 instance only for secure mode. */ +/* DMA0 instance only for secure mode. */ /* Secure Mapping */ +// TODO(ME30): Is there actuall a secure mapping for DMA0? #define MXC_BASE_DMA0_S ((uint32_t)0x50028000UL) #define MXC_DMA0_S ((mxc_dma_regs_t *)MXC_BASE_DMA0_S) #define MXC_BASE_DMA1_S ((uint32_t)0x50035000UL) #define MXC_DMA1_S ((mxc_dma_regs_t *)MXC_BASE_DMA1_S) #define MXC_BASE_DMA0 MXC_BASE_DMA0_S -#define MXC_DMA0 MXC_DMA0_S +#define MXC_DMA0 MXC_DMA0_NS #define MXC_BASE_DMA1 MXC_BASE_DMA1_S #define MXC_DMA1 MXC_DMA1_S +#if IS_SECURE_ENVIRONMENT +#define MXC_DMA MXC_DMA1_S +#define MXC_DMA_CH_GET_IRQ(i) \ + ((IRQn_Type)(((i) == 0) ? DMA1_CH0_IRQn : \ + ((i) == 1) ? DMA1_CH1_IRQn : \ + ((i) == 2) ? DMA1_CH2_IRQn : \ + ((i) == 3) ? DMA1_CH3_IRQn : \ + 0)) +#else +#define MXC_DMA MXC_DMA0_NS #define MXC_DMA_CH_GET_IRQ(i) \ - ((IRQn_Type)(((i) == 0) ? DMA0_IRQn : \ - ((i) == 1) ? DMA1_IRQn : \ - ((i) == 2) ? DMA2_IRQn : \ - ((i) == 3) ? DMA3_IRQn : \ + ((IRQn_Type)(((i) == 0) ? DMA0_CH0_IRQn : \ + ((i) == 1) ? DMA0_CH1_IRQn : \ + ((i) == 2) ? DMA0_CH2_IRQn : \ + ((i) == 3) ? DMA0_CH3_IRQn : \ 0)) +#endif + +#define MXC_DMA_GET_IDX(p) ((p) == MXC_DMA0 ? 0 : (p) == MXC_DMA1 ? 1 : -1) /******************************************************************************/ /* Flash Controller */ diff --git a/Libraries/PeriphDrivers/Source/DMA/dma_me30.c b/Libraries/PeriphDrivers/Source/DMA/dma_me30.c index a0483bd536d..bab48e3c5e9 100644 --- a/Libraries/PeriphDrivers/Source/DMA/dma_me30.c +++ b/Libraries/PeriphDrivers/Source/DMA/dma_me30.c @@ -35,10 +35,15 @@ int MXC_DMA_Init(void) { #ifndef MSDK_NO_GPIO_CLK_INIT - if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA)) { - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA); - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA); + if (MXC_DMA == MXC_DMA0 && !MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA0)) { + MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA0); + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA0); } + // TODO(ME30): There is no periph clock enable register for DMA1 atm + // else if (MXC_DMA == MXC_DMA1 && !MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA1)) + // MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA1); + // MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA1); + // } #endif return MXC_DMA_RevA_Init((mxc_dma_reva_regs_t *)MXC_DMA); From 80b7343a9a203e82acf6717b1f93e950208232de Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 16:38:41 -0600 Subject: [PATCH 18/41] Update ME30 FLC drivers and macros --- .../Device/Maxim/MAX32657/Include/max32657.h | 4 + Libraries/PeriphDrivers/Source/FLC/flc_me30.c | 95 ++++--------------- 2 files changed, 24 insertions(+), 75 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index c30c5af857d..1a6b87a7921 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -606,6 +606,10 @@ We may want to handle GET_IRQ better... #define MXC_BASE_FLC_S MXC_BASE_FLC #define MXC_FLC_S MXC_FLC +// Note(JC): There is only one flash instance, but some bottom-level RevX implementations +// depend on MXC_FLC_GET_FLC +#define MXC_FLC_GET_FLC(i) MXC_FLC + /******************************************************************************/ /* Internal Cache Controller */ #define MXC_ICC_INSTANCES (1) diff --git a/Libraries/PeriphDrivers/Source/FLC/flc_me30.c b/Libraries/PeriphDrivers/Source/FLC/flc_me30.c index 961a912434c..fa8f12b072e 100644 --- a/Libraries/PeriphDrivers/Source/FLC/flc_me30.c +++ b/Libraries/PeriphDrivers/Source/FLC/flc_me30.c @@ -27,7 +27,7 @@ #include "mcr_regs.h" // For ECCEN registers. //****************************************************************************** -void MXC_FLC_ME17_Flash_Operation(void) +void MXC_FLC_ME30_Flash_Operation(void) { /* This function should be called after modifying the contents of flash memory. @@ -44,10 +44,10 @@ void MXC_FLC_ME17_Flash_Operation(void) */ /* Flush all instruction caches */ - MXC_GCR->sysctrl |= MXC_F_GCR_SYSCTRL_ICC0_FLUSH; + MXC_GCR->sysctrl |= MXC_F_GCR_SYSCTRL_ICC_FLUSH; /* Wait for flush to complete */ - while (MXC_GCR->sysctrl & MXC_F_GCR_SYSCTRL_ICC0_FLUSH) {} + while (MXC_GCR->sysctrl & MXC_F_GCR_SYSCTRL_ICC_FLUSH) {} // Clear the line fill buffer by reading 2 pages from flash volatile uint32_t *line_addr; @@ -59,21 +59,7 @@ void MXC_FLC_ME17_Flash_Operation(void) } //****************************************************************************** -int MXC_FLC_ME17_GetByAddress(mxc_flc_regs_t **flc, uint32_t addr) -{ - if ((addr >= MXC_FLASH_MEM_BASE) && (addr < (MXC_FLASH_MEM_BASE + MXC_FLASH_MEM_SIZE))) { - *flc = MXC_FLC0; - } else if ((addr >= MXC_INFO_MEM_BASE) && (addr < (MXC_INFO_MEM_BASE + MXC_INFO_MEM_SIZE))) { - *flc = MXC_FLC0; - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -//****************************************************************************** -int MXC_FLC_ME17_GetPhysicalAddress(uint32_t addr, uint32_t *result) +int MXC_FLC_ME30_GetPhysicalAddress(uint32_t addr, uint32_t *result) { if ((addr >= MXC_FLASH_MEM_BASE) && (addr < (MXC_FLASH_MEM_BASE + MXC_FLASH_MEM_SIZE))) { *result = addr & (MXC_FLASH_MEM_SIZE - 1); @@ -113,21 +99,15 @@ int MXC_FLC_PageErase(uint32_t address) { int err; uint32_t addr; - mxc_flc_regs_t *flc = NULL; - // Get FLC Instance - if ((err = MXC_FLC_ME17_GetByAddress(&flc, address)) != E_NO_ERROR) { + if ((err = MXC_FLC_ME30_GetPhysicalAddress(address, &addr)) < E_NO_ERROR) { return err; } - if ((err = MXC_FLC_ME17_GetPhysicalAddress(address, &addr)) < E_NO_ERROR) { - return err; - } - - err = MXC_FLC_RevA_PageErase((mxc_flc_reva_regs_t *)flc, addr); + err = MXC_FLC_RevA_PageErase((mxc_flc_reva_regs_t *)MXC_FLC, addr); // Flush the cache - MXC_FLC_ME17_Flash_Operation(); + MXC_FLC_ME30_Flash_Operation(); return err; } @@ -142,7 +122,6 @@ __attribute__((section(".flashprog"))) int MXC_FLC_Write128(uint32_t address, uint32_t *data) { int err; - mxc_flc_regs_t *flc = NULL; uint32_t addr; // Address checked if it is 128-bit aligned @@ -150,19 +129,14 @@ int MXC_FLC_Write128(uint32_t address, uint32_t *data) return E_BAD_PARAM; } - // Get FLC Instance - if ((err = MXC_FLC_ME17_GetByAddress(&flc, address)) != E_NO_ERROR) { + if ((err = MXC_FLC_ME30_GetPhysicalAddress(address, &addr)) < E_NO_ERROR) { return err; } - if ((err = MXC_FLC_ME17_GetPhysicalAddress(address, &addr)) < E_NO_ERROR) { - return err; - } - - err = MXC_FLC_RevA_Write128((mxc_flc_reva_regs_t *)flc, addr, data); + err = MXC_FLC_RevA_Write128((mxc_flc_reva_regs_t *)MXC_FLC, addr, data); // Flush the cache - MXC_FLC_ME17_Flash_Operation(); + MXC_FLC_ME30_Flash_Operation(); return err; } @@ -172,7 +146,6 @@ int MXC_FLC_Write32(uint32_t address, uint32_t data) { uint32_t addr, aligned; int err; - mxc_flc_regs_t *flc = NULL; // Address checked if it is byte addressable if (address & 0x3) { @@ -182,19 +155,14 @@ int MXC_FLC_Write32(uint32_t address, uint32_t data) // Align address to 128-bit word aligned = address & 0xfffffff0; - // Get FLC Instance - if ((err = MXC_FLC_ME17_GetByAddress(&flc, address)) != E_NO_ERROR) { + if ((err = MXC_FLC_ME30_GetPhysicalAddress(aligned, &addr)) < E_NO_ERROR) { return err; } - if ((err = MXC_FLC_ME17_GetPhysicalAddress(aligned, &addr)) < E_NO_ERROR) { - return err; - } - - err = MXC_FLC_RevA_Write32Using128((mxc_flc_reva_regs_t *)flc, address, data, addr); + err = MXC_FLC_RevA_Write32Using128((mxc_flc_reva_regs_t *)MXC_FLC, address, data, addr); // Flush the cache - MXC_FLC_ME17_Flash_Operation(); + MXC_FLC_ME30_Flash_Operation(); return err; } @@ -202,49 +170,26 @@ int MXC_FLC_Write32(uint32_t address, uint32_t data) //****************************************************************************** int MXC_FLC_MassErase(void) { - int err, i; - mxc_flc_regs_t *flc; - - for (i = 0; i < MXC_FLC_INSTANCES; i++) { - flc = MXC_FLC_GET_FLC(i); - - err = MXC_FLC_RevA_MassErase((mxc_flc_reva_regs_t *)flc); + int err; - // Flush the cache - MXC_FLC_ME17_Flash_Operation(); + err = MXC_FLC_RevA_MassErase((mxc_flc_reva_regs_t *)MXC_FLC); - if (err != E_NO_ERROR) { - return err; - } - } + // Flush the cache + MXC_FLC_ME30_Flash_Operation(); - return E_NO_ERROR; + return err; } //****************************************************************************** int MXC_FLC_UnlockInfoBlock(uint32_t address) { - int err; - mxc_flc_regs_t *flc; - - if ((err = MXC_FLC_ME17_GetByAddress(&flc, address)) != E_NO_ERROR) { - return err; - } - - return MXC_FLC_RevA_UnlockInfoBlock((mxc_flc_reva_regs_t *)flc, address); + return MXC_FLC_RevA_UnlockInfoBlock((mxc_flc_reva_regs_t *)MXC_FLC, address); } //****************************************************************************** int MXC_FLC_LockInfoBlock(uint32_t address) { - int err; - mxc_flc_regs_t *flc; - - if ((err = MXC_FLC_ME17_GetByAddress(&flc, address)) != E_NO_ERROR) { - return err; - } - - return MXC_FLC_RevA_LockInfoBlock((mxc_flc_reva_regs_t *)flc, address); + return MXC_FLC_RevA_LockInfoBlock((mxc_flc_reva_regs_t *)MXC_FLC, address); } //****************************************************************************** From 3910ebe40849dc821d8dbd4ab886ad8a711c6638 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 16:49:13 -0600 Subject: [PATCH 19/41] Update ME30 GPIO drivers and macros --- .../Device/Maxim/MAX32657/Include/max32657.h | 29 ++- .../PeriphDrivers/Source/GPIO/gpio_me30.c | 246 +++--------------- 2 files changed, 56 insertions(+), 219 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 1a6b87a7921..6dc05068db9 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -387,19 +387,6 @@ typedef enum { #define MXC_CFG_GPIO_INSTANCES (1) #define MXC_CFG_GPIO_PINS_PORT (32) -/* Utility macros - -Note(JC): There is only 1 GPIO instance, but for driver compatibility these must be -implemented. - -For GET_IDX and GET_GPIO we return -1 so that other MXC_ASSERTs might error out. -For GET_IRQ we follow precedent and return the base 0 IRQn, which is the ICE unlock. -We may want to handle GET_IRQ better... -*/ -#define MXC_GPIO_GET_IDX(p) ((p) == MXC_GPIO0 ? 0 : -1) -#define MXC_GPIO_GET_GPIO(i) ((i) == 0 ? MXC_GPIO0 : -1) -#define MXC_GPIO_GET_IRQ(i) ((i) == 0 ? GPIO0_IRQn : (IRQn_Type)0) - /* Non-secure Mapping */ #define MXC_BASE_GPIO0_NS ((uint32_t)0x40008000UL) #define MXC_GPIO0_NS ((mxc_gpio_regs_t *)MXC_BASE_GPIO0_NS) @@ -412,7 +399,23 @@ We may want to handle GET_IRQ better... #define MXC_GPIO0_S ((mxc_gpio_regs_t *)MXC_BASE_GPIO0_S) #define MXC_BASE_GPIO0 MXC_BASE_GPIO0_S + +#if IS_SECURE_ENVIRONMENT #define MXC_GPIO0 MXC_GPIO0_S +#else +#define MXC_GPIO0 MXC_GPIO0_NS +#endif + +/* +Note(JC): There is only 1 GPIO instance, but for driver compatibility these must be +implemented. + +For GET_IRQ we follow precedent and return the base 0 IRQn, which is the ICE unlock. +We may want to handle GET_IRQ better... +*/ +#define MXC_GPIO_GET_IDX(p) ((p) == MXC_GPIO0 ? 0 : 0) +#define MXC_GPIO_GET_GPIO(i) ((i) == 0 ? MXC_GPIO0 : 0) +#define MXC_GPIO_GET_IRQ(i) ((i) == 0 ? GPIO0_IRQn : (IRQn_Type)0) /******************************************************************************/ /* CRC */ diff --git a/Libraries/PeriphDrivers/Source/GPIO/gpio_me30.c b/Libraries/PeriphDrivers/Source/GPIO/gpio_me30.c index 5b3312315d7..bddc113d0b0 100644 --- a/Libraries/PeriphDrivers/Source/GPIO/gpio_me30.c +++ b/Libraries/PeriphDrivers/Source/GPIO/gpio_me30.c @@ -24,7 +24,6 @@ #include "gpio_reva.h" #include "gpio_common.h" #include "mxc_sys.h" -#include "lpgcr_regs.h" #include "mcr_regs.h" #include "pwrseq_regs.h" @@ -53,14 +52,6 @@ int MXC_GPIO_Init(uint32_t portmask) MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_GPIO0); } - if (portmask & 0x2) { - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_GPIO1); - } - - if (portmask & 0x4) { - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_GPIO2); - } - return MXC_GPIO_Common_Init(portmask); } @@ -70,14 +61,6 @@ int MXC_GPIO_Shutdown(uint32_t portmask) MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_GPIO0); } - if (portmask & 0x2) { - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_GPIO1); - } - - if (portmask & 0x4) { - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_GPIO2); - } - return E_NO_ERROR; } @@ -87,14 +70,6 @@ int MXC_GPIO_Reset(uint32_t portmask) MXC_SYS_Reset_Periph(MXC_SYS_RESET0_GPIO0); } - if (portmask & 0x2) { - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_GPIO1); - } - - if (portmask & 0x4) { - MXC_SYS_Reset_Periph(MXC_SYS_RESET_GPIO2); - } - return E_NO_ERROR; } @@ -118,88 +93,46 @@ int MXC_GPIO_Config(const mxc_gpio_cfg_t *cfg) return error; } - if (cfg->port == MXC_GPIO3) { - switch (cfg->func) { - case MXC_GPIO_FUNC_IN: - MXC_MCR->gpio3_ctrl &= ~(P30_OUT_EN(cfg->mask) | P31_OUT_EN(cfg->mask)); - MXC_MCR->outen &= ~(SQWAVE_OUT_EN(cfg->mask) | PDOWN_OUT_EN(cfg->mask)); - break; - - case MXC_GPIO_FUNC_OUT: - MXC_MCR->gpio3_ctrl |= P30_OUT_EN(cfg->mask) | P31_OUT_EN(cfg->mask); - MXC_MCR->outen &= ~(SQWAVE_OUT_EN(cfg->mask) | PDOWN_OUT_EN(cfg->mask)); - break; - - case MXC_GPIO_FUNC_ALT1: - MXC_MCR->gpio3_ctrl |= P30_OUT_EN(cfg->mask) | P31_OUT_EN(cfg->mask); - MXC_MCR->outen |= SQWAVE_OUT_EN(cfg->mask) | PDOWN_OUT_EN(cfg->mask); - break; - - default: - return E_NOT_SUPPORTED; - } - - switch (cfg->pad) { - case MXC_GPIO_PAD_NONE: - MXC_MCR->gpio3_ctrl |= P30_PULL_DIS(cfg->mask) | P31_PULL_DIS(cfg->mask); - break; - - case MXC_GPIO_PAD_PULL_UP: - case MXC_GPIO_PAD_WEAK_PULL_UP: - MXC_MCR->gpio3_ctrl |= P30_DATA_OUT(cfg->mask) | P31_DATA_OUT(cfg->mask); - MXC_MCR->gpio3_ctrl &= ~(P30_PULL_DIS(cfg->mask) | P31_PULL_DIS(cfg->mask)); - break; - - case MXC_GPIO_PAD_PULL_DOWN: - case MXC_GPIO_PAD_WEAK_PULL_DOWN: - MXC_MCR->gpio3_ctrl &= ~(P30_DATA_OUT(cfg->mask) | P31_DATA_OUT(cfg->mask)); - MXC_MCR->gpio3_ctrl &= ~(P30_PULL_DIS(cfg->mask) | P31_PULL_DIS(cfg->mask)); - break; - - default: - return E_NOT_SUPPORTED; - } - } else { - // Configure alternate function - error = MXC_GPIO_RevA_SetAF((mxc_gpio_reva_regs_t *)gpio, cfg->func, cfg->mask); - if (error != E_NO_ERROR) { - return error; - } - - // Configure the pad - switch (cfg->pad) { - case MXC_GPIO_PAD_NONE: - gpio->padctrl0 &= ~cfg->mask; - gpio->padctrl1 &= ~cfg->mask; - break; - - case MXC_GPIO_PAD_WEAK_PULL_UP: - gpio->padctrl0 |= cfg->mask; - gpio->padctrl1 &= ~cfg->mask; - gpio->ps &= ~cfg->mask; - break; - - case MXC_GPIO_PAD_PULL_UP: - gpio->padctrl0 |= cfg->mask; - gpio->padctrl1 &= ~cfg->mask; - gpio->ps |= cfg->mask; - break; - - case MXC_GPIO_PAD_WEAK_PULL_DOWN: - gpio->padctrl0 &= ~cfg->mask; - gpio->padctrl1 |= cfg->mask; - gpio->ps &= ~cfg->mask; - break; - - case MXC_GPIO_PAD_PULL_DOWN: - gpio->padctrl0 &= ~cfg->mask; - gpio->padctrl1 |= cfg->mask; - gpio->ps |= cfg->mask; - break; - - default: - return E_BAD_PARAM; - } + // Configure alternate function + error = MXC_GPIO_RevA_SetAF((mxc_gpio_reva_regs_t *)gpio, cfg->func, cfg->mask); + if (error != E_NO_ERROR) { + return error; + } + + // Configure the pad + // TODO(ME30): "ps" (weak vs strong pull-up/down select) register field missing + switch (cfg->pad) { + case MXC_GPIO_PAD_NONE: + gpio->padctrl0 &= ~cfg->mask; + gpio->padctrl1 &= ~cfg->mask; + break; + + case MXC_GPIO_PAD_WEAK_PULL_UP: + gpio->padctrl0 |= cfg->mask; + gpio->padctrl1 &= ~cfg->mask; + // gpio->ps &= ~cfg->mask; + break; + + case MXC_GPIO_PAD_PULL_UP: + gpio->padctrl0 |= cfg->mask; + gpio->padctrl1 &= ~cfg->mask; + // gpio->ps |= cfg->mask; + break; + + case MXC_GPIO_PAD_WEAK_PULL_DOWN: + gpio->padctrl0 &= ~cfg->mask; + gpio->padctrl1 |= cfg->mask; + // gpio->ps &= ~cfg->mask; + break; + + case MXC_GPIO_PAD_PULL_DOWN: + gpio->padctrl0 &= ~cfg->mask; + gpio->padctrl1 |= cfg->mask; + // gpio->ps |= cfg->mask; + break; + + default: + return E_BAD_PARAM; } // Configure the drive strength @@ -213,122 +146,54 @@ int MXC_GPIO_Config(const mxc_gpio_cfg_t *cfg) /* ************************************************************************** */ uint32_t MXC_GPIO_InGet(mxc_gpio_regs_t *port, uint32_t mask) { - uint32_t in = 0; - - if (port == MXC_GPIO3) { - if (MXC_MCR->gpio3_ctrl & P30_DATA_IN(mask)) { - in |= MXC_GPIO_PIN_0; - } - - if (MXC_MCR->gpio3_ctrl & P31_DATA_IN(mask)) { - in |= MXC_GPIO_PIN_1; - } - - return in; - } - return MXC_GPIO_RevA_InGet((mxc_gpio_reva_regs_t *)port, mask); } /* ************************************************************************** */ void MXC_GPIO_OutSet(mxc_gpio_regs_t *port, uint32_t mask) { - if (port == MXC_GPIO3) { - MXC_MCR->gpio3_ctrl |= P30_DATA_OUT(mask) | P31_DATA_OUT(mask); - return; - } - MXC_GPIO_RevA_OutSet((mxc_gpio_reva_regs_t *)port, mask); } /* ************************************************************************** */ void MXC_GPIO_OutClr(mxc_gpio_regs_t *port, uint32_t mask) { - if (port == MXC_GPIO3) { - MXC_MCR->gpio3_ctrl &= ~(P30_DATA_OUT(mask) | P31_DATA_OUT(mask)); - return; - } - MXC_GPIO_RevA_OutClr((mxc_gpio_reva_regs_t *)port, mask); } /* ************************************************************************** */ uint32_t MXC_GPIO_OutGet(mxc_gpio_regs_t *port, uint32_t mask) { - uint32_t out = 0; - - if (port == MXC_GPIO3) { - if (MXC_MCR->gpio3_ctrl & P30_DATA_OUT(mask)) { - out |= MXC_GPIO_PIN_0; - } - - if (MXC_MCR->gpio3_ctrl & P31_DATA_OUT(mask)) { - out |= MXC_GPIO_PIN_1; - } - - return out; - } - return MXC_GPIO_RevA_OutGet((mxc_gpio_reva_regs_t *)port, mask); } /* ************************************************************************** */ void MXC_GPIO_OutPut(mxc_gpio_regs_t *port, uint32_t mask, uint32_t val) { - if (port == MXC_GPIO3) { - uint32_t gpio3_cp = MXC_MCR->gpio3_ctrl & ~(P30_DATA_OUT(mask) | P31_DATA_OUT(mask)); - - MXC_MCR->gpio3_ctrl = gpio3_cp | P30_DATA_OUT((mask & val)) | P31_DATA_OUT((mask & val)); - return; - } - MXC_GPIO_RevA_OutPut((mxc_gpio_reva_regs_t *)port, mask, val); } /* ************************************************************************** */ void MXC_GPIO_OutToggle(mxc_gpio_regs_t *port, uint32_t mask) { - if (port == MXC_GPIO3) { - MXC_MCR->gpio3_ctrl ^= P30_DATA_OUT(mask) | P31_DATA_OUT(mask); - return; - } - MXC_GPIO_RevA_OutToggle((mxc_gpio_reva_regs_t *)port, mask); } /* ************************************************************************** */ int MXC_GPIO_IntConfig(const mxc_gpio_cfg_t *cfg, mxc_gpio_int_pol_t pol) { - if (cfg->port == MXC_GPIO3) { - if (pol != MXC_GPIO_INT_BOTH) { - return E_NOT_SUPPORTED; - } - - return E_NO_ERROR; - } - return MXC_GPIO_RevA_IntConfig(cfg, pol); } /* ************************************************************************** */ void MXC_GPIO_EnableInt(mxc_gpio_regs_t *port, uint32_t mask) { - if (port == MXC_GPIO3) { - MXC_PWRSEQ->lpwken3 |= mask; - return; - } - MXC_GPIO_RevA_EnableInt((mxc_gpio_reva_regs_t *)port, mask); } /* ************************************************************************** */ void MXC_GPIO_DisableInt(mxc_gpio_regs_t *port, uint32_t mask) { - if (port == MXC_GPIO3) { - MXC_PWRSEQ->lpwken3 &= ~mask; - return; - } - MXC_GPIO_RevA_DisableInt((mxc_gpio_reva_regs_t *)port, mask); } @@ -347,67 +212,36 @@ void MXC_GPIO_Handler(unsigned int port) /* ************************************************************************** */ void MXC_GPIO_ClearFlags(mxc_gpio_regs_t *port, uint32_t flags) { - if (port == MXC_GPIO3) { - MXC_PWRSEQ->lpwkst3 = flags; - return; - } - MXC_GPIO_RevA_ClearFlags((mxc_gpio_reva_regs_t *)port, flags); } /* ************************************************************************** */ uint32_t MXC_GPIO_GetFlags(mxc_gpio_regs_t *port) { - if (port == MXC_GPIO3) { - return MXC_PWRSEQ->lpwkst3; - } - return MXC_GPIO_RevA_GetFlags((mxc_gpio_reva_regs_t *)port); } /* ************************************************************************** */ int MXC_GPIO_SetVSSEL(mxc_gpio_regs_t *port, mxc_gpio_vssel_t vssel, uint32_t mask) { - if (port == MXC_GPIO3) { - if (vssel == MXC_GPIO_VSSEL_VDDIO) { - return E_NOT_SUPPORTED; - } - - return E_NO_ERROR; - } - return MXC_GPIO_RevA_SetVSSEL((mxc_gpio_reva_regs_t *)port, vssel, mask); } /* ************************************************************************** */ void MXC_GPIO_SetWakeEn(mxc_gpio_regs_t *port, uint32_t mask) { - if (port == MXC_GPIO3) { - MXC_PWRSEQ->lpwken3 |= mask; - return; - } - MXC_GPIO_RevA_SetWakeEn((mxc_gpio_reva_regs_t *)port, mask); } /* ************************************************************************** */ void MXC_GPIO_ClearWakeEn(mxc_gpio_regs_t *port, uint32_t mask) { - if (port == MXC_GPIO3) { - MXC_PWRSEQ->lpwken3 &= ~mask; - return; - } - MXC_GPIO_RevA_ClearWakeEn((mxc_gpio_reva_regs_t *)port, mask); } /* ************************************************************************** */ uint32_t MXC_GPIO_GetWakeEn(mxc_gpio_regs_t *port) { - if (port == MXC_GPIO3) { - return MXC_PWRSEQ->lpwken3; - } - return MXC_GPIO_RevA_GetWakeEn((mxc_gpio_reva_regs_t *)port); } From c8fab7309ac07b63bf86bda7b6c470c49dc17afa Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 16:52:43 -0600 Subject: [PATCH 20/41] Update mem base/size macros --- .../CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 6dc05068db9..413f2af005d 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -179,6 +179,7 @@ typedef enum { #define MXC_SRAM_S_MEM_SIZE 0x00040000UL /* Secure Region name redefinitions for explicit use */ +#if IS_SECURE_ENVIRONMENT #define MXC_FLASH_MEM_BASE MXC_FLASH_S_MEM_BASE #define MXC_FLASH_PAGE_SIZE MXC_FLASH_S_PAGE_SIZE #define MXC_FLASH_MEM_SIZE MXC_FLASH_S_MEM_SIZE @@ -186,6 +187,15 @@ typedef enum { #define MXC_INFO_MEM_SIZE MXC_INFO_S_MEM_SIZE #define MXC_SRAM_MEM_BASE MXC_SRAM_S_MEM_BASE #define MXC_SRAM_MEM_SIZE MXC_SRAM_S_MEM_SIZE +#else +#define MXC_FLASH_MEM_BASE MXC_FLASH_NS_MEM_BASE +#define MXC_FLASH_PAGE_SIZE MXC_FLASH_NS_PAGE_SIZE +#define MXC_FLASH_MEM_SIZE MXC_FLASH_NS_MEM_SIZE +#define MXC_INFO_MEM_BASE MXC_INFO_NS_MEM_BASE +#define MXC_INFO_MEM_SIZE MXC_INFO_NS_MEM_SIZE +#define MXC_SRAM_MEM_BASE MXC_SRAM_NS_MEM_BASE +#define MXC_SRAM_MEM_SIZE MXC_SRAM_NS_MEM_SIZE +#endif /* ================================================================================ */ /* ================ Device Specific Peripheral Section ================ */ From 36cf4265500f251e449f0d7dd88b5e52b0b4dcac Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 16:53:24 -0600 Subject: [PATCH 21/41] Update GCR macros --- Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 413f2af005d..08fa30ae580 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -216,8 +216,11 @@ typedef enum { #define MXC_BASE_GCR_S ((uint32_t)0x50000000UL) #define MXC_GCR_S ((mxc_gcr_regs_t *)MXC_BASE_GCR_S) -#define MXC_BASE_GCR MXC_BASE_GCR_S +#if IS_SECURE_ENVIRONMENT #define MXC_GCR MXC_GCR_S +#else +#define MXC_GCR MXC_GCR_NS +#endif /******************************************************************************/ /* Non-battery backed SI Registers */ From d7a8087c244ed87f6ed0a1e05b7a18d01348f8b6 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:13:28 -0600 Subject: [PATCH 22/41] Update secure vs non-secure macros for: - SIR - FCR - WDT - SVM - BOOST - TRIMSIR - RTC - WUT - PWRSEQ - MCR - AES - CRC - TMR - I3C - SPI - TRNG - BTLE --- .../Device/Maxim/MAX32657/Include/max32657.h | 153 +++++++++++------- 1 file changed, 94 insertions(+), 59 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 08fa30ae580..53e6036fabb 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -233,8 +233,11 @@ typedef enum { #define MXC_BASE_SIR_S ((uint32_t)0x50000400UL) #define MXC_SIR_S ((mxc_sir_regs_t *)MXC_BASE_SIR_S) -#define MXC_BASE_SIR MXC_BASE_SIR_S +#if IS_SECURE_ENVIRONMENT #define MXC_SIR MXC_SIR_S +#else +#define MXC_SIR MXC_SIR_NS +#endif /******************************************************************************/ /* Non-Battery Backed Function Control */ @@ -247,6 +250,12 @@ typedef enum { #define MXC_BASE_FCR_S ((uint32_t)0x50000800UL) #define MXC_FCR_S ((mxc_fcr_regs_t *)MXC_BASE_FCR_S) +#if IS_SECURE_ENVIRONMENT +#define MXC_FCR MXC_FCR_S +#else +#define MXC_FCR_NS +#endif + /******************************************************************************/ /* Windowed Watchdog Timer */ #define MXC_CFG_WDT_INSTANCES (1) @@ -259,8 +268,11 @@ typedef enum { #define MXC_BASE_WDT_S ((uint32_t)0x50003000UL) #define MXC_WDT_S ((mxc_wdt_regs_t *)MXC_BASE_WDT_S) -#define MXC_BASE_WDT MXC_BASE_WDT_S +#if IS_SECURE_ENVIRONMENT #define MXC_WDT MXC_WDT_S +#else +#define MXC_WDT MXC_WDT_NS +#endif /******************************************************************************/ /* SVM Controller */ @@ -273,8 +285,11 @@ typedef enum { #define MXC_BASE_SVM_S ((uint32_t)0x50004800UL) #define MXC_SVM_S //TODO(ME30): Add SVM controller registers. -#define MXC_BASE_SVM MXC_BASE_SVM_S -#define MXC_SVM //TODO(ME30): Add SVM controller registers. +#if IS_SECURE_ENVIRONMENT +#define MXC_SVM MXC_SVM_S //TODO(ME30): Add SVM controller registers +#else +#define MXC_SVM MXC_SVM_NS +#endif /******************************************************************************/ /* Boost Controller */ @@ -287,8 +302,11 @@ typedef enum { #define MXC_BASE_BOOST_S ((uint32_t)0x50004C00UL) #define MXC_BOOST_S //TODO(ME30): Add Boost controller registers. -#define MXC_BASE_BOOST MXC_BASE_BOOST_S -#define MXC_BOOST //TODO(ME30): Add Boost controller registers. +#if IS_SECURE_ENVIRONMENT +#define MXC_BOOST MXC_BOOST_S +#else +#define MXC_BOOST MXC_BOOST_NS +#endif /******************************************************************************/ /* Trim System Initalization Register */ @@ -301,8 +319,11 @@ typedef enum { #define MXC_BASE_TRIMSIR_S ((uint32_t)0x50005400UL) #define MXC_TRIMSIR_S ((mxc_trimsir_regs_t *)MXC_BASE_TRIMSIR_S) -#define MXC_BASE_TRIMSIR MXC_BASE_TRIMSIR_S +#if IS_SECURE_ENVIRONMENT #define MXC_TRIMSIR MXC_TRIMSIR_S +#else +#define MXC_TRIMSIR MXC_TRIMSIR_NS +#endif /******************************************************************************/ /* Real Time Clock */ @@ -315,8 +336,11 @@ typedef enum { #define MXC_BASE_RTC_S ((uint32_t)0x50006000UL) #define MXC_RTC_S ((mxc_rtc_regs_t *)MXC_BASE_RTC_S) -#define MXC_BASE_RTC MXC_BASE_RTC_S +#if IS_SECURE_ENVIRONMENT #define MXC_RTC MXC_RTC_S +#else +#define MXC_RTC MXC_RTC_NS +#endif /******************************************************************************/ /* Wake-Up Timer (WUT) */ @@ -334,10 +358,13 @@ typedef enum { #define MXC_BASE_WUT1_S ((uint32_t)0x50006600UL) #define MXC_WUT1_S ((mxc_wut_regs_t *)MXC_BASE_WUT1_S) -#define MXC_BASE_WUT0 MXC_BASE_WUT0_S +#if IS_SECURE_ENVIRONMENT #define MXC_WUT0 MXC_WUT0_S -#define MXC_BASE_WUT1 MXC_BASE_WUT1_S #define MXC_WUT1 MXC_WUT1_S +#else +#define MXC_WUT0 MXC_WUT0_NS +#define MXC_WUT1 MXC_WUT1_NS +#endif /******************************************************************************/ /* Power Sequencer */ @@ -350,8 +377,11 @@ typedef enum { #define MXC_BASE_PWRSEQ_S ((uint32_t)0x50006800UL) #define MXC_PWRSEQ_S ((mxc_pwrseq_regs_t *)MXC_BASE_PWRSEQ_S) -#define MXC_BASE_PWRSEQ MXC_BASE_PWRSEQ_S +#if IS_SECURE_ENVIRONMENT #define MXC_PWRSEQ MXC_PWRSEQ_S +#else +#define MXC_PWRSEQ MXC_PWRSEQ_NS +#endif /******************************************************************************/ /* Misc Control */ @@ -364,8 +394,11 @@ typedef enum { #define MXC_BASE_MCR_S ((uint32_t)0x50006C00UL) #define MXC_MCR_S ((mxc_mcr_regs_t *)MXC_BASE_MCR_S) -#define MXC_BASE_MCR MXC_BASE_MCR_S +#if IS_SECURE_ENVIRONMENT #define MXC_MCR MXC_MCR_S +#else +#define MXC_MCR MXC_MCR_S +#endif /******************************************************************************/ /* AES */ @@ -378,8 +411,11 @@ typedef enum { #define MXC_BASE_AES_S ((uint32_t)0x50007400UL) #define MXC_AES_S ((mxc_aes_regs_t *)MXC_BASE_AES_NS) -#define MXC_BASE_AES MXC_BASE_AES_S +#if IS_SECURE_ENVIRONMENT #define MXC_AES MXC_AES_S +#else +#define MXC_AES MXC_AES_NS +#endif /******************************************************************************/ /* AES Keys */ @@ -392,8 +428,11 @@ typedef enum { #define MXC_BASE_AESKEYS_S ((uint32_t)0x50007800UL) #define MXC_AESKEYS_S ((mxc_aeskeys_regs_t *)MXC_BASE_AESKEYS_S) -#define MXC_BASE_AESKEYS MXC_BASE_AESKEYS_S +#if IS_SECURE_ENVIRONMENT #define MXC_AESKEYS MXC_AESKEYS_S +#else +#define MXC_AESKEYS MXC_AESKEYS_NS +#endif /******************************************************************************/ /* GPIO */ @@ -441,8 +480,11 @@ We may want to handle GET_IRQ better... #define MXC_BASE_CRC_S ((uint32_t)0x5000F000UL) #define MXC_CRC_S ((mxc_crc_regs_t *)MXC_BASE_CRC_S) -#define MXC_BASE_CRC MXC_BASE_CRC_S +#if IS_SECURE_ENVIRONMENT #define MXC_CRC MXC_CRC_S +#else +#define MXC_CRC MXC_CRC_NS +#endif /******************************************************************************/ /* Timer */ @@ -498,35 +540,29 @@ We may want to handle GET_IRQ better... #define MXC_BASE_TMR5_S ((uint32_t)0x50081000UL) #define MXC_TMR5_S ((mxc_tmr_regs_t *)MXC_BASE_TMR5_S) -#define MXC_BASE_TMR0 MXC_BASE_TMR0_S +#if IS_SECURE_ENVIRONMENT #define MXC_TMR0 MXC_TMR0_S -#define MXC_BASE_TMR1 MXC_BASE_TMR1_S #define MXC_TMR1 MXC_TMR1_S -#define MXC_BASE_TMR2 MXC_BASE_TMR2_S #define MXC_TMR2 MXC_TMR2_S -#define MXC_BASE_TMR3 MXC_BASE_TMR3_S #define MXC_TMR3 MXC_TMR3_S -#define MXC_BASE_TMR4 MXC_BASE_TMR4_S #define MXC_TMR4 MXC_TMR4_S -#define MXC_BASE_TMR5 MXC_BASE_TMR5_S #define MXC_TMR5 MXC_TMR5_S - -#define MXC_TMR_S_GET_BASE(i) \ - ((i) == 0 ? MXC_BASE_TMR0_S : \ - (i) == 1 ? MXC_BASE_TMR1_S : \ - (i) == 2 ? MXC_BASE_TMR2_S : \ - (i) == 3 ? MXC_BASE_TMR3_S : \ - (i) == 4 ? MXC_BASE_TMR4_S : \ - (i) == 5 ? MXC_BASE_TMR5_S : \ - 0) +#else +#define MXC_TMR0 MXC_TMR0_NS +#define MXC_TMR1 MXC_TMR1_NS +#define MXC_TMR2 MXC_TMR2_NS +#define MXC_TMR3 MXC_TMR3_NS +#define MXC_TMR4 MXC_TMR4_NS +#define MXC_TMR5 MXC_TMR5_NS +#endif #define MXC_TMR_S_GET_TMR(i) \ - ((i) == 0 ? MXC_TMR0_S : \ - (i) == 1 ? MXC_TMR1_S : \ - (i) == 2 ? MXC_TMR2_S : \ - (i) == 3 ? MXC_TMR3_S : \ - (i) == 4 ? MXC_TMR4_S : \ - (i) == 5 ? MXC_TMR5_S : \ + ((i) == 0 ? MXC_TMR0 : \ + (i) == 1 ? MXC_TMR1 : \ + (i) == 2 ? MXC_TMR2 : \ + (i) == 3 ? MXC_TMR3 : \ + (i) == 4 ? MXC_TMR4 : \ + (i) == 5 ? MXC_TMR5 : \ 0) #define MXC_TMR_GET_IRQ(i) \ @@ -555,6 +591,8 @@ We may want to handle GET_IRQ better... /******************************************************************************/ /* I3C */ +#define MXC_I3C_FIFO_DEPTH (8) // TODO(ME30): Confirm this is correct. + /* Non-secure Mapping */ #define MXC_BASE_I3C_NS ((uint32_t)0x4001D000UL) #define MXC_I3C_NS ((mxc_i2c_regs_t *)MXC_BASE_I3C_NS) @@ -563,10 +601,11 @@ We may want to handle GET_IRQ better... #define MXC_BASE_I3C_S ((uint32_t)0x5001D000UL) #define MXC_I3C_S ((mxc_i2c_regs_t *)MXC_BASE_I3C_S) -#define MXC_BASE_I3C MXC_BASE_I2C_S +#if IS_SECURE_ENVIRONMENT #define MXC_I3C MXC_I3C_S - -#define MXC_I3C_FIFO_DEPTH (8) // TODO(ME30): Confirm this is correct. +#else +#define MXC_I3C MXC_I3C_NS +#endif /******************************************************************************/ /* DMA */ @@ -635,7 +674,6 @@ We may want to handle GET_IRQ better... #define MXC_ICC ((mxc_icc_regs_t *)MXC_BASE_ICC_S) /* Added for consistency and explicitness */ -#define MXC_BASE_ICC_S MXC_BASE_ICC #define MXC_ICC_S MXC_ICC /******************************************************************************/ @@ -647,26 +685,17 @@ We may want to handle GET_IRQ better... #define MXC_BASE_UART_NS ((uint32_t)0x40042000UL) #define MXC_UART_NS ((mxc_uart_regs_t *)MXC_BASE_UART_NS) -#define MXC_UART_NS_GET_BASE(i) ((i) == 0 ? MXC_BASE_UART0_NS : 0) -#define MXC_UART_NS_GET_UART(i) ((i) == 0 ? MXC_UART_NS : 0) - /* Secure Mapping */ #define MXC_BASE_UART_S ((uint32_t)0x50042000UL) #define MXC_UART_S ((mxc_uart_regs_t *)MXC_BASE_UART_S) -#define MXC_UART_S_GET_UART(i) ((i) == 0 ? MXC_UART_S : 0) -#define MXC_UART_S_GET_BASE(i) ((i) == 0 ? MXC_BASE_UART0_S : 0) - #if IS_SECURE_ENVIRONMENT -#define MXC_BASE_UART MXC_BASE_UART_S #define MXC_UART MXC_UART_S -#define MXC_UART_GET_UART(i) MXC_UART_S_GET_UART(i) #else -#define MXC_BASE_UART MXC_BASE_UART_NS #define MXC_UART MXC_UART_NS -#define MXC_UART_GET_UART(i) MXC_UART_NS_GET_UART(i) #endif +#define MXC_UART_GET_UART(i) ((i) == 0 ? MXC_UART : 0) #define MXC_UART_GET_IRQ(i) (IRQn_Type)((i) == 0 ? UART0_IRQn : 0) #define MXC_UART_GET_IDX(p) ((p) == MXC_UART_NS ? 0 : (p) == MXC_UART_S ? 0 : -1) @@ -687,12 +716,13 @@ We may want to handle GET_IRQ better... #define MXC_BASE_SPI_S ((uint32_t)0x50046000UL) #define MXC_SPI_S ((mxc_spi_regs_t *)MXC_BASE_SPI_S) -#define MXC_BASE_SPI MXC_BASE_SPI_S +#if IS_SECURE_ENVIRONMENT #define MXC_SPI MXC_SPI_S +#else +#define MXC_SPI MXC_SPI_NS +#endif -#define MXC_SPI_S_GET_BASE(i) ((i) == 0 ? MXC_BASE_SPI_S : 0) -#define MXC_SPI_S_GET_SPI(i) ((i) == 0 ? MXC_SPI_S : 0) - +#define MXC_SPI_GET_SPI(i) ((i) == 0 ? MXC_SPI : 0) #define MXC_SPI_GET_IRQ(i) (IRQn_Type)((i) == 0 ? SPI_IRQn : 0) #define MXC_SPI_GET_IDX(p) ((p) == MXC_SPI_NS ? 0 : (p) == MXC_SPI_S ? 0 : -1) @@ -707,8 +737,11 @@ We may want to handle GET_IRQ better... #define MXC_BASE_TRNG_S ((uint32_t)0x5004D000UL) #define MXC_TRNG_S ((mxc_trng_regs_t *)MXC_BASE_TRNG_S) -#define MXC_BASE_TRNG MXC_BASE_TRNG_S +#if IS_SECURE_ENVIRONMENT #define MXC_TRNG MXC_TRNG_S +#else +#define MXC_TRNG MXC_TRNG_NS +#endif /******************************************************************************/ /* BTLE */ @@ -722,8 +755,12 @@ We may want to handle GET_IRQ better... #define MXC_BASE_BTLE_S ((uint32_t)0x50050000UL) #define MXC_BTLE_S // TODO(ME30): Add BTLE related registers? This section doesn't exist for ME17. -#define MXC_BASE_BTLE MXC_BASE_BTLE_S -#define MXC_BTLE // TODO(ME30): Does this have registers? +#if IS_SECURE_ENVIRONMENT +// TODO(ME30): Does this have registers? +#define MXC_BTLE MXC_BTLE_S +#else +#define MXC_BTLE MXC_BTLE_NS +#endif /******************************************************************************/ /* Secure Privilege Control (SPC TZ) */ @@ -731,8 +768,6 @@ We may want to handle GET_IRQ better... /* Secure Mapping Only */ #define MXC_BASE_SPC ((uint32_t)0x50090000UL) #define MXC_SPC // TODO(ME30): Does this have registers? - -#define MXC_BASE_SPC_S MXC_BASE_SPC #define MXC_SPC_S // TODO(ME30): Does this have registers? /******************************************************************************/ From e6cc041509dbbbaf71865a0f1871af3f58d2dead Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:30:01 -0600 Subject: [PATCH 23/41] Update ME30 SYS drivers --- .../PeriphDrivers/Include/MAX32657/mxc_sys.h | 3 +- Libraries/PeriphDrivers/Source/SYS/sys_me30.c | 161 ++++++------------ Libraries/PeriphDrivers/max32657_files.mk | 2 + 3 files changed, 52 insertions(+), 114 deletions(-) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h index def4ee9b925..4d0d93621d3 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/mxc_sys.h @@ -105,9 +105,8 @@ typedef enum { } mxc_sys_periph_clock_t; /** @brief Enumeration to select System Clock source */ +// TODO(ME30): CLKCTRL sysclk_sel values seem incorrect. typedef enum { - MXC_SYS_CLOCK_ISO = - MXC_V_GCR_CLKCTRL_SYSCLK_SEL_ISO, /**< Select the Internal Secondary Oscillator (ISO) */ MXC_SYS_CLOCK_IPO = MXC_V_GCR_CLKCTRL_SYSCLK_SEL_IPO, /**< Select the Internal Primary Oscillator (IPO) */ MXC_SYS_CLOCK_IBRO = diff --git a/Libraries/PeriphDrivers/Source/SYS/sys_me30.c b/Libraries/PeriphDrivers/Source/SYS/sys_me30.c index 4ad2ab85b67..e03cd7c5cfd 100644 --- a/Libraries/PeriphDrivers/Source/SYS/sys_me30.c +++ b/Libraries/PeriphDrivers/Source/SYS/sys_me30.c @@ -29,7 +29,6 @@ #include "mxc_assert.h" #include "mxc_sys.h" #include "mxc_delay.h" -#include "lpgcr_regs.h" #include "gcr_regs.h" #include "fcr_regs.h" #include "mcr_regs.h" @@ -61,14 +60,14 @@ extern uint32_t _binary_riscv_bin_start; int MXC_SYS_GetUSN(uint8_t *usn, uint8_t *checksum) { int err = E_NO_ERROR; - uint32_t *infoblock = (uint32_t *)MXC_INFO0_MEM_BASE; + uint32_t *infoblock = (uint32_t *)MXC_INFO_MEM_BASE; if (usn == NULL) { return E_NULL_PTR; } /* Read the USN from the info block */ - MXC_FLC_UnlockInfoBlock(MXC_INFO0_MEM_BASE); + MXC_FLC_UnlockInfoBlock(MXC_INFO_MEM_BASE); memset(usn, 0, MXC_SYS_USN_CHECKSUM_LEN); @@ -96,7 +95,7 @@ int MXC_SYS_GetUSN(uint8_t *usn, uint8_t *checksum) err = MXC_AES_Init(); if (err) { - MXC_FLC_LockInfoBlock(MXC_INFO0_MEM_BASE); + MXC_FLC_LockInfoBlock(MXC_INFO_MEM_BASE); return err; } @@ -114,7 +113,7 @@ int MXC_SYS_GetUSN(uint8_t *usn, uint8_t *checksum) err = MXC_AES_Generic(&aes_req); if (err) { - MXC_FLC_LockInfoBlock(MXC_INFO0_MEM_BASE); + MXC_FLC_LockInfoBlock(MXC_INFO_MEM_BASE); return err; } @@ -122,7 +121,7 @@ int MXC_SYS_GetUSN(uint8_t *usn, uint8_t *checksum) // Verify Checksum if (check_csum[0] != checksum[1] || check_csum[1] != checksum[0]) { - MXC_FLC_LockInfoBlock(MXC_INFO0_MEM_BASE); + MXC_FLC_LockInfoBlock(MXC_INFO_MEM_BASE); return E_INVALID; } } @@ -131,7 +130,7 @@ int MXC_SYS_GetUSN(uint8_t *usn, uint8_t *checksum) usn[11] = ((infoblock[3] & 0x7F800000) >> 23); usn[12] = ((infoblock[4] & 0x007F8000) >> 15); - MXC_FLC_LockInfoBlock(MXC_INFO0_MEM_BASE); + MXC_FLC_LockInfoBlock(MXC_INFO_MEM_BASE); return err; } @@ -146,10 +145,7 @@ int MXC_SYS_GetRevision(void) int MXC_SYS_IsClockEnabled(mxc_sys_periph_clock_t clock) { /* The mxc_sys_periph_clock_t enum uses enum values that are the offset by 32 and 64 for the perckcn1 register. */ - if (clock > 63) { - clock -= 64; - return !(MXC_LPGCR->pclkdis & (0x1 << clock)); - } else if (clock > 31) { + if (clock > 31) { clock -= 32; return !(MXC_GCR->pclkdis1 & (0x1 << clock)); } else { @@ -161,10 +157,7 @@ int MXC_SYS_IsClockEnabled(mxc_sys_periph_clock_t clock) void MXC_SYS_ClockDisable(mxc_sys_periph_clock_t clock) { /* The mxc_sys_periph_clock_t enum uses enum values that are the offset by 32 and 64 for the perckcn1 register. */ - if (clock > 63) { - clock -= 64; - MXC_LPGCR->pclkdis |= (0x1 << clock); - } else if (clock > 31) { + if (clock > 31) { clock -= 32; MXC_GCR->pclkdis1 |= (0x1 << clock); } else { @@ -176,10 +169,7 @@ void MXC_SYS_ClockDisable(mxc_sys_periph_clock_t clock) void MXC_SYS_ClockEnable(mxc_sys_periph_clock_t clock) { /* The mxc_sys_periph_clock_t enum uses enum values that are the offset by 32 and 64 for the perckcn1 register. */ - if (clock > 63) { - clock -= 64; - MXC_LPGCR->pclkdis &= ~(0x1 << clock); - } else if (clock > 31) { + if (clock > 31) { clock -= 32; MXC_GCR->pclkdis1 &= ~(0x1 << clock); } else { @@ -232,10 +222,11 @@ int MXC_SYS_ClockSourceEnable(mxc_sys_system_clock_t clock) return MXC_SYS_Clock_Timeout(MXC_F_GCR_CLKCTRL_IBRO_RDY); break; - case MXC_SYS_CLOCK_EXTCLK: - // No "RDY" bit to monitor, so just configure the GPIO - return MXC_GPIO_Config(&gpio_cfg_extclk); - break; + // TODO(ME30): EXTCLK is missing from register definitions + // case MXC_SYS_CLOCK_EXTCLK: + // // No "RDY" bit to monitor, so just configure the GPIO + // return MXC_GPIO_Config(&gpio_cfg_extclk); + // break; case MXC_SYS_CLOCK_INRO: // The 80k clock is always enabled @@ -243,20 +234,21 @@ int MXC_SYS_ClockSourceEnable(mxc_sys_system_clock_t clock) break; case MXC_SYS_CLOCK_ERFO: - MXC_GCR->btleldoctrl |= MXC_F_GCR_BTLELDOCTRL_LDOTXEN | MXC_F_GCR_BTLELDOCTRL_LDORXEN; + MXC_GCR->btleldoctrl |= MXC_F_GCR_BTLELDOCTRL_TX_EN | MXC_F_GCR_BTLELDOCTRL_RX_EN; /* Initialize kickstart circuit Select Kick start circuit clock source- IPO/ISO */ - MXC_FCR->erfoks = ((MXC_S_FCR_ERFOKS_KSCLKSEL_ISO) - /* Set Drive strengh - 0x1,0x2,0x3 */ - | ((0x1) << MXC_F_FCR_ERFOKS_KSERFODRIVER_POS) - /* Set kick count 1-127 */ - | (0x8) - /* Set double pulse length On/Off*/ - | (0 & MXC_F_FCR_ERFOKS_KSERFO2X) - /* Enable On/Off */ - | (MXC_F_FCR_ERFOKS_KSERFO_EN)); + // TODO(ME30): MXC_FCR missing ERFOKS definition + // MXC_FCR->erfoks = ((MXC_S_FCR_ERFOKS_KSCLKSEL_ISO) + // /* Set Drive strengh - 0x1,0x2,0x3 */ + // | ((0x1) << MXC_F_FCR_ERFOKS_KSERFODRIVER_POS) + // /* Set kick count 1-127 */ + // | (0x8) + // /* Set double pulse length On/Off*/ + // | (0 & MXC_F_FCR_ERFOKS_KSERFO2X) + // /* Enable On/Off */ + // | (MXC_F_FCR_ERFOKS_KSERFO_EN)); /* Enable ERFO */ MXC_GCR->clkctrl |= MXC_F_GCR_CLKCTRL_ERFO_EN; @@ -295,15 +287,16 @@ int MXC_SYS_ClockSourceDisable(mxc_sys_system_clock_t clock) MXC_GCR->clkctrl &= ~MXC_F_GCR_CLKCTRL_IBRO_EN; break; - case MXC_SYS_CLOCK_EXTCLK: - /* - There's not a great way to disable the external clock. - Deinitializing the GPIO here may have unintended consequences - for application code. - Selecting a different system clock source is sufficient - to "disable" the EXT_CLK source. - */ - break; + // TODO(ME30): Missing EXTCLK register definition + // case MXC_SYS_CLOCK_EXTCLK: + // /* + // There's not a great way to disable the external clock. + // Deinitializing the GPIO here may have unintended consequences + // for application code. + // Selecting a different system clock source is sufficient + // to "disable" the EXT_CLK source. + // */ + // break; case MXC_SYS_CLOCK_INRO: // The 80k clock is always enabled @@ -356,29 +349,11 @@ int MXC_SYS_Clock_Timeout(uint32_t ready) int MXC_SYS_Clock_Select(mxc_sys_system_clock_t clock) { uint32_t current_clock; - int err = E_NO_ERROR; // Save the current system clock current_clock = MXC_GCR->clkctrl & MXC_F_GCR_CLKCTRL_SYSCLK_SEL; switch (clock) { - case MXC_SYS_CLOCK_ISO: - - // Enable ISO clock - if (!(MXC_GCR->clkctrl & MXC_F_GCR_CLKCTRL_ISO_EN)) { - MXC_GCR->clkctrl |= MXC_F_GCR_CLKCTRL_ISO_EN; - - // Check if ISO clock is ready - if (MXC_SYS_Clock_Timeout(MXC_F_GCR_CLKCTRL_ISO_RDY) != E_NO_ERROR) { - return E_TIME_OUT; - } - } - - // Set ISO clock as System Clock - MXC_SETFIELD(MXC_GCR->clkctrl, MXC_F_GCR_CLKCTRL_SYSCLK_SEL, - MXC_S_GCR_CLKCTRL_SYSCLK_SEL_ISO); - - break; case MXC_SYS_CLOCK_IPO: // Enable IPO clock @@ -415,20 +390,21 @@ int MXC_SYS_Clock_Select(mxc_sys_system_clock_t clock) break; - case MXC_SYS_CLOCK_EXTCLK: - /* - There's not "EXT_CLK RDY" bit for the ME17, so we'll - blindly enable (configure GPIO) the external clock every time. - */ - err = MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_EXTCLK); - if (err) - return err; + // TODO(ME30): Missing EXTCLK register definition + // case MXC_SYS_CLOCK_EXTCLK: + // /* + // There's not "EXT_CLK RDY" bit for the ME17, so we'll + // blindly enable (configure GPIO) the external clock every time. + // */ + // err = MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_EXTCLK); + // if (err) + // return err; - // Set EXT clock as System Clock - MXC_SETFIELD(MXC_GCR->clkctrl, MXC_F_GCR_CLKCTRL_SYSCLK_SEL, - MXC_S_GCR_CLKCTRL_SYSCLK_SEL_EXTCLK); + // // Set EXT clock as System Clock + // MXC_SETFIELD(MXC_GCR->clkctrl, MXC_F_GCR_CLKCTRL_SYSCLK_SEL, + // MXC_S_GCR_CLKCTRL_SYSCLK_SEL_EXTCLK); - break; + // break; case MXC_SYS_CLOCK_ERFO: @@ -514,11 +490,7 @@ mxc_sys_system_clock_div_t MXC_SYS_GetClockDiv(void) void MXC_SYS_Reset_Periph(mxc_sys_reset_t reset) { /* The mxc_sys_reset_t enum uses enum values that are the offset by 32 and 64 for the rst register. */ - if (reset > 63) { - reset -= 64; - MXC_LPGCR->rst = (0x1 << reset); - while (MXC_LPGCR->rst & (0x1 << reset)) {} - } else if (reset > 31) { + if (reset > 31) { reset -= 32; MXC_GCR->rst1 = (0x1 << reset); while (MXC_GCR->rst1 & (0x1 << reset)) {} @@ -528,41 +500,6 @@ void MXC_SYS_Reset_Periph(mxc_sys_reset_t reset) } } -/* ************************************************************************** */ -void MXC_SYS_RISCVRun(void) -{ - /* Disable the the RSCV */ - MXC_GCR->pclkdis1 |= MXC_F_GCR_PCLKDIS1_CPU1; - - /* Set the interrupt vector base address */ - MXC_FCR->urvbootaddr = (uint32_t)&_binary_riscv_bin_start; - - /* Power up the RSCV */ - MXC_GCR->pclkdis1 &= ~(MXC_F_GCR_PCLKDIS1_CPU1); - - /* CPU1 reset */ - MXC_GCR->rst1 |= MXC_F_GCR_RST1_CPU1; -} - -/* ************************************************************************** */ -void MXC_SYS_RISCVShutdown(void) -{ - /* Disable the the RSCV */ - MXC_GCR->pclkdis1 |= MXC_F_GCR_PCLKDIS1_CPU1; -} - -/* ************************************************************************** */ -uint32_t MXC_SYS_RiscVClockRate(void) -{ - // If in LPM mode and the PCLK is selected as the RV32 clock source, - if (((MXC_GCR->pm & MXC_F_GCR_PM_MODE) == MXC_S_GCR_PM_MODE_LPM) && - (MXC_PWRSEQ->lpcn & MXC_F_PWRSEQ_LPCN_LPMCLKSEL)) { - return ISO_FREQ; - } else { - return PeripheralClock; - } -} - /* ************************************************************************** */ int MXC_SYS_LockDAP_Permanent(void) { diff --git a/Libraries/PeriphDrivers/max32657_files.mk b/Libraries/PeriphDrivers/max32657_files.mk index 9be6538cd3e..9cc4233adba 100644 --- a/Libraries/PeriphDrivers/max32657_files.mk +++ b/Libraries/PeriphDrivers/max32657_files.mk @@ -50,6 +50,8 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me30.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/pins_me30.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/AES PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/AES/aes_me30.c From 1318192d4d08deb26a00caff6cd3fe6d6f341394 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:30:17 -0600 Subject: [PATCH 24/41] Add ME30 pins file to build --- .../PeriphDrivers/Source/SYS/pins_me30.c | 126 ++++-------------- 1 file changed, 24 insertions(+), 102 deletions(-) diff --git a/Libraries/PeriphDrivers/Source/SYS/pins_me30.c b/Libraries/PeriphDrivers/Source/SYS/pins_me30.c index 79c0d33bc52..8b8e6b4afda 100644 --- a/Libraries/PeriphDrivers/Source/SYS/pins_me30.c +++ b/Libraries/PeriphDrivers/Source/SYS/pins_me30.c @@ -40,98 +40,31 @@ const mxc_gpio_cfg_t gpio_cfg_uart0_flow = { MXC_GPIO0, (MXC_GPIO_PIN_2 | MXC_GP MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; const mxc_gpio_cfg_t gpio_cfg_uart0_flow_disable = { MXC_GPIO0, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), MXC_GPIO_FUNC_IN, MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart1 = { MXC_GPIO0, (MXC_GPIO_PIN_12 | MXC_GPIO_PIN_13), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart1_flow = { MXC_GPIO0, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_15), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart1_flow_disable = { MXC_GPIO0, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_15), MXC_GPIO_FUNC_IN, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart2 = { MXC_GPIO1, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart2_flow = { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart2_flow_disable = { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_IN, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart3 = { MXC_GPIO2, (MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; - -const mxc_gpio_cfg_t antenna_ctrl0 = { MXC_GPIO1, (MXC_GPIO_PIN_8 | MXC_GPIO_PIN_9), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t antenna_ctrl1 = { MXC_GPIO1, (MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t antenna_ctrl0 = { MXC_GPIO1, (MXC_GPIO_PIN_8 | MXC_GPIO_PIN_9), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t antenna_ctrl1 = { MXC_GPIO1, (MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT2, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// TODO(ME30): TMR pins // Timers are only defined once, depending on package, each timer could be mapped to other pins -const mxc_gpio_cfg_t gpio_cfg_tmr0 = { MXC_GPIO0, (MXC_GPIO_PIN_2), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_tmr0b = { MXC_GPIO0, (MXC_GPIO_PIN_3), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_tmr1 = { MXC_GPIO0, (MXC_GPIO_PIN_14), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_tmr1b = { MXC_GPIO0, (MXC_GPIO_PIN_15), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_tmr1_MapB = { MXC_GPIO0, (MXC_GPIO_PIN_20), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_tmr2 = { MXC_GPIO0, (MXC_GPIO_PIN_26), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_tmr2b = { MXC_GPIO0, (MXC_GPIO_PIN_27), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_tmr3 = { MXC_GPIO1, (MXC_GPIO_PIN_6), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_tmr3b = { MXC_GPIO1, (MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; - -const mxc_gpio_cfg_t gpio_cfg_i2s0 = { MXC_GPIO1, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3 | MXC_GPIO_PIN_4 | MXC_GPIO_PIN_5), - MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; - -const mxc_gpio_cfg_t gpio_cfg_i2s0_clkext = { MXC_GPIO0, MXC_GPIO_PIN_14, MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; - -const mxc_gpio_cfg_t gpio_cfg_rtcsqw = { MXC_GPIO3, MXC_GPIO_PIN_1, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0}; - -const mxc_gpio_cfg_t gpio_cfg_pt0 = { MXC_GPIO0, MXC_GPIO_PIN_18, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_pt1 = { MXC_GPIO0, MXC_GPIO_PIN_19, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_pt2 = { MXC_GPIO0, MXC_GPIO_PIN_16, MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_pt3 = { MXC_GPIO0, MXC_GPIO_PIN_17, MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; - -// 1-Wire pins need to be at 3.3V so that MXC_GPIO_VSSEL_VDDIOH is selected. -const mxc_gpio_cfg_t gpio_cfg_owm = { MXC_GPIO0, (MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_owmb = { MXC_GPIO0, (MXC_GPIO_PIN_18 | MXC_GPIO_PIN_19), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0 }; - -const mxc_gpio_cfg_t gpio_cfg_adc_ain0 = { MXC_GPIO2, MXC_GPIO_PIN_0, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_adc_ain1 = { MXC_GPIO2, MXC_GPIO_PIN_1, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_adc_ain2 = { MXC_GPIO2, MXC_GPIO_PIN_2, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_adc_ain3 = { MXC_GPIO2, MXC_GPIO_PIN_3, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_adc_ain4 = { MXC_GPIO2, MXC_GPIO_PIN_4, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_adc_ain5 = { MXC_GPIO2, MXC_GPIO_PIN_5, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_adc_ain6 = { MXC_GPIO2, MXC_GPIO_PIN_6, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_adc_ain7 = { MXC_GPIO2, MXC_GPIO_PIN_7, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; - -const mxc_gpio_cfg_t gpio_cfg_rv_jtag = { MXC_GPIO1, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1 | MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), - MXC_GPIO_FUNC_ALT2, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; - -const mxc_gpio_cfg_t gpio_cfg_cmp0 = { MXC_GPIO2, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_cmp1 = { MXC_GPIO2, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_cmp2 = { MXC_GPIO2, (MXC_GPIO_PIN_4 | MXC_GPIO_PIN_5), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_cmp3 = { MXC_GPIO2, (MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr0 = { MXC_GPIO0, (MXC_GPIO_PIN_2), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr0b = { MXC_GPIO0, (MXC_GPIO_PIN_3), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr1 = { MXC_GPIO0, (MXC_GPIO_PIN_14), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr1b = { MXC_GPIO0, (MXC_GPIO_PIN_15), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr1_MapB = { MXC_GPIO0, (MXC_GPIO_PIN_20), MXC_GPIO_FUNC_ALT2, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr2 = { MXC_GPIO0, (MXC_GPIO_PIN_26), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr2b = { MXC_GPIO0, (MXC_GPIO_PIN_27), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr3 = { MXC_GPIO1, (MXC_GPIO_PIN_6), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; +// const mxc_gpio_cfg_t gpio_cfg_tmr3b = { MXC_GPIO1, (MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT1, +// MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; // SPI v2 Pin Definitions const mxc_gpio_cfg_t gpio_cfg_spi0_standard = { MXC_GPIO0, (MXC_GPIO_PIN_5 | MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), @@ -143,21 +76,10 @@ const mxc_gpio_cfg_t gpio_cfg_spi0_dual = { MXC_GPIO0, (MXC_GPIO_PIN_5 | MXC_GPI const mxc_gpio_cfg_t gpio_cfg_spi0_quad = { MXC_GPIO0, (MXC_GPIO_PIN_5 | MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7 | MXC_GPIO_PIN_8 | MXC_GPIO_PIN_9), MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_spi1_standard = { MXC_GPIO0, (MXC_GPIO_PIN_21 | MXC_GPIO_PIN_22 | MXC_GPIO_PIN_23), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_spi1_3wire = { MXC_GPIO0, (MXC_GPIO_PIN_21 | MXC_GPIO_PIN_23), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_spi1_dual = { MXC_GPIO0, (MXC_GPIO_PIN_21 | MXC_GPIO_PIN_22 | MXC_GPIO_PIN_23), - MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_spi1_quad = { MXC_GPIO0, (MXC_GPIO_PIN_21 | MXC_GPIO_PIN_22 | MXC_GPIO_PIN_23 | MXC_GPIO_PIN_24 | MXC_GPIO_PIN_25), - MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; - // SPI v2 Target Selects Pin Definitions const mxc_gpio_cfg_t gpio_cfg_spi0_ts0 = { MXC_GPIO0, MXC_GPIO_PIN_4, MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; const mxc_gpio_cfg_t gpio_cfg_spi0_ts1 = { MXC_GPIO0, MXC_GPIO_PIN_26, MXC_GPIO_FUNC_ALT2, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; const mxc_gpio_cfg_t gpio_cfg_spi0_ts2 = { MXC_GPIO0, MXC_GPIO_PIN_27, MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_spi1_ts0 = { MXC_GPIO0, MXC_GPIO_PIN_20, MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; + MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; \ No newline at end of file From 541738cbfc84582ee4f475fa1809cea596e80738 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:35:23 -0600 Subject: [PATCH 25/41] Skip LP drivers --- Libraries/PeriphDrivers/max32657_files.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Libraries/PeriphDrivers/max32657_files.mk b/Libraries/PeriphDrivers/max32657_files.mk index 9cc4233adba..c8ed1baecaf 100644 --- a/Libraries/PeriphDrivers/max32657_files.mk +++ b/Libraries/PeriphDrivers/max32657_files.mk @@ -79,8 +79,9 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/ICC PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/ICC/icc_me30.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/ICC/icc_reva.c -PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/LP -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/LP/lp_me30.c +# TODO(ME30): Add LP drivers back in when register files are provided +# PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/LP +# PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/LP/lp_me30.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/RTC PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/RTC/rtc_me30.c From 732872d000292524cb15cf64f0c3c3140c8e3ef2 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:35:40 -0600 Subject: [PATCH 26/41] Update ME30 LP drivers --- Libraries/PeriphDrivers/Include/MAX32657/rtc.h | 4 ++-- Libraries/PeriphDrivers/Source/RTC/rtc_me30.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/rtc.h b/Libraries/PeriphDrivers/Include/MAX32657/rtc.h index ad8c192a5f9..187e70ec417 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/rtc.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/rtc.h @@ -70,8 +70,8 @@ typedef enum { * @brief Bitmasks for each of the RTC's interrupt flags. */ typedef enum { - MXC_RTC_INT_FL_LONG = MXC_F_RTC_CTRL_TOD_ALARM, /**< Long-interval alarm interrupt flag */ - MXC_RTC_INT_FL_SHORT = MXC_F_RTC_CTRL_SSEC_ALARM, /**< Short-interval alarm interrupt flag */ + MXC_RTC_INT_FL_LONG = MXC_F_RTC_CTRL_TOD_ALARM_IF, /**< Long-interval alarm interrupt flag */ + MXC_RTC_INT_FL_SHORT = MXC_F_RTC_CTRL_SSEC_ALARM_IF, /**< Short-interval alarm interrupt flag */ MXC_RTC_INT_FL_READY = MXC_F_RTC_CTRL_RDY, /**< Timer ready interrupt flag */ } mxc_rtc_int_fl_t; diff --git a/Libraries/PeriphDrivers/Source/RTC/rtc_me30.c b/Libraries/PeriphDrivers/Source/RTC/rtc_me30.c index 6d6eefe2757..df0dac1d216 100644 --- a/Libraries/PeriphDrivers/Source/RTC/rtc_me30.c +++ b/Libraries/PeriphDrivers/Source/RTC/rtc_me30.c @@ -222,13 +222,13 @@ int MXC_RTC_TrimCrystal(void) /* Wait for an RTC edge */ MXC_RTC_ClearFlags(MXC_RTC_GetFlags()); - while (!(MXC_RTC->ctrl & MXC_F_RTC_CTRL_SSEC_ALARM)) {} + while (!(MXC_RTC->ctrl & MXC_F_RTC_CTRL_SSEC_ALARM_IF)) {} MXC_TMR_Start(MXC_TMR3); /* Wait for an RTC edge */ MXC_RTC_ClearFlags(MXC_RTC_GetFlags()); - while (!(MXC_RTC->ctrl & MXC_F_RTC_CTRL_SSEC_ALARM)) {} + while (!(MXC_RTC->ctrl & MXC_F_RTC_CTRL_SSEC_ALARM_IF)) {} /* Capture the TMR count and adjust for processing delay */ elapsed = MXC_TMR_GetCount(MXC_TMR3); From 8d0a66259a9fe82a18555b328a8c3e1b30b1fcc0 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:39:58 -0600 Subject: [PATCH 27/41] Update ME30 SPI drivers --- Libraries/PeriphDrivers/Source/SPI/spi_me30.c | 164 +++++------------- 1 file changed, 48 insertions(+), 116 deletions(-) diff --git a/Libraries/PeriphDrivers/Source/SPI/spi_me30.c b/Libraries/PeriphDrivers/Source/SPI/spi_me30.c index da6225abb7b..b2e419561d2 100644 --- a/Libraries/PeriphDrivers/Source/SPI/spi_me30.c +++ b/Libraries/PeriphDrivers/Source/SPI/spi_me30.c @@ -66,9 +66,8 @@ int MXC_SPI_Init(mxc_spi_regs_t *spi, int masterMode, int quadModeUsed, int numS } // Configure GPIO for spi - if (spi == MXC_SPI1) { - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_SPI1); - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SPI1); + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_SPI); + MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SPI); #if (TARGET != MAX78000 || TARGET_NUM == 32655) @@ -86,87 +85,37 @@ int MXC_SPI_Init(mxc_spi_regs_t *spi, int masterMode, int quadModeUsed, int numS } #endif - //clear mask - gpio_cfg_spi.mask = 0; + //clear mask + gpio_cfg_spi.mask = 0; - // check rest of the pins - if (pins.clock) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_23; - } - - if (pins.miso) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_22; - } - - if (pins.mosi) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_21; - } - - if (pins.sdio2) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_24; - } - - if (pins.sdio3) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_25; - } - - if (pins.ss0) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_20; - } - - gpio_cfg_spi.func = MXC_GPIO_FUNC_ALT1; -#ifdef MXC_SPI0 - } else if (spi == MXC_SPI0) { - MXC_SYS_Reset_Periph(MXC_SYS_RESET1_SPI0); - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SPI0); - - //Define pins - if (pins.ss1) { - gpio_cfg_spi.mask = MXC_GPIO_PIN_11; - gpio_cfg_spi.func = MXC_GPIO_FUNC_ALT2; - MXC_GPIO_Config(&gpio_cfg_spi); - } - - if (pins.ss2) { - gpio_cfg_spi.func = MXC_GPIO_FUNC_ALT2; - gpio_cfg_spi.mask = MXC_GPIO_PIN_10; - MXC_GPIO_Config(&gpio_cfg_spi); - } - - //clear mask - gpio_cfg_spi.mask = 0; - - // check rest of the pins - if (pins.clock) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_7; - } - - if (pins.miso) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_6; - } + // TODO(ME30): Validate pin assignments + // check rest of the pins + if (pins.clock) { + gpio_cfg_spi.mask |= MXC_GPIO_PIN_23; + } - if (pins.mosi) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_5; - } + if (pins.miso) { + gpio_cfg_spi.mask |= MXC_GPIO_PIN_22; + } - if (pins.sdio2) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_8; - } + if (pins.mosi) { + gpio_cfg_spi.mask |= MXC_GPIO_PIN_21; + } - if (pins.sdio3) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_9; - } + if (pins.sdio2) { + gpio_cfg_spi.mask |= MXC_GPIO_PIN_24; + } - if (pins.ss0) { - gpio_cfg_spi.mask |= MXC_GPIO_PIN_4; - } + if (pins.sdio3) { + gpio_cfg_spi.mask |= MXC_GPIO_PIN_25; + } - gpio_cfg_spi.func = MXC_GPIO_FUNC_ALT1; -#endif - } else { - return E_NO_DEVICE; + if (pins.ss0) { + gpio_cfg_spi.mask |= MXC_GPIO_PIN_20; } + gpio_cfg_spi.func = MXC_GPIO_FUNC_ALT1; + MXC_GPIO_Config(&gpio_cfg_spi); #else (void)pins; @@ -185,15 +134,7 @@ int MXC_SPI_Shutdown(mxc_spi_regs_t *spi) MXC_SPI_RevA1_Shutdown((mxc_spi_reva_regs_t *)spi); - if (spi == MXC_SPI1) { - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_SPI1); -#ifdef MXC_SPI0 - } else if (spi == MXC_SPI0) { - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_SPI0); -#endif - } else { - return E_NO_DEVICE; - } + MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_SPI); return E_NO_ERROR; } @@ -207,42 +148,33 @@ int MXC_SPI_GetPeripheralClock(mxc_spi_regs_t *spi) { int retval; - if (spi == MXC_SPI1) { - retval = PeripheralClock; -#ifdef MXC_SPI0 // SPI0 is not accessible from the RISC core. - } else if (spi == MXC_SPI0) { - int sys_clk = (MXC_GCR->clkctrl & MXC_F_GCR_CLKCTRL_SYSCLK_SEL) >> - MXC_F_GCR_CLKCTRL_SYSCLK_SEL_POS; - switch (sys_clk) { - case MXC_SYS_CLOCK_IPO: - retval = IPO_FREQ; - break; - case MXC_SYS_CLOCK_IBRO: - retval = IBRO_FREQ; - break; - case MXC_SYS_CLOCK_ISO: - retval = ISO_FREQ; - break; - case MXC_SYS_CLOCK_INRO: - retval = INRO_FREQ; - break; - case MXC_SYS_CLOCK_ERTCO: - retval = ERTCO_FREQ; - break; - case MXC_SYS_CLOCK_EXTCLK: - retval = EXTCLK_FREQ; - break; + // TODO(ME30): Validate this logic + int sys_clk = (MXC_GCR->clkctrl & MXC_F_GCR_CLKCTRL_SYSCLK_SEL) >> + MXC_F_GCR_CLKCTRL_SYSCLK_SEL_POS; + switch (sys_clk) { + case MXC_SYS_CLOCK_IPO: + retval = IPO_FREQ; + break; + case MXC_SYS_CLOCK_IBRO: + retval = IBRO_FREQ; + break; + case MXC_SYS_CLOCK_INRO: + retval = INRO_FREQ; + break; + case MXC_SYS_CLOCK_ERTCO: + retval = ERTCO_FREQ; + break; + // TODO(ME30): EXTCLK definition is missing from registers + // case MXC_SYS_CLOCK_EXTCLK: + // retval = EXTCLK_FREQ; + // break; #if TARGET_NUM == 32655 || TARGET_NUM == 32680 case MXC_SYS_CLOCK_ERFO: retval = ERFO_FREQ; break; #endif - default: - return E_BAD_STATE; - } -#endif // MXC_SPI0 - } else { - return E_BAD_PARAM; + default: + return E_BAD_STATE; } retval /= 2; From d441ff7ec0204284c5dbfe35889fd82d238ea37c Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:42:33 -0600 Subject: [PATCH 28/41] Update ME30 TMR drivers --- .../PeriphDrivers/Include/MAX32657/tmr.h | 2 +- Libraries/PeriphDrivers/Source/TMR/tmr_me30.c | 23 ++----------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/tmr.h b/Libraries/PeriphDrivers/Include/MAX32657/tmr.h index 89e3feb3760..9fd2c7d96ad 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/tmr.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/tmr.h @@ -137,10 +137,10 @@ typedef enum { /** * @brief Peripheral Clock settings */ +// TODO(ME30): TMR clock sources typedef enum { MXC_TMR_APB_CLK = 0, /**< PCLK */ MXC_TMR_EXT_CLK = 1, /**< External Clock */ - MXC_TMR_ISO_CLK = 2, /**< 60MHz Clock */ MXC_TMR_IBRO_CLK = 3, /**< 7.3728MHz Clock */ MXC_TMR_ERTCO_CLK = 4, /**< 32.768KHz Clock */ MXC_TMR_INRO_CLK = 5, /**< 8-30KHz Clock */ diff --git a/Libraries/PeriphDrivers/Source/TMR/tmr_me30.c b/Libraries/PeriphDrivers/Source/TMR/tmr_me30.c index 8c4404d6b6a..868caf34d47 100644 --- a/Libraries/PeriphDrivers/Source/TMR/tmr_me30.c +++ b/Libraries/PeriphDrivers/Source/TMR/tmr_me30.c @@ -19,7 +19,6 @@ #include "tmr.h" #include "tmr_revb.h" #include "tmr_common.h" -#include "lpgcr_regs.h" #include "stdbool.h" int MXC_TMR_Init(mxc_tmr_regs_t *tmr, mxc_tmr_cfg_t *cfg, bool init_pins) @@ -34,16 +33,6 @@ int MXC_TMR_Init(mxc_tmr_regs_t *tmr, mxc_tmr_cfg_t *cfg, bool init_pins) MXC_ASSERT(tmr_id >= 0); switch (cfg->clock) { - case MXC_TMR_ISO_CLK: - if (tmr_id > 3) { // Timers 4-5 do not support this clock source - return E_NOT_SUPPORTED; - } - - clockSource = MXC_TMR_CLK1; - MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_ISO); - MXC_TMR_RevB_SetClockSourceFreq((mxc_tmr_revb_regs_t *)tmr, ISO_FREQ); - break; - case MXC_TMR_IBRO_CLK: if (tmr_id > 3) { // Timers 4-5 do not support this clock source return E_NOT_SUPPORTED; @@ -64,7 +53,6 @@ int MXC_TMR_Init(mxc_tmr_regs_t *tmr, mxc_tmr_cfg_t *cfg, bool init_pins) MXC_TMR_RevB_SetClockSourceFreq((mxc_tmr_revb_regs_t *)tmr, (IBRO_FREQ / 8)); break; -#if (TARGET_NUM != 32680) case MXC_TMR_ERTCO_CLK: if (tmr_id == 4) { clockSource = MXC_TMR_CLK1; @@ -77,7 +65,6 @@ int MXC_TMR_Init(mxc_tmr_regs_t *tmr, mxc_tmr_cfg_t *cfg, bool init_pins) MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_ERTCO); MXC_TMR_RevB_SetClockSourceFreq((mxc_tmr_revb_regs_t *)tmr, ERTCO_FREQ); break; -#endif case MXC_TMR_INRO_CLK: if (tmr_id < 4) { // Timers 0-3 do not support this clock source @@ -154,12 +141,12 @@ int MXC_TMR_Init(mxc_tmr_regs_t *tmr, mxc_tmr_cfg_t *cfg, bool init_pins) break; case 4: - MXC_SYS_Reset_Periph(MXC_SYS_RESET_TMR4); + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_TMR4); MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_TMR4); break; case 5: - MXC_SYS_Reset_Periph(MXC_SYS_RESET_TMR5); + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_TMR5); MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_TMR5); break; } @@ -265,19 +252,13 @@ uint32_t MXC_TMR_GetPeriod(mxc_tmr_regs_t *tmr, mxc_tmr_clock_t clock, uint32_t clockFrequency = PeripheralClock; break; - case MXC_TMR_ISO_CLK: - clockFrequency = ISO_FREQ; - break; - case MXC_TMR_IBRO_CLK: clockFrequency = IBRO_FREQ; break; -#if (TARGET_NUM != 32680) case MXC_TMR_ERTCO_CLK: clockFrequency = ERTCO_FREQ; break; -#endif default: break; From 58af5bcb3f5616d8d670e7648883997a35da3869 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:43:20 -0600 Subject: [PATCH 29/41] Remove revision check from TRNG health test --- Libraries/PeriphDrivers/Source/TRNG/trng_me30.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Libraries/PeriphDrivers/Source/TRNG/trng_me30.c b/Libraries/PeriphDrivers/Source/TRNG/trng_me30.c index 0875de46e2d..9d9725e5616 100644 --- a/Libraries/PeriphDrivers/Source/TRNG/trng_me30.c +++ b/Libraries/PeriphDrivers/Source/TRNG/trng_me30.c @@ -85,9 +85,5 @@ void MXC_TRNG_RandomAsync(uint8_t *data, uint32_t len, mxc_trng_complete_t callb int MXC_TRNG_HealthTest(void) { - if ((MXC_SYS_GetRevision() & 0xF0) == 0xA0) { // ME17 Rev. A does not support health tests. - return E_NOT_SUPPORTED; - } - return MXC_TRNG_RevB_HealthTest((mxc_trng_revb_regs_t *)MXC_TRNG); } From 1c753dcdf5089708d8e9697bf8560003a1097177 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 17:56:19 -0600 Subject: [PATCH 30/41] Update ME30 UART drivers --- .../Device/Maxim/MAX32657/Include/max32657.h | 4 +- .../PeriphDrivers/Include/MAX32657/dma.h | 1 + .../PeriphDrivers/Include/MAX32657/uart.h | 306 +++++++------ .../PeriphDrivers/Source/UART/uart_me30.c | 401 +++++------------- 4 files changed, 276 insertions(+), 436 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 53e6036fabb..dba31a5a9f1 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -610,7 +610,9 @@ We may want to handle GET_IRQ better... /******************************************************************************/ /* DMA */ #define MXC_DMA_CHANNELS (4) -#define MXC_DMA_INSTANCES (2) +#define MXC_DMA_INSTANCES (1) +// ^ Note: We have 2 DMA instances in hardware, but they are secure vs non-secure +// instances. Therefore we treat the part as if there is only 1. /* Non-secure Mapping */ #define MXC_BASE_DMA0_NS ((uint32_t)0x40028000UL) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/dma.h b/Libraries/PeriphDrivers/Include/MAX32657/dma.h index 747e5702681..ef471bb2ce4 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/dma.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/dma.h @@ -53,6 +53,7 @@ typedef enum { } mxc_dma_priority_t; /** @brief DMA request select */ +// TODO(ME30): Updated DMA reqsel typedef enum { MXC_DMA_REQUEST_MEMTOMEM = MXC_S_DMA_CTRL_REQUEST_MEMTOMEM, ///< Memory to Memory DMA Request Selection diff --git a/Libraries/PeriphDrivers/Include/MAX32657/uart.h b/Libraries/PeriphDrivers/Include/MAX32657/uart.h index 8acc38bb9b5..40e90877866 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/uart.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/uart.h @@ -1,11 +1,13 @@ /** * @file uart.h - * @brief Serial Peripheral Interface (UART) communications driver. + * @brief (UART) communications driver. */ /****************************************************************************** * - * Copyright (C) 2024 Analog Devices, Inc. + * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by + * Analog Devices, Inc.), + * Copyright (C) 2023-2024 Analog Devices, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,8 +24,8 @@ ******************************************************************************/ /* Define to prevent redundant inclusion */ -#ifndef LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32657_UART_H_ -#define LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32657_UART_H_ +#ifndef LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32570_UART_H_ +#define LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32570_UART_H_ /***** Definitions *****/ #include @@ -34,8 +36,6 @@ extern "C" { #endif -#define UART_EXTCLK_FREQ E_BAD_PARAM - /** * @defgroup uart UART * @ingroup periphlibs @@ -45,7 +45,7 @@ extern "C" { typedef struct _mxc_uart_req_t mxc_uart_req_t; /** * @brief The list of UART stop bit lengths supported - * + * */ typedef enum { MXC_UART_STOP_1, ///< UART Stop 1 clock cycle @@ -54,69 +54,67 @@ typedef enum { /** * @brief The list of UART Parity options supported - * + * */ typedef enum { MXC_UART_PARITY_DISABLE, ///< UART Parity Disabled + MXC_UART_PARITY_EVEN, ///< UART Parity Even + MXC_UART_PARITY_ODD, ///< UART Parity Odd + MXC_UART_PARITY_MARK, ///< UART Parity Mark + MXC_UART_PARITY_SPACE, ///< UART Parity Space MXC_UART_PARITY_EVEN_0, ///< UART Parity Even, 0 based MXC_UART_PARITY_EVEN_1, ///< UART Parity Even, 1 based MXC_UART_PARITY_ODD_0, ///< UART Parity Odd, 0 based MXC_UART_PARITY_ODD_1, ///< UART Parity Odd, 1 based + MXC_UART_PARITY_MARK_0, ///< UART Parity Mark, 0 based + MXC_UART_PARITY_MARK_1, ///< UART Parity Mark, 1 based + MXC_UART_PARITY_SPACE_0, ///< UART Parity Space, 0 based + MXC_UART_PARITY_SPACE_1, ///< UART Parity Space, 1 based } mxc_uart_parity_t; /** * @brief The list of UART flow control options supported - * + * */ typedef enum { MXC_UART_FLOW_DIS, ///< UART Flow Control Disabled - MXC_UART_FLOW_EN, ///< UART Flow Control Enabled + MXC_UART_FLOW_EN_LOW, ///< UART Flow Control Enabled, Active Low + MXC_UART_FLOW_EN_HIGH, ///< UART Flow Control Enabled, Active High } mxc_uart_flow_t; -/** - * @brief Clock settings */ -typedef enum { - /*Only available for UARTS 0-2*/ - MXC_UART_APB_CLK = 0, - /*Available for all UARTs*/ - MXC_UART_IBRO_CLK = 2, - /*ERTCO clock can only be used for UART3*/ - MXC_UART_ERTCO_CLK = 4, -} mxc_uart_clock_t; - /** * @brief The callback routine used to indicate the transaction has terminated. * - * @param req The details of the transaction. - * @param result See \ref MXC_Error_Codes for the list of error codes. + * @param req The details of the transaction. + * @param result See \ref MXC_Error_Codes for the list of error codes. */ typedef void (*mxc_uart_complete_cb_t)(mxc_uart_req_t *req, int result); /** * @brief The callback routine used to indicate the transaction has terminated. * - * @param req The details of the transaction. - * @param num The number of characters actually copied - * @param result See \ref MXC_Error_Codes for the list of error codes. + * @param req The details of the transaction. + * @param num The number of characters actually copied + * @param result See \ref MXC_Error_Codes for the list of error codes. */ typedef void (*mxc_uart_dma_complete_cb_t)(mxc_uart_req_t *req, int num, int result); /** - * @brief The information required to perform a complete UART transaction + * @brief The information required to perform a complete UART transaction. * - * @note This structure is used by blocking, async, and DMA based transactions. - * @note "callback" only needs to be initialized for interrupt driven (Async) and DMA transactions. + * This structure is used by blocking, async, and DMA based transactions. + * @note "callback" is only needed for interrupt driven (Async) and DMA transactions. */ struct _mxc_uart_req_t { mxc_uart_regs_t *uart; /// 8 bits, use two bytes per character - ///< and pad the MSB of the upper byte with zeros + uint8_t *txData; ///< Buffer containing transmit data. For character sizes + ///< < 8 bits, pad the MSB of each byte with zeros. For + ///< character sizes > 8 bits, use two bytes per character + ///< and pad the MSB of the upper byte with zeros uint8_t *rxData; ///< Buffer to store received data For character sizes - ///< < 8 bits, pad the MSB of each byte with zeros. For - ///< character sizes > 8 bits, use two bytes per character - ///< and pad the MSB of the upper byte with zeros + ///< < 8 bits, pad the MSB of each byte with zeros. For + ///< character sizes > 8 bits, use two bytes per character + ///< and pad the MSB of the upper byte with zeros uint32_t txLen; ///< Number of bytes to be sent from txData uint32_t rxLen; ///< Number of bytes to be stored in rxData volatile uint32_t txCnt; ///< Number of bytes actually transmitted from txData @@ -133,29 +131,25 @@ struct _mxc_uart_req_t { /** * @brief Initialize and enable UART peripheral. - * + * * This function initializes everything necessary to call a UART transaction function. * Some parameters are set to defaults as follows: * UART Data Size - 8 bits * UART Stop Bits - 1 bit * UART Parity - None * UART Flow Control - None - * + * UART Clock - 7.37MHz Clock (for baud > 7372800, PCLK is used) + * * These parameters can be modified after initialization using low level functions - * - * @note On default this function enables UART peripheral clock. - * if you wish to manage clock and gpio related things in upper level instead of here. - * Define MSDK_NO_GPIO_CLK_INIT flag in project.mk file. - * By this flag this function will remove clock and gpio related codes from file. - * - * @param uart Pointer to UART registers (selects the UART block used.) - * @param baud The requested clock frequency. The actual clock frequency - * will be returned by the function if successful. - * @param clock Clock source * - * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. + * @param uart Pointer to UART registers (selects the UART block used.) + * @param baud The requested clock frequency. The actual clock frequency + * will be returned by the function if successful. + * + * @return If successful, the actual clock frequency is returned. Otherwise, see + * \ref MXC_Error_Codes for a list of return codes. */ -int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud, mxc_uart_clock_t clock); +int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud); /** * @brief Disable and shutdown UART peripheral. @@ -183,14 +177,15 @@ int MXC_UART_ReadyForSleep(mxc_uart_regs_t *uart); /** * @brief Set the frequency of the UART interface. * - * @param uart Pointer to UART registers (selects the UART block used.) - * @param baud The desired baud rate - * @param clock Clock source + * + * + * @param uart Pointer to UART registers (selects the UART block used.) + * @param baud The desired baud rate * * @return Negative if error, otherwise actual speed set. See \ref * MXC_Error_Codes for the list of error return codes. */ -int MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud, mxc_uart_clock_t clock); +int MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud); /** * @brief Get the frequency of the UART interface. @@ -205,9 +200,9 @@ int MXC_UART_GetFrequency(mxc_uart_regs_t *uart); /** * @brief Sets the number of bits per character - * - * @param uart Pointer to UART registers (selects the UART block used.) - * @param dataSize The number of bits per character (5-8 bits/character are valid) + * + * @param uart Pointer to UART registers (selects the UART block used.) + * @param dataSize The number of bits per character (5-8 bits/character are valid) * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ @@ -215,9 +210,9 @@ int MXC_UART_SetDataSize(mxc_uart_regs_t *uart, int dataSize); /** * @brief Sets the number of stop bits sent at the end of a character - * - * @param uart Pointer to UART registers (selects the UART block used.) - * @param stopBits The number of stop bits used + * + * @param uart Pointer to UART registers (selects the UART block used.) + * @param stopBits The number of stop bits used * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ @@ -225,9 +220,9 @@ int MXC_UART_SetStopBits(mxc_uart_regs_t *uart, mxc_uart_stop_t stopBits); /** * @brief Sets the type of parity generation used - * - * @param uart Pointer to UART registers (selects the UART block used.) - * @param parity see \ref UART Parity Types for details + * + * @param uart Pointer to UART registers (selects the UART block used.) + * @param parity see \ref mxc_uart_parity_t UART Parity Types for details * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ @@ -235,10 +230,10 @@ int MXC_UART_SetParity(mxc_uart_regs_t *uart, mxc_uart_parity_t parity); /** * @brief Sets the flow control used - * - * @param uart Pointer to UART registers (selects the UART block used.) - * @param flowCtrl see \ref UART Flow Control Types for details - * @param rtsThreshold Number of bytes remaining in the RX FIFO when RTS is asserted + * + * @param uart Pointer to UART registers (selects the UART block used.) + * @param flowCtrl see \ref mxc_uart_flow_t UART Flow Control Types for details + * @param rtsThreshold Number of bytes remaining in the RX FIFO when RTS is asserted * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ @@ -246,24 +241,47 @@ int MXC_UART_SetFlowCtrl(mxc_uart_regs_t *uart, mxc_uart_flow_t flowCtrl, int rt /** * @brief Sets the clock source for the baud rate generator - * - * @param uart Pointer to UART registers (selects the UART block used.) - * @param clock Clock source * - * @return Actual baud rate if successful, otherwise see \ref MXC_Error_Codes + * @param uart Pointer to UART registers (selects the UART block used.) + * @param usePCLK Non-zero values will use the PCLK as the bit clock instead + * of the default 7.37MHz clock source. The baud rate generator + * will automatically be reconfigured to the closest possible + * baud rate. + * + * @return Actual baud rate if successful, otherwise see \ref MXC_Error_Codes * for a list of return codes. */ -int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, mxc_uart_clock_t clock); +int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, int usePCLK); + +/** + * @brief Enables or Disables the built-in null modem + * + * @param uart Pointer to UART registers (selects the UART block used.) + * @param nullModem Non-zero values will enable the null modem function, + * which swaps TXD/RXD and also swaps RTS/CTS, if used. + * + * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. + */ +int MXC_UART_SetNullModem(mxc_uart_regs_t *uart, int nullModem); /* ************************************************************************* */ /* Low-level functions */ /* ************************************************************************* */ +/** + * @brief Transmits a Break Frame (all bits 0) + * + * @param uart Pointer to UART registers (selects the UART block used.) + * + * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. + */ +int MXC_UART_SendBreak(mxc_uart_regs_t *uart); + /** * @brief Checks the UART Peripheral for an ongoing transmission * * @note This function is applicable in Master mode only - * + * * @param uart Pointer to UART registers (selects the UART block used.) * * @return Active/Inactive, see \ref MXC_Error_Codes for a list of return codes. @@ -280,44 +298,46 @@ int MXC_UART_GetActive(mxc_uart_regs_t *uart); int MXC_UART_AbortTransmission(mxc_uart_regs_t *uart); /** - * @brief Reads the next available character. If no character is available, this function - * will return an error. + * @brief Reads the next available character. This function will block until a character + * is available or a UART error occurs. * * @param uart Pointer to UART registers (selects the UART block used.) * * @return The character read, otherwise see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_UART_ReadCharacterRaw(mxc_uart_regs_t *uart); +int MXC_UART_ReadCharacter(mxc_uart_regs_t *uart); /** - * @brief Writes a character on the UART. If the character cannot be written because the - * transmit FIFO is currently full, this function returns an error. + * @brief Writes a character on the UART. This function will block until the character + * has been placed in the TX FIFO or a UART error occurs. * * @param uart Pointer to UART registers (selects the UART block used.) * @param character The character to write * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_UART_WriteCharacterRaw(mxc_uart_regs_t *uart, uint8_t character); +int MXC_UART_WriteCharacter(mxc_uart_regs_t *uart, uint8_t character); /** - * @brief Reads the next available character + * @brief Reads the next available character. If no character is available, this function + * will return an error. * * @param uart Pointer to UART registers (selects the UART block used.) * * @return The character read, otherwise see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_UART_ReadCharacter(mxc_uart_regs_t *uart); +int MXC_UART_ReadCharacterRaw(mxc_uart_regs_t *uart); /** - * @brief Writes a character on the UART + * @brief Writes a character on the UART. If the character cannot be written because the + * transmit FIFO is currently full, this function returns an error. * * @param uart Pointer to UART registers (selects the UART block used.) - * @param character The character to write + * @param character The character to write * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_UART_WriteCharacter(mxc_uart_regs_t *uart, uint8_t character); +int MXC_UART_WriteCharacterRaw(mxc_uart_regs_t *uart, uint8_t character); /** * @brief Reads the next available character @@ -326,7 +346,7 @@ int MXC_UART_WriteCharacter(mxc_uart_regs_t *uart, uint8_t character); * * @param uart Pointer to UART registers (selects the UART block used.) * @param buffer Buffer to store data in - * @param len Number of characters + * @param len Number of characters * * @return The character read, otherwise see \ref MXC_Error_Codes for a list of return codes. */ @@ -336,19 +356,19 @@ int MXC_UART_Read(mxc_uart_regs_t *uart, uint8_t *buffer, int *len); * @brief Writes a byte on the UART * * @param uart Pointer to UART registers (selects the UART block used.) - * @param byte The buffer of characters to write + * @param byte The buffer of characters to write * @param len The number of characters to write * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_UART_Write(mxc_uart_regs_t *uart, const uint8_t *byte, int *len); +int MXC_UART_Write(mxc_uart_regs_t *uart, uint8_t *byte, int *len); /** * @brief Unloads bytes from the receive FIFO. * * @param uart Pointer to UART registers (selects the UART block used.) - * @param bytes The buffer to read the data into. - * @param len The number of bytes to read. + * @param bytes The buffer to read the data into. + * @param len The number of bytes to read. * * @return The number of bytes actually read. */ @@ -358,11 +378,11 @@ unsigned int MXC_UART_ReadRXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, un * @brief Unloads bytes from the receive FIFO user DMA for longer reads. * * @param uart Pointer to UART registers (selects the UART block used.) - * @param bytes The buffer to read the data into. - * @param len The number of bytes to read. - * @param callback The function to call when the read is complete + * @param bytes The buffer to read the data into. + * @param len The number of bytes to read. + * @param callback The function to call when the read is complete * - * @return See \ref MXC_ERROR_CODES for a list of return values + * @return See \ref MXC_Error_Codes for a list of return values */ int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len, mxc_uart_dma_complete_cb_t callback); @@ -380,25 +400,24 @@ unsigned int MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t *uart); * @brief Loads bytes into the transmit FIFO. * * @param uart Pointer to UART registers (selects the UART block used.) - * @param bytes The buffer containing the bytes to write - * @param len The number of bytes to write. + * @param bytes The buffer containing the bytes to write + * @param len The number of bytes to write. * * @return The number of bytes actually written. */ -unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, const unsigned char *bytes, - unsigned int len); +unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len); /** * @brief Loads bytes into the transmit FIFO using DMA for longer writes * * @param uart Pointer to UART registers (selects the UART block used.) - * @param bytes The buffer containing the bytes to write - * @param len The number of bytes to write. - * @param callback The function to call when the write is complete + * @param bytes The buffer containing the bytes to write + * @param len The number of bytes to write. + * @param callback The function to call when the write is complete * - * @return See \ref MXC_ERROR_CODES for a list of return values + * @return See \ref MXC_Error_Codes for a list of return values */ -int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, const unsigned char *bytes, unsigned int len, +int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len, mxc_uart_dma_complete_cb_t callback); /** @@ -430,18 +449,18 @@ int MXC_UART_ClearTXFIFO(mxc_uart_regs_t *uart); /** * @brief Set the receive threshold level. - * + * * @note RX FIFO Receive threshold. Smaller values will cause * interrupts to occur more often, but reduce the possibility * of losing data because of a FIFO overflow. Larger values - * will reduce the time required by the ISR, but increase the + * will reduce the time required by the ISR, but increase the * possibility of data loss. Passing an invalid value will - * cause the driver to use the value already set in the + * cause the driver to use the value already set in the * appropriate register. * * @param uart Pointer to UART registers (selects the UART block used.) - * @param numBytes The threshold level to set. This value must be - * between 0 and 8 inclusive. + * @param numBytes The threshold level to set. This value must be + * between 0 and 8 inclusive. * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ @@ -449,27 +468,27 @@ int MXC_UART_SetRXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes); /** * @brief Get the current receive threshold level. - * + * * @param uart Pointer to UART registers (selects the UART block used.) - * + * * @return The receive threshold value (in bytes). */ unsigned int MXC_UART_GetRXThreshold(mxc_uart_regs_t *uart); /** * @brief Set the transmit threshold level. - * + * * @note TX FIFO threshold. Smaller values will cause interrupts * to occur more often, but reduce the possibility of terminating * a transaction early in master mode, or transmitting invalid data * in slave mode. Larger values will reduce the time required by - * the ISR, but increase the possibility errors occurring. Passing - * an invalid value will cause the driver to use the value already + * the ISR, but increase the possibility errors occurring. Passing + * an invalid value will cause the driver to use the value already * set in the appropriate register. * * @param uart Pointer to UART registers (selects the UART block used.) - * @param numBytes The threshold level to set. This value must be - * between 0 and 8 inclusive. + * @param numBytes The threshold level to set. This value must be + * between 0 and 8 inclusive. * * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ @@ -477,9 +496,9 @@ int MXC_UART_SetTXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes); /** * @brief Get the current transmit threshold level. - * + * * @param uart Pointer to UART registers (selects the UART block used.) - * + * * @return The transmit threshold value (in bytes). */ unsigned int MXC_UART_GetTXThreshold(mxc_uart_regs_t *uart); @@ -487,24 +506,24 @@ unsigned int MXC_UART_GetTXThreshold(mxc_uart_regs_t *uart); /** * @brief Gets the interrupt flags that are currently set * - * @note These functions should not be used while using non-blocking Transaction Level + * @note These functions should not be used while using non-blocking Transaction Level * functions (Async or DMA) * * @param uart Pointer to UART registers (selects the UART block used.) - * - * @return The interrupt flags + * + * @return The interrupt flags */ unsigned int MXC_UART_GetFlags(mxc_uart_regs_t *uart); /** * @brief Clears the interrupt flags that are currently set * - * @note These functions should not be used while using non-blocking Transaction Level + * @note These functions should not be used while using non-blocking Transaction Level * functions (Async or DMA) * * @param uart Pointer to UART registers (selects the UART block used.) * @param flags mask of flags to clear - * + * * @return See \ref MXC_Error_Codes for the list of error return codes. */ int MXC_UART_ClearFlags(mxc_uart_regs_t *uart, unsigned int flags); @@ -512,7 +531,7 @@ int MXC_UART_ClearFlags(mxc_uart_regs_t *uart, unsigned int flags); /** * @brief Enables specific interrupts * - * @note These functions should not be used while using non-blocking Transaction Level + * @note These functions should not be used while using non-blocking Transaction Level * functions (Async or DMA) * * @param uart Pointer to UART registers (selects the UART block used.) @@ -525,7 +544,7 @@ int MXC_UART_EnableInt(mxc_uart_regs_t *uart, unsigned int mask); /** * @brief Disables specific interrupts * - * @note These functions should not be used while using non-blocking Transaction Level + * @note These functions should not be used while using non-blocking Transaction Level * functions (Async or DMA) * * @param uart Pointer to UART registers (selects the UART block used.) @@ -539,7 +558,7 @@ int MXC_UART_DisableInt(mxc_uart_regs_t *uart, unsigned int mask); * @brief Gets the status flags that are currently set * * @param uart Pointer to UART registers (selects the UART block used.) - * + * * @return The status flags */ unsigned int MXC_UART_GetStatus(mxc_uart_regs_t *uart); @@ -549,13 +568,13 @@ unsigned int MXC_UART_GetStatus(mxc_uart_regs_t *uart); /* ************************************************************************* */ /** - * @brief Performs a blocking UART transaction. - * + * @brief Performs a blocking UART transaction. + * * @note Performs a blocking UART transaction as follows. * If tx_len is non-zero, transmit TX data * Once tx_len has been sent, if rx_len is non-zero, receive data * - * @param req Pointer to details of the transaction + * @param req Pointer to details of the transaction * * @return See \ref MXC_Error_Codes for the list of error return codes. */ @@ -563,11 +582,11 @@ int MXC_UART_Transaction(mxc_uart_req_t *req); /** * @brief Setup an interrupt-driven UART transaction - * + * * @note The TX FIFO will be filled with txData if necessary * Relevant interrupts will be enabled * - * @param req Pointer to details of the transaction + * @param req Pointer to details of the transaction * * @return See \ref MXC_Error_Codes for the list of error return codes. */ @@ -575,14 +594,14 @@ int MXC_UART_TransactionAsync(mxc_uart_req_t *req); /** * @brief Setup a DMA driven UART transaction - * + * * @note The TX FIFO will be filled with txData if necessary - * Relevant interrupts will be enabled - * The DMA channel indicated by the request will be set up to load/unload the FIFOs - * with as few interrupt-based events as possible. The channel will be reset and + * Relevant interrupts will be enabled. + * The DMA channel indicated by the request will be set up to load/unload the FIFOs + * with as few interrupt-based events as possible. The channel will be reset and * returned to the system at the end of the transaction. * - * @param req Pointer to details of the transaction + * @param req Pointer to details of the transaction * * @return See \ref MXC_Error_Codes for the list of error return codes. */ @@ -600,23 +619,27 @@ int MXC_UART_TransactionDMA(mxc_uart_req_t *req); void MXC_UART_DMACallback(int ch, int error); /** - * @brief Async callback + * @brief Async callback * - * @param uart The uart - * @param retVal The ret value + * @param uart The uart + * @param[in] retVal The ret value * * @return See \ref MXC_Error_Codes for the list of error return codes. */ int MXC_UART_AsyncCallback(mxc_uart_regs_t *uart, int retVal); +int MXC_UART_TxAsyncCallback(mxc_uart_regs_t *uart, int retVal); +int MXC_UART_RxAsyncCallback(mxc_uart_regs_t *uart, int retVal); /** * @brief stop any async callbacks * - * @param uart The uart + * @param uart The uart * * @return See \ref MXC_Error_Codes for the list of error return codes. */ int MXC_UART_AsyncStop(mxc_uart_regs_t *uart); +int MXC_UART_TxAsyncStop(mxc_uart_regs_t *uart); +int MXC_UART_RxAsyncStop(mxc_uart_regs_t *uart); /** * @brief Abort any asynchronous requests in progress. @@ -630,6 +653,8 @@ int MXC_UART_AsyncStop(mxc_uart_regs_t *uart); * @return See \ref MXC_Error_Codes for the list of error return codes. */ int MXC_UART_AbortAsync(mxc_uart_regs_t *uart); +int MXC_UART_TxAbortAsync(mxc_uart_regs_t *uart); +int MXC_UART_RxAbortAsync(mxc_uart_regs_t *uart); /** * @brief The processing function for asynchronous transactions. @@ -642,8 +667,8 @@ int MXC_UART_AbortAsync(mxc_uart_regs_t *uart); * * @return See \ref MXC_Error_Codes for the list of error return codes. */ -int MXC_UART_AsyncHandler(mxc_uart_regs_t *uart); +int MXC_UART_AsyncHandler(mxc_uart_regs_t *uart); /** * @brief Provide TXCount for asynchronous transactions.. * @@ -651,6 +676,7 @@ int MXC_UART_AsyncHandler(mxc_uart_regs_t *uart); * * @return Returns transmit bytes (in FIFO). */ + uint32_t MXC_UART_GetAsyncTXCount(mxc_uart_req_t *req); /** @@ -731,4 +757,4 @@ int MXC_UART_GetRXDMAChannel(mxc_uart_regs_t *uart); } #endif -#endif // LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32657_UART_H_ +#endif // LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32570_UART_H_ diff --git a/Libraries/PeriphDrivers/Source/UART/uart_me30.c b/Libraries/PeriphDrivers/Source/UART/uart_me30.c index 32b722c786c..83eb8202790 100644 --- a/Libraries/PeriphDrivers/Source/UART/uart_me30.c +++ b/Libraries/PeriphDrivers/Source/UART/uart_me30.c @@ -1,6 +1,8 @@ /****************************************************************************** * - * Copyright (C) 2024 Analog Devices, Inc. + * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by + * Analog Devices, Inc.), + * Copyright (C) 2023-2024 Analog Devices, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,29 +22,47 @@ #include "mxc_device.h" #include "mxc_pins.h" #include "mxc_assert.h" -#include "uart_revb.h" +#include "uart_reva.h" #include "uart_common.h" -#include "lpgcr_regs.h" #include "dma.h" void MXC_UART_DMACallback(int ch, int error) { - MXC_UART_RevB_DMACallback(ch, error); + MXC_UART_RevA_DMACallback(ch, error); } int MXC_UART_AsyncCallback(mxc_uart_regs_t *uart, int retVal) { - return MXC_UART_RevB_AsyncCallback((mxc_uart_revb_regs_t *)uart, retVal); + return MXC_UART_RevA_AsyncCallback((mxc_uart_reva_regs_t *)uart, retVal); +} + +int MXC_UART_TxAsyncCallback(mxc_uart_regs_t *uart, int retVal) +{ + return MXC_UART_RevA_TxAsyncCallback((mxc_uart_reva_regs_t *)uart, retVal); +} + +int MXC_UART_RxAsyncCallback(mxc_uart_regs_t *uart, int retVal) +{ + return MXC_UART_RevA_RxAsyncCallback((mxc_uart_reva_regs_t *)uart, retVal); } int MXC_UART_AsyncStop(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_AsyncStop((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_AsyncStop((mxc_uart_reva_regs_t *)uart); } -int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud, mxc_uart_clock_t clock) +int MXC_UART_TxAsyncStop(mxc_uart_regs_t *uart) +{ + return MXC_UART_RevA_TxAsyncStop((mxc_uart_reva_regs_t *)uart); +} + +int MXC_UART_RxAsyncStop(mxc_uart_regs_t *uart) +{ + return MXC_UART_RevA_RxAsyncStop((mxc_uart_reva_regs_t *)uart); +} + +int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud) { -#ifndef MSDK_NO_GPIO_CLK_INIT int retval; retval = MXC_UART_Shutdown(uart); @@ -51,261 +71,90 @@ int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud, mxc_uart_clock_t clo return retval; } - switch (clock) { -#if TARGET_NUM != 32680 - case MXC_UART_ERTCO_CLK: - MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_ERTCO); - break; -#endif - - case MXC_UART_IBRO_CLK: - MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_IBRO); - break; - - default: - break; - } - - switch (MXC_UART_GET_IDX(uart)) { - case 0: - MXC_GPIO_Config(&gpio_cfg_uart0); - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART0); - break; - - case 1: - MXC_GPIO_Config(&gpio_cfg_uart1); - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART1); - break; - - case 2: - MXC_GPIO_Config(&gpio_cfg_uart2); - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART2); - break; - - case 3: - MXC_GPIO_Config(&gpio_cfg_uart3); - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART3); - break; - - default: - return E_BAD_PARAM; - } -#endif // MSDK_NO_GPIO_CLK_INIT + MXC_GPIO_Config(&gpio_cfg_uart0); + MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART); - return MXC_UART_RevB_Init((mxc_uart_revb_regs_t *)uart, baud, clock); + return MXC_UART_RevA_Init((mxc_uart_reva_regs_t *)uart, baud); } int MXC_UART_Shutdown(mxc_uart_regs_t *uart) { - switch (MXC_UART_GET_IDX(uart)) { - case 0: - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART0); - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART0); - break; - - case 1: - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART1); - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART1); - break; - - case 2: - MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART2); - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART2); - break; - - case 3: - MXC_SYS_Reset_Periph(MXC_SYS_RESET_UART3); - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART3); - break; - - default: - return E_BAD_PARAM; - } + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART); + MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART); return E_NO_ERROR; } int MXC_UART_ReadyForSleep(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_ReadyForSleep((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_ReadyForSleep((mxc_uart_reva_regs_t *)uart); } -int MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud, mxc_uart_clock_t clock) +int MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud) { - int freq; - unsigned mod = 0; - unsigned clkDiv = 0; - - if (MXC_UART_GET_IDX(uart) < 0) { - return E_BAD_PARAM; - } - - // check if the uart is LPUART - if (uart == MXC_UART3) { - // OSR default value - uart->osr = 5; - - switch (clock) { - case MXC_UART_IBRO_CLK: - uart->ctrl |= MXC_S_UART_CTRL_BCLKSRC_PERIPHERAL_CLOCK; - clkDiv = ((IBRO_FREQ) / baud); - mod = ((IBRO_FREQ) % baud); - break; - - case MXC_UART_ERTCO_CLK: - // Only supports up to 9600 baud with ERTCO clock. - if (baud > 9600) { - return E_NOT_SUPPORTED; - } - - uart->ctrl |= MXC_S_UART_CTRL_BCLKSRC_EXTERNAL_CLOCK; - uart->ctrl |= MXC_F_UART_CTRL_FDM; - if (baud == 9600) { - clkDiv = 7; - mod = 0; - } else { - clkDiv = ((ERTCO_FREQ * 2) / baud); - mod = ((ERTCO_FREQ * 2) % baud); - } - - if (baud > 2400) { - uart->osr = 0; - } else { - uart->osr = 1; - } - break; - - default: - return E_BAD_PARAM; - } - - if (!clkDiv || mod > (baud / 2)) { - clkDiv++; - } - uart->clkdiv = clkDiv; - - freq = MXC_UART_GetFrequency(uart); - } else { - if (clock == MXC_UART_ERTCO_CLK) { - return E_BAD_PARAM; - } - - freq = MXC_UART_RevB_SetFrequency((mxc_uart_revb_regs_t *)uart, baud, clock); - } - - if (freq > 0) { - // Enable baud clock and wait for it to become ready. - uart->ctrl |= MXC_F_UART_CTRL_BCLKEN; - while (((uart->ctrl & MXC_F_UART_CTRL_BCLKRDY) >> MXC_F_UART_CTRL_BCLKRDY_POS) == 0) {} - } - - return freq; + return MXC_UART_RevA_SetFrequency((mxc_uart_reva_regs_t *)uart, baud); } int MXC_UART_GetFrequency(mxc_uart_regs_t *uart) { - int periphClock = 0; - - if (MXC_UART_GET_IDX(uart) < 0) { - return E_BAD_PARAM; - } - - // check if UART is LP UART - if (uart == MXC_UART3) { - if ((uart->ctrl & MXC_F_UART_CTRL_BCLKSRC) == - MXC_S_UART_REVB_CTRL_BCLKSRC_PERIPHERAL_CLOCK) { - periphClock = IBRO_FREQ; - } else if ((uart->ctrl & MXC_F_UART_CTRL_BCLKSRC) == - MXC_S_UART_REVB_CTRL_BCLKSRC_EXTERNAL_CLOCK) { - periphClock = ERTCO_FREQ * 2; - } else { - return E_NOT_SUPPORTED; - } - return (periphClock / uart->clkdiv); - } else { - return MXC_UART_RevB_GetFrequency((mxc_uart_revb_regs_t *)uart); - } + return MXC_UART_RevA_GetFrequency((mxc_uart_reva_regs_t *)uart); } int MXC_UART_SetDataSize(mxc_uart_regs_t *uart, int dataSize) { - return MXC_UART_RevB_SetDataSize((mxc_uart_revb_regs_t *)uart, dataSize); + return MXC_UART_RevA_SetDataSize((mxc_uart_reva_regs_t *)uart, dataSize); } int MXC_UART_SetStopBits(mxc_uart_regs_t *uart, mxc_uart_stop_t stopBits) { - return MXC_UART_RevB_SetStopBits((mxc_uart_revb_regs_t *)uart, stopBits); + return MXC_UART_RevA_SetStopBits((mxc_uart_reva_regs_t *)uart, stopBits); } int MXC_UART_SetParity(mxc_uart_regs_t *uart, mxc_uart_parity_t parity) { - return MXC_UART_RevB_SetParity((mxc_uart_revb_regs_t *)uart, parity); + return MXC_UART_RevA_SetParity((mxc_uart_reva_regs_t *)uart, parity); } int MXC_UART_SetFlowCtrl(mxc_uart_regs_t *uart, mxc_uart_flow_t flowCtrl, int rtsThreshold) { - if (flowCtrl == MXC_UART_FLOW_EN) { - switch (MXC_UART_GET_IDX(uart)) { - case 0: - MXC_GPIO_Config(&gpio_cfg_uart0_flow); - break; - - case 1: - MXC_GPIO_Config(&gpio_cfg_uart1_flow); - break; - - case 2: - MXC_GPIO_Config(&gpio_cfg_uart2_flow); - break; - - default: - return E_BAD_PARAM; - } - } else { - switch (MXC_UART_GET_IDX(uart)) { - case 0: - MXC_GPIO_Config(&gpio_cfg_uart0_flow_disable); - break; - - case 1: - MXC_GPIO_Config(&gpio_cfg_uart1_flow_disable); - break; - - case 2: - MXC_GPIO_Config(&gpio_cfg_uart2_flow_disable); - break; - - default: - return E_BAD_PARAM; - } - } + MXC_GPIO_Config(&gpio_cfg_uart0_flow); - return MXC_UART_RevB_SetFlowCtrl((mxc_uart_revb_regs_t *)uart, flowCtrl, rtsThreshold); + return MXC_UART_RevA_SetFlowCtrl((mxc_uart_reva_regs_t *)uart, flowCtrl, rtsThreshold); } -int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, mxc_uart_clock_t clock) +int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, int usePCLK) { - return MXC_UART_RevB_SetClockSource((mxc_uart_revb_regs_t *)uart, clock); + return MXC_UART_RevA_SetClockSource((mxc_uart_reva_regs_t *)uart, usePCLK); +} + +int MXC_UART_SetNullModem(mxc_uart_regs_t *uart, int nullModem) +{ + return MXC_UART_RevA_SetNullModem((mxc_uart_reva_regs_t *)uart, nullModem); +} + +int MXC_UART_SendBreak(mxc_uart_regs_t *uart) +{ + return MXC_UART_RevA_SendBreak((mxc_uart_reva_regs_t *)uart); } int MXC_UART_GetActive(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_GetActive((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_GetActive((mxc_uart_reva_regs_t *)uart); } int MXC_UART_AbortTransmission(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_AbortTransmission((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_AbortTransmission((mxc_uart_reva_regs_t *)uart); } int MXC_UART_ReadCharacterRaw(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_ReadCharacterRaw((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_ReadCharacterRaw((mxc_uart_reva_regs_t *)uart); } int MXC_UART_WriteCharacterRaw(mxc_uart_regs_t *uart, uint8_t character) { - return MXC_UART_RevB_WriteCharacterRaw((mxc_uart_revb_regs_t *)uart, character); + return MXC_UART_RevA_WriteCharacterRaw((mxc_uart_reva_regs_t *)uart, character); } int MXC_UART_ReadCharacter(mxc_uart_regs_t *uart) @@ -320,176 +169,142 @@ int MXC_UART_WriteCharacter(mxc_uart_regs_t *uart, uint8_t character) int MXC_UART_Read(mxc_uart_regs_t *uart, uint8_t *buffer, int *len) { - return MXC_UART_RevB_Read((mxc_uart_revb_regs_t *)uart, buffer, len); + return MXC_UART_RevA_Read((mxc_uart_reva_regs_t *)uart, buffer, len); } -int MXC_UART_Write(mxc_uart_regs_t *uart, const uint8_t *byte, int *len) +int MXC_UART_Write(mxc_uart_regs_t *uart, uint8_t *byte, int *len) { - return MXC_UART_RevB_Write((mxc_uart_revb_regs_t *)uart, byte, len); + return MXC_UART_RevA_Write((mxc_uart_reva_regs_t *)uart, byte, len); } unsigned int MXC_UART_ReadRXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len) { - return MXC_UART_RevB_ReadRXFIFO((mxc_uart_revb_regs_t *)uart, bytes, len); + return MXC_UART_RevA_ReadRXFIFO((mxc_uart_reva_regs_t *)uart, bytes, len); } int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len, mxc_uart_dma_complete_cb_t callback) { mxc_dma_config_t config; + config.reqsel = MXC_DMA_REQUEST_UART0RX; // TODO(ME30): Updated DMA reqsel - int uart_num = MXC_UART_GET_IDX(uart); - - switch (uart_num) { - case 0: - config.reqsel = MXC_DMA_REQUEST_UART0RX; - break; - - case 1: - config.reqsel = MXC_DMA_REQUEST_UART1RX; - break; - - case 2: - config.reqsel = MXC_DMA_REQUEST_UART2RX; - break; - - case 3: - config.reqsel = MXC_DMA_REQUEST_UART3RX; - break; - - default: - return E_BAD_PARAM; - break; - } - - return MXC_UART_RevB_ReadRXFIFODMA((mxc_uart_revb_regs_t *)uart, bytes, len, callback, config); + return MXC_UART_RevA_ReadRXFIFODMA((mxc_uart_reva_regs_t *)uart, MXC_DMA, bytes, len, callback, + config); } unsigned int MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_GetRXFIFOAvailable((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_GetRXFIFOAvailable((mxc_uart_reva_regs_t *)uart); } -unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, const unsigned char *bytes, - unsigned int len) +unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len) { - return MXC_UART_RevB_WriteTXFIFO((mxc_uart_revb_regs_t *)uart, bytes, len); + return MXC_UART_RevA_WriteTXFIFO((mxc_uart_reva_regs_t *)uart, bytes, len); } -int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, const unsigned char *bytes, unsigned int len, +int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len, mxc_uart_dma_complete_cb_t callback) { mxc_dma_config_t config; + config.reqsel = MXC_DMA_REQUEST_UART0TX; // TODO(ME30): Updated DMA reqsel - int uart_num = MXC_UART_GET_IDX(uart); - switch (uart_num) { - case 0: - config.reqsel = MXC_DMA_REQUEST_UART0TX; - break; - - case 1: - config.reqsel = MXC_DMA_REQUEST_UART1TX; - break; - - case 2: - config.reqsel = MXC_DMA_REQUEST_UART2TX; - break; - - case 3: - config.reqsel = MXC_DMA_REQUEST_UART3TX; - break; - - default: - return E_BAD_PARAM; - break; - } - - return MXC_UART_RevB_WriteTXFIFODMA((mxc_uart_revb_regs_t *)uart, bytes, len, callback, config); + return MXC_UART_RevA_WriteTXFIFODMA((mxc_uart_reva_regs_t *)uart, MXC_DMA, bytes, len, callback, + config); } unsigned int MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_GetTXFIFOAvailable((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_GetTXFIFOAvailable((mxc_uart_reva_regs_t *)uart); } int MXC_UART_ClearRXFIFO(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_ClearRXFIFO((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_ClearRXFIFO((mxc_uart_reva_regs_t *)uart); } int MXC_UART_ClearTXFIFO(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_ClearTXFIFO((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_ClearTXFIFO((mxc_uart_reva_regs_t *)uart); } int MXC_UART_SetRXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes) { - return MXC_UART_RevB_SetRXThreshold((mxc_uart_revb_regs_t *)uart, numBytes); + return MXC_UART_RevA_SetRXThreshold((mxc_uart_reva_regs_t *)uart, numBytes); } unsigned int MXC_UART_GetRXThreshold(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_GetRXThreshold((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_GetRXThreshold((mxc_uart_reva_regs_t *)uart); } int MXC_UART_SetTXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes) { - return E_NOT_SUPPORTED; + return MXC_UART_RevA_SetTXThreshold((mxc_uart_reva_regs_t *)uart, numBytes); } unsigned int MXC_UART_GetTXThreshold(mxc_uart_regs_t *uart) { - return E_NOT_SUPPORTED; + return MXC_UART_RevA_GetTXThreshold((mxc_uart_reva_regs_t *)uart); } unsigned int MXC_UART_GetFlags(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_GetFlags((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_GetFlags((mxc_uart_reva_regs_t *)uart); } int MXC_UART_ClearFlags(mxc_uart_regs_t *uart, unsigned int flags) { - return MXC_UART_RevB_ClearFlags((mxc_uart_revb_regs_t *)uart, flags); + return MXC_UART_RevA_ClearFlags((mxc_uart_reva_regs_t *)uart, flags); } -int MXC_UART_EnableInt(mxc_uart_regs_t *uart, unsigned int intEn) +int MXC_UART_EnableInt(mxc_uart_regs_t *uart, unsigned int mask) { - return MXC_UART_RevB_EnableInt((mxc_uart_revb_regs_t *)uart, intEn); + return MXC_UART_RevA_EnableInt((mxc_uart_reva_regs_t *)uart, mask); } -int MXC_UART_DisableInt(mxc_uart_regs_t *uart, unsigned int intDis) +int MXC_UART_DisableInt(mxc_uart_regs_t *uart, unsigned int mask) { - return MXC_UART_RevB_DisableInt((mxc_uart_revb_regs_t *)uart, intDis); + return MXC_UART_RevA_DisableInt((mxc_uart_reva_regs_t *)uart, mask); } unsigned int MXC_UART_GetStatus(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_GetStatus((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_GetStatus((mxc_uart_reva_regs_t *)uart); } int MXC_UART_Transaction(mxc_uart_req_t *req) { - return MXC_UART_RevB_Transaction((mxc_uart_revb_req_t *)req); + return MXC_UART_RevA_Transaction((mxc_uart_reva_req_t *)req); } int MXC_UART_TransactionAsync(mxc_uart_req_t *req) { - return MXC_UART_RevB_TransactionAsync((mxc_uart_revb_req_t *)req); + return MXC_UART_RevA_TransactionAsync((mxc_uart_reva_req_t *)req); } int MXC_UART_TransactionDMA(mxc_uart_req_t *req) { - return MXC_UART_RevB_TransactionDMA((mxc_uart_revb_req_t *)req); + return MXC_UART_RevA_TransactionDMA((mxc_uart_reva_req_t *)req, MXC_DMA); } int MXC_UART_AbortAsync(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_AbortAsync((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_AbortAsync((mxc_uart_reva_regs_t *)uart); +} + +int MXC_UART_TxAbortAsync(mxc_uart_regs_t *uart) +{ + return MXC_UART_RevA_TxAbortAsync((mxc_uart_reva_regs_t *)uart); +} + +int MXC_UART_RxAbortAsync(mxc_uart_regs_t *uart) +{ + return MXC_UART_RevA_RxAbortAsync((mxc_uart_reva_regs_t *)uart); } int MXC_UART_AsyncHandler(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_AsyncHandler((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_AsyncHandler((mxc_uart_reva_regs_t *)uart); } uint32_t MXC_UART_GetAsyncTXCount(mxc_uart_req_t *req) @@ -504,25 +319,21 @@ uint32_t MXC_UART_GetAsyncRXCount(mxc_uart_req_t *req) int MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t *uart, bool enable) { - return MXC_UART_RevB_SetAutoDMAHandlers((mxc_uart_revb_regs_t *)uart, enable); + return MXC_UART_RevA_SetAutoDMAHandlers((mxc_uart_reva_regs_t *)uart, enable); } - int MXC_UART_SetTXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel) { - return MXC_UART_RevB_SetTXDMAChannel((mxc_uart_revb_regs_t *)uart, channel); + return MXC_UART_RevA_SetTXDMAChannel((mxc_uart_reva_regs_t *)uart, channel); } - int MXC_UART_GetTXDMAChannel(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_GetTXDMAChannel((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_GetTXDMAChannel((mxc_uart_reva_regs_t *)uart); } - int MXC_UART_SetRXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel) { - return MXC_UART_RevB_SetRXDMAChannel((mxc_uart_revb_regs_t *)uart, channel); + return MXC_UART_RevA_SetRXDMAChannel((mxc_uart_reva_regs_t *)uart, channel); } - int MXC_UART_GetRXDMAChannel(mxc_uart_regs_t *uart) { - return MXC_UART_RevB_GetTXDMAChannel((mxc_uart_revb_regs_t *)uart); + return MXC_UART_RevA_GetRXDMAChannel((mxc_uart_reva_regs_t *)uart); } From ed64a6d1f89d9b2393231b3a757d48defb2e8049 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 18:01:19 -0600 Subject: [PATCH 31/41] Update ME30 WDT drivers --- Libraries/PeriphDrivers/Source/WDT/wdt_me30.c | 35 +++++-------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me30.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me30.c index 0c761e70c7e..8c1af1514bf 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me30.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me30.c @@ -29,27 +29,22 @@ int MXC_WDT_Init(mxc_wdt_regs_t *wdt, mxc_wdt_cfg_t *cfg) { #ifndef MSDK_NO_GPIO_CLK_INIT - if (wdt == MXC_WDT0) { - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_WDT0); - } else if (wdt == MXC_WDT1) { - MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_WDT1); + if (wdt == MXC_WDT) { + MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_WDT); } else { return E_BAD_PARAM; } #endif - MXC_WDT_RevB_Init((mxc_wdt_revb_regs_t *)wdt, (mxc_wdt_revb_cfg_t *)cfg); - - return E_NO_ERROR; + return MXC_WDT_RevB_Init((mxc_wdt_revb_regs_t *)wdt, (mxc_wdt_revb_cfg_t *)cfg); } int MXC_WDT_Shutdown(mxc_wdt_regs_t *wdt) { - if (wdt == MXC_WDT0) { - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_WDT0); - } else if (wdt == MXC_WDT1) { - MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_WDT1); - } else { + if (wdt == MXC_WDT) { + MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_WDT); + } + else { return E_BAD_PARAM; } @@ -127,24 +122,12 @@ int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) uint8_t idx = 0; uint8_t instance = 0; -#if TARGET_NUM == 32655 || TARGET_NUM == 78000 - mxc_wdt_clock_t clock_sources[2][8] = { + mxc_wdt_clock_t clock_sources[1][8] = { { MXC_WDT_PCLK, MXC_WDT_IBRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, - { MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } }; -#elif TARGET_NUM == 32680 - mxc_wdt_clock_t clock_sources[2][8] = { - { MXC_WDT_PCLK, MXC_WDT_IBRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, - { MXC_WDT_IBRO_CLK, 0xFF, MXC_WDT_INRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } - }; -#else -#error ME17 WDT driver does not support given target number. -#endif - if (wdt == MXC_WDT0) { + if (wdt == MXC_WDT) { instance = 0; - } else if (wdt == MXC_WDT1) { - instance = 1; } else { return E_BAD_PARAM; } From 4c9522a5ec8b79176ff8f158cc97ae82a7c7d404 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 18:03:13 -0600 Subject: [PATCH 32/41] Misc final fixes --- Libraries/Boards/MAX32657/EvKit_V1/Source/board.c | 2 +- Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Libraries/Boards/MAX32657/EvKit_V1/Source/board.c b/Libraries/Boards/MAX32657/EvKit_V1/Source/board.c index 4d02252ff00..f0bdcddf5e0 100644 --- a/Libraries/Boards/MAX32657/EvKit_V1/Source/board.c +++ b/Libraries/Boards/MAX32657/EvKit_V1/Source/board.c @@ -92,7 +92,7 @@ int Console_Init(void) { int err; - if ((err = MXC_UART_Init(ConsoleUart, CONSOLE_BAUD, MXC_UART_APB_CLK)) != E_NO_ERROR) { + if ((err = MXC_UART_Init(ConsoleUart, CONSOLE_BAUD)) != E_NO_ERROR) { return err; } diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index dba31a5a9f1..b3b9c1b337a 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -672,7 +672,7 @@ We may want to handle GET_IRQ better... #define MXC_ICC_INSTANCES (1) /* Secure Mapping Only */ -#define MXC_BASE_ICC ((uint32_t)0x5002A000UL) +#define MXC_BASE_ICC_S ((uint32_t)0x5002A000UL) #define MXC_ICC ((mxc_icc_regs_t *)MXC_BASE_ICC_S) /* Added for consistency and explicitness */ From bdd0ff3fb00436d68a9521e4f7b6bdab39a1a668 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Thu, 2 May 2024 18:14:31 -0600 Subject: [PATCH 33/41] Fix some build errors for non-secure builds --- .../CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index b3b9c1b337a..065c785951e 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -173,26 +173,25 @@ typedef enum { #define MXC_FLASH_S_MEM_BASE 0x11000000UL #define MXC_FLASH_S_PAGE_SIZE 0x00002000UL #define MXC_FLASH_S_MEM_SIZE 0x00100000UL +/* Flash info is always in secure region */ #define MXC_INFO_S_MEM_BASE 0x12000000UL #define MXC_INFO_S_MEM_SIZE 0x00004000UL #define MXC_SRAM_S_MEM_BASE 0x30000000UL #define MXC_SRAM_S_MEM_SIZE 0x00040000UL -/* Secure Region name redefinitions for explicit use */ +#define MXC_INFO_MEM_BASE MXC_INFO_S_MEM_BASE +#define MXC_INFO_MEM_SIZE MXC_INFO_S_MEM_SIZE + #if IS_SECURE_ENVIRONMENT #define MXC_FLASH_MEM_BASE MXC_FLASH_S_MEM_BASE #define MXC_FLASH_PAGE_SIZE MXC_FLASH_S_PAGE_SIZE #define MXC_FLASH_MEM_SIZE MXC_FLASH_S_MEM_SIZE -#define MXC_INFO_MEM_BASE MXC_INFO_S_MEM_BASE -#define MXC_INFO_MEM_SIZE MXC_INFO_S_MEM_SIZE #define MXC_SRAM_MEM_BASE MXC_SRAM_S_MEM_BASE #define MXC_SRAM_MEM_SIZE MXC_SRAM_S_MEM_SIZE #else #define MXC_FLASH_MEM_BASE MXC_FLASH_NS_MEM_BASE #define MXC_FLASH_PAGE_SIZE MXC_FLASH_NS_PAGE_SIZE #define MXC_FLASH_MEM_SIZE MXC_FLASH_NS_MEM_SIZE -#define MXC_INFO_MEM_BASE MXC_INFO_NS_MEM_BASE -#define MXC_INFO_MEM_SIZE MXC_INFO_NS_MEM_SIZE #define MXC_SRAM_MEM_BASE MXC_SRAM_NS_MEM_BASE #define MXC_SRAM_MEM_SIZE MXC_SRAM_NS_MEM_SIZE #endif @@ -253,7 +252,7 @@ typedef enum { #if IS_SECURE_ENVIRONMENT #define MXC_FCR MXC_FCR_S #else -#define MXC_FCR_NS +#define MXC_FCR MXC_FCR_NS #endif /******************************************************************************/ From 4e9156e999a23ed16cbaa7125005362013771573 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Fri, 3 May 2024 14:25:22 -0600 Subject: [PATCH 34/41] Dynamically switch memory address ranges for secure/non-secure linkage --- Libraries/CMSIS/Device/Maxim/GCC/gcc.mk | 4 +++ .../Maxim/MAX32657/Source/GCC/max32657.ld | 34 +++++++++++-------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk index 48acf971c44..8b434adada0 100644 --- a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk +++ b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk @@ -277,6 +277,10 @@ ifeq "$(MSECURITY_MODE)" "SECURE" # defined in "Armv8-M Security Extension: Requirements on Developments Tools" # https://developer.arm.com/documentation/ecm0359818/latest PROJ_CFLAGS += -mcmse + +# Tell the linker we are building a secure project. This defines the "SECURE_LINK" symbol which the +# linker uses to set the secure FLASH/SRAM memory address ranges. +PROJ_LDFLAGS += -Xlinker --defsym=SECURE_LINK=1 endif endif diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld index 72aae01c65d..6455e14f967 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld @@ -18,12 +18,16 @@ MEMORY { ROM_S (rx) : ORIGIN = 0x00000000, LENGTH = 0x00010000 /* 64kB secure ROM (ROM always secure) */ - FLASH_NS (rx) : ORIGIN = 0x01000000, LENGTH = 0x00100000 /* 1MB non-secure Flash */ - SRAM_NS (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 /* 256KB non-secure SRAM */ - FLASH_S (rx) : ORIGIN = 0x11000000, LENGTH = 0x00100000 /* 1MB secure Flash */ + FLASH (rx) : ORIGIN = DEFINED(SECURE_LINK) ? 0x11000000 : 0x01000000, LENGTH = 0x00100000 /* 1MB Flash */ FLASH_INFO_S (rx) : ORIGIN = 0x12000000, LENGTH = 0x00010000 /* 16KB secure Flash Info */ - SRAM_S (rwx) : ORIGIN = 0x30000000, LENGTH = 0x00040000 /* 256KB secure SRAM */ + SRAM (rwx) : ORIGIN = DEFINED(SECURE_LINK) ? 0x30000000 : 0x20000000, LENGTH = 0x00040000 /* 256KB SRAM */ } +/* Note(JC): "SECURE_LINK" is a symbol defined at link-time by Libraries/CMSIS/Device/Maxim/GCC/gcc.mk + * It's only defined for when building secure binaries (which is the default). + * When it's defined, the FLASH and SRAM memory addresses will use the secure ranges. Otherwise, the + * non-secure ranges will be used. This mechanism allows secure and non-secure binaries to be linked + * without having to maintain a separate copy of the linkerfile. + */ SECTIONS { .rom : @@ -59,12 +63,12 @@ SECTIONS { /* C++ Exception handling */ KEEP(*(.eh_frame*)) _etext = .; - } > FLASH_S + } > FLASH .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) - } > FLASH_S + } > FLASH /* Binary import */ .bin_storage : @@ -74,7 +78,7 @@ SECTIONS { KEEP(*(.bin_storage_img)) _bin_end_ = .; . = ALIGN(4); - } > FLASH_S + } > FLASH .rom_code : { @@ -90,7 +94,7 @@ SECTIONS { _sran_code = .; *(.flash_code_section) _esran_code = .; - } > FLASH_S + } > FLASH .sram_code : { @@ -98,7 +102,7 @@ SECTIONS { _sran_code = .; *(.sram_code_section) _esran_code = .; - } > SRAM_S + } > SRAM /* it's used for C++ exception handling */ /* we need to keep this to avoid overlapping */ @@ -107,7 +111,7 @@ SECTIONS { __exidx_start = .; *(.ARM.exidx* .gnu.linkonce.armexidx.*) __exidx_end = .; - } > FLASH_S + } > FLASH .data : { @@ -138,7 +142,7 @@ SECTIONS { PROVIDE_HIDDEN (__fini_array_end = .); _edata = ALIGN(., 4); - } > SRAM_S AT>FLASH_S + } > SRAM AT>FLASH __load_data = LOADADDR(.data); .bss : @@ -147,11 +151,11 @@ SECTIONS { _bss = .; *(.bss*) /*read-write zero initialized data: uninitialzed global variable*/ _ebss = ALIGN(., 4); - } > SRAM_S + } > SRAM /* Set stack top to end of RAM, and stack limit move down by * size of stack_dummy section */ - __StackTop = ORIGIN(SRAM_S) + LENGTH(SRAM_S); + __StackTop = ORIGIN(SRAM) + LENGTH(SRAM); __StackLimit = __StackTop - SIZEOF(.stack_dummy); /* .stack_dummy section doesn't contains any symbols. It is only @@ -160,14 +164,14 @@ SECTIONS { .stack_dummy (COPY): { *(.stack*) - } > SRAM_S + } > SRAM .heap (COPY): { . = ALIGN(4); *(.heap*) __HeapLimit = ABSOLUTE(__StackLimit); - } > SRAM_S + } > SRAM PROVIDE(__stack = __StackTop); From 7e7138e22f3773545bf4656c551dc76f94d58c4a Mon Sep 17 00:00:00 2001 From: Woo Date: Fri, 3 May 2024 16:05:45 -0500 Subject: [PATCH 35/41] Add TrustZone support to CMSIS files (secure mode only) --- .../Device/Maxim/MAX32657/Include/max32657.h | 162 ++- .../MAX32657/Include/partition_max32657.h | 1281 +++++++++++++++++ .../Maxim/MAX32657/Source/GCC/max32657.ld | 49 +- .../MAX32657/Source/GCC/startup_max32657.S | 193 ++- .../Maxim/MAX32657/Source/system_max32657.c | 77 +- 5 files changed, 1624 insertions(+), 138 deletions(-) create mode 100644 Libraries/CMSIS/Device/Maxim/MAX32657/Include/partition_max32657.h diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 065c785951e..3ca98d730fb 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -59,7 +59,6 @@ /* ================================================================================ */ // clang-format off -// TODO(ME30): Secure vs non-secure interrupt vectors typedef enum { NonMaskableInt_IRQn = -14, HardFault_IRQn = -13, @@ -97,10 +96,10 @@ typedef enum { DMA0_CH1_IRQn, /* 0x21 0x0084 33: DMA0 Channel 1 */ DMA0_CH2_IRQn, /* 0x22 0x0088 34: DMA0 Channel 2 */ DMA0_CH3_IRQn, /* 0x23 0x008C 35: DMA0 Channel 3 */ - DMA1_CH0_IRQn, /* 0x24 0x0090 36: DMA1 Channel 0 */ - DMA1_CH1_IRQn, /* 0x25 0x0094 37: DMA1 Channel 1 */ - DMA1_CH2_IRQn, /* 0x26 0x0098 38: DMA1 CHannel 2 */ - DMA1_CH3_IRQn, /* 0x27 0x009C 39: DMA1 Channel 3 */ + DMA1_CH0_IRQn, /* 0x24 0x0090 36: DMA1 Channel 0 (Secure) */ + DMA1_CH1_IRQn, /* 0x25 0x0094 37: DMA1 Channel 1 (Secure) */ + DMA1_CH2_IRQn, /* 0x26 0x0098 38: DMA1 CHannel 2 (Secure) */ + DMA1_CH3_IRQn, /* 0x27 0x009C 39: DMA1 Channel 3 (Secure) */ WUT0_IRQn, /* 0x28 0x00A0 40: Wakeup Timer 0 */ WUT1_IRQn, /* 0x29 0x00A4 41: Wakeup TImer 1 */ GPIOWAKE_IRQn, /* 0x2A 0x00A8 42: GPIO Wakeup */ @@ -233,8 +232,10 @@ typedef enum { #define MXC_SIR_S ((mxc_sir_regs_t *)MXC_BASE_SIR_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_SIR MXC_BASE_SIR_S #define MXC_SIR MXC_SIR_S #else +#define MXC_BASE_SIR MXC_BASE_SIR_NS #define MXC_SIR MXC_SIR_NS #endif @@ -250,8 +251,10 @@ typedef enum { #define MXC_FCR_S ((mxc_fcr_regs_t *)MXC_BASE_FCR_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_FCR MXC_BASE_FCR_S #define MXC_FCR MXC_FCR_S #else +#define MXC_BASE_FCR MXC_BASE_FCR_NS #define MXC_FCR MXC_FCR_NS #endif @@ -268,8 +271,10 @@ typedef enum { #define MXC_WDT_S ((mxc_wdt_regs_t *)MXC_BASE_WDT_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_WDT MXC_BASE_WDT_S #define MXC_WDT MXC_WDT_S #else +#define MXC_BASE_WDT MXC_BASE_WDT_NS #define MXC_WDT MXC_WDT_NS #endif @@ -278,15 +283,17 @@ typedef enum { /* Non-secure Mapping */ #define MXC_BASE_SVM_NS ((uint32_t)0x40004800UL) -#define MXC_SVM_NS //TODO(ME30): Add SVM controller registers. +#define MXC_SVM_NS 0 //TODO(ME30): Add SVM controller registers. /* Secure Mapping */ #define MXC_BASE_SVM_S ((uint32_t)0x50004800UL) -#define MXC_SVM_S //TODO(ME30): Add SVM controller registers. +#define MXC_SVM_S 0 //TODO(ME30): Add SVM controller registers. #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_SVM MXC_BASE_SVM_S #define MXC_SVM MXC_SVM_S //TODO(ME30): Add SVM controller registers #else +#define MXC_BASE_SVM MXC_BASE_SVM_NS #define MXC_SVM MXC_SVM_NS #endif @@ -295,15 +302,17 @@ typedef enum { /* Non-secure Mapping */ #define MXC_BASE_BOOST_NS ((uint32_t)0x40004C00UL) -#define MXC_BOOST_NS //TODO(ME30): Add Boost controller registers. +#define MXC_BOOST_NS 0 //TODO(ME30): Add Boost controller registers. /* Secure Mapping */ #define MXC_BASE_BOOST_S ((uint32_t)0x50004C00UL) -#define MXC_BOOST_S //TODO(ME30): Add Boost controller registers. +#define MXC_BOOST_S 0 //TODO(ME30): Add Boost controller registers. #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_BOOST MXC_BASE_BOOST_S #define MXC_BOOST MXC_BOOST_S #else +#define MXC_BASE_BOOST MXC_BASE_BOOST_NS #define MXC_BOOST MXC_BOOST_NS #endif @@ -319,8 +328,10 @@ typedef enum { #define MXC_TRIMSIR_S ((mxc_trimsir_regs_t *)MXC_BASE_TRIMSIR_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_TRIMSIR MXC_BASE_TRIMSIR_S #define MXC_TRIMSIR MXC_TRIMSIR_S #else +#define MXC_BASE_TRIMSIR MXC_BASE_TRIMSIR_NS #define MXC_TRIMSIR MXC_TRIMSIR_NS #endif @@ -336,8 +347,10 @@ typedef enum { #define MXC_RTC_S ((mxc_rtc_regs_t *)MXC_BASE_RTC_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_RTC MXC_BASE_RTC_S #define MXC_RTC MXC_RTC_S #else +#define MXC_BASE_RTC MXC_BASE_RTC_NS #define MXC_RTC MXC_RTC_NS #endif @@ -358,10 +371,14 @@ typedef enum { #define MXC_WUT1_S ((mxc_wut_regs_t *)MXC_BASE_WUT1_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_WUT0 MXC_BASE_WUT0_S #define MXC_WUT0 MXC_WUT0_S +#define MXC_BASE_WUT1 MXC_BASE_WUT1_S #define MXC_WUT1 MXC_WUT1_S #else +#define MXC_BASE_WUT0 MXC_BASE_WUT0_NS #define MXC_WUT0 MXC_WUT0_NS +#define MXC_BASE_WUT1 MXC_BASE_WUT1_NS #define MXC_WUT1 MXC_WUT1_NS #endif @@ -377,8 +394,10 @@ typedef enum { #define MXC_PWRSEQ_S ((mxc_pwrseq_regs_t *)MXC_BASE_PWRSEQ_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_PWRSEQ MXC_BASE_PWRSEQ_S #define MXC_PWRSEQ MXC_PWRSEQ_S #else +#define MXC_BASE_PWRSEQ MXC_BASE_PWRSEQ_NS #define MXC_PWRSEQ MXC_PWRSEQ_NS #endif @@ -394,9 +413,11 @@ typedef enum { #define MXC_MCR_S ((mxc_mcr_regs_t *)MXC_BASE_MCR_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_MCR MXC_BASE_MCR_S #define MXC_MCR MXC_MCR_S #else -#define MXC_MCR MXC_MCR_S +#define MXC_BASE_MCR MXC_BASE_MCR_NS +#define MXC_MCR MXC_MCR_NS #endif /******************************************************************************/ @@ -411,8 +432,10 @@ typedef enum { #define MXC_AES_S ((mxc_aes_regs_t *)MXC_BASE_AES_NS) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_AES MXC_BASE_AES_S #define MXC_AES MXC_AES_S #else +#define MXC_BASE_AES MXC_BASE_AES_NS #define MXC_AES MXC_AES_NS #endif @@ -428,8 +451,10 @@ typedef enum { #define MXC_AESKEYS_S ((mxc_aeskeys_regs_t *)MXC_BASE_AESKEYS_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_AESKEYS MXC_BASE_AESKEYS_S #define MXC_AESKEYS MXC_AESKEYS_S #else +#define MXC_BASE_AESKEYS MXC_BASE_AESKEYS_NS #define MXC_AESKEYS MXC_AESKEYS_NS #endif @@ -452,8 +477,10 @@ typedef enum { #define MXC_BASE_GPIO0 MXC_BASE_GPIO0_S #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_GPIO0 MXC_BASE_GPIO0_S #define MXC_GPIO0 MXC_GPIO0_S #else +#define MXC_BASE_GPIO0 MXC_BASE_GPIO0_NS #define MXC_GPIO0 MXC_GPIO0_NS #endif @@ -480,8 +507,10 @@ We may want to handle GET_IRQ better... #define MXC_CRC_S ((mxc_crc_regs_t *)MXC_BASE_CRC_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_CRC MXC_BASE_CRC_S #define MXC_CRC MXC_CRC_S #else +#define MXC_BASE_CRC MXC_BASE_CRC_NS #define MXC_CRC MXC_CRC_NS #endif @@ -507,24 +536,6 @@ We may want to handle GET_IRQ better... #define MXC_BASE_TMR5_NS ((uint32_t)0x40081000UL) #define MXC_TMR5_NS ((mxc_tmr_regs_t *)MXC_BASE_TMR5_NS) -#define MXC_TMR_NS_GET_BASE(i) \ - ((i) == 0 ? MXC_BASE_TMR0_NS : \ - (i) == 1 ? MXC_BASE_TMR1_NS : \ - (i) == 2 ? MXC_BASE_TMR2_NS : \ - (i) == 3 ? MXC_BASE_TMR3_NS : \ - (i) == 4 ? MXC_BASE_TMR4_NS : \ - (i) == 5 ? MXC_BASE_TMR5_NS : \ - 0) - -#define MXC_TMR_NS_GET_TMR(i) \ - ((i) == 0 ? MXC_TMR0_NS : \ - (i) == 1 ? MXC_TMR1_NS : \ - (i) == 2 ? MXC_TMR2_NS : \ - (i) == 3 ? MXC_TMR3_NS : \ - (i) == 4 ? MXC_TMR4_NS : \ - (i) == 5 ? MXC_TMR5_NS : \ - 0) - /* Secure Mapping */ #define MXC_BASE_TMR0_S ((uint32_t)0x50010000UL) #define MXC_TMR0_S ((mxc_tmr_regs_t *)MXC_BASE_TMR0_S) @@ -555,7 +566,16 @@ We may want to handle GET_IRQ better... #define MXC_TMR5 MXC_TMR5_NS #endif -#define MXC_TMR_S_GET_TMR(i) \ +#define MXC_TMR_GET_BASE(i) \ + ((i) == 0 ? MXC_BASE_TMR0 : \ + (i) == 1 ? MXC_BASE_TMR1 : \ + (i) == 2 ? MXC_BASE_TMR2 : \ + (i) == 3 ? MXC_BASE_TMR3 : \ + (i) == 4 ? MXC_BASE_TMR4 : \ + (i) == 5 ? MXC_BASE_TMR5 : \ + 0) + +#define MXC_TMR_GET_TMR(i) \ ((i) == 0 ? MXC_TMR0 : \ (i) == 1 ? MXC_TMR1 : \ (i) == 2 ? MXC_TMR2 : \ @@ -574,19 +594,13 @@ We may want to handle GET_IRQ better... 0) #define MXC_TMR_GET_IDX(p) \ - ((p) == MXC_TMR0_NS ? 0 : \ - (p) == MXC_TMR1_NS ? 1 : \ - (p) == MXC_TMR2_NS ? 2 : \ - (p) == MXC_TMR3_NS ? 3 : \ - (p) == MXC_TMR4_NS ? 4 : \ - (p) == MXC_TMR5_NS ? 5 : \ - (p) == MXC_TMR0_S ? 0 : \ - (p) == MXC_TMR1_S ? 1 : \ - (p) == MXC_TMR2_S ? 2 : \ - (p) == MXC_TMR3_S ? 3 : \ - (p) == MXC_TMR4_S ? 4 : \ - (p) == MXC_TMR5_S ? 5 : \ - -1) + ((p) == MXC_TMR0 ? 0 : \ + (p) == MXC_TMR1 ? 1 : \ + (p) == MXC_TMR2 ? 2 : \ + (p) == MXC_TMR3 ? 3 : \ + (p) == MXC_TMR4 ? 4 : \ + (p) == MXC_TMR5 ? 5 : \ + -1) /******************************************************************************/ /* I3C */ @@ -601,52 +615,70 @@ We may want to handle GET_IRQ better... #define MXC_I3C_S ((mxc_i2c_regs_t *)MXC_BASE_I3C_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_I3C MXC_BASE_I3C_S #define MXC_I3C MXC_I3C_S #else +#define MXC_BASE_I3C MXC_BASE_I3C_NS #define MXC_I3C MXC_I3C_NS #endif /******************************************************************************/ /* DMA */ #define MXC_DMA_CHANNELS (4) -#define MXC_DMA_INSTANCES (1) -// ^ Note: We have 2 DMA instances in hardware, but they are secure vs non-secure -// instances. Therefore we treat the part as if there is only 1. +#define MXC_DMA_INSTANCES (2) /* Non-secure Mapping */ #define MXC_BASE_DMA0_NS ((uint32_t)0x40028000UL) #define MXC_DMA0_NS ((mxc_dma_regs_t *)MXC_BASE_DMA0_NS) -/* DMA0 instance only for secure mode. */ /* Secure Mapping */ // TODO(ME30): Is there actuall a secure mapping for DMA0? +// -Yes, DMA0 can be accessed from secure mode. Realizing this, I think +// we would still have to define two DMA instances. +// DMA0 can only access the non-secure mappings of the peripherals, +// but DMA0 can be accessed in both Non-secure and Secure code. +// DMA1 can access both secure and non-secure addresses of the peripherals, +// but DMA1 can Only be accessed in Secure code. #define MXC_BASE_DMA0_S ((uint32_t)0x50028000UL) #define MXC_DMA0_S ((mxc_dma_regs_t *)MXC_BASE_DMA0_S) #define MXC_BASE_DMA1_S ((uint32_t)0x50035000UL) #define MXC_DMA1_S ((mxc_dma_regs_t *)MXC_BASE_DMA1_S) +#if IS_SECURE_ENVIRONMENT #define MXC_BASE_DMA0 MXC_BASE_DMA0_S -#define MXC_DMA0 MXC_DMA0_NS +#define MXC_DMA0 MXC_DMA0_S #define MXC_BASE_DMA1 MXC_BASE_DMA1_S #define MXC_DMA1 MXC_DMA1_S -#if IS_SECURE_ENVIRONMENT -#define MXC_DMA MXC_DMA1_S -#define MXC_DMA_CH_GET_IRQ(i) \ +#define MXC_DMA1_CH_GET_IRQ(i) \ ((IRQn_Type)(((i) == 0) ? DMA1_CH0_IRQn : \ ((i) == 1) ? DMA1_CH1_IRQn : \ ((i) == 2) ? DMA1_CH2_IRQn : \ ((i) == 3) ? DMA1_CH3_IRQn : \ 0)) + #else -#define MXC_DMA MXC_DMA0_NS -#define MXC_DMA_CH_GET_IRQ(i) \ +#define MXC_BASE_DMA0 MXC_BASE_DMA0_NS +#define MXC_DMA0 MXC_DMA0_NS +// TODO(DMA1): Not entirely show how to handle access to MXC_DMA1 in non-secure mode. +// A secure fault should be generated when non-secure code accesses +// a secure peripheral mapping, so it'd be best if a build time warning +// or error was thrown when using MXCX_DMA1. +#define MXC_BASE_DMA1 0 +#define MXC_DMA1 0 + +/* DMA1 IRQs not usable in Non-Secure state. */ +#define MXC_DMA1_CH_GET_IRQ(i) ((IRQn_Type)(0)) +#endif // IS_SECURE_ENVIRONMENT + +#define MXC_DMA_GET_BASE(i) ((i) == MXC_BASE_DMA0 ? 0 : (p) == MXC_BASE_DMA1 ? 1 : -1) + +#define MXC_DMA0_CH_GET_IRQ(i) \ ((IRQn_Type)(((i) == 0) ? DMA0_CH0_IRQn : \ ((i) == 1) ? DMA0_CH1_IRQn : \ ((i) == 2) ? DMA0_CH2_IRQn : \ ((i) == 3) ? DMA0_CH3_IRQn : \ 0)) -#endif #define MXC_DMA_GET_IDX(p) ((p) == MXC_DMA0 ? 0 : (p) == MXC_DMA1 ? 1 : -1) @@ -662,19 +694,22 @@ We may want to handle GET_IRQ better... #define MXC_BASE_FLC_S MXC_BASE_FLC #define MXC_FLC_S MXC_FLC -// Note(JC): There is only one flash instance, but some bottom-level RevX implementations -// depend on MXC_FLC_GET_FLC -#define MXC_FLC_GET_FLC(i) MXC_FLC +/** + * There is only one flash instance, but some bottom-level RevX implementations + * depend on MXC_FLC_GET_FLC + */ +#define MXC_FLC_GET_FLC(i) ((i) == 0 ? MXC_FLC : 0) /******************************************************************************/ /* Internal Cache Controller */ #define MXC_ICC_INSTANCES (1) /* Secure Mapping Only */ -#define MXC_BASE_ICC_S ((uint32_t)0x5002A000UL) +#define MXC_BASE_ICC ((uint32_t)0x5002A000UL) #define MXC_ICC ((mxc_icc_regs_t *)MXC_BASE_ICC_S) /* Added for consistency and explicitness */ +#define MXC_BASE_ICC_S MXC_BASE_ICC #define MXC_ICC_S MXC_ICC /******************************************************************************/ @@ -691,11 +726,14 @@ We may want to handle GET_IRQ better... #define MXC_UART_S ((mxc_uart_regs_t *)MXC_BASE_UART_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_UART MXC_BASE_UART_S #define MXC_UART MXC_UART_S #else +#define MXC_BASE_UART MXC_BASE_UART_NS #define MXC_UART MXC_UART_NS #endif +#define MXC_UART_GET_BASE(i) ((i) == 0 ? MXC_BASE_UART : 0) #define MXC_UART_GET_UART(i) ((i) == 0 ? MXC_UART : 0) #define MXC_UART_GET_IRQ(i) (IRQn_Type)((i) == 0 ? UART0_IRQn : 0) #define MXC_UART_GET_IDX(p) ((p) == MXC_UART_NS ? 0 : (p) == MXC_UART_S ? 0 : -1) @@ -710,19 +748,19 @@ We may want to handle GET_IRQ better... #define MXC_BASE_SPI_NS ((uint32_t)0x40046000UL) #define MXC_SPI_NS ((mxc_spi_regs_t *)MXC_BASE_SPI_NS) -#define MXC_SPI_NS_GET_BASE(i) ((i) == 0 ? MXC_BASE_SPI_NS : 0) -#define MXC_SPI_NS_GET_SPI(i) ((i) == 0 ? MXC_SPI_NS : 0) - /* Secure Mapping */ #define MXC_BASE_SPI_S ((uint32_t)0x50046000UL) #define MXC_SPI_S ((mxc_spi_regs_t *)MXC_BASE_SPI_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_SPI MXC_BASE_SPI_S #define MXC_SPI MXC_SPI_S #else +#define MXC_BASE_SPI MXC_BASE_SPI_S #define MXC_SPI MXC_SPI_NS #endif +#define MXC_SPI_GET_BASE(i) ((i) == 0 ? MXC_BASE_SPI : 0) #define MXC_SPI_GET_SPI(i) ((i) == 0 ? MXC_SPI : 0) #define MXC_SPI_GET_IRQ(i) (IRQn_Type)((i) == 0 ? SPI_IRQn : 0) #define MXC_SPI_GET_IDX(p) ((p) == MXC_SPI_NS ? 0 : (p) == MXC_SPI_S ? 0 : -1) @@ -739,8 +777,10 @@ We may want to handle GET_IRQ better... #define MXC_TRNG_S ((mxc_trng_regs_t *)MXC_BASE_TRNG_S) #if IS_SECURE_ENVIRONMENT +#define MXC_BASE_TRNG MXC_BASE_TRNG_S #define MXC_TRNG MXC_TRNG_S #else +#define MXC_BASE_TRNG MXC_BASE_TRNG_NS #define MXC_TRNG MXC_TRNG_NS #endif @@ -758,8 +798,10 @@ We may want to handle GET_IRQ better... #if IS_SECURE_ENVIRONMENT // TODO(ME30): Does this have registers? +#define MXC_BASE_BTLE MXC_BASE_BTLE_S #define MXC_BTLE MXC_BTLE_S #else +#define MXC_BASE_BTLE MXC_BASE_BTLE_NS #define MXC_BTLE MXC_BTLE_NS #endif diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/partition_max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/partition_max32657.h new file mode 100644 index 00000000000..14b28a9312e --- /dev/null +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/partition_max32657.h @@ -0,0 +1,1281 @@ +/*************************************************************************//** + * @file partition_max32657.h + * @brief CMSIS-Core(M) Device Initial Setup for Secure/Non-Secure Zones for + * MAX32657 + * @version V1.0.0 + * @date 20. January 2021 + *****************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * Portions Copyright (C) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LIBRARIES_CMSIS_DEVICE_MAXIM_MAX32657_SOURCE_GCC_PARTITION_MAX32657_H_ +#define LIBRARIES_CMSIS_DEVICE_MAXIM_MAX32657_SOURCE_GCC_PARTITION_MAX32657_H_ + +#include "max32657.h" + +/* +//-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- +*/ + +/* +// Enable SAU +// Value for SAU->CTRL register bit ENABLE +*/ +#define SAU_INIT_CTRL_ENABLE 1 + +/* +// When SAU is disabled +// <0=> All Memory is Secure +// <1=> All Memory is Non-Secure +// Value for SAU->CTRL register bit ALLNS +// When all Memory is Non-Secure (ALLNS is 1), IDAU can override memory map configuration. +*/ +#define SAU_INIT_CTRL_ALLNS 0 + +/* +// +*/ + +/* +// Initialize Security Attribution Unit (SAU) Address Regions +// SAU configuration specifies regions to be one of: +// - Secure and Non-Secure Callable +// - Non-Secure +// Note: All memory regions not configured by SAU are Secure +*/ +/** + * Analog Devices, Inc. + * 4 Regions in the MAX32657. + * 1. Non-Secure Flash + * 2. Secure Flash + * 3. Non-Secure SRAM + * 4. Secure SRAM + * + * Finer grain control can be achieved depending on the application + * requirements by updating the regions of this file. + * + * Non-Secure Flash (1MB) 0x0100.0000 - 0x010F.FFFF + * Non-Secure SRAM0 (32kB) 0x2000.0000 - 0x2000.7FFF + * Non-Secure SRAM1 (32kB) 0x2000.8000 - 0x2000.FFFF + * Non-Secure SRAM2 (64kB) 0x2001.0000 - 0x2001.FFFF + * Non-Secure SRAM3 (64kB) 0x2002.0000 - 0x2002.FFFF + * Non-Secure SRAM4 (64kB) 0x2003.0000 - 0x2003.FFFF + * + * Secure Flash (1MB) 0x1100.0000 - 0x110F.FFFF + * Secure SRAM0 (32kB) 0x3000.0000 - 0x3000.7FFF + * Secure SRAM1 (32kB) 0x3000.8000 - 0x3000.FFFF + * Secure SRAM2 (64kB) 0x3001.0000 - 0x3001.FFFF + * Secure SRAM3 (64kB) 0x3002.0000 - 0x3002.FFFF + * Secure SRAM4 (64kB) 0x3003.0000 - 0x3003.FFFF + */ +#define SAU_REGIONS_MAX 4 /* Max. number of SAU regions */ + +/* +// Initialize SAU Region 0 (Secure Flash) +// Setup SAU Region 0 memory attributes +*/ +#define SAU_INIT_REGION0 1 + +/* +// Start Address <0-0xFFFFFFE0> +*/ +#define SAU_INIT_START0 0x11000000 /* start address of SAU region 0 (ROM) */ + +/* +// End Address <0x1F-0xFFFFFFFF> +*/ +#define SAU_INIT_END0 0x110FFFFF /* end address of SAU region 0 */ + +/* +// Region is +// <0=>Non-Secure +// <1=>Secure, Non-Secure Callable +*/ +#define SAU_INIT_NSC0 1 +/* +// +*/ + +/* +// Initialize SAU Region 1 (Non-Secure Flash) +// Setup SAU Region 1 memory attributes +*/ +#define SAU_INIT_REGION1 1 + +/* +// Start Address <0-0xFFFFFFE0> +*/ +#define SAU_INIT_START1 0x01000000 + +/* +// End Address <0x1F-0xFFFFFFFF> +*/ +#define SAU_INIT_END1 0x010FFFFF + +/* +// Region is +// <0=>Non-Secure +// <1=>Secure, Non-Secure Callable +*/ +#define SAU_INIT_NSC1 0 +/* +// +*/ + +/* +// Initialize SAU Region 2 (Secure SRAM) +// Setup SAU Region 2 memory attributes +*/ +#define SAU_INIT_REGION2 1 + +/* +// Start Address <0-0xFFFFFFE0> +*/ +#define SAU_INIT_START2 0x30000000 + +/* +// End Address <0x1F-0xFFFFFFFF> +*/ +#define SAU_INIT_END2 0x3003FFFF + +/* +// Region is +// <0=>Non-Secure +// <1=>Secure, Non-Secure Callable +*/ +#define SAU_INIT_NSC2 1 +/* +// +*/ + +/* +// Initialize SAU Region 3 (Non-Secure SRAM) +// Setup SAU Region 3 memory attributes +*/ +#define SAU_INIT_REGION3 1 + +/* +// Start Address <0-0xFFFFFFE0> +*/ +#define SAU_INIT_START3 0x20000000 + +/* +// End Address <0x1F-0xFFFFFFFF> +*/ +#define SAU_INIT_END3 0x2003FFFF + +/* +// Region is +// <0=>Non-Secure +// <1=>Secure, Non-Secure Callable +*/ +#define SAU_INIT_NSC3 0 +/* +// +*/ + +/* +// Initialize SAU Region 4 +// Setup SAU Region 4 memory attributes +*/ +#define SAU_INIT_REGION4 0 + +/* +// Start Address <0-0xFFFFFFE0> +*/ +#define SAU_INIT_START4 0x00000000 /* start address of SAU region 4 */ + +/* +// End Address <0x1F-0xFFFFFFFF> +*/ +#define SAU_INIT_END4 0x00000000 /* end address of SAU region 4 */ + +/* +// Region is +// <0=>Non-Secure +// <1=>Secure, Non-Secure Callable +*/ +#define SAU_INIT_NSC4 0 +/* +// +*/ + +/* +// Initialize SAU Region 5 +// Setup SAU Region 5 memory attributes +*/ +#define SAU_INIT_REGION5 0 + +/* +// Start Address <0-0xFFFFFFE0> +*/ +#define SAU_INIT_START5 0x00000000 + +/* +// End Address <0x1F-0xFFFFFFFF> +*/ +#define SAU_INIT_END5 0x00000000 + +/* +// Region is +// <0=>Non-Secure +// <1=>Secure, Non-Secure Callable +*/ +#define SAU_INIT_NSC5 0 +/* +// +*/ + +/* +// Initialize SAU Region 6 +// Setup SAU Region 6 memory attributes +*/ +#define SAU_INIT_REGION6 0 + +/* +// Start Address <0-0xFFFFFFE0> +*/ +#define SAU_INIT_START6 0x00000000 + +/* +// End Address <0x1F-0xFFFFFFFF> +*/ +#define SAU_INIT_END6 0x00000000 + +/* +// Region is +// <0=>Non-Secure +// <1=>Secure, Non-Secure Callable +*/ +#define SAU_INIT_NSC6 0 +/* +// +*/ + +/* +// Initialize SAU Region 7 +// Setup SAU Region 7 memory attributes +*/ +#define SAU_INIT_REGION7 0 + +/* +// Start Address <0-0xFFFFFFE0> +*/ +#define SAU_INIT_START7 0x00000000 + +/* +// End Address <0x1F-0xFFFFFFFF> +*/ +#define SAU_INIT_END7 0x00000000 + +/* +// Region is +// <0=>Non-Secure +// <1=>Secure, Non-Secure Callable +*/ +#define SAU_INIT_NSC7 0 +/* +// +*/ + +/* +// +*/ + +/* +// Setup behaviour of Sleep and Exception Handling +*/ +#define SCB_CSR_AIRCR_INIT 1 + +/* +// Deep Sleep can be enabled by +// <0=>Secure and Non-Secure state +// <1=>Secure state only +// Value for SCB->CSR register bit DEEPSLEEPS +*/ +#define SCB_CSR_DEEPSLEEPS_VAL 1 + +/* +// System reset request accessible from +// <0=> Secure and Non-Secure state +// <1=> Secure state only +// Value for SCB->AIRCR register bit SYSRESETREQS +*/ +#define SCB_AIRCR_SYSRESETREQS_VAL 1 + +/* +// Priority of Non-Secure exceptions is +// <0=> Not altered +// <1=> Lowered to 0x80-0xFF +// Value for SCB->AIRCR register bit PRIS +*/ +#define SCB_AIRCR_PRIS_VAL 1 + +/* +// BusFault, HardFault, and NMI target +// <0=> Secure state +// <1=> Non-Secure state +// Value for SCB->AIRCR register bit BFHFNMINS +*/ +#define SCB_AIRCR_BFHFNMINS_VAL 0 + +/* +// +*/ + +/* +// Setup behaviour of Floating Point and Vector Unit (FPU/MVE) +*/ +#define TZ_FPU_NS_USAGE 1 + +/* +// Floating Point and Vector Unit usage +// <0=> Secure state only +// <3=> Secure and Non-Secure state +// Value for SCB->NSACR register bits CP10, CP11 +*/ +#define SCB_NSACR_CP10_11_VAL 3 + +/* +// Treat floating-point registers as Secure +// <0=> Disabled +// <1=> Enabled +// Value for FPU->FPCCR register bit TS +*/ +#define FPU_FPCCR_TS_VAL 0 + +/* +// Clear on return (CLRONRET) accessibility +// <0=> Secure and Non-Secure state +// <1=> Secure state only +// Value for FPU->FPCCR register bit CLRONRETS +*/ +#define FPU_FPCCR_CLRONRETS_VAL 0 + +/* +// Clear floating-point caller saved registers on exception return +// <0=> Disabled +// <1=> Enabled +// Value for FPU->FPCCR register bit CLRONRET +*/ +#define FPU_FPCCR_CLRONRET_VAL 1 + +/* +// +*/ + +/* +// Setup Interrupt Target +*/ + +/* +// Initialize ITNS 0 (Interrupts 0..31) +*/ +#define NVIC_INIT_ITNS0 1 + +/* +// Interrupts 0..31 +// ICE Unlock <0=> Secure state <1=> Non-Secure state +// Watchdog Timer <0=> Secure state <1=> Non-Secure state +// Real Time Clock <0=> Secure state <1=> Non-Secure state +// True Random Number Generator <0=> Secure state <1=> Non-Secure state +// Timer 0 <0=> Secure state <1=> Non-Secure state +// Timer 1 <0=> Secure state <1=> Non-Secure state +// Timer 2 <0=> Secure state <1=> Non-Secure state +// Timer 3 <0=> Secure state <1=> Non-Secure state +// Timer 4 <0=> Secure state <1=> Non-Secure state +// Timer 5 <0=> Secure state <1=> Non-Secure state +// I3C <0=> Secure state <1=> Non-Secure state +// UART <0=> Secure state <1=> Non-Secure state +// SPI <0=> Secure state <1=> Non-Secure state +// Flash Controller <0=> Secure state <1=> Non-Secure state +// GPIO0 <0=> Secure state <1=> Non-Secure state +// Reserved (15) <0=> Secure state <1=> Non-Secure state +// DMA0 Channel 0 <0=> Secure state <1=> Non-Secure state +// DMA0 Channel 1 <0=> Secure state <1=> Non-Secure state +// DMA0 Channel 2 <0=> Secure state <1=> Non-Secure state +// DMA0 Channel 3 <0=> Secure state <1=> Non-Secure state +// DMA1 Channel 0 <0=> Secure state <1=> Non-Secure state +// DMA1 Channel 1 <0=> Secure state <1=> Non-Secure state +// DMA1 Channel 2 <0=> Secure state <1=> Non-Secure state +// DMA1 Channel 3 <0=> Secure state <1=> Non-Secure state +// Wakeup Timer 0 <0=> Secure state <1=> Non-Secure state +// Wakeup Timer 1 <0=> Secure state <1=> Non-Secure state +// GPIO Wake <0=> Secure state <1=> Non-Secure state +// CRC <0=> Secure state <1=> Non-Secure state +// AES <0=> Secure state <1=> Non-Secure state +// ERFO Ready <0=> Secure state <1=> Non-Secure state +// Boost Controller <0=> Secure state <1=> Non-Secure state +// ECC <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS0_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 1 (Interrupts 32..63) +*/ +#define NVIC_INIT_ITNS1 1 + +/* +// Interrupts 32..63 +// BTLE XXXX0 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX1 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX2 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX3 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX4 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX5 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX6 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX7 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX8 <0=> Secure state <1=> Non-Secure state +// BTLE XXXX9 <0=> Secure state <1=> Non-Secure state +// BTLE XXXXA <0=> Secure state <1=> Non-Secure state +// BTLE XXXXB <0=> Secure state <1=> Non-Secure state +// BTLE XXXXC <0=> Secure state <1=> Non-Secure state +// BTLE XXXXD <0=> Secure state <1=> Non-Secure state +// BTLE XXXXE <0=> Secure state <1=> Non-Secure state +// Reserved (47) <0=> Secure state <1=> Non-Secure state +// MPC Combined (Secure) <0=> Secure state <1=> Non-Secure state +// PPC Combined (Secure) <0=> Secure state <1=> Non-Secure state +// Reserved (50) <0=> Secure state <1=> Non-Secure state +// Reserved (51) <0=> Secure state <1=> Non-Secure state +// Reserved (52) <0=> Secure state <1=> Non-Secure state +// Reserved (53) <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS1_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 2 (Interrupts 64..95) +*/ +#define NVIC_INIT_ITNS2 0 + +/* +// Interrupts 64..95 +// Interrupt 64 <0=> Secure state <1=> Non-Secure state +// Interrupt 65 <0=> Secure state <1=> Non-Secure state +// Interrupt 66 <0=> Secure state <1=> Non-Secure state +// Interrupt 67 <0=> Secure state <1=> Non-Secure state +// Interrupt 68 <0=> Secure state <1=> Non-Secure state +// Interrupt 69 <0=> Secure state <1=> Non-Secure state +// Interrupt 70 <0=> Secure state <1=> Non-Secure state +// Interrupt 71 <0=> Secure state <1=> Non-Secure state +// Interrupt 72 <0=> Secure state <1=> Non-Secure state +// Interrupt 73 <0=> Secure state <1=> Non-Secure state +// Interrupt 74 <0=> Secure state <1=> Non-Secure state +// Interrupt 75 <0=> Secure state <1=> Non-Secure state +// Interrupt 76 <0=> Secure state <1=> Non-Secure state +// Interrupt 77 <0=> Secure state <1=> Non-Secure state +// Interrupt 78 <0=> Secure state <1=> Non-Secure state +// Interrupt 79 <0=> Secure state <1=> Non-Secure state +// Interrupt 80 <0=> Secure state <1=> Non-Secure state +// Interrupt 81 <0=> Secure state <1=> Non-Secure state +// Interrupt 82 <0=> Secure state <1=> Non-Secure state +// Interrupt 83 <0=> Secure state <1=> Non-Secure state +// Interrupt 84 <0=> Secure state <1=> Non-Secure state +// Interrupt 85 <0=> Secure state <1=> Non-Secure state +// Interrupt 86 <0=> Secure state <1=> Non-Secure state +// Interrupt 87 <0=> Secure state <1=> Non-Secure state +// Interrupt 88 <0=> Secure state <1=> Non-Secure state +// Interrupt 89 <0=> Secure state <1=> Non-Secure state +// Interrupt 90 <0=> Secure state <1=> Non-Secure state +// Interrupt 91 <0=> Secure state <1=> Non-Secure state +// Interrupt 92 <0=> Secure state <1=> Non-Secure state +// Interrupt 93 <0=> Secure state <1=> Non-Secure state +// Interrupt 94 <0=> Secure state <1=> Non-Secure state +// Interrupt 95 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS2_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 3 (Interrupts 96..127) +*/ +#define NVIC_INIT_ITNS3 0 + +/* +// Interrupts 96..127 +// Interrupt 96 <0=> Secure state <1=> Non-Secure state +// Interrupt 97 <0=> Secure state <1=> Non-Secure state +// Interrupt 98 <0=> Secure state <1=> Non-Secure state +// Interrupt 99 <0=> Secure state <1=> Non-Secure state +// Interrupt 100 <0=> Secure state <1=> Non-Secure state +// Interrupt 101 <0=> Secure state <1=> Non-Secure state +// Interrupt 102 <0=> Secure state <1=> Non-Secure state +// Interrupt 103 <0=> Secure state <1=> Non-Secure state +// Interrupt 104 <0=> Secure state <1=> Non-Secure state +// Interrupt 105 <0=> Secure state <1=> Non-Secure state +// Interrupt 106 <0=> Secure state <1=> Non-Secure state +// Interrupt 107 <0=> Secure state <1=> Non-Secure state +// Interrupt 108 <0=> Secure state <1=> Non-Secure state +// Interrupt 109 <0=> Secure state <1=> Non-Secure state +// Interrupt 110 <0=> Secure state <1=> Non-Secure state +// Interrupt 111 <0=> Secure state <1=> Non-Secure state +// Interrupt 112 <0=> Secure state <1=> Non-Secure state +// Interrupt 113 <0=> Secure state <1=> Non-Secure state +// Interrupt 114 <0=> Secure state <1=> Non-Secure state +// Interrupt 115 <0=> Secure state <1=> Non-Secure state +// Interrupt 116 <0=> Secure state <1=> Non-Secure state +// Interrupt 117 <0=> Secure state <1=> Non-Secure state +// Interrupt 118 <0=> Secure state <1=> Non-Secure state +// Interrupt 119 <0=> Secure state <1=> Non-Secure state +// Interrupt 120 <0=> Secure state <1=> Non-Secure state +// Interrupt 121 <0=> Secure state <1=> Non-Secure state +// Interrupt 122 <0=> Secure state <1=> Non-Secure state +// Interrupt 123 <0=> Secure state <1=> Non-Secure state +// Interrupt 124 <0=> Secure state <1=> Non-Secure state +// Interrupt 125 <0=> Secure state <1=> Non-Secure state +// Interrupt 126 <0=> Secure state <1=> Non-Secure state +// Interrupt 127 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS3_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 4 (Interrupts 128..159) +*/ +#define NVIC_INIT_ITNS4 0 + +/* +// Interrupts 128..159 +// Interrupt 128 <0=> Secure state <1=> Non-Secure state +// Interrupt 129 <0=> Secure state <1=> Non-Secure state +// Interrupt 130 <0=> Secure state <1=> Non-Secure state +// Interrupt 131 <0=> Secure state <1=> Non-Secure state +// Interrupt 132 <0=> Secure state <1=> Non-Secure state +// Interrupt 133 <0=> Secure state <1=> Non-Secure state +// Interrupt 134 <0=> Secure state <1=> Non-Secure state +// Interrupt 135 <0=> Secure state <1=> Non-Secure state +// Interrupt 136 <0=> Secure state <1=> Non-Secure state +// Interrupt 137 <0=> Secure state <1=> Non-Secure state +// Interrupt 138 <0=> Secure state <1=> Non-Secure state +// Interrupt 139 <0=> Secure state <1=> Non-Secure state +// Interrupt 140 <0=> Secure state <1=> Non-Secure state +// Interrupt 141 <0=> Secure state <1=> Non-Secure state +// Interrupt 142 <0=> Secure state <1=> Non-Secure state +// Interrupt 143 <0=> Secure state <1=> Non-Secure state +// Interrupt 144 <0=> Secure state <1=> Non-Secure state +// Interrupt 145 <0=> Secure state <1=> Non-Secure state +// Interrupt 146 <0=> Secure state <1=> Non-Secure state +// Interrupt 147 <0=> Secure state <1=> Non-Secure state +// Interrupt 148 <0=> Secure state <1=> Non-Secure state +// Interrupt 149 <0=> Secure state <1=> Non-Secure state +// Interrupt 150 <0=> Secure state <1=> Non-Secure state +// Interrupt 151 <0=> Secure state <1=> Non-Secure state +// Interrupt 152 <0=> Secure state <1=> Non-Secure state +// Interrupt 153 <0=> Secure state <1=> Non-Secure state +// Interrupt 154 <0=> Secure state <1=> Non-Secure state +// Interrupt 155 <0=> Secure state <1=> Non-Secure state +// Interrupt 156 <0=> Secure state <1=> Non-Secure state +// Interrupt 157 <0=> Secure state <1=> Non-Secure state +// Interrupt 158 <0=> Secure state <1=> Non-Secure state +// Interrupt 159 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS4_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 5 (Interrupts 160..191) +*/ +#define NVIC_INIT_ITNS5 0 + +/* +// Interrupts 160..191 +// Interrupt 160 <0=> Secure state <1=> Non-Secure state +// Interrupt 161 <0=> Secure state <1=> Non-Secure state +// Interrupt 162 <0=> Secure state <1=> Non-Secure state +// Interrupt 163 <0=> Secure state <1=> Non-Secure state +// Interrupt 164 <0=> Secure state <1=> Non-Secure state +// Interrupt 165 <0=> Secure state <1=> Non-Secure state +// Interrupt 166 <0=> Secure state <1=> Non-Secure state +// Interrupt 167 <0=> Secure state <1=> Non-Secure state +// Interrupt 168 <0=> Secure state <1=> Non-Secure state +// Interrupt 169 <0=> Secure state <1=> Non-Secure state +// Interrupt 170 <0=> Secure state <1=> Non-Secure state +// Interrupt 171 <0=> Secure state <1=> Non-Secure state +// Interrupt 172 <0=> Secure state <1=> Non-Secure state +// Interrupt 173 <0=> Secure state <1=> Non-Secure state +// Interrupt 174 <0=> Secure state <1=> Non-Secure state +// Interrupt 175 <0=> Secure state <1=> Non-Secure state +// Interrupt 176 <0=> Secure state <1=> Non-Secure state +// Interrupt 177 <0=> Secure state <1=> Non-Secure state +// Interrupt 178 <0=> Secure state <1=> Non-Secure state +// Interrupt 179 <0=> Secure state <1=> Non-Secure state +// Interrupt 180 <0=> Secure state <1=> Non-Secure state +// Interrupt 181 <0=> Secure state <1=> Non-Secure state +// Interrupt 182 <0=> Secure state <1=> Non-Secure state +// Interrupt 183 <0=> Secure state <1=> Non-Secure state +// Interrupt 184 <0=> Secure state <1=> Non-Secure state +// Interrupt 185 <0=> Secure state <1=> Non-Secure state +// Interrupt 186 <0=> Secure state <1=> Non-Secure state +// Interrupt 187 <0=> Secure state <1=> Non-Secure state +// Interrupt 188 <0=> Secure state <1=> Non-Secure state +// Interrupt 189 <0=> Secure state <1=> Non-Secure state +// Interrupt 190 <0=> Secure state <1=> Non-Secure state +// Interrupt 191 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS5_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 6 (Interrupts 192..223) +*/ +#define NVIC_INIT_ITNS6 0 + +/* +// Interrupts 192..223 +// Interrupt 192 <0=> Secure state <1=> Non-Secure state +// Interrupt 193 <0=> Secure state <1=> Non-Secure state +// Interrupt 194 <0=> Secure state <1=> Non-Secure state +// Interrupt 195 <0=> Secure state <1=> Non-Secure state +// Interrupt 196 <0=> Secure state <1=> Non-Secure state +// Interrupt 197 <0=> Secure state <1=> Non-Secure state +// Interrupt 198 <0=> Secure state <1=> Non-Secure state +// Interrupt 199 <0=> Secure state <1=> Non-Secure state +// Interrupt 200 <0=> Secure state <1=> Non-Secure state +// Interrupt 201 <0=> Secure state <1=> Non-Secure state +// Interrupt 202 <0=> Secure state <1=> Non-Secure state +// Interrupt 203 <0=> Secure state <1=> Non-Secure state +// Interrupt 204 <0=> Secure state <1=> Non-Secure state +// Interrupt 205 <0=> Secure state <1=> Non-Secure state +// Interrupt 206 <0=> Secure state <1=> Non-Secure state +// Interrupt 207 <0=> Secure state <1=> Non-Secure state +// Interrupt 208 <0=> Secure state <1=> Non-Secure state +// Interrupt 209 <0=> Secure state <1=> Non-Secure state +// Interrupt 210 <0=> Secure state <1=> Non-Secure state +// Interrupt 211 <0=> Secure state <1=> Non-Secure state +// Interrupt 212 <0=> Secure state <1=> Non-Secure state +// Interrupt 213 <0=> Secure state <1=> Non-Secure state +// Interrupt 214 <0=> Secure state <1=> Non-Secure state +// Interrupt 215 <0=> Secure state <1=> Non-Secure state +// Interrupt 216 <0=> Secure state <1=> Non-Secure state +// Interrupt 217 <0=> Secure state <1=> Non-Secure state +// Interrupt 218 <0=> Secure state <1=> Non-Secure state +// Interrupt 219 <0=> Secure state <1=> Non-Secure state +// Interrupt 220 <0=> Secure state <1=> Non-Secure state +// Interrupt 221 <0=> Secure state <1=> Non-Secure state +// Interrupt 222 <0=> Secure state <1=> Non-Secure state +// Interrupt 223 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS6_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 7 (Interrupts 224..255) +*/ +#define NVIC_INIT_ITNS7 0 + +/* +// Interrupts 224..255 +// Interrupt 224 <0=> Secure state <1=> Non-Secure state +// Interrupt 225 <0=> Secure state <1=> Non-Secure state +// Interrupt 226 <0=> Secure state <1=> Non-Secure state +// Interrupt 227 <0=> Secure state <1=> Non-Secure state +// Interrupt 228 <0=> Secure state <1=> Non-Secure state +// Interrupt 229 <0=> Secure state <1=> Non-Secure state +// Interrupt 230 <0=> Secure state <1=> Non-Secure state +// Interrupt 231 <0=> Secure state <1=> Non-Secure state +// Interrupt 232 <0=> Secure state <1=> Non-Secure state +// Interrupt 233 <0=> Secure state <1=> Non-Secure state +// Interrupt 234 <0=> Secure state <1=> Non-Secure state +// Interrupt 235 <0=> Secure state <1=> Non-Secure state +// Interrupt 236 <0=> Secure state <1=> Non-Secure state +// Interrupt 237 <0=> Secure state <1=> Non-Secure state +// Interrupt 238 <0=> Secure state <1=> Non-Secure state +// Interrupt 239 <0=> Secure state <1=> Non-Secure state +// Interrupt 240 <0=> Secure state <1=> Non-Secure state +// Interrupt 241 <0=> Secure state <1=> Non-Secure state +// Interrupt 242 <0=> Secure state <1=> Non-Secure state +// Interrupt 243 <0=> Secure state <1=> Non-Secure state +// Interrupt 244 <0=> Secure state <1=> Non-Secure state +// Interrupt 245 <0=> Secure state <1=> Non-Secure state +// Interrupt 246 <0=> Secure state <1=> Non-Secure state +// Interrupt 247 <0=> Secure state <1=> Non-Secure state +// Interrupt 248 <0=> Secure state <1=> Non-Secure state +// Interrupt 249 <0=> Secure state <1=> Non-Secure state +// Interrupt 250 <0=> Secure state <1=> Non-Secure state +// Interrupt 251 <0=> Secure state <1=> Non-Secure state +// Interrupt 252 <0=> Secure state <1=> Non-Secure state +// Interrupt 253 <0=> Secure state <1=> Non-Secure state +// Interrupt 254 <0=> Secure state <1=> Non-Secure state +// Interrupt 255 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS7_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 8 (Interrupts 256..287) +*/ +#define NVIC_INIT_ITNS8 0 + +/* +// Interrupts 256..287 +// Interrupt 256 <0=> Secure state <1=> Non-Secure state +// Interrupt 257 <0=> Secure state <1=> Non-Secure state +// Interrupt 258 <0=> Secure state <1=> Non-Secure state +// Interrupt 259 <0=> Secure state <1=> Non-Secure state +// Interrupt 260 <0=> Secure state <1=> Non-Secure state +// Interrupt 261 <0=> Secure state <1=> Non-Secure state +// Interrupt 262 <0=> Secure state <1=> Non-Secure state +// Interrupt 263 <0=> Secure state <1=> Non-Secure state +// Interrupt 264 <0=> Secure state <1=> Non-Secure state +// Interrupt 265 <0=> Secure state <1=> Non-Secure state +// Interrupt 266 <0=> Secure state <1=> Non-Secure state +// Interrupt 267 <0=> Secure state <1=> Non-Secure state +// Interrupt 268 <0=> Secure state <1=> Non-Secure state +// Interrupt 269 <0=> Secure state <1=> Non-Secure state +// Interrupt 270 <0=> Secure state <1=> Non-Secure state +// Interrupt 271 <0=> Secure state <1=> Non-Secure state +// Interrupt 272 <0=> Secure state <1=> Non-Secure state +// Interrupt 273 <0=> Secure state <1=> Non-Secure state +// Interrupt 274 <0=> Secure state <1=> Non-Secure state +// Interrupt 275 <0=> Secure state <1=> Non-Secure state +// Interrupt 276 <0=> Secure state <1=> Non-Secure state +// Interrupt 277 <0=> Secure state <1=> Non-Secure state +// Interrupt 278 <0=> Secure state <1=> Non-Secure state +// Interrupt 279 <0=> Secure state <1=> Non-Secure state +// Interrupt 280 <0=> Secure state <1=> Non-Secure state +// Interrupt 281 <0=> Secure state <1=> Non-Secure state +// Interrupt 282 <0=> Secure state <1=> Non-Secure state +// Interrupt 283 <0=> Secure state <1=> Non-Secure state +// Interrupt 284 <0=> Secure state <1=> Non-Secure state +// Interrupt 285 <0=> Secure state <1=> Non-Secure state +// Interrupt 286 <0=> Secure state <1=> Non-Secure state +// Interrupt 287 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS8_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 9 (Interrupts 288..319) +*/ +#define NVIC_INIT_ITNS9 0 + +/* +// Interrupts 288..319 +// Interrupt 288 <0=> Secure state <1=> Non-Secure state +// Interrupt 289 <0=> Secure state <1=> Non-Secure state +// Interrupt 290 <0=> Secure state <1=> Non-Secure state +// Interrupt 291 <0=> Secure state <1=> Non-Secure state +// Interrupt 292 <0=> Secure state <1=> Non-Secure state +// Interrupt 293 <0=> Secure state <1=> Non-Secure state +// Interrupt 294 <0=> Secure state <1=> Non-Secure state +// Interrupt 295 <0=> Secure state <1=> Non-Secure state +// Interrupt 296 <0=> Secure state <1=> Non-Secure state +// Interrupt 297 <0=> Secure state <1=> Non-Secure state +// Interrupt 298 <0=> Secure state <1=> Non-Secure state +// Interrupt 299 <0=> Secure state <1=> Non-Secure state +// Interrupt 300 <0=> Secure state <1=> Non-Secure state +// Interrupt 301 <0=> Secure state <1=> Non-Secure state +// Interrupt 302 <0=> Secure state <1=> Non-Secure state +// Interrupt 303 <0=> Secure state <1=> Non-Secure state +// Interrupt 304 <0=> Secure state <1=> Non-Secure state +// Interrupt 305 <0=> Secure state <1=> Non-Secure state +// Interrupt 306 <0=> Secure state <1=> Non-Secure state +// Interrupt 307 <0=> Secure state <1=> Non-Secure state +// Interrupt 308 <0=> Secure state <1=> Non-Secure state +// Interrupt 309 <0=> Secure state <1=> Non-Secure state +// Interrupt 310 <0=> Secure state <1=> Non-Secure state +// Interrupt 311 <0=> Secure state <1=> Non-Secure state +// Interrupt 312 <0=> Secure state <1=> Non-Secure state +// Interrupt 313 <0=> Secure state <1=> Non-Secure state +// Interrupt 314 <0=> Secure state <1=> Non-Secure state +// Interrupt 315 <0=> Secure state <1=> Non-Secure state +// Interrupt 316 <0=> Secure state <1=> Non-Secure state +// Interrupt 317 <0=> Secure state <1=> Non-Secure state +// Interrupt 318 <0=> Secure state <1=> Non-Secure state +// Interrupt 319 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS9_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 10 (Interrupts 320..351) +*/ +#define NVIC_INIT_ITNS10 0 + +/* +// Interrupts 320..351 +// Interrupt 320 <0=> Secure state <1=> Non-Secure state +// Interrupt 321 <0=> Secure state <1=> Non-Secure state +// Interrupt 322 <0=> Secure state <1=> Non-Secure state +// Interrupt 323 <0=> Secure state <1=> Non-Secure state +// Interrupt 324 <0=> Secure state <1=> Non-Secure state +// Interrupt 325 <0=> Secure state <1=> Non-Secure state +// Interrupt 326 <0=> Secure state <1=> Non-Secure state +// Interrupt 327 <0=> Secure state <1=> Non-Secure state +// Interrupt 328 <0=> Secure state <1=> Non-Secure state +// Interrupt 329 <0=> Secure state <1=> Non-Secure state +// Interrupt 330 <0=> Secure state <1=> Non-Secure state +// Interrupt 331 <0=> Secure state <1=> Non-Secure state +// Interrupt 332 <0=> Secure state <1=> Non-Secure state +// Interrupt 333 <0=> Secure state <1=> Non-Secure state +// Interrupt 334 <0=> Secure state <1=> Non-Secure state +// Interrupt 335 <0=> Secure state <1=> Non-Secure state +// Interrupt 336 <0=> Secure state <1=> Non-Secure state +// Interrupt 337 <0=> Secure state <1=> Non-Secure state +// Interrupt 338 <0=> Secure state <1=> Non-Secure state +// Interrupt 339 <0=> Secure state <1=> Non-Secure state +// Interrupt 340 <0=> Secure state <1=> Non-Secure state +// Interrupt 341 <0=> Secure state <1=> Non-Secure state +// Interrupt 342 <0=> Secure state <1=> Non-Secure state +// Interrupt 343 <0=> Secure state <1=> Non-Secure state +// Interrupt 344 <0=> Secure state <1=> Non-Secure state +// Interrupt 345 <0=> Secure state <1=> Non-Secure state +// Interrupt 346 <0=> Secure state <1=> Non-Secure state +// Interrupt 347 <0=> Secure state <1=> Non-Secure state +// Interrupt 348 <0=> Secure state <1=> Non-Secure state +// Interrupt 349 <0=> Secure state <1=> Non-Secure state +// Interrupt 350 <0=> Secure state <1=> Non-Secure state +// Interrupt 351 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS10_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 11 (Interrupts 352..383) +*/ +#define NVIC_INIT_ITNS11 0 + +/* +// Interrupts 352..383 +// Interrupt 352 <0=> Secure state <1=> Non-Secure state +// Interrupt 353 <0=> Secure state <1=> Non-Secure state +// Interrupt 354 <0=> Secure state <1=> Non-Secure state +// Interrupt 355 <0=> Secure state <1=> Non-Secure state +// Interrupt 356 <0=> Secure state <1=> Non-Secure state +// Interrupt 357 <0=> Secure state <1=> Non-Secure state +// Interrupt 358 <0=> Secure state <1=> Non-Secure state +// Interrupt 359 <0=> Secure state <1=> Non-Secure state +// Interrupt 360 <0=> Secure state <1=> Non-Secure state +// Interrupt 361 <0=> Secure state <1=> Non-Secure state +// Interrupt 362 <0=> Secure state <1=> Non-Secure state +// Interrupt 363 <0=> Secure state <1=> Non-Secure state +// Interrupt 364 <0=> Secure state <1=> Non-Secure state +// Interrupt 365 <0=> Secure state <1=> Non-Secure state +// Interrupt 366 <0=> Secure state <1=> Non-Secure state +// Interrupt 367 <0=> Secure state <1=> Non-Secure state +// Interrupt 368 <0=> Secure state <1=> Non-Secure state +// Interrupt 369 <0=> Secure state <1=> Non-Secure state +// Interrupt 370 <0=> Secure state <1=> Non-Secure state +// Interrupt 371 <0=> Secure state <1=> Non-Secure state +// Interrupt 372 <0=> Secure state <1=> Non-Secure state +// Interrupt 373 <0=> Secure state <1=> Non-Secure state +// Interrupt 374 <0=> Secure state <1=> Non-Secure state +// Interrupt 375 <0=> Secure state <1=> Non-Secure state +// Interrupt 376 <0=> Secure state <1=> Non-Secure state +// Interrupt 377 <0=> Secure state <1=> Non-Secure state +// Interrupt 378 <0=> Secure state <1=> Non-Secure state +// Interrupt 379 <0=> Secure state <1=> Non-Secure state +// Interrupt 380 <0=> Secure state <1=> Non-Secure state +// Interrupt 381 <0=> Secure state <1=> Non-Secure state +// Interrupt 382 <0=> Secure state <1=> Non-Secure state +// Interrupt 383 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS11_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 12 (Interrupts 384..415) +*/ +#define NVIC_INIT_ITNS12 0 + +/* +// Interrupts 384..415 +// Interrupt 384 <0=> Secure state <1=> Non-Secure state +// Interrupt 385 <0=> Secure state <1=> Non-Secure state +// Interrupt 386 <0=> Secure state <1=> Non-Secure state +// Interrupt 387 <0=> Secure state <1=> Non-Secure state +// Interrupt 388 <0=> Secure state <1=> Non-Secure state +// Interrupt 389 <0=> Secure state <1=> Non-Secure state +// Interrupt 390 <0=> Secure state <1=> Non-Secure state +// Interrupt 391 <0=> Secure state <1=> Non-Secure state +// Interrupt 392 <0=> Secure state <1=> Non-Secure state +// Interrupt 393 <0=> Secure state <1=> Non-Secure state +// Interrupt 394 <0=> Secure state <1=> Non-Secure state +// Interrupt 395 <0=> Secure state <1=> Non-Secure state +// Interrupt 396 <0=> Secure state <1=> Non-Secure state +// Interrupt 397 <0=> Secure state <1=> Non-Secure state +// Interrupt 398 <0=> Secure state <1=> Non-Secure state +// Interrupt 399 <0=> Secure state <1=> Non-Secure state +// Interrupt 400 <0=> Secure state <1=> Non-Secure state +// Interrupt 401 <0=> Secure state <1=> Non-Secure state +// Interrupt 402 <0=> Secure state <1=> Non-Secure state +// Interrupt 403 <0=> Secure state <1=> Non-Secure state +// Interrupt 404 <0=> Secure state <1=> Non-Secure state +// Interrupt 405 <0=> Secure state <1=> Non-Secure state +// Interrupt 406 <0=> Secure state <1=> Non-Secure state +// Interrupt 407 <0=> Secure state <1=> Non-Secure state +// Interrupt 408 <0=> Secure state <1=> Non-Secure state +// Interrupt 409 <0=> Secure state <1=> Non-Secure state +// Interrupt 410 <0=> Secure state <1=> Non-Secure state +// Interrupt 411 <0=> Secure state <1=> Non-Secure state +// Interrupt 412 <0=> Secure state <1=> Non-Secure state +// Interrupt 413 <0=> Secure state <1=> Non-Secure state +// Interrupt 414 <0=> Secure state <1=> Non-Secure state +// Interrupt 415 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS12_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 13 (Interrupts 416..447) +*/ +#define NVIC_INIT_ITNS13 0 + +/* +// Interrupts 416..447 +// Interrupt 416 <0=> Secure state <1=> Non-Secure state +// Interrupt 417 <0=> Secure state <1=> Non-Secure state +// Interrupt 418 <0=> Secure state <1=> Non-Secure state +// Interrupt 419 <0=> Secure state <1=> Non-Secure state +// Interrupt 420 <0=> Secure state <1=> Non-Secure state +// Interrupt 421 <0=> Secure state <1=> Non-Secure state +// Interrupt 422 <0=> Secure state <1=> Non-Secure state +// Interrupt 423 <0=> Secure state <1=> Non-Secure state +// Interrupt 424 <0=> Secure state <1=> Non-Secure state +// Interrupt 425 <0=> Secure state <1=> Non-Secure state +// Interrupt 426 <0=> Secure state <1=> Non-Secure state +// Interrupt 427 <0=> Secure state <1=> Non-Secure state +// Interrupt 428 <0=> Secure state <1=> Non-Secure state +// Interrupt 429 <0=> Secure state <1=> Non-Secure state +// Interrupt 430 <0=> Secure state <1=> Non-Secure state +// Interrupt 431 <0=> Secure state <1=> Non-Secure state +// Interrupt 432 <0=> Secure state <1=> Non-Secure state +// Interrupt 433 <0=> Secure state <1=> Non-Secure state +// Interrupt 434 <0=> Secure state <1=> Non-Secure state +// Interrupt 435 <0=> Secure state <1=> Non-Secure state +// Interrupt 436 <0=> Secure state <1=> Non-Secure state +// Interrupt 437 <0=> Secure state <1=> Non-Secure state +// Interrupt 438 <0=> Secure state <1=> Non-Secure state +// Interrupt 439 <0=> Secure state <1=> Non-Secure state +// Interrupt 440 <0=> Secure state <1=> Non-Secure state +// Interrupt 441 <0=> Secure state <1=> Non-Secure state +// Interrupt 442 <0=> Secure state <1=> Non-Secure state +// Interrupt 443 <0=> Secure state <1=> Non-Secure state +// Interrupt 444 <0=> Secure state <1=> Non-Secure state +// Interrupt 445 <0=> Secure state <1=> Non-Secure state +// Interrupt 446 <0=> Secure state <1=> Non-Secure state +// Interrupt 447 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS13_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 14 (Interrupts 448..479) +*/ +#define NVIC_INIT_ITNS14 0 + +/* +// Interrupts 448..479 +// Interrupt 448 <0=> Secure state <1=> Non-Secure state +// Interrupt 449 <0=> Secure state <1=> Non-Secure state +// Interrupt 450 <0=> Secure state <1=> Non-Secure state +// Interrupt 451 <0=> Secure state <1=> Non-Secure state +// Interrupt 452 <0=> Secure state <1=> Non-Secure state +// Interrupt 453 <0=> Secure state <1=> Non-Secure state +// Interrupt 454 <0=> Secure state <1=> Non-Secure state +// Interrupt 455 <0=> Secure state <1=> Non-Secure state +// Interrupt 456 <0=> Secure state <1=> Non-Secure state +// Interrupt 457 <0=> Secure state <1=> Non-Secure state +// Interrupt 458 <0=> Secure state <1=> Non-Secure state +// Interrupt 459 <0=> Secure state <1=> Non-Secure state +// Interrupt 460 <0=> Secure state <1=> Non-Secure state +// Interrupt 461 <0=> Secure state <1=> Non-Secure state +// Interrupt 462 <0=> Secure state <1=> Non-Secure state +// Interrupt 463 <0=> Secure state <1=> Non-Secure state +// Interrupt 464 <0=> Secure state <1=> Non-Secure state +// Interrupt 465 <0=> Secure state <1=> Non-Secure state +// Interrupt 466 <0=> Secure state <1=> Non-Secure state +// Interrupt 467 <0=> Secure state <1=> Non-Secure state +// Interrupt 468 <0=> Secure state <1=> Non-Secure state +// Interrupt 469 <0=> Secure state <1=> Non-Secure state +// Interrupt 470 <0=> Secure state <1=> Non-Secure state +// Interrupt 471 <0=> Secure state <1=> Non-Secure state +// Interrupt 472 <0=> Secure state <1=> Non-Secure state +// Interrupt 473 <0=> Secure state <1=> Non-Secure state +// Interrupt 474 <0=> Secure state <1=> Non-Secure state +// Interrupt 475 <0=> Secure state <1=> Non-Secure state +// Interrupt 476 <0=> Secure state <1=> Non-Secure state +// Interrupt 477 <0=> Secure state <1=> Non-Secure state +// Interrupt 478 <0=> Secure state <1=> Non-Secure state +// Interrupt 479 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS14_VAL 0x00000000 + +/* +// +*/ + +/* +// Initialize ITNS 15 (Interrupts 480..511) +*/ +#define NVIC_INIT_ITNS15 0 + +/* +// Interrupts 480..511 +// Interrupt 480 <0=> Secure state <1=> Non-Secure state +// Interrupt 481 <0=> Secure state <1=> Non-Secure state +// Interrupt 482 <0=> Secure state <1=> Non-Secure state +// Interrupt 483 <0=> Secure state <1=> Non-Secure state +// Interrupt 484 <0=> Secure state <1=> Non-Secure state +// Interrupt 485 <0=> Secure state <1=> Non-Secure state +// Interrupt 486 <0=> Secure state <1=> Non-Secure state +// Interrupt 487 <0=> Secure state <1=> Non-Secure state +// Interrupt 488 <0=> Secure state <1=> Non-Secure state +// Interrupt 489 <0=> Secure state <1=> Non-Secure state +// Interrupt 490 <0=> Secure state <1=> Non-Secure state +// Interrupt 491 <0=> Secure state <1=> Non-Secure state +// Interrupt 492 <0=> Secure state <1=> Non-Secure state +// Interrupt 493 <0=> Secure state <1=> Non-Secure state +// Interrupt 494 <0=> Secure state <1=> Non-Secure state +// Interrupt 495 <0=> Secure state <1=> Non-Secure state +// Interrupt 496 <0=> Secure state <1=> Non-Secure state +// Interrupt 497 <0=> Secure state <1=> Non-Secure state +// Interrupt 498 <0=> Secure state <1=> Non-Secure state +// Interrupt 499 <0=> Secure state <1=> Non-Secure state +// Interrupt 500 <0=> Secure state <1=> Non-Secure state +// Interrupt 501 <0=> Secure state <1=> Non-Secure state +// Interrupt 502 <0=> Secure state <1=> Non-Secure state +// Interrupt 503 <0=> Secure state <1=> Non-Secure state +// Interrupt 504 <0=> Secure state <1=> Non-Secure state +// Interrupt 505 <0=> Secure state <1=> Non-Secure state +// Interrupt 506 <0=> Secure state <1=> Non-Secure state +// Interrupt 507 <0=> Secure state <1=> Non-Secure state +// Interrupt 508 <0=> Secure state <1=> Non-Secure state +// Interrupt 509 <0=> Secure state <1=> Non-Secure state +// Interrupt 510 <0=> Secure state <1=> Non-Secure state +// Interrupt 511 <0=> Secure state <1=> Non-Secure state +*/ +#define NVIC_INIT_ITNS15_VAL 0x00000000 + +/* +// +*/ + +/* +// +*/ + + + +/* + max 128 SAU regions. + SAU regions are defined in partition.h + */ + +#define SAU_INIT_REGION(n) \ + SAU->RNR = (n & SAU_RNR_REGION_Msk); \ + SAU->RBAR = (SAU_INIT_START##n & SAU_RBAR_BADDR_Msk); \ + SAU->RLAR = (SAU_INIT_END##n & SAU_RLAR_LADDR_Msk) | \ + ((SAU_INIT_NSC##n << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk) | 1U + +/** + \brief Setup a SAU Region + \details Writes the region information contained in SAU_Region to the + registers SAU_RNR, SAU_RBAR, and SAU_RLAR + */ +__STATIC_INLINE void TZ_SAU_Setup (void) +{ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + + #if defined (SAU_INIT_REGION0) && (SAU_INIT_REGION0 == 1U) + SAU_INIT_REGION(0); + #endif + + #if defined (SAU_INIT_REGION1) && (SAU_INIT_REGION1 == 1U) + SAU_INIT_REGION(1); + #endif + + #if defined (SAU_INIT_REGION2) && (SAU_INIT_REGION2 == 1U) + SAU_INIT_REGION(2); + #endif + + #if defined (SAU_INIT_REGION3) && (SAU_INIT_REGION3 == 1U) + SAU_INIT_REGION(3); + #endif + + #if defined (SAU_INIT_REGION4) && (SAU_INIT_REGION4 == 1U) + SAU_INIT_REGION(4); + #endif + + #if defined (SAU_INIT_REGION5) && (SAU_INIT_REGION5 == 1U) + SAU_INIT_REGION(5); + #endif + + #if defined (SAU_INIT_REGION6) && (SAU_INIT_REGION6 == 1U) + SAU_INIT_REGION(6); + #endif + + #if defined (SAU_INIT_REGION7) && (SAU_INIT_REGION7 == 1U) + SAU_INIT_REGION(7); + #endif + + /* repeat this for all possible SAU regions */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + + + #if defined (SAU_INIT_CTRL) && (SAU_INIT_CTRL == 1U) + SAU->CTRL = ((SAU_INIT_CTRL_ENABLE << SAU_CTRL_ENABLE_Pos) & SAU_CTRL_ENABLE_Msk) | + ((SAU_INIT_CTRL_ALLNS << SAU_CTRL_ALLNS_Pos) & SAU_CTRL_ALLNS_Msk) ; + #endif + + #if defined (SCB_CSR_AIRCR_INIT) && (SCB_CSR_AIRCR_INIT == 1U) + SCB->SCR = (SCB->SCR & ~(SCB_SCR_SLEEPDEEPS_Msk )) | + ((SCB_CSR_DEEPSLEEPS_VAL << SCB_SCR_SLEEPDEEPS_Pos) & SCB_SCR_SLEEPDEEPS_Msk); + + SCB->AIRCR = (SCB->AIRCR & ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_SYSRESETREQS_Msk | + SCB_AIRCR_BFHFNMINS_Msk | SCB_AIRCR_PRIS_Msk )) | + ((0x05FAU << SCB_AIRCR_VECTKEY_Pos) & SCB_AIRCR_VECTKEY_Msk) | + ((SCB_AIRCR_SYSRESETREQS_VAL << SCB_AIRCR_SYSRESETREQS_Pos) & SCB_AIRCR_SYSRESETREQS_Msk) | + ((SCB_AIRCR_PRIS_VAL << SCB_AIRCR_PRIS_Pos) & SCB_AIRCR_PRIS_Msk) | + ((SCB_AIRCR_BFHFNMINS_VAL << SCB_AIRCR_BFHFNMINS_Pos) & SCB_AIRCR_BFHFNMINS_Msk); + #endif /* defined (SCB_CSR_AIRCR_INIT) && (SCB_CSR_AIRCR_INIT == 1U) */ + + #if (((defined (__FPU_USED) && (__FPU_USED == 1U)) || \ + (defined (__ARM_FEATURE_MVE) && (__ARM_FEATURE_MVE > 0))) && \ + (defined (TZ_FPU_NS_USAGE) && (TZ_FPU_NS_USAGE == 1U))) + + SCB->NSACR = (SCB->NSACR & ~(SCB_NSACR_CP10_Msk | SCB_NSACR_CP11_Msk)) | + ((SCB_NSACR_CP10_11_VAL << SCB_NSACR_CP10_Pos) & (SCB_NSACR_CP10_Msk | SCB_NSACR_CP11_Msk)); + + FPU->FPCCR = (FPU->FPCCR & ~(FPU_FPCCR_TS_Msk | FPU_FPCCR_CLRONRETS_Msk | FPU_FPCCR_CLRONRET_Msk)) | + ((FPU_FPCCR_TS_VAL << FPU_FPCCR_TS_Pos ) & FPU_FPCCR_TS_Msk ) | + ((FPU_FPCCR_CLRONRETS_VAL << FPU_FPCCR_CLRONRETS_Pos) & FPU_FPCCR_CLRONRETS_Msk) | + ((FPU_FPCCR_CLRONRET_VAL << FPU_FPCCR_CLRONRET_Pos ) & FPU_FPCCR_CLRONRET_Msk ); + #endif + + #if defined (NVIC_INIT_ITNS0) && (NVIC_INIT_ITNS0 == 1U) + NVIC->ITNS[0] = NVIC_INIT_ITNS0_VAL; + #endif + + #if defined (NVIC_INIT_ITNS1) && (NVIC_INIT_ITNS1 == 1U) + NVIC->ITNS[1] = NVIC_INIT_ITNS1_VAL; + #endif + + #if defined (NVIC_INIT_ITNS2) && (NVIC_INIT_ITNS2 == 1U) + NVIC->ITNS[2] = NVIC_INIT_ITNS2_VAL; + #endif + + #if defined (NVIC_INIT_ITNS3) && (NVIC_INIT_ITNS3 == 1U) + NVIC->ITNS[3] = NVIC_INIT_ITNS3_VAL; + #endif + + #if defined (NVIC_INIT_ITNS4) && (NVIC_INIT_ITNS4 == 1U) + NVIC->ITNS[4] = NVIC_INIT_ITNS4_VAL; + #endif + + #if defined (NVIC_INIT_ITNS5) && (NVIC_INIT_ITNS5 == 1U) + NVIC->ITNS[5] = NVIC_INIT_ITNS5_VAL; + #endif + + #if defined (NVIC_INIT_ITNS6) && (NVIC_INIT_ITNS6 == 1U) + NVIC->ITNS[6] = NVIC_INIT_ITNS6_VAL; + #endif + + #if defined (NVIC_INIT_ITNS7) && (NVIC_INIT_ITNS7 == 1U) + NVIC->ITNS[7] = NVIC_INIT_ITNS7_VAL; + #endif + + #if defined (NVIC_INIT_ITNS8) && (NVIC_INIT_ITNS8 == 1U) + NVIC->ITNS[8] = NVIC_INIT_ITNS8_VAL; + #endif + + #if defined (NVIC_INIT_ITNS9) && (NVIC_INIT_ITNS9 == 1U) + NVIC->ITNS[9] = NVIC_INIT_ITNS9_VAL; + #endif + + #if defined (NVIC_INIT_ITNS10) && (NVIC_INIT_ITNS10 == 1U) + NVIC->ITNS[10] = NVIC_INIT_ITNS10_VAL; + #endif + + #if defined (NVIC_INIT_ITNS11) && (NVIC_INIT_ITNS11 == 1U) + NVIC->ITNS[11] = NVIC_INIT_ITNS11_VAL; + #endif + + #if defined (NVIC_INIT_ITNS12) && (NVIC_INIT_ITNS12 == 1U) + NVIC->ITNS[12] = NVIC_INIT_ITNS12_VAL; + #endif + + #if defined (NVIC_INIT_ITNS13) && (NVIC_INIT_ITNS13 == 1U) + NVIC->ITNS[13] = NVIC_INIT_ITNS13_VAL; + #endif + + #if defined (NVIC_INIT_ITNS14) && (NVIC_INIT_ITNS14 == 1U) + NVIC->ITNS[14] = NVIC_INIT_ITNS14_VAL; + #endif + + #if defined (NVIC_INIT_ITNS15) && (NVIC_INIT_ITNS15 == 1U) + NVIC->ITNS[15] = NVIC_INIT_ITNS15_VAL; + #endif + + /* repeat this for all possible ITNS elements */ + +} + +#endif // LIBRARIES_CMSIS_DEVICE_MAXIM_MAX32657_SOURCE_PARTITION_MAX32657_H_ diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld index 72aae01c65d..4f79ad5bb70 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld @@ -36,7 +36,7 @@ SECTIONS { { _text = .; KEEP(*(.isr_vector)) - EXCLUDE_FILE (*riscv.o) *(.text*) /* Program code (exclude RISCV code) */ + *(.text*) /* Program code */ *(.rodata*) /* read-only data: "const" */ KEEP(*(.init)) @@ -61,19 +61,20 @@ SECTIONS { _etext = .; } > FLASH_S - .ARM.extab : + /* + * Secure Gatway (SG) veneers. + * All SG veneers are placed in the special output section .gnu.sgstubs. + */ + .gnu.sgstubs : { - *(.ARM.extab* .gnu.linkonce.armextab.*) + _sg_veneers = .; + KEEP(*(.gnu.sgstubs*)) + _esg_veneers = .; } > FLASH_S - /* Binary import */ - .bin_storage : + .ARM.extab : { - FILL(0xFF) - _bin_start_ = .; - KEEP(*(.bin_storage_img)) - _bin_end_ = .; - . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) } > FLASH_S .rom_code : @@ -149,17 +150,34 @@ SECTIONS { _ebss = ALIGN(., 4); } > SRAM_S - /* Set stack top to end of RAM, and stack limit move down by - * size of stack_dummy section */ + /** + * Stack Seal section is required for secure builds. Stack sealing protects + * secure stack from illegal access by non-secure code. + */ + .stackseal (COPY): + { + . = ALIGN(8); + __StackSeal = .; + . = . + 8; + . = ALIGN(8); + } > SRAM_S + + /** + * Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section. + */ __StackTop = ORIGIN(SRAM_S) + LENGTH(SRAM_S); __StackLimit = __StackTop - SIZEOF(.stack_dummy); - /* .stack_dummy section doesn't contains any symbols. It is only - * used for linker to calculate size of stack sections, and assign - * values to stack symbols later */ + /** + * .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later. + */ .stack_dummy (COPY): { *(.stack*) + *(.stackseal*) } > SRAM_S .heap (COPY): @@ -173,5 +191,4 @@ SECTIONS { /* Check if data + heap + stack exceeds RAM limit */ ASSERT(__StackLimit >= _ebss, "region RAM overflowed with stack") - } diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/startup_max32657.S b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/startup_max32657.S index 6d472f73a13..2a4348f73c2 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/startup_max32657.S +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/startup_max32657.S @@ -24,26 +24,31 @@ .section .stack .align 3 #ifdef __STACK_SIZE - .equ Stack_Size, __STACK_SIZE + .equ Stack_Size, __STACK_SIZE #else // Default stack size (192KB) - .equ Stack_Size, 0x00030000 + .equ Stack_Size, 0x00030000 #endif .globl __StackTop .globl __StackLimit +#if IS_SECURE_ENVIRONMENT + // __StackSeal defined in linker script + .equ __STACK_SEAL, __StackSeal + .globl __StackSeal +#endif __StackLimit: .space Stack_Size - .size __StackLimit, . - __StackLimit + .size __StackLimit, . - __StackLimit __StackTop: - .size __StackTop, . - __StackTop + .size __StackTop, . - __StackTop .section .heap .align 3 #ifdef __HEAP_SIZE - .equ Heap_Size, __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE #else // Default heap size (64KB) - .equ Heap_Size, 0x00010000 + .equ Heap_Size, 0x00010000 #endif .globl __HeapBase .globl __HeapLimit @@ -60,26 +65,84 @@ __HeapLimit: .align 9 /* must be aligned to 512 byte boundary. VTOR requirement */ .globl __isr_vector __isr_vector: - .long __StackTop /* Top of Stack */ - .long Reset_Handler /* Reset Handler */ - .long NMI_Handler /* NMI Handler */ - .long HardFault_Handler /* Hard Fault Handler */ - .long MemManage_Handler /* MPU Fault Handler */ - .long BusFault_Handler /* Bus Fault Handler */ - .long UsageFault_Handler /* Usage Fault Handler */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long SVC_Handler /* SVCall Handler */ - .long DebugMon_Handler /* Debug Monitor Handler */ - .long 0 /* Reserved */ - .long PendSV_Handler /* PendSV Handler */ - .long SysTick_Handler /* SysTick Handler */ - - // TODO: Add device-specific interrupt table - /* Device-specific Interrupts */ - .long RSVXX_IRQHandler /* 0xXX 0xXXXX XX: Reserved */ + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* Device-specific Interrupts */ + /* CMSIS Interrupt Number */ + /* |||| || */ + /* |||| Offset || */ + /* vvvv vvvvvv vv */ + + .long ICE_IRQHandler /* 0x10 0x0040 16: ICE Unlock */ + .long WDT_IRQHandler /* 0x11 0x0044 17: Watchdog Timer */ + .long RTC_IRQHandler /* 0x12 0x0048 18: RTC */ + .long TRNG_IRQHandler /* 0x13 0x004C 19: True Random Number Generator */ + .long TMR0_IRQHandler /* 0x14 0x0050 20: Timer 0 */ + .long TMR1_IRQHandler /* 0x15 0x0054 21: Timer 1 */ + .long TMR2_IRQHandler /* 0x16 0x0058 22: Timer 2 */ + .long TMR3_IRQHandler /* 0x17 0x005C 23: Timer 3 */ + .long TMR4_IRQHandler /* 0x18 0x0060 24: Timer 4 */ + .long TMR5_IRQHandler /* 0x19 0x0064 25: Timer 5 */ + .long I3C_IRQHandler /* 0x1A 0x0068 26: I3C */ + .long UART_IRQHandler /* 0x1B 0x006C 27: UART */ + .long SPI_IRQHandler /* 0x1C 0x0070 28: SPI */ + .long FLC_IRQHandler /* 0x1D 0x0074 29: FLC */ + .long GPIO0_IRQHandler /* 0x1E 0x0078 30: GPIO0 */ + .long RSV15_IRQHandler /* 0x1F 0x007C 31: Reserved */ + .long DMA0_CH0_IRQHandler /* 0x20 0x0080 32: DMA0 Channel 0 */ + .long DMA0_CH1_IRQHandler /* 0x21 0x0084 33: DMA0 Channel 1 */ + .long DMA0_CH2_IRQHandler /* 0x22 0x0088 34: DMA0 Channel 2 */ + .long DMA0_CH3_IRQHandler /* 0x23 0x008C 35: DMA0 Channel 3 */ + .long DMA1_CH0_IRQHandler /* 0x24 0x0090 36: DMA1 Channel 0 */ + .long DMA1_CH1_IRQHandler /* 0x25 0x0094 37: DMA1 Channel 1 */ + .long DMA1_CH2_IRQHandler /* 0x26 0x0098 38: DMA1 Channel 2 */ + .long DMA1_CH3_IRQHandler /* 0x27 0x009C 39: DMA1 Channel 3 */ + .long WUT0_IRQHandler /* 0x28 0x00A0 40: Wakeup Timer 0 */ + .long WUT1_IRQHandler /* 0x29 0x00A4 41: Wakeup Timer 1 */ + .long GPIOWAKE_IRQHandler /* 0x2A 0x00A8 42: GPIO Wakeup */ + .long CRC_IRQHandler /* 0x2B 0x00AC 43: CRC */ + .long AES_IRQHandler /* 0x2C 0x00B0 44: AES */ + .long ERFO_IRQHandler /* 0x2D 0x00B4 45: ERFO Ready */ + .long BOOST_IRQHandler /* 0x2E 0x00B8 46: Boost Controller */ + .long ECC_IRQHandler /* 0x2F 0x00BC 47: ECC */ +/* TODO(Bluetooth): Confirm BTLE IRQ Handler Names */ + .long BTLE_XXXX0_IRQHandler /* 0x30 0x00C0 48: BTLE XXXX0 */ + .long BTLE_XXXX1_IRQHandler /* 0x31 0x00C4 49: BTLE XXXX1 */ + .long BTLE_XXXX2_IRQHandler /* 0x32 0x00C8 50: BTLE XXXX2 */ + .long BTLE_XXXX3_IRQHandler /* 0x33 0x00CC 51: BTLE XXXX3 */ + .long BTLE_XXXX4_IRQHandler /* 0x34 0x00D0 52: BTLE XXXX4 */ + .long BTLE_XXXX5_IRQHandler /* 0x35 0x00D4 53: BTLE XXXX5 */ + .long BTLE_XXXX6_IRQHandler /* 0x36 0x00D8 54: BTLE XXXX6 */ + .long BTLE_XXXX7_IRQHandler /* 0x37 0x00DC 55: BTLE XXXX7 */ + .long BTLE_XXXX8_IRQHandler /* 0x38 0x00E0 56: BTLE XXXX8 */ + .long BTLE_XXXX9_IRQHandler /* 0x39 0x00E4 57: BTLE XXXX9 */ + .long BTLE_XXXXA_IRQHandler /* 0x3A 0x00E8 58: BTLE XXXXA */ + .long BTLE_XXXXB_IRQHandler /* 0x3B 0x00EC 59: BTLE XXXXB */ + .long BTLE_XXXXC_IRQHandler /* 0x3C 0x00F0 60: BTLE XXXXC */ + .long BTLE_XXXXD_IRQHandler /* 0x3D 0x00F4 61: BTLE XXXXD */ + .long BTLE_XXXXE_IRQHandler /* 0x3E 0x00F8 62: BTLE XXXXE */ + .long RSV47_IRQHandler /* 0x3F 0x00FC 63: Reserved */ + .long MPC_IRQHandler /* 0x40 0x0100 64: MPC Combined (Secure) */ + .long PPC_IRQHandler /* 0x44 0x0104 65: PPC Combined (Secure) */ + .long RSV50_IRQHandler /* 0x48 0x0108 66: Reserved */ + .long RSV51_IRQHandler /* 0x49 0x010C 67: Reserved */ + .long RSV52_IRQHandler /* 0x4A 0x0110 68: Reserved */ + .long RSV53_IRQHandler /* 0x4B 0x0114 69: Reserved */ .text .thumb @@ -91,6 +154,19 @@ Reset_Handler: ldr r0, =__StackTop mov sp, r0 +#if IS_SECURE_ENVIRONMENT + /* Set limit on Main and Process SP */ + ldr r0, =__STACK_LIMIT + msr msplim, r0 + msr psplim, r0 + + /* Set up Stack Sealing - using predefined stack seal value */ + ldr r0, =__STACK_SEAL + ldr r1, =0xFEF5EDA5U + /* Store seal value twice as a double word for redundancy */ + strd r1, r1, [r0, #0] +#endif + /* PreInit runs before any RAM initialization. Example usage: DDR setup, etc. */ ldr r0, =PreInit blx r0 @@ -177,7 +253,6 @@ Reset_Handler: .size \handler_name, . - \handler_name .endm - // TODO: Update to match arch-specific handlers above def_irq_handler NMI_Handler def_irq_handler HardFault_Handler def_irq_handler MemManage_Handler @@ -189,7 +264,65 @@ Reset_Handler: def_irq_handler SysTick_Handler def_irq_handler Default_Handler - // TODO: Add default device-specific handlers to match above - /* Device-specific Interrupts */ - def_irq_handler RSVXX_IRQHandler /* 0xXX 0xXXXX XX: Reserved */ + /* Device-specific Interrupts */ + /* CMSIS Interrupt Number */ + /* |||| || */ + /* |||| Offset || */ + /* vvvv vvvvvv vv */ + + def_irq_handler ICE_IRQHandler /* 0x10 0x0040 16: ICE Unlock */ + def_irq_handler WDT_IRQHandler /* 0x11 0x0044 17: Watchdog Timer */ + def_irq_handler RTC_IRQHandler /* 0x12 0x0048 18: RTC */ + def_irq_handler TRNG_IRQHandler /* 0x13 0x004C 19: True Random Number Generator */ + def_irq_handler TMR0_IRQHandler /* 0x14 0x0050 20: Timer 0 */ + def_irq_handler TMR1_IRQHandler /* 0x15 0x0054 21: Timer 1 */ + def_irq_handler TMR2_IRQHandler /* 0x16 0x0058 22: Timer 2 */ + def_irq_handler TMR3_IRQHandler /* 0x17 0x005C 23: Timer 3 */ + def_irq_handler TMR4_IRQHandler /* 0x18 0x0060 24: Timer 4 */ + def_irq_handler TMR5_IRQHandler /* 0x19 0x0064 25: Timer 5 */ + def_irq_handler I3C_IRQHandler /* 0x1A 0x0068 26: I3C */ + def_irq_handler UART_IRQHandler /* 0x1B 0x006C 27: UART */ + def_irq_handler SPI_IRQHandler /* 0x1C 0x0070 28: SPI */ + def_irq_handler FLC_IRQHandler /* 0x1D 0x0074 29: FLC */ + def_irq_handler GPIO0_IRQHandler /* 0x1E 0x0078 30: GPIO0 */ + def_irq_handler RSV15_IRQHandler /* 0x1F 0x007C 31: Reserved */ + def_irq_handler DMA0_CH0_IRQHandler /* 0x20 0x0080 32: DMA0 Channel 0 */ + def_irq_handler DMA0_CH1_IRQHandler /* 0x21 0x0084 33: DMA0 Channel 1 */ + def_irq_handler DMA0_CH2_IRQHandler /* 0x22 0x0088 34: DMA0 Channel 2 */ + def_irq_handler DMA0_CH3_IRQHandler /* 0x23 0x008C 35: DMA0 Channel 3 */ + def_irq_handler DMA1_CH0_IRQHandler /* 0x24 0x0090 36: DMA1 Channel 0 */ + def_irq_handler DMA1_CH1_IRQHandler /* 0x25 0x0094 37: DMA1 Channel 1 */ + def_irq_handler DMA1_CH2_IRQHandler /* 0x26 0x0098 38: DMA1 Channel 2 */ + def_irq_handler DMA1_CH3_IRQHandler /* 0x27 0x009C 39: DMA1 Channel 3 */ + def_irq_handler WUT0_IRQHandler /* 0x28 0x00A0 40: Wakeup Timer 0 */ + def_irq_handler WUT1_IRQHandler /* 0x29 0x00A4 41: Wakeup Timer 1 */ + def_irq_handler GPIOWAKE_IRQHandler /* 0x2A 0x00A8 42: GPIO Wakeup */ + def_irq_handler CRC_IRQHandler /* 0x2B 0x00AC 43: CRC */ + def_irq_handler AES_IRQHandler /* 0x2C 0x00B0 44: AES */ + def_irq_handler ERFO_IRQHandler /* 0x2D 0x00B4 45: ERFO Ready */ + def_irq_handler BOOST_IRQHandler /* 0x2E 0x00B8 46: Boost Controller */ + def_irq_handler ECC_IRQHandler /* 0x2F 0x00BC 47: ECC */ +/* TODO(Bluetooth): Confirm BTLE IRQ Handler Names */ + def_irq_handler BTLE_XXXX0_IRQHandler /* 0x30 0x00C0 48: BTLE XXXX0 */ + def_irq_handler BTLE_XXXX1_IRQHandler /* 0x31 0x00C4 49: BTLE XXXX1 */ + def_irq_handler BTLE_XXXX2_IRQHandler /* 0x32 0x00C8 50: BTLE XXXX2 */ + def_irq_handler BTLE_XXXX3_IRQHandler /* 0x33 0x00CC 51: BTLE XXXX3 */ + def_irq_handler BTLE_XXXX4_IRQHandler /* 0x34 0x00D0 52: BTLE XXXX4 */ + def_irq_handler BTLE_XXXX5_IRQHandler /* 0x35 0x00D4 53: BTLE XXXX5 */ + def_irq_handler BTLE_XXXX6_IRQHandler /* 0x36 0x00D8 54: BTLE XXXX6 */ + def_irq_handler BTLE_XXXX7_IRQHandler /* 0x37 0x00DC 55: BTLE XXXX7 */ + def_irq_handler BTLE_XXXX8_IRQHandler /* 0x38 0x00E0 56: BTLE XXXX8 */ + def_irq_handler BTLE_XXXX9_IRQHandler /* 0x39 0x00E4 57: BTLE XXXX9 */ + def_irq_handler BTLE_XXXXA_IRQHandler /* 0x3A 0x00E8 58: BTLE XXXXA */ + def_irq_handler BTLE_XXXXB_IRQHandler /* 0x3B 0x00EC 59: BTLE XXXXB */ + def_irq_handler BTLE_XXXXC_IRQHandler /* 0x3C 0x00F0 60: BTLE XXXXC */ + def_irq_handler BTLE_XXXXD_IRQHandler /* 0x3D 0x00F4 61: BTLE XXXXD */ + def_irq_handler BTLE_XXXXE_IRQHandler /* 0x3E 0x00F8 62: BTLE XXXXE */ + def_irq_handler RSV47_IRQHandler /* 0x3F 0x00FC 63: Reserved */ + def_irq_handler MPC_IRQHandler /* 0x40 0x0100 64: MPC Combined (Secure) */ + def_irq_handler PPC_IRQHandler /* 0x44 0x0104 65: PPC Combined (Secure) */ + def_irq_handler RSV50_IRQHandler /* 0x48 0x0108 66: Reserved */ + def_irq_handler RSV51_IRQHandler /* 0x49 0x010C 67: Reserved */ + def_irq_handler RSV52_IRQHandler /* 0x4A 0x0110 68: Reserved */ + def_irq_handler RSV53_IRQHandler /* 0x4B 0x0114 69: Reserved */ .end diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c index 51078ce7a50..652790d2796 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c @@ -16,20 +16,23 @@ * ******************************************************************************/ -// TODO(ME30): System implementation - -#include "system_max32657.h" -#include "max32657.h" +#include +#include +#include #include "mxc_sys.h" -#include "icc.h" +#include "max32657.h" +#include "system_max32657.h" +#include "partition_max32657.h" +#include "gcr_regs.h" extern void (*const __isr_vector[])(void); -uint32_t SystemCoreClock = IPO_FREQ; // Part defaults to IPO on startup + +uint32_t SystemCoreClock = IPO_FREQ; /* -The libc implementation from GCC 11+ depends on _getpid and _kill in some places. -There is no concept of processes/PIDs in the baremetal PeriphDrivers, therefore -we implement stub functions that return an error code to resolve linker warnings. + The libc implementation from GCC 11+ depends on _getpid and _kill in some places. + There is no concept of processes/PIDs in the baremetal PeriphDrivers, therefore + we implement stub functions that return an error code to resolve linker warnings. */ int _getpid(void) { @@ -47,7 +50,7 @@ __weak void SystemCoreClockUpdate(void) // Get the clock source and frequency clk_src = (MXC_GCR->clkctrl & MXC_F_GCR_CLKCTRL_SYSCLK_SEL); - switch (clk_src) { + switch (clk_src) { case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_IPO: base_freq = IPO_FREQ; break; @@ -56,15 +59,12 @@ __weak void SystemCoreClockUpdate(void) break; case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_INRO: base_freq = INRO_FREQ; - break; + break; case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_IBRO: base_freq = IBRO_FREQ; break; - case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_ERTCO: - base_freq = ERTCO_FREQ; - break; - // case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_EXTCLK: - // base_freq = EXTCLK_FREQ; + // case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_ERTCO: + // base_freq = ERTCO_FREQ; // break; // TODO(JC): ^^^ Uncomment when EXTCLK register definition is added default: @@ -90,8 +90,9 @@ __weak void SystemCoreClockUpdate(void) */ __weak int PreInit(void) { - // TODO(JC): No SIMO on this device, confirm nothing needs to be done here. - + /* Do nothing */ + // TODO(JC): No SIMO on this device, confirm nothing needs to be done here. + // (SW): Correct, different power HW. return 0; } @@ -121,26 +122,38 @@ __weak int Board_Init(void) */ __weak void SystemInit(void) { - /* Configure the interrupt controller to use the application vector table in */ - /* the application space */ -#if defined(__CC_ARM) || defined(__GNUC__) - /* IAR sets the VTOR pointer incorrectly and causes stack corruption */ + +#if defined(__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) SCB->VTOR = (uint32_t)__isr_vector; -#endif /* __CC_ARM || __GNUC__ */ +#endif /* __VTOR_PRESENT check */ - /* Make sure interrupts are enabled. */ - __enable_irq(); +#if (__FPU_PRESENT == 1U) + /* Enable FPU - coprocessor slots 10 & 11 full access */ + SCB->CPACR |= SCB_CPACR_CP10_Msk | SCB_CPACR_CP11_Msk; +#endif /* __FPU_PRESENT check */ - /* Enable instruction cache */ - MXC_ICC_Enable(MXC_ICC); + /* + Enable Unaligned Access Trapping to throw an exception when there is an + unaligned memory access while unaligned access support is disabled. + + Note: ARMv8-M without the Main Extension disables unaligned access by default. + */ +#if defined(UNALIGNED_SUPPORT_DISABLE) || defined(__ARM_FEATURE_UNALIGNED) + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + /* Security Extension Features */ +#if IS_SECURE_ENVIRONMENT + /* Settings for TrustZone SAU setup are defined in partitions_max32657.h */ + TZ_SAU_Setup(); +#endif /* TrustZone */ - /* Enable FPU on Cortex-M4, which occupies coprocessor slots 10 & 11 */ - /* Grant full access, per "Table B3-24 CPACR bit assignments". */ - /* DDI0403D "ARMv7-M Architecture Reference Manual" */ - SCB->CPACR |= SCB_CPACR_CP10_Msk | SCB_CPACR_CP11_Msk; __DSB(); __ISB(); + /* Enable interrupts */ + __enable_irq(); + /* Change system clock source to the main high-speed clock */ MXC_SYS_Clock_Select(MXC_SYS_CLOCK_IPO); MXC_SYS_SetClockDiv(MXC_SYS_CLOCK_DIV_1); @@ -148,4 +161,4 @@ __weak void SystemInit(void) PinInit(); Board_Init(); -} \ No newline at end of file +} From 553d1a2ccf6497f09fc12bb24d1eb81154bdc165 Mon Sep 17 00:00:00 2001 From: Woo Date: Fri, 3 May 2024 16:12:38 -0500 Subject: [PATCH 36/41] Push unsavbed changes in system_max32657.h --- Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c index 652790d2796..4e052bde544 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c @@ -27,7 +27,7 @@ extern void (*const __isr_vector[])(void); -uint32_t SystemCoreClock = IPO_FREQ; +uint32_t SystemCoreClock = IPO_FREQ; // Part defaults to IPO on startup /* The libc implementation from GCC 11+ depends on _getpid and _kill in some places. @@ -122,7 +122,6 @@ __weak int Board_Init(void) */ __weak void SystemInit(void) { - #if defined(__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) SCB->VTOR = (uint32_t)__isr_vector; #endif /* __VTOR_PRESENT check */ From c877fe8c9e7bfc7ceb43c35543ce637f65f42779 Mon Sep 17 00:00:00 2001 From: Woo Date: Mon, 6 May 2024 11:11:05 -0500 Subject: [PATCH 37/41] Fix extclk settings --- .../CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c index 4e052bde544..960bb98bf57 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c @@ -16,6 +16,7 @@ * ******************************************************************************/ +#include #include #include #include @@ -63,8 +64,11 @@ __weak void SystemCoreClockUpdate(void) case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_IBRO: base_freq = IBRO_FREQ; break; - // case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_ERTCO: - // base_freq = ERTCO_FREQ; + case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_ERTCO: + base_freq = ERTCO_FREQ; + break; + // case MXC_S_GCR_CLKCTRL_SYSCLK_SEL_EXTCLK: + // base_freq = EXTCLK_FREQ; // break; // TODO(JC): ^^^ Uncomment when EXTCLK register definition is added default: From 470eda04f3a5fb0cae7e2860b8f7287110549052 Mon Sep 17 00:00:00 2001 From: Woo Date: Mon, 6 May 2024 11:34:47 -0500 Subject: [PATCH 38/41] Remove syntax error --- Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld index 8856c41f36b..c75c977f343 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld @@ -185,7 +185,7 @@ SECTIONS { */ .stack_dummy (COPY): { - *(.stack*)\ + *(.stack*) #if SECURE_LINK *(.stackseal*) #endif From 68206e2d1b0319a18a4c3c68b26b1a65927c3cd4 Mon Sep 17 00:00:00 2001 From: Woo Date: Mon, 6 May 2024 11:39:48 -0500 Subject: [PATCH 39/41] Add DMA instance number separation with secure vs non-secure builds --- Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 3ca98d730fb..7bd345d82db 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -625,7 +625,11 @@ We may want to handle GET_IRQ better... /******************************************************************************/ /* DMA */ #define MXC_DMA_CHANNELS (4) +#if IS_SECURE_ENVIRONMENT #define MXC_DMA_INSTANCES (2) +#else +#define MXC_DMA_INSTANCES (1) +#endif /* Non-secure Mapping */ #define MXC_BASE_DMA0_NS ((uint32_t)0x40028000UL) From b50f1ae80f3dc9e19f96ad495b4ba445e35930aa Mon Sep 17 00:00:00 2001 From: Woo Date: Mon, 6 May 2024 16:49:02 -0500 Subject: [PATCH 40/41] Reorganize DMA handling --- Libraries/CMSIS/Device/Maxim/GCC/gcc.mk | 2 + .../Device/Maxim/MAX32657/Include/max32657.h | 30 ++++++------ .../MAX32657/Include/partition_max32657.h | 4 ++ .../Maxim/MAX32657/Source/GCC/max32657.ld | 10 +--- .../PeriphDrivers/Include/MAX32657/aes.h | 10 ++-- .../PeriphDrivers/Include/MAX32657/crc.h | 5 +- .../PeriphDrivers/Include/MAX32657/dma.h | 27 +++++++--- .../PeriphDrivers/Include/MAX32657/spi.h | 9 ++-- .../PeriphDrivers/Include/MAX32657/uart.h | 14 ++++-- Libraries/PeriphDrivers/Source/AES/aes_ai87.c | 4 +- Libraries/PeriphDrivers/Source/AES/aes_me12.c | 4 +- Libraries/PeriphDrivers/Source/AES/aes_me15.c | 4 +- Libraries/PeriphDrivers/Source/AES/aes_me17.c | 4 +- Libraries/PeriphDrivers/Source/AES/aes_me21.c | 4 +- Libraries/PeriphDrivers/Source/AES/aes_me30.c | 13 ++--- Libraries/PeriphDrivers/Source/AES/aes_revb.c | 39 ++++++++++++--- Libraries/PeriphDrivers/Source/AES/aes_revb.h | 7 +-- Libraries/PeriphDrivers/Source/CRC/crc_ai87.c | 2 +- Libraries/PeriphDrivers/Source/CRC/crc_me15.c | 2 +- Libraries/PeriphDrivers/Source/CRC/crc_me17.c | 2 +- Libraries/PeriphDrivers/Source/CRC/crc_me30.c | 5 +- Libraries/PeriphDrivers/Source/CRC/crc_reva.c | 17 ++++++- Libraries/PeriphDrivers/Source/CRC/crc_reva.h | 3 +- Libraries/PeriphDrivers/Source/DMA/dma_me30.c | 39 ++++++++------- Libraries/PeriphDrivers/Source/DMA/dma_reva.c | 12 ++++- Libraries/PeriphDrivers/Source/SPI/spi_me30.c | 10 ++-- .../PeriphDrivers/Source/SPI/spi_reva1.c | 22 ++++++++- Libraries/PeriphDrivers/Source/SYS/sys_me30.c | 5 +- .../PeriphDrivers/Source/UART/uart_me30.c | 12 ++--- .../PeriphDrivers/Source/UART/uart_reva.c | 49 ++++++++++++++----- 30 files changed, 247 insertions(+), 123 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk index 8b434adada0..873d657f568 100644 --- a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk +++ b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk @@ -278,6 +278,8 @@ ifeq "$(MSECURITY_MODE)" "SECURE" # https://developer.arm.com/documentation/ecm0359818/latest PROJ_CFLAGS += -mcmse +PROJ_AFLAGS += -DIS_SECURE_ENVRIONMENT + # Tell the linker we are building a secure project. This defines the "SECURE_LINK" symbol which the # linker uses to set the secure FLASH/SRAM memory address ranges. PROJ_LDFLAGS += -Xlinker --defsym=SECURE_LINK=1 diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h index 7bd345d82db..24a89242cdd 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h @@ -474,8 +474,6 @@ typedef enum { #define MXC_BASE_GPIO0_S ((uint32_t)0x50008000UL) #define MXC_GPIO0_S ((mxc_gpio_regs_t *)MXC_BASE_GPIO0_S) -#define MXC_BASE_GPIO0 MXC_BASE_GPIO0_S - #if IS_SECURE_ENVIRONMENT #define MXC_BASE_GPIO0 MXC_BASE_GPIO0_S #define MXC_GPIO0 MXC_GPIO0_S @@ -654,11 +652,15 @@ We may want to handle GET_IRQ better... #define MXC_BASE_DMA1 MXC_BASE_DMA1_S #define MXC_DMA1 MXC_DMA1_S -#define MXC_DMA1_CH_GET_IRQ(i) \ - ((IRQn_Type)(((i) == 0) ? DMA1_CH0_IRQn : \ - ((i) == 1) ? DMA1_CH1_IRQn : \ - ((i) == 2) ? DMA1_CH2_IRQn : \ - ((i) == 3) ? DMA1_CH3_IRQn : \ +#define MXC_DMA_CH_GET_IRQ(p, i) \ + ((IRQn_Type)(((p) == MXC_DMA0 && (i) == 0) ? DMA0_CH0_IRQn : \ + ((p) == MXC_DMA0 && (i) == 1) ? DMA0_CH1_IRQn : \ + ((p) == MXC_DMA0 && (i) == 2) ? DMA0_CH2_IRQn : \ + ((p) == MXC_DMA0 && (i) == 3) ? DMA0_CH3_IRQn : \ + ((p) == MXC_DMA1 && (i) == 0) ? DMA1_CH0_IRQn : \ + ((p) == MXC_DMA1 && (i) == 1) ? DMA1_CH1_IRQn : \ + ((p) == MXC_DMA1 && (i) == 2) ? DMA1_CH2_IRQn : \ + ((p) == MXC_DMA1 && (i) == 3) ? DMA1_CH3_IRQn : \ 0)) #else @@ -672,18 +674,16 @@ We may want to handle GET_IRQ better... #define MXC_DMA1 0 /* DMA1 IRQs not usable in Non-Secure state. */ -#define MXC_DMA1_CH_GET_IRQ(i) ((IRQn_Type)(0)) +#define MXC_DMA_CH_GET_IRQ(p, i) \ + ((IRQn_Type)(((p) == MXC_DMA0 && (i) == 0) ? DMA0_CH0_IRQn : \ + ((p) == MXC_DMA0 && (i) == 1) ? DMA0_CH1_IRQn : \ + ((p) == MXC_DMA0 && (i) == 2) ? DMA0_CH2_IRQn : \ + ((p) == MXC_DMA0 && (i) == 3) ? DMA0_CH3_IRQn : \ + 0)) #endif // IS_SECURE_ENVIRONMENT #define MXC_DMA_GET_BASE(i) ((i) == MXC_BASE_DMA0 ? 0 : (p) == MXC_BASE_DMA1 ? 1 : -1) -#define MXC_DMA0_CH_GET_IRQ(i) \ - ((IRQn_Type)(((i) == 0) ? DMA0_CH0_IRQn : \ - ((i) == 1) ? DMA0_CH1_IRQn : \ - ((i) == 2) ? DMA0_CH2_IRQn : \ - ((i) == 3) ? DMA0_CH3_IRQn : \ - 0)) - #define MXC_DMA_GET_IDX(p) ((p) == MXC_DMA0 ? 0 : (p) == MXC_DMA1 ? 1 : -1) /******************************************************************************/ diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/partition_max32657.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/partition_max32657.h index 14b28a9312e..5b9fed2bedf 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/partition_max32657.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/partition_max32657.h @@ -30,6 +30,8 @@ #include "max32657.h" +#if IS_SECURE_ENVIRONMENT + /* //-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- */ @@ -1278,4 +1280,6 @@ __STATIC_INLINE void TZ_SAU_Setup (void) } +#endif // IS_SECURE_EVIRONMENT + #endif // LIBRARIES_CMSIS_DEVICE_MAXIM_MAX32657_SOURCE_PARTITION_MAX32657_H_ diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld index c75c977f343..7a02a14948e 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/GCC/max32657.ld @@ -70,14 +70,12 @@ SECTIONS { * Secure Gatway (SG) veneers. * All SG veneers are placed in the special output section .gnu.sgstubs. */ -#if SECURE_LINK .gnu.sgstubs : { _sg_veneers = .; - KEEP(*(.gnu.sgstubs*)) + *(.gnu.sgstubs*) _esg_veneers = .; } > FLASH -#endif .ARM.extab : { @@ -161,7 +159,6 @@ SECTIONS { * Stack Seal section is required for secure builds. Stack sealing protects * secure stack from illegal access by non-secure code. */ -#if SECURE_LINK .stackseal (COPY): { . = ALIGN(8); @@ -169,7 +166,6 @@ SECTIONS { . = . + 8; . = ALIGN(8); } > SRAM -#endif /** * Set stack top to end of RAM, and stack limit move down by @@ -185,10 +181,8 @@ SECTIONS { */ .stack_dummy (COPY): { - *(.stack*) -#if SECURE_LINK + KEEP(*(.stack*)) *(.stackseal*) -#endif } > SRAM .heap (COPY): diff --git a/Libraries/PeriphDrivers/Include/MAX32657/aes.h b/Libraries/PeriphDrivers/Include/MAX32657/aes.h index 7f51f371c1b..806df3abbbc 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/aes.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/aes.h @@ -27,6 +27,7 @@ /***** Includes *****/ #include "aes_regs.h" #include "aeskeys_regs.h" +#include "dma_regs.h" #ifdef __cplusplus extern "C" { @@ -89,9 +90,10 @@ typedef struct _mxc_aes_cipher_req_t { /** * @brief Enable portions of the AES * + * @param dma DMA instance used for AES * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_AES_Init(void); +int MXC_AES_Init(mxc_dma_regs_t *dma); /** * @brief Enable AES Interrupts @@ -213,18 +215,20 @@ int MXC_AES_Decrypt(mxc_aes_req_t *req); * * @param src_addr source address * @param len number of words of data + * @param dma DMA instance to configue for AES * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_AES_TXDMAConfig(void *src_addr, int len); +int MXC_AES_TXDMAConfig(void *src_addr, int len, mxc_dma_regs_t *dma); /** * @brief Perform AES RX using DMA. Configures DMA request and receives data from AES FIFO. * * @param dest_addr destination address * @param len number of words of data + * @param dma DMA instance to configure for AES * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_AES_RXDMAConfig(void *dest_addr, int len); +int MXC_AES_RXDMAConfig(void *dest_addr, int len, mxc_dma_regs_t *dma); /** * @brief Perform encryption or decryption using DMA diff --git a/Libraries/PeriphDrivers/Include/MAX32657/crc.h b/Libraries/PeriphDrivers/Include/MAX32657/crc.h index 35218bf1f23..f80ed216122 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/crc.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/crc.h @@ -26,6 +26,7 @@ /***** Includes *****/ #include "crc_regs.h" +#include "dma_regs.h" #ifdef __cplusplus extern "C" { @@ -63,10 +64,10 @@ typedef enum { CRC_LSB_FIRST, CRC_MSB_FIRST } mxc_crc_bitorder_t; /** * @brief Enable portions of the CRC * - * + * @param dma DMA Instance used for CRC calculation * @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes. */ -int MXC_CRC_Init(void); +int MXC_CRC_Init(mxc_dma_regs_t *dma); /** * @brief Disable and reset portions of the CRC diff --git a/Libraries/PeriphDrivers/Include/MAX32657/dma.h b/Libraries/PeriphDrivers/Include/MAX32657/dma.h index ef471bb2ce4..44fd184aeb7 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/dma.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/dma.h @@ -193,25 +193,30 @@ typedef mxc_dma_srcdst_t (*mxc_dma_trans_chain_t)(mxc_dma_srcdst_t dest); * if you wish to manage clock and gpio related things in upper level instead of here. * Define MSDK_NO_GPIO_CLK_INIT flag in project.mk file. * By this flag this function will remove clock and gpio related codes from file. + * @param dma Pointer to selected DMA instance's registers. + * * @return #E_NO_ERROR if successful */ -int MXC_DMA_Init(void); +int MXC_DMA_Init(mxc_dma_regs_t *dma); /** * @brief De-Initialize DMA resources. + * + * @param dma Pointer to selected DMA instance's registers. */ -void MXC_DMA_DeInit(void); +void MXC_DMA_DeInit(mxc_dma_regs_t *dma); /** * @brief Request DMA channel * @details Returns a handle to the first free DMA channel, which can be used via API calls * or direct access to channel registers using the MXC_DMA_GetCHRegs(int ch) function. + * @param dma Pointer to selected DMA instance's registers. * @return Non-negative channel handle (inclusive of zero). * @return #E_NONE_AVAIL All channels in use. * @return #E_BAD_STATE DMA is not initialized, call MXC_DMA_Init() first. * @return #E_BUSY DMA is currently busy (locked), try again later. */ -int MXC_DMA_AcquireChannel(void); +int MXC_DMA_AcquireChannel(mxc_dma_regs_t *dma); /** * @brief Release DMA channel @@ -360,19 +365,21 @@ int MXC_DMA_ChannelClearFlags(int ch, int flags); * @brief Enable channel interrupt * @note Each channel has two interrupts (complete, and count to zero) which must also be enabled with MXC_DMA_SetChannelInterruptEn() + * @param dma DMA instance used for the DMA channel registers. * @param ch DMA channel to enable interrupts for. * @return #E_BAD_PARAM if an unused or invalid channel handle, * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ -int MXC_DMA_EnableInt(int ch); +int MXC_DMA_EnableInt(mxc_dma_regs_t *dma, int ch); /** * @brief Disable channel interrupt + * @param dma DMA instance used for the DMA channel registers. * @param ch DMA channel to disable interrupts for. * @return #E_BAD_PARAM if an unused or invalid channel handle, * #E_NO_ERROR otherwise, \ref MXC_Error_Codes */ -int MXC_DMA_DisableInt(int ch); +int MXC_DMA_DisableInt(mxc_dma_regs_t *dma, int ch); /** * @brief Start transfer @@ -402,10 +409,11 @@ mxc_dma_ch_regs_t *MXC_DMA_GetCHRegs(int ch); /** * @brief Interrupt handler function + * @param dma Pointer to DMA registers. * @details Call this function as the ISR for each DMA channel under driver control. * Interrupt flags for channel ch will be automatically cleared before return. */ -void MXC_DMA_Handler(void); +void MXC_DMA_Handler(mxc_dma_regs_t *dma); /*************************/ /* High Level Functions */ @@ -416,6 +424,7 @@ void MXC_DMA_Handler(void); * @note The user must have the DMA interrupt enabled and call * MXC_DMA_Handler() from the ISR. * + * @param dma Pointer to DMA registers. * @param dest pointer to destination memory * @param src pointer to source memory * @param len number of bytes to copy @@ -423,20 +432,22 @@ void MXC_DMA_Handler(void); * * @return see \ref MXC_Error_Codes */ -int MXC_DMA_MemCpy(void *dest, void *src, int len, mxc_dma_complete_cb_t callback); +int MXC_DMA_MemCpy(mxc_dma_regs_t *dma, void *dest, void *src, int len, + mxc_dma_complete_cb_t callback); /** * @brief Performs a memcpy, using DMA, optionally asynchronous * @note The user must have the DMA interrupt enabled and call * MXC_DMA_Handler() from the ISR. * + * @param dma Pointer to DMA registers. * @param config The channel config struct * @param firstSrcDst The source, destination, and count for the first transfer * @param callback function is called when transfer is complete * * @return see \ref MXC_Error_Codes */ -int MXC_DMA_DoTransfer(mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, +int MXC_DMA_DoTransfer(mxc_dma_regs_t *dma, mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, mxc_dma_trans_chain_t callback); /** * For other functional uses of DMA (UART, SPI, etc) see the appropriate peripheral driver diff --git a/Libraries/PeriphDrivers/Include/MAX32657/spi.h b/Libraries/PeriphDrivers/Include/MAX32657/spi.h index de855f2cb0e..7ddde948670 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/spi.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/spi.h @@ -32,6 +32,7 @@ #include "gpio.h" #include "mxc_pins.h" #include "mxc_lock.h" +#include "dma_regs.h" #ifdef __cplusplus extern "C" { @@ -595,11 +596,12 @@ int MXC_SPI_MasterTransactionAsync(mxc_spi_req_t *req); * possible. The channel will be reset and returned to the system at the end of * the transaction. * - * @param req Pointer to details of the transaction + * @param req Pointer to details of the transaction + * @param dma DMA instance to use for SPI DMA * * @return See \ref MXC_Error_Codes for the list of error return codes. */ -int MXC_SPI_MasterTransactionDMA(mxc_spi_req_t *req); +int MXC_SPI_MasterTransactionDMA(mxc_spi_req_t *req, mxc_dma_regs_t *dma); /** * @brief Performs a blocking SPI transaction. @@ -642,10 +644,11 @@ int MXC_SPI_SlaveTransactionAsync(mxc_spi_req_t *req); * the transaction. * * @param req Pointer to details of the transaction + * @param dma DMA instance to use for SPI DMA * * @return See \ref MXC_Error_Codes for the list of error return codes. */ -int MXC_SPI_SlaveTransactionDMA(mxc_spi_req_t *req); +int MXC_SPI_SlaveTransactionDMA(mxc_spi_req_t *req, mxc_dma_regs_t *dma); /** * @brief Sets the TX data to transmit as a 'dummy' byte diff --git a/Libraries/PeriphDrivers/Include/MAX32657/uart.h b/Libraries/PeriphDrivers/Include/MAX32657/uart.h index 40e90877866..523b80f8e0b 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/uart.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/uart.h @@ -31,6 +31,7 @@ #include #include "uart_regs.h" #include "mxc_sys.h" +#include "dma_regs.h" #ifdef __cplusplus extern "C" { @@ -377,14 +378,15 @@ unsigned int MXC_UART_ReadRXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, un /** * @brief Unloads bytes from the receive FIFO user DMA for longer reads. * - * @param uart Pointer to UART registers (selects the UART block used.) + * @param uart Pointer to UART registers (selects the UART block used). + * @param dma Pointer to DMA registers (selects the DMA block used for UART DMA). * @param bytes The buffer to read the data into. * @param len The number of bytes to read. * @param callback The function to call when the read is complete * * @return See \ref MXC_Error_Codes for a list of return values */ -int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len, +int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, mxc_dma_regs_t *dma, unsigned char *bytes, unsigned int len, mxc_uart_dma_complete_cb_t callback); /** @@ -410,14 +412,15 @@ unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, u /** * @brief Loads bytes into the transmit FIFO using DMA for longer writes * - * @param uart Pointer to UART registers (selects the UART block used.) + * @param uart Pointer to UART registers (selects the UART block used). + * @param dma Pointer to DMA registers (selects the DMA block used for UART DMA). * @param bytes The buffer containing the bytes to write * @param len The number of bytes to write. * @param callback The function to call when the write is complete * * @return See \ref MXC_Error_Codes for a list of return values */ -int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len, +int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, mxc_dma_regs_t *dma, unsigned char *bytes, unsigned int len, mxc_uart_dma_complete_cb_t callback); /** @@ -602,10 +605,11 @@ int MXC_UART_TransactionAsync(mxc_uart_req_t *req); * returned to the system at the end of the transaction. * * @param req Pointer to details of the transaction + * @param dma Pointer to DMA registers used for UART DMA * * @return See \ref MXC_Error_Codes for the list of error return codes. */ -int MXC_UART_TransactionDMA(mxc_uart_req_t *req); +int MXC_UART_TransactionDMA(mxc_uart_req_t *req, mxc_dma_regs_t *dma); /** * @brief The processing function for DMA transactions. diff --git a/Libraries/PeriphDrivers/Source/AES/aes_ai87.c b/Libraries/PeriphDrivers/Source/AES/aes_ai87.c index 594d86119ce..ba60f951604 100644 --- a/Libraries/PeriphDrivers/Source/AES/aes_ai87.c +++ b/Libraries/PeriphDrivers/Source/AES/aes_ai87.c @@ -138,12 +138,12 @@ int MXC_AES_Decrypt(mxc_aes_req_t *req) int MXC_AES_TXDMAConfig(void *src_addr, int len) { - return MXC_AES_RevB_TXDMAConfig(src_addr, len); + return MXC_AES_RevB_TXDMAConfig(src_addr, len, MXC_DMA); } int MXC_AES_RXDMAConfig(void *dest_addr, int len) { - return MXC_AES_RevB_RXDMAConfig(dest_addr, len); + return MXC_AES_RevB_RXDMAConfig(dest_addr, len, MXC_DMA); } int MXC_AES_GenericAsync(mxc_aes_req_t *req, uint8_t enc) diff --git a/Libraries/PeriphDrivers/Source/AES/aes_me12.c b/Libraries/PeriphDrivers/Source/AES/aes_me12.c index 87e6b35cb25..60c6eaeeb21 100644 --- a/Libraries/PeriphDrivers/Source/AES/aes_me12.c +++ b/Libraries/PeriphDrivers/Source/AES/aes_me12.c @@ -131,12 +131,12 @@ int MXC_AES_Decrypt(mxc_aes_req_t *req) int MXC_AES_TXDMAConfig(void *src_addr, int len) { - return MXC_AES_RevB_TXDMAConfig(src_addr, len); + return MXC_AES_RevB_TXDMAConfig(src_addr, len, MXC_DMA); } int MXC_AES_RXDMAConfig(void *dest_addr, int len) { - return MXC_AES_RevB_RXDMAConfig(dest_addr, len); + return MXC_AES_RevB_RXDMAConfig(dest_addr, len, MXC_DMA); } int MXC_AES_GenericAsync(mxc_aes_req_t *req, uint8_t enc) diff --git a/Libraries/PeriphDrivers/Source/AES/aes_me15.c b/Libraries/PeriphDrivers/Source/AES/aes_me15.c index d35812e0d27..60ecf1ead79 100644 --- a/Libraries/PeriphDrivers/Source/AES/aes_me15.c +++ b/Libraries/PeriphDrivers/Source/AES/aes_me15.c @@ -155,12 +155,12 @@ int MXC_AES_Decrypt(mxc_aes_req_t *req) int MXC_AES_TXDMAConfig(void *src_addr, int len) { - return MXC_AES_RevB_TXDMAConfig(src_addr, len); + return MXC_AES_RevB_TXDMAConfig(src_addr, len, MXC_DMA); } int MXC_AES_RXDMAConfig(void *dest_addr, int len) { - return MXC_AES_RevB_RXDMAConfig(dest_addr, len); + return MXC_AES_RevB_RXDMAConfig(dest_addr, len, MXC_DMA); } int MXC_AES_GenericAsync(mxc_aes_req_t *req, uint8_t enc) diff --git a/Libraries/PeriphDrivers/Source/AES/aes_me17.c b/Libraries/PeriphDrivers/Source/AES/aes_me17.c index 27ac05bc04a..1cbca9635a9 100644 --- a/Libraries/PeriphDrivers/Source/AES/aes_me17.c +++ b/Libraries/PeriphDrivers/Source/AES/aes_me17.c @@ -132,12 +132,12 @@ int MXC_AES_Decrypt(mxc_aes_req_t *req) int MXC_AES_TXDMAConfig(void *src_addr, int len) { - return MXC_AES_RevB_TXDMAConfig(src_addr, len); + return MXC_AES_RevB_TXDMAConfig(src_addr, len, MXC_DMA); } int MXC_AES_RXDMAConfig(void *dest_addr, int len) { - return MXC_AES_RevB_RXDMAConfig(dest_addr, len); + return MXC_AES_RevB_RXDMAConfig(dest_addr, len, MXC_DMA); } int MXC_AES_GenericAsync(mxc_aes_req_t *req, uint8_t enc) diff --git a/Libraries/PeriphDrivers/Source/AES/aes_me21.c b/Libraries/PeriphDrivers/Source/AES/aes_me21.c index 1eaf61ca5e1..cfb340482a9 100644 --- a/Libraries/PeriphDrivers/Source/AES/aes_me21.c +++ b/Libraries/PeriphDrivers/Source/AES/aes_me21.c @@ -126,12 +126,12 @@ int MXC_AES_Decrypt(mxc_aes_req_t *req) int MXC_AES_TXDMAConfig(void *src_addr, int len) { - return MXC_AES_RevB_TXDMAConfig(src_addr, len); + return MXC_AES_RevB_TXDMAConfig(src_addr, len, MXC_DMA); } int MXC_AES_RXDMAConfig(void *dest_addr, int len) { - return MXC_AES_RevB_RXDMAConfig(dest_addr, len); + return MXC_AES_RevB_RXDMAConfig(dest_addr, len, MXC_DMA); } int MXC_AES_GenericAsync(mxc_aes_req_t *req, uint8_t enc) diff --git a/Libraries/PeriphDrivers/Source/AES/aes_me30.c b/Libraries/PeriphDrivers/Source/AES/aes_me30.c index 63603f4cf83..575f8abedf6 100644 --- a/Libraries/PeriphDrivers/Source/AES/aes_me30.c +++ b/Libraries/PeriphDrivers/Source/AES/aes_me30.c @@ -23,19 +23,20 @@ #include "aes_revb.h" #include "trng.h" #include "trng_revb.h" +#include "dma.h" /* ************************************************************************* */ /* Global Control/Configuration functions */ /* ************************************************************************* */ -int MXC_AES_Init(void) +int MXC_AES_Init(mxc_dma_regs_t *dma) { #ifndef MSDK_NO_GPIO_CLK_INIT MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_AES); MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_TRNG); #endif - return MXC_AES_RevB_Init((mxc_aes_revb_regs_t *)MXC_AES); + return MXC_AES_RevB_Init((mxc_aes_revb_regs_t *)MXC_AES, dma); } void MXC_AES_EnableInt(uint32_t interrupt) @@ -123,14 +124,14 @@ int MXC_AES_Decrypt(mxc_aes_req_t *req) return MXC_AES_RevB_Decrypt((mxc_aes_revb_regs_t *)MXC_AES, (mxc_aes_revb_req_t *)req); } -int MXC_AES_TXDMAConfig(void *src_addr, int len) +int MXC_AES_TXDMAConfig(void *src_addr, int len, mxc_dma_regs_t *dma) { - return MXC_AES_RevB_TXDMAConfig(src_addr, len); + return MXC_AES_RevB_TXDMAConfig(src_addr, len, dma); } -int MXC_AES_RXDMAConfig(void *dest_addr, int len) +int MXC_AES_RXDMAConfig(void *dest_addr, int len, mxc_dma_regs_t *dma) { - return MXC_AES_RevB_RXDMAConfig(dest_addr, len); + return MXC_AES_RevB_RXDMAConfig(dest_addr, len, dma); } int MXC_AES_GenericAsync(mxc_aes_req_t *req, uint8_t enc) diff --git a/Libraries/PeriphDrivers/Source/AES/aes_revb.c b/Libraries/PeriphDrivers/Source/AES/aes_revb.c index 240b8b6f21a..77ce01370f1 100644 --- a/Libraries/PeriphDrivers/Source/AES/aes_revb.c +++ b/Libraries/PeriphDrivers/Source/AES/aes_revb.c @@ -33,6 +33,7 @@ /* **** Variable Declaration **** */ typedef struct { uint8_t enc; + mxc_dma_regs_t *dma; uint8_t channelRX; uint8_t channelTX; uint32_t remain; @@ -62,7 +63,7 @@ memcpy32r(uint32_t *dst, const uint32_t *src, unsigned int len) } } -int MXC_AES_RevB_Init(mxc_aes_revb_regs_t *aes) +int MXC_AES_RevB_Init(mxc_aes_revb_regs_t *aes, mxc_dma_regs_t *dma) { aes->ctrl = 0x00; @@ -70,6 +71,8 @@ int MXC_AES_RevB_Init(mxc_aes_revb_regs_t *aes) aes->ctrl |= MXC_F_AES_REVB_CTRL_EN; + dma_state.dma = dma; + return E_NO_ERROR; } @@ -226,7 +229,7 @@ int MXC_AES_RevB_Decrypt(mxc_aes_revb_regs_t *aes, mxc_aes_revb_req_t *req) return MXC_AES_RevB_Generic(aes, req); } -int MXC_AES_RevB_TXDMAConfig(void *src_addr, int len) +int MXC_AES_RevB_TXDMAConfig(void *src_addr, int len, mxc_dma_regs_t *dma) { uint8_t channel; mxc_dma_config_t config; @@ -240,9 +243,16 @@ int MXC_AES_RevB_TXDMAConfig(void *src_addr, int len) return E_BAD_PARAM; } +#if (TARGET_NUM == 32657) + MXC_DMA_Init(dma); + + channel = MXC_DMA_AcquireChannel(dma); +#else MXC_DMA_Init(); channel = MXC_DMA_AcquireChannel(); +#endif + dma_state.channelTX = channel; config.reqsel = MXC_DMA_REQUEST_AESTX; @@ -269,7 +279,12 @@ int MXC_AES_RevB_TXDMAConfig(void *src_addr, int len) MXC_DMA_ConfigChannel(config, srcdst); MXC_DMA_SetCallback(channel, MXC_AES_RevB_DMACallback); +#if (TARGET_NUM == 32657) + MXC_DMA_EnableInt(dma, channel); +#else MXC_DMA_EnableInt(channel); +#endif + MXC_DMA_Start(channel); //MXC_DMA->ch[channel].ctrl |= MXC_F_DMA_CTRL_CTZ_IE; MXC_DMA_SetChannelInterruptEn(channel, 0, 1); @@ -277,7 +292,7 @@ int MXC_AES_RevB_TXDMAConfig(void *src_addr, int len) return E_NO_ERROR; } -int MXC_AES_RevB_RXDMAConfig(void *dest_addr, int len) +int MXC_AES_RevB_RXDMAConfig(void *dest_addr, int len, mxc_dma_regs_t *dma) { if (dest_addr == NULL) { return E_NULL_PTR; @@ -291,9 +306,16 @@ int MXC_AES_RevB_RXDMAConfig(void *dest_addr, int len) mxc_dma_config_t config; mxc_dma_srcdst_t srcdst; +#if (TARGET_NUM == 32657) + MXC_DMA_Init(dma); + + channel = MXC_DMA_AcquireChannel(dma); +#else MXC_DMA_Init(); channel = MXC_DMA_AcquireChannel(); +#endif + dma_state.channelRX = channel; config.reqsel = MXC_DMA_REQUEST_AESRX; @@ -320,7 +342,12 @@ int MXC_AES_RevB_RXDMAConfig(void *dest_addr, int len) MXC_DMA_ConfigChannel(config, srcdst); MXC_DMA_SetCallback(channel, MXC_AES_RevB_DMACallback); +#if (TARGET_NUM == 32657) + MXC_DMA_EnableInt(dma, channel); +#else MXC_DMA_EnableInt(channel); +#endif + MXC_DMA_Start(channel); //MXC_DMA->ch[channel].ctrl |= MXC_F_DMA_CTRL_CTZ_IE; MXC_DMA_SetChannelInterruptEn(channel, 0, 1); @@ -359,7 +386,7 @@ int MXC_AES_RevB_GenericAsync(mxc_aes_revb_regs_t *aes, mxc_aes_revb_req_t *req, aes->ctrl |= MXC_F_AES_REVB_CTRL_DMA_RX_EN; //Enable AES DMA aes->ctrl |= MXC_F_AES_REVB_CTRL_DMA_TX_EN; //Enable AES DMA - if (MXC_AES_RevB_TXDMAConfig(dma_state.inputText, dma_state.remain) != E_NO_ERROR) { + if (MXC_AES_RevB_TXDMAConfig(dma_state.inputText, dma_state.remain, dma_state.dma) != E_NO_ERROR) { return E_BAD_PARAM; } @@ -385,7 +412,7 @@ void MXC_AES_RevB_DMACallback(int ch, int error) if (dma_state.remain < 4) { MXC_AES_Start(); } - MXC_AES_RevB_RXDMAConfig(dma_state.outputText, dma_state.remain); + MXC_AES_RevB_RXDMAConfig(dma_state.outputText, dma_state.remain, dma_state.dma); } else if (dma_state.channelRX == ch) { if (dma_state.remain > 4) { dma_state.remain -= 4; @@ -394,7 +421,7 @@ void MXC_AES_RevB_DMACallback(int ch, int error) } MXC_DMA_ReleaseChannel(dma_state.channelRX); if (dma_state.remain > 0) { - MXC_AES_RevB_TXDMAConfig(dma_state.inputText, dma_state.remain); + MXC_AES_RevB_TXDMAConfig(dma_state.inputText, dma_state.remain, dma_state.dma); } } } diff --git a/Libraries/PeriphDrivers/Source/AES/aes_revb.h b/Libraries/PeriphDrivers/Source/AES/aes_revb.h index 3f00bda64c1..0c8b318a7c3 100644 --- a/Libraries/PeriphDrivers/Source/AES/aes_revb.h +++ b/Libraries/PeriphDrivers/Source/AES/aes_revb.h @@ -26,6 +26,7 @@ #include "aes_revb_regs.h" #include "aeskeys_revb_regs.h" #include "trng_revb_regs.h" +#include "dma.h" /** * @brief Enumeration type to select AES key @@ -60,7 +61,7 @@ typedef struct _mxc_aes_revb_cipher_req_t { mxc_aes_complete_t callback; ///< Callback function } mxc_aes_revb_req_t; -int MXC_AES_RevB_Init(mxc_aes_revb_regs_t *aes); +int MXC_AES_RevB_Init(mxc_aes_revb_regs_t *aes, mxc_dma_regs_t *dma); void MXC_AES_RevB_EnableInt(mxc_aes_revb_regs_t *aes, uint32_t interrupt); void MXC_AES_RevB_DisableInt(mxc_aes_revb_regs_t *aes, uint32_t interrupt); int MXC_AES_RevB_IsBusy(mxc_aes_revb_regs_t *aes); @@ -76,8 +77,8 @@ void MXC_AES_RevB_ClearFlags(mxc_aes_revb_regs_t *aes, uint32_t flags); int MXC_AES_RevB_Generic(mxc_aes_revb_regs_t *aes, mxc_aes_revb_req_t *req); int MXC_AES_RevB_Encrypt(mxc_aes_revb_regs_t *aes, mxc_aes_revb_req_t *req); int MXC_AES_RevB_Decrypt(mxc_aes_revb_regs_t *aes, mxc_aes_revb_req_t *req); -int MXC_AES_RevB_TXDMAConfig(void *src_addr, int len); -int MXC_AES_RevB_RXDMAConfig(void *dest_addr, int len); +int MXC_AES_RevB_TXDMAConfig(void *src_addr, int len, mxc_dma_regs_t *dma); +int MXC_AES_RevB_RXDMAConfig(void *dest_addr, int len, mxc_dma_regs_t *dma); int MXC_AES_RevB_GenericAsync(mxc_aes_revb_regs_t *aes, mxc_aes_revb_req_t *req, uint8_t enc); int MXC_AES_RevB_EncryptAsync(mxc_aes_revb_regs_t *aes, mxc_aes_revb_req_t *req); int MXC_AES_RevB_DecryptAsync(mxc_aes_revb_regs_t *aes, mxc_aes_revb_req_t *req); diff --git a/Libraries/PeriphDrivers/Source/CRC/crc_ai87.c b/Libraries/PeriphDrivers/Source/CRC/crc_ai87.c index 8e09e2dc81c..e75000fe5fc 100644 --- a/Libraries/PeriphDrivers/Source/CRC/crc_ai87.c +++ b/Libraries/PeriphDrivers/Source/CRC/crc_ai87.c @@ -36,7 +36,7 @@ int MXC_CRC_Init(void) MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CRC); #endif - MXC_CRC_RevA_Init((mxc_crc_reva_regs_t *)MXC_CRC); + MXC_CRC_RevA_Init((mxc_crc_reva_regs_t *)MXC_CRC, MXC_DMA); return E_NO_ERROR; } diff --git a/Libraries/PeriphDrivers/Source/CRC/crc_me15.c b/Libraries/PeriphDrivers/Source/CRC/crc_me15.c index 8e09e2dc81c..e75000fe5fc 100644 --- a/Libraries/PeriphDrivers/Source/CRC/crc_me15.c +++ b/Libraries/PeriphDrivers/Source/CRC/crc_me15.c @@ -36,7 +36,7 @@ int MXC_CRC_Init(void) MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CRC); #endif - MXC_CRC_RevA_Init((mxc_crc_reva_regs_t *)MXC_CRC); + MXC_CRC_RevA_Init((mxc_crc_reva_regs_t *)MXC_CRC, MXC_DMA); return E_NO_ERROR; } diff --git a/Libraries/PeriphDrivers/Source/CRC/crc_me17.c b/Libraries/PeriphDrivers/Source/CRC/crc_me17.c index 8e09e2dc81c..e75000fe5fc 100644 --- a/Libraries/PeriphDrivers/Source/CRC/crc_me17.c +++ b/Libraries/PeriphDrivers/Source/CRC/crc_me17.c @@ -36,7 +36,7 @@ int MXC_CRC_Init(void) MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CRC); #endif - MXC_CRC_RevA_Init((mxc_crc_reva_regs_t *)MXC_CRC); + MXC_CRC_RevA_Init((mxc_crc_reva_regs_t *)MXC_CRC, MXC_DMA); return E_NO_ERROR; } diff --git a/Libraries/PeriphDrivers/Source/CRC/crc_me30.c b/Libraries/PeriphDrivers/Source/CRC/crc_me30.c index cf4819eb767..1d1bcf41eb9 100644 --- a/Libraries/PeriphDrivers/Source/CRC/crc_me30.c +++ b/Libraries/PeriphDrivers/Source/CRC/crc_me30.c @@ -23,18 +23,19 @@ #include "crc.h" #include "crc_reva.h" +#include "dma.h" /* ************************************************************************* */ /* Global Control/Configuration functions */ /* ************************************************************************* */ -int MXC_CRC_Init(void) +int MXC_CRC_Init(mxc_dma_regs_t *dma) { #ifndef MSDK_NO_GPIO_CLK_INIT MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CRC); #endif - MXC_CRC_RevA_Init((mxc_crc_reva_regs_t *)MXC_CRC); + MXC_CRC_RevA_Init((mxc_crc_reva_regs_t *)MXC_CRC, dma); return E_NO_ERROR; } diff --git a/Libraries/PeriphDrivers/Source/CRC/crc_reva.c b/Libraries/PeriphDrivers/Source/CRC/crc_reva.c index 4cdb5e5ebb3..a84b553ab89 100644 --- a/Libraries/PeriphDrivers/Source/CRC/crc_reva.c +++ b/Libraries/PeriphDrivers/Source/CRC/crc_reva.c @@ -33,13 +33,16 @@ /***** Global Variables *****/ static mxc_crc_reva_req_t *CRCreq; +static mxc_dma_regs_t *CRCdma; /* ************************************************************************* */ /* Global Control/Configuration functions */ /* ************************************************************************* */ -int MXC_CRC_RevA_Init(mxc_crc_reva_regs_t *crc) +int MXC_CRC_RevA_Init(mxc_crc_reva_regs_t *crc, mxc_dma_regs_t *dma) { + CRCdma = dma; + crc->ctrl = 0x00; crc->val = 0xFFFFFFFF; return E_NO_ERROR; @@ -160,9 +163,15 @@ int MXC_CRC_RevA_ComputeAsync(mxc_crc_reva_regs_t *crc, mxc_crc_reva_req_t *req) CRCreq = req; +#if (TARGET_NUM == 32657) + MXC_DMA_Init(CRCdma); + + channel = MXC_DMA_AcquireChannel(CRCdma); +#else MXC_DMA_Init(); channel = MXC_DMA_AcquireChannel(); +#endif config.reqsel = MXC_DMA_REQUEST_CRCTX; @@ -183,7 +192,13 @@ int MXC_CRC_RevA_ComputeAsync(mxc_crc_reva_regs_t *crc, mxc_crc_reva_req_t *req) MXC_DMA_ConfigChannel(config, srcdst); MXC_DMA_SetCallback(channel, MXC_CRC_Handler); + +#if (TARGET_NUM == 32657) + MXC_DMA_EnableInt(CRCdma, channel); +#else MXC_DMA_EnableInt(channel); +#endif + MXC_DMA_Start(channel); //MXC_DMA->ch[channel].ctrl |= MXC_F_DMA_CTRL_CTZ_IE; MXC_DMA_SetChannelInterruptEn(channel, 0, 1); diff --git a/Libraries/PeriphDrivers/Source/CRC/crc_reva.h b/Libraries/PeriphDrivers/Source/CRC/crc_reva.h index d4a06efee33..8e2c46f9b34 100644 --- a/Libraries/PeriphDrivers/Source/CRC/crc_reva.h +++ b/Libraries/PeriphDrivers/Source/CRC/crc_reva.h @@ -23,6 +23,7 @@ #include "crc.h" #include "crc_reva_regs.h" +#include "dma.h" /***** CRC Definitions *****/ /** @@ -41,7 +42,7 @@ typedef struct _mxc_crc_reva_req_t { */ typedef enum { CRC_REVA_LSB_FIRST, CRC_REVA_MSB_FIRST } mxc_crc_reva_bitorder_t; -int MXC_CRC_RevA_Init(mxc_crc_reva_regs_t *crc); +int MXC_CRC_RevA_Init(mxc_crc_reva_regs_t *crc, mxc_dma_regs_t *dma); int MXC_CRC_RevA_Shutdown(mxc_crc_reva_regs_t *crc); int MXC_CRC_RevA_Handler(int ch, int error); void MXC_CRC_RevA_SetDirection(mxc_crc_reva_regs_t *crc, mxc_crc_reva_bitorder_t bitOrder); diff --git a/Libraries/PeriphDrivers/Source/DMA/dma_me30.c b/Libraries/PeriphDrivers/Source/DMA/dma_me30.c index bab48e3c5e9..d0359eaa1da 100644 --- a/Libraries/PeriphDrivers/Source/DMA/dma_me30.c +++ b/Libraries/PeriphDrivers/Source/DMA/dma_me30.c @@ -32,31 +32,33 @@ /****** Functions ******/ -int MXC_DMA_Init(void) +int MXC_DMA_Init(mxc_dma_regs_t *dma) { #ifndef MSDK_NO_GPIO_CLK_INIT - if (MXC_DMA == MXC_DMA0 && !MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA0)) { + if (dma == MXC_DMA0 && !MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA0)) { MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA0); MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA0); } // TODO(ME30): There is no periph clock enable register for DMA1 atm - // else if (MXC_DMA == MXC_DMA1 && !MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA1)) + // -Added but it's in feat/ME30 branch. + // Uncomment when merged. + // else if (dma == MXC_DMA1 && !MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA1)) // MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA1); // MXC_SYS_Reset_Periph(MXC_SYS_RESET0_DMA1); // } #endif - return MXC_DMA_RevA_Init((mxc_dma_reva_regs_t *)MXC_DMA); + return MXC_DMA_RevA_Init((mxc_dma_reva_regs_t *)dma); } -void MXC_DMA_DeInit(void) +void MXC_DMA_DeInit(mxc_dma_regs_t *dma) { - return MXC_DMA_RevA_DeInit((mxc_dma_reva_regs_t *)MXC_DMA); + return MXC_DMA_RevA_DeInit((mxc_dma_reva_regs_t *)dma); } -int MXC_DMA_AcquireChannel(void) +int MXC_DMA_AcquireChannel(mxc_dma_regs_t *dma) { - return MXC_DMA_RevA_AcquireChannel((mxc_dma_reva_regs_t *)MXC_DMA); + return MXC_DMA_RevA_AcquireChannel((mxc_dma_reva_regs_t *)dma); } int MXC_DMA_ReleaseChannel(int ch) @@ -124,14 +126,15 @@ int MXC_DMA_ChannelClearFlags(int ch, int flags) return MXC_DMA_RevA_ChannelClearFlags(ch, flags); } -int MXC_DMA_EnableInt(int ch) +// TODO(DMA): Check ME14 becasue you can only get ME14 intrs from MXC_DMA0. +int MXC_DMA_EnableInt(mxc_dma_regs_t *dma, int ch) { - return MXC_DMA_RevA_EnableInt((mxc_dma_reva_regs_t *)MXC_DMA, ch); + return MXC_DMA_RevA_EnableInt((mxc_dma_reva_regs_t *)dma, ch); } -int MXC_DMA_DisableInt(int ch) +int MXC_DMA_DisableInt(mxc_dma_regs_t *dma, int ch) { - return MXC_DMA_RevA_DisableInt((mxc_dma_reva_regs_t *)MXC_DMA, ch); + return MXC_DMA_RevA_DisableInt((mxc_dma_reva_regs_t *)dma, ch); } int MXC_DMA_Start(int ch) @@ -149,18 +152,18 @@ mxc_dma_ch_regs_t *MXC_DMA_GetCHRegs(int ch) return MXC_DMA_RevA_GetCHRegs(ch); } -void MXC_DMA_Handler(void) +void MXC_DMA_Handler(mxc_dma_regs_t *dma) { - MXC_DMA_RevA_Handler((mxc_dma_reva_regs_t *)MXC_DMA); + MXC_DMA_RevA_Handler((mxc_dma_reva_regs_t *)dma); } -int MXC_DMA_MemCpy(void *dest, void *src, int len, mxc_dma_complete_cb_t callback) +int MXC_DMA_MemCpy(mxc_dma_regs_t *dma, void *dest, void *src, int len, mxc_dma_complete_cb_t callback) { - return MXC_DMA_RevA_MemCpy((mxc_dma_reva_regs_t *)MXC_DMA, dest, src, len, callback); + return MXC_DMA_RevA_MemCpy((mxc_dma_reva_regs_t *)dma, dest, src, len, callback); } -int MXC_DMA_DoTransfer(mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, +int MXC_DMA_DoTransfer(mxc_dma_regs_t *dma, mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, mxc_dma_trans_chain_t callback) { - return MXC_DMA_RevA_DoTransfer((mxc_dma_reva_regs_t *)MXC_DMA, config, firstSrcDst, callback); + return MXC_DMA_RevA_DoTransfer((mxc_dma_reva_regs_t *)dma, config, firstSrcDst, callback); } diff --git a/Libraries/PeriphDrivers/Source/DMA/dma_reva.c b/Libraries/PeriphDrivers/Source/DMA/dma_reva.c index 6b8ac9a8436..05ba7bbbf89 100644 --- a/Libraries/PeriphDrivers/Source/DMA/dma_reva.c +++ b/Libraries/PeriphDrivers/Source/DMA/dma_reva.c @@ -470,7 +470,7 @@ int MXC_DMA_RevA_MemCpy(mxc_dma_reva_regs_t *dma, void *dest, void *src, int len mxc_dma_srcdst_t transfer; int channel; -#if TARGET_NUM == 32665 +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) channel = MXC_DMA_AcquireChannel((mxc_dma_regs_t *)dma); #else channel = MXC_DMA_AcquireChannel(); @@ -500,7 +500,11 @@ int MXC_DMA_RevA_MemCpy(mxc_dma_reva_regs_t *dma, void *dest, void *src, int len return retval; } +#if (TARGET_NUM == 32657) + retval = MXC_DMA_EnableInt((mxc_dma_regs_t *)dma, channel); +#else retval = MXC_DMA_EnableInt(channel); +#endif if (retval != E_NO_ERROR) { return retval; @@ -535,7 +539,7 @@ int MXC_DMA_RevA_DoTransfer(mxc_dma_reva_regs_t *dma, mxc_dma_config_t config, { int retval, channel; -#if TARGET_NUM == 32665 +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) channel = MXC_DMA_AcquireChannel((mxc_dma_regs_t *)dma); #else channel = MXC_DMA_AcquireChannel(); @@ -553,7 +557,11 @@ int MXC_DMA_RevA_DoTransfer(mxc_dma_reva_regs_t *dma, mxc_dma_config_t config, return retval; } +#if (TARGET_NUM == 32657) + retval = MXC_DMA_EnableInt((mxc_dma_regs_t *)dma, channel); +#else retval = MXC_DMA_EnableInt(channel); +#endif if (retval != E_NO_ERROR) { return retval; diff --git a/Libraries/PeriphDrivers/Source/SPI/spi_me30.c b/Libraries/PeriphDrivers/Source/SPI/spi_me30.c index b2e419561d2..3d75b2bcd37 100644 --- a/Libraries/PeriphDrivers/Source/SPI/spi_me30.c +++ b/Libraries/PeriphDrivers/Source/SPI/spi_me30.c @@ -337,7 +337,7 @@ int MXC_SPI_MasterTransactionAsync(mxc_spi_req_t *req) return MXC_SPI_RevA1_MasterTransactionAsync((mxc_spi_reva_req_t *)req); } -int MXC_SPI_MasterTransactionDMA(mxc_spi_req_t *req) +int MXC_SPI_MasterTransactionDMA(mxc_spi_req_t *req, mxc_dma_regs_t *dma) { int reqselTx = -1; int reqselRx = -1; @@ -377,8 +377,7 @@ int MXC_SPI_MasterTransactionDMA(mxc_spi_req_t *req) } } - return MXC_SPI_RevA1_MasterTransactionDMA((mxc_spi_reva_req_t *)req, reqselTx, reqselRx, - MXC_DMA); + return MXC_SPI_RevA1_MasterTransactionDMA((mxc_spi_reva_req_t *)req, reqselTx, reqselRx, dma); } int MXC_SPI_SlaveTransaction(mxc_spi_req_t *req) @@ -391,7 +390,7 @@ int MXC_SPI_SlaveTransactionAsync(mxc_spi_req_t *req) return MXC_SPI_RevA1_SlaveTransactionAsync((mxc_spi_reva_req_t *)req); } -int MXC_SPI_SlaveTransactionDMA(mxc_spi_req_t *req) +int MXC_SPI_SlaveTransactionDMA(mxc_spi_req_t *req, mxc_dma_regs_t *dma) { int reqselTx = -1; int reqselRx = -1; @@ -433,8 +432,7 @@ int MXC_SPI_SlaveTransactionDMA(mxc_spi_req_t *req) } } - return MXC_SPI_RevA1_SlaveTransactionDMA((mxc_spi_reva_req_t *)req, reqselTx, reqselRx, - MXC_DMA); + return MXC_SPI_RevA1_SlaveTransactionDMA((mxc_spi_reva_req_t *)req, reqselTx, reqselRx, dma); } int MXC_SPI_SetDefaultTXData(mxc_spi_regs_t *spi, unsigned int defaultTXData) diff --git a/Libraries/PeriphDrivers/Source/SPI/spi_reva1.c b/Libraries/PeriphDrivers/Source/SPI/spi_reva1.c index 4c7fd64e6dc..74b8871e5f3 100644 --- a/Libraries/PeriphDrivers/Source/SPI/spi_reva1.c +++ b/Libraries/PeriphDrivers/Source/SPI/spi_reva1.c @@ -952,7 +952,7 @@ int MXC_SPI_RevA1_MasterTransactionDMA(mxc_spi_reva_req_t *req, int reqselTx, in // for non-MT mode do this setup every time, for MT mode only first time if ((states[spi_num].mtMode == 0) || ((states[spi_num].mtMode == 1) && (states[spi_num].mtFirstTrans == 1))) { -#if TARGET_NUM == 32665 +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) MXC_DMA_Init(dma); states[spi_num].channelTx = MXC_DMA_AcquireChannel(dma); states[spi_num].channelRx = MXC_DMA_AcquireChannel(dma); @@ -1009,7 +1009,13 @@ int MXC_SPI_RevA1_MasterTransactionDMA(mxc_spi_reva_req_t *req, int reqselTx, in //tx if (req->txData != NULL && !tx_is_complete) { MXC_DMA_SetCallback(states[spi_num].channelTx, MXC_SPI_RevA1_DMACallback); + +#if (TARGET_NUM == 32657) + MXC_DMA_EnableInt(dma, states[spi_num].channelTx); +#else MXC_DMA_EnableInt(states[spi_num].channelTx); +#endif + config.reqsel = (mxc_dma_reqsel_t)reqselTx; config.ch = states[spi_num].channelTx; advConfig.ch = states[spi_num].channelTx; @@ -1049,7 +1055,13 @@ int MXC_SPI_RevA1_MasterTransactionDMA(mxc_spi_reva_req_t *req, int reqselTx, in // rx if (req->rxData != NULL && !rx_is_complete) { MXC_DMA_SetCallback(states[spi_num].channelRx, MXC_SPI_RevA1_DMACallback); + +#if (TARGET_NUM == 32657) + MXC_DMA_EnableInt(dma, states[spi_num].channelRx); +#else MXC_DMA_EnableInt(states[spi_num].channelRx); +#endif + config.reqsel = (mxc_dma_reqsel_t)reqselRx; config.ch = states[spi_num].channelRx; config.srcinc_en = 0; @@ -1160,7 +1172,7 @@ int MXC_SPI_RevA1_SlaveTransactionDMA(mxc_spi_reva_req_t *req, int reqselTx, int // for non-MT mode do this setup every time, for MT mode only first time if ((states[spi_num].mtMode == 0) || ((states[spi_num].mtMode == 1) && (states[spi_num].mtFirstTrans == 1))) { -#if TARGET_NUM == 32665 +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) MXC_DMA_Init(dma); states[spi_num].channelTx = MXC_DMA_AcquireChannel(dma); states[spi_num].channelRx = MXC_DMA_AcquireChannel(dma); @@ -1180,8 +1192,14 @@ int MXC_SPI_RevA1_SlaveTransactionDMA(mxc_spi_reva_req_t *req, int reqselTx, int MXC_DMA_SetCallback(states[spi_num].channelTx, MXC_SPI_RevA1_DMACallback); MXC_DMA_SetCallback(states[spi_num].channelRx, MXC_SPI_RevA1_DMACallback); + +#if (TARGET_NUM == 32657) + MXC_DMA_EnableInt(dma, states[spi_num].channelTx); + MXC_DMA_EnableInt(dma, states[spi_num].channelRx); +#else MXC_DMA_EnableInt(states[spi_num].channelTx); MXC_DMA_EnableInt(states[spi_num].channelRx); +#endif } bits = MXC_SPI_GetDataSize((mxc_spi_regs_t *)req->spi); diff --git a/Libraries/PeriphDrivers/Source/SYS/sys_me30.c b/Libraries/PeriphDrivers/Source/SYS/sys_me30.c index e03cd7c5cfd..78e09ee40bc 100644 --- a/Libraries/PeriphDrivers/Source/SYS/sys_me30.c +++ b/Libraries/PeriphDrivers/Source/SYS/sys_me30.c @@ -93,7 +93,10 @@ int MXC_SYS_GetUSN(uint8_t *usn, uint8_t *checksum) checksum[0] = ((infoblock[3] & 0x7F800000) >> 23); checksum[1] = ((infoblock[4] & 0x007F8000) >> 15); - err = MXC_AES_Init(); + // Info block only accessible for secure code. + // Use Secure DMA1. + // TODO(DMA): Figure out access to "secure" functions when in non-secure code. + err = MXC_AES_Init(MXC_DMA1); if (err) { MXC_FLC_LockInfoBlock(MXC_INFO_MEM_BASE); return err; diff --git a/Libraries/PeriphDrivers/Source/UART/uart_me30.c b/Libraries/PeriphDrivers/Source/UART/uart_me30.c index 83eb8202790..303d21c973a 100644 --- a/Libraries/PeriphDrivers/Source/UART/uart_me30.c +++ b/Libraries/PeriphDrivers/Source/UART/uart_me30.c @@ -182,13 +182,13 @@ unsigned int MXC_UART_ReadRXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, un return MXC_UART_RevA_ReadRXFIFO((mxc_uart_reva_regs_t *)uart, bytes, len); } -int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len, +int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, mxc_dma_regs_t *dma, unsigned char *bytes, unsigned int len, mxc_uart_dma_complete_cb_t callback) { mxc_dma_config_t config; config.reqsel = MXC_DMA_REQUEST_UART0RX; // TODO(ME30): Updated DMA reqsel - return MXC_UART_RevA_ReadRXFIFODMA((mxc_uart_reva_regs_t *)uart, MXC_DMA, bytes, len, callback, + return MXC_UART_RevA_ReadRXFIFODMA((mxc_uart_reva_regs_t *)uart, dma, bytes, len, callback, config); } @@ -202,13 +202,13 @@ unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, u return MXC_UART_RevA_WriteTXFIFO((mxc_uart_reva_regs_t *)uart, bytes, len); } -int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len, +int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, mxc_dma_regs_t *dma, unsigned char *bytes, unsigned int len, mxc_uart_dma_complete_cb_t callback) { mxc_dma_config_t config; config.reqsel = MXC_DMA_REQUEST_UART0TX; // TODO(ME30): Updated DMA reqsel - return MXC_UART_RevA_WriteTXFIFODMA((mxc_uart_reva_regs_t *)uart, MXC_DMA, bytes, len, callback, + return MXC_UART_RevA_WriteTXFIFODMA((mxc_uart_reva_regs_t *)uart, dma, bytes, len, callback, config); } @@ -282,9 +282,9 @@ int MXC_UART_TransactionAsync(mxc_uart_req_t *req) return MXC_UART_RevA_TransactionAsync((mxc_uart_reva_req_t *)req); } -int MXC_UART_TransactionDMA(mxc_uart_req_t *req) +int MXC_UART_TransactionDMA(mxc_uart_req_t *req, mxc_dma_regs_t *dma) { - return MXC_UART_RevA_TransactionDMA((mxc_uart_reva_req_t *)req, MXC_DMA); + return MXC_UART_RevA_TransactionDMA((mxc_uart_reva_req_t *)req, dma); } int MXC_UART_AbortAsync(mxc_uart_regs_t *uart) diff --git a/Libraries/PeriphDrivers/Source/UART/uart_reva.c b/Libraries/PeriphDrivers/Source/UART/uart_reva.c index 2256afe35a1..5ba07b5c3e4 100644 --- a/Libraries/PeriphDrivers/Source/UART/uart_reva.c +++ b/Libraries/PeriphDrivers/Source/UART/uart_reva.c @@ -48,6 +48,7 @@ typedef struct { int channelTx; int channelRx; bool auto_dma_handlers; + mxc_dma_regs_t *dma; } uart_reva_req_state_t; uart_reva_req_state_t states[MXC_UART_INSTANCES]; @@ -99,6 +100,7 @@ int MXC_UART_RevA_Init(mxc_uart_reva_regs_t *uart, unsigned int baud) states[i].tx_req = NULL; states[i].rx_req = NULL; states[i].auto_dma_handlers = false; + states[i].dma = NULL; return E_NO_ERROR; } @@ -502,7 +504,13 @@ unsigned int MXC_UART_RevA_ReadRXFIFO(mxc_uart_reva_regs_t *uart, unsigned char return read; } -#if MXC_DMA_INSTANCES > 1 + +// TODO(DMA): Replaced the DMA instance number check to the only +// parts affected by this. Our DMA drivers probably +// needs a rework to handle multiple instances because +// the ME14's DMA drivers are very limited with +// the DMA instance selection. +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) void MXC_UART_RevA_DMA0_Handler(void) { @@ -522,19 +530,21 @@ DMA instance. void MXC_UART_RevA_DMA_SetupAutoHandlers(mxc_dma_regs_t *dma_instance, unsigned int channel) { #ifdef __arm__ - NVIC_EnableIRQ(MXC_DMA_CH_GET_IRQ(channel)); +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) + NVIC_EnableIRQ(MXC_DMA_CH_GET_IRQ(dma_instance, channel)); -#if MXC_DMA_INSTANCES > 1 /* (JC): This is not the cleanest or most scalable way to do this, but I tried defining default handler's in the system file. Some complications make this the most attractive short-term option. We could handle multiple DMA instances better in the DMA API (See the mismatch between the size of "dma_resource" array and the number of channels per instance, to start)*/ if (dma_instance == MXC_DMA0) { - MXC_NVIC_SetVector(MXC_DMA_CH_GET_IRQ(channel), MXC_UART_RevA_DMA0_Handler); + MXC_NVIC_SetVector(MXC_DMA_CH_GET_IRQ(dma_instance, channel), MXC_UART_RevA_DMA0_Handler); } else if (dma_instance == MXC_DMA1) { - MXC_NVIC_SetVector(MXC_DMA_CH_GET_IRQ(channel), MXC_UART_RevA_DMA1_Handler); + MXC_NVIC_SetVector(MXC_DMA_CH_GET_IRQ(dma_instance, channel), MXC_UART_RevA_DMA1_Handler); } #else + NVIC_EnableIRQ(MXC_DMA_CH_GET_IRQ(channel)); + // Only one DMA instance, we can point direct to MXC_DMA_Handler MXC_NVIC_SetVector(MXC_DMA_CH_GET_IRQ(channel), MXC_DMA_Handler); #endif // MXC_DMA_INSTANCES > 1 @@ -560,7 +570,7 @@ int MXC_UART_RevA_ReadRXFIFODMA(mxc_uart_reva_regs_t *uart, mxc_dma_regs_t *dma, if (states[uart_num].auto_dma_handlers && states[uart_num].channelRx < 0) { /* Acquire channel if we don't have one already */ -#if MXC_DMA_INSTANCES > 1 +#if MXC_DMA_INSTANCES > 1 || TARGET_NUM == 32657 channel = MXC_DMA_AcquireChannel(dma); #else channel = MXC_DMA_AcquireChannel(); @@ -591,7 +601,13 @@ int MXC_UART_RevA_ReadRXFIFODMA(mxc_uart_reva_regs_t *uart, mxc_dma_regs_t *dma, MXC_DMA_ConfigChannel(config, srcdst); MXC_DMA_SetCallback(channel, MXC_UART_DMACallback); + +#if (TARGET_NUM == 32657) + MXC_DMA_EnableInt(dma, channel); +#else MXC_DMA_EnableInt(channel); +#endif + MXC_DMA_Start(channel); //MXC_DMA->ch[channel].ctrl |= MXC_F_DMA_CTRL_CTZ_IE; MXC_DMA_SetChannelInterruptEn(channel, 0, 1); @@ -679,7 +695,7 @@ unsigned int MXC_UART_RevA_WriteTXFIFODMA(mxc_uart_reva_regs_t *uart, mxc_dma_re if (states[uart_num].auto_dma_handlers && states[uart_num].channelTx < 0) { /* Acquire channel if we don't have one already */ -#if TARGET_NUM == 32665 +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) channel = MXC_DMA_AcquireChannel(dma); #else channel = MXC_DMA_AcquireChannel(); @@ -708,7 +724,13 @@ unsigned int MXC_UART_RevA_WriteTXFIFODMA(mxc_uart_reva_regs_t *uart, mxc_dma_re MXC_DMA_ConfigChannel(config, srcdst); MXC_DMA_SetCallback(channel, MXC_UART_DMACallback); + +#if (TARGET_NUM == 32657) + MXC_DMA_EnableInt(dma, channel); +#else MXC_DMA_EnableInt(channel); +#endif + MXC_DMA_Start(channel); //MXC_DMA->ch[channel].ctrl |= MXC_F_DMA_CTRL_CTZ_IE; MXC_DMA_SetChannelInterruptEn(channel, 0, 1); @@ -951,6 +973,9 @@ int MXC_UART_RevA_TransactionDMA(mxc_uart_reva_req_t *req, mxc_dma_regs_t *dma) { int uart_num = MXC_UART_GET_IDX((mxc_uart_regs_t *)(req->uart)); + // Save DMA instance for DMA Callback. + states[uart_num].dma = dma; + if (req->txLen) { if (req->txData == NULL) { return E_BAD_PARAM; @@ -976,7 +1001,7 @@ int MXC_UART_RevA_TransactionDMA(mxc_uart_reva_req_t *req, mxc_dma_regs_t *dma) (req->uart)->dma |= (2 << MXC_F_UART_REVA_DMA_TXDMA_LEVEL_POS); // Set TX DMA threshold to 2 bytes -#if TARGET_NUM == 32665 +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) MXC_DMA_Init(dma); #else MXC_DMA_Init(); @@ -990,7 +1015,7 @@ int MXC_UART_RevA_TransactionDMA(mxc_uart_reva_req_t *req, mxc_dma_regs_t *dma) if ((req->txData != NULL) && (req->txLen)) { /* Save TX req, the DMA handler will use this later. */ states[uart_num].tx_req = req; -#if TARGET_NUM == 32665 +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) if (MXC_UART_WriteTXFIFODMA((mxc_uart_regs_t *)(req->uart), dma, req->txData, req->txLen, NULL) != E_NO_ERROR) { return E_BAD_PARAM; @@ -1005,7 +1030,7 @@ int MXC_UART_RevA_TransactionDMA(mxc_uart_reva_req_t *req, mxc_dma_regs_t *dma) if ((req->rxData != NULL) && (req->rxLen)) { states[uart_num].rx_req = req; -#if TARGET_NUM == 32665 +#if (TARGET_NUM == 32665 || TARGET_NUM == 32657) if (MXC_UART_ReadRXFIFODMA((mxc_uart_regs_t *)(req->uart), dma, req->rxData, req->rxLen, NULL) != E_NO_ERROR) { return E_BAD_PARAM; @@ -1029,7 +1054,7 @@ void MXC_UART_RevA_DMACallback(int ch, int error) if (states[i].channelTx == ch) { /* Populate txLen. The number of "remainder" bytes is what's left on the DMA channel's count register. */ - states[i].tx_req->txCnt = states[i].tx_req->txLen - MXC_DMA->ch[ch].cnt; + states[i].tx_req->txCnt = states[i].tx_req->txLen - states[i].dma->ch[ch].cnt; temp_req = states[i].tx_req; @@ -1051,7 +1076,7 @@ void MXC_UART_RevA_DMACallback(int ch, int error) break; } else if (states[i].channelRx == ch) { /* Same as above, but for RX */ - states[i].rx_req->rxCnt = states[i].rx_req->rxLen - MXC_DMA->ch[ch].cnt; + states[i].rx_req->rxCnt = states[i].rx_req->rxLen - states[i].dma->ch[ch].cnt; temp_req = states[i].rx_req; if (states[i].auto_dma_handlers) { MXC_DMA_ReleaseChannel(ch); From fd6d3aa3458926c286b244429ada698439b40721 Mon Sep 17 00:00:00 2001 From: Woo Date: Mon, 6 May 2024 16:51:42 -0500 Subject: [PATCH 41/41] Add comment to enable ICC after testing --- Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c index 960bb98bf57..417f887b2ab 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c @@ -157,6 +157,9 @@ __weak void SystemInit(void) /* Enable interrupts */ __enable_irq(); + // TODO(ICC): Enable the internal cache controller after testing. + // MXC_ICC_Enable(); + /* Change system clock source to the main high-speed clock */ MXC_SYS_Clock_Select(MXC_SYS_CLOCK_IPO); MXC_SYS_SetClockDiv(MXC_SYS_CLOCK_DIV_1);